Forum: Compiler & IDEs INT0 durch INT1 erstzen geht nicht


von Mathias O. (m-obi)


Lesenswert?

Guten Morgen,

ich habe einen Code geschrieben, zum dimmen einer Lampe (einige müssten 
wissen worum es geht). Ich nutze einen ATtiny2313 bei 8MHz. In dem Code 
nutze ich INT0, der wird ausgelöst durch die Nulldurchgangserkennung, 
bei einer fallenden Flanke. Nun möchte ich aber anstatt INT0, INT1 
benutzen. Aber wenn ich alles nötige dafür ersetze, funktioniert der 
Code nicht richtig, er compiliert zwar, aber in der Praxis funktioniert 
er nicht.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
#define Taster_1   (PIND&(1<<PD4))
6
7
volatile struct {
8
   unsigned _1:1;
9
   unsigned _2:1;
10
   unsigned _3:1;
11
   unsigned _4:1;
12
   unsigned _5:1;
13
   unsigned _6:1;
14
} Merker;
15
16
volatile uint8_t Dimmrichtung = 1;
17
volatile uint8_t Counter_1 = 0;
18
volatile uint8_t Counter_2 = 0;
19
volatile uint8_t Counter_3 = 0;
20
volatile uint16_t Zuendwert = 800;
21
volatile uint16_t Zuendpunkt_1 = 0;
22
volatile uint16_t Zuendpunkt_2 = 0;
23
volatile uint16_t Temp = 0;
24
25
26
ISR(INT0_vect)
27
{    
28
  TCNT1 = 0;
29
  
30
  Merker._1 = 1;
31
  
32
  if (Taster_1)
33
  {    
34
    Counter_1 = 0;
35
    Counter_2++;
36
    if (Merker._3 == 0)
37
    {
38
      Merker._2 = 1;
39
    }
40
  }
41
  else
42
  {
43
    Counter_1++;
44
    Counter_2 = 0;
45
    Merker._3 = 0;
46
    Merker._2 = 0;
47
  }
48
  
49
  if (Merker._2 == 1)
50
  {
51
    Counter_3++;
52
  }
53
  
54
  if ((Counter_3 <= 45) && (Counter_3 >= 4) && (Merker._2 == 0))
55
  {
56
    PORTD ^= (1<<6);
57
    Merker._4 = !Merker._4;
58
    if (Merker._4 == 1)
59
    {
60
      Dimmrichtung = !Dimmrichtung;
61
    }
62
    Counter_3 = 0;
63
    Merker._5 = 1;
64
  }
65
  
66
  if ((Merker._2 == 0) && (Merker._5 == 1))
67
  {
68
    Counter_3 = 0;
69
  }
70
  
71
  if ((Merker._4 == 0) && (Zuendwert != 0))
72
  {
73
    Temp = Zuendwert;
74
    Zuendwert = 0;
75
    Merker._6 = 1;
76
  }
77
  
78
  if ((Merker._6 == 1) && (Merker._4 == 1))
79
  {
80
    Zuendwert = Temp;
81
    Merker._6 = 0;
82
  }
83
  
84
  Zuendpunkt_1 = Zuendwert + 0;
85
  Zuendpunkt_2 = Zuendwert + 1250;  
86
}
87
88
89
int main(void)
90
{  
91
  DDRB = 0b11111111;
92
  DDRD = 0b11100000;
93
  
94
  MCUCR |= (1<<ISC01)|(1<<ISC11);
95
  MCUCR &= ~((1<<ISC00)|(1<<ISC10));    
96
  GIMSK |= (1<<INT0);
97
  
98
  TCCR1A = 0x00;
99
  TCCR1B |= (1<<CS10)|(1<<CS11);
100
  
101
  Merker._1 = 0;
102
  Merker._2 = 0;
103
  Merker._3 = 0;
104
  Merker._4 = 0;
105
  Merker._5 = 0;
106
  Merker._6 = 0;
107
  
108
  sei();
109
110
  while(1)
111
  {       
112
    if ((Counter_2 == 50) && (Merker._4 == 1))
113
    {
114
      Merker._3 = 1;  
115
    }
116
  
117
    if ((Counter_1 == 2) && (Merker._4 == 1))
118
    {
119
      Dimmrichtung = !Dimmrichtung;
120
      Counter_1++;
121
    }
122
  
123
    if (Merker._3 == 1 && Zuendwert <= 900 && Merker._1 == 1 && Dimmrichtung == 0)
124
    {
125
      Merker._1 = 0;
126
      Zuendwert+=5;
127
      Counter_3 = 0;
128
      Merker._2 = 0;
129
    }
130
  
131
    if (Merker._3 == 1 && Zuendwert >= 100 && Merker._1 == 1 && Dimmrichtung == 1)
132
    {
133
      Merker._1 = 0;
134
      Zuendwert-=5;
135
      Counter_3 = 0;
136
      Merker._2 = 0;
137
    }
138
  
139
    if  (((TCNT1 == Zuendpunkt_1) || (TCNT1 == Zuendpunkt_2)) && (Zuendwert != 0))
140
    {
141
      PORTD |= (1<<5);
142
      _delay_us(80);
143
      PORTD &= ~(1<<5);
144
    }
145
  }  
146
}

Im MCUCR hab ich alles schon eingefügt was benötigt wird.
Wenn ich jetzt aber beim GIMSK das
1
GIMSK |= (1<<INT0)|(1<<INT1);
anstatt
1
GIMSK |= (1<<INT0);
schreibe, funktioniert der Code wie beschrieben nicht mehr.

Dann muss ich ja auch nur noch anstatt
1
ISR(INT0_vect)
2
{
1
ISR(INT1_vect)
2
{
schreiben. Stimmt doch oder, fehlt dann noch etwas?


MfG
Mathias

von ... .. (docean) Benutzerseite


Lesenswert?

Was ist mit dem Taster_1 define und den Pullups?

von Mathias O. (m-obi)


Lesenswert?

Das hat ja alles schon vorher geklappt, nur ich muss rein 
hardwaretechnisch, den Nulldurchgang auf INT1 setzen. Und der Taster is 
ja an PD4 und INT1 ist an PD3, alles eigentlich ganz ok.

von Michael U. (amiga)


Lesenswert?

Hallo,

Mathias O. wrote:
> Im MCUCR hab ich alles schon eingefügt was benötigt wird.
> Wenn ich jetzt aber beim GIMSK das
>
1
GIMSK |= (1<<INT0)|(1<<INT1);

Ich denke, Du willst INT0 durch INT1 ersetzen?
Warum willst Du dann BEIDE freigegen???

> Dann muss ich ja auch nur noch anstatt
>
1
ISR(INT0_vect)
2
> {
>
>
1
ISR(INT1_vect)
2
> {

Und wohin springt dann Dein oben freigegebener INT0, wenn es keine ISR 
mehr dafür gibt?

Gruß aus Berlin
Michael

von Stefan E. (sternst)


Lesenswert?

Und was hängt jetzt statt dessen an Int0?
Schließlich ist der Interrupt ja auch immer noch enabled, aber ohne dass 
es eine ISR dafür gibt. Wenn der Eingang offen ist, wird dein µC munter 
laufend Software-Resets durchführen.

von Mathias O. (m-obi)


Lesenswert?

ich habe es jetzt mal so geändert:
1
ISR(INT1_vect)
2
{
1
MCUCR |= (1<<ISC11);
2
  MCUCR &= ~(1<<ISC10);    
3
  GIMSK |= (1<<INT1);

Funktioniert immernoch nicht.

von Mathias O. (m-obi)


Lesenswert?

Also wenn ich den Taster kurz betätige, geht sie an oder halt aus. Wenn 
ich den Taster länger gedrückt halte dimmt es entweder, hoch oder 
runter, je nachdem wie grad die Dimmrichtung ist. Aber jetzt ist es so. 
Auf langen drücken reagiert nix mehr, nur wenn ich kurz drücke, geht an 
oder aus, oder macht garnix.

Und das ganze nur weil ich einen ander INT-Pin nehme.

von Oliver (Gast)


Lesenswert?

>#define Taster_1   (PIND&(1<<PD4))
>...
>Und der Taster is ja an PD4 und INT1 ist an PD3, alles eigentlich ganz ok.

??? Der Sinn erschliesst sich mir jetzt nicht ganz.

Aus dem ATTiny2313-Datenblatt (doc2543.pdf):

>• T0 – Port D, Bit 4
>T0: Timer/Counter0 External Counter Clock input is enabled by setting (one) the 
>bits
>CS02 and CS01 in the Timer/Counter0 Control Register (TCCR0).

>• INT1 – Port D, Bit 3
>INT1: External Interrupt Source 1. The PD3 pin can serve as an external interrupt
>source to the MCU.
>• INT0/XCK/CKOUT – Port D, Bit 2
>INT0: External Interrupt Source 0. The PD2 pin can serve as en external interrupt
>source to the MCU.

Was soll der Taster an PD4?? Aus meinem laienhaften Verständnis heraus 
würde ich, wenn ich per Taster den INT1 auslösen möchte, den Taster auch 
am Pin INT1 (=PD3) anschliessen. (und in der Version mit INT0 an PD2)

Oder gibt es verschiedene ATTiny2313?

Ich denke mal, du stellts die falsche Frage. Die richtige lautet:

Warum in aller Welt tut das Programm so, als ob es funktioniert, wenn du 
INT0 benutzt?

Oliver

von Oliver (Gast)


Lesenswert?

Ach ja, und wenn du das geklärt hast, lies dir mal in der 
Artikelsammlung alles zum Thema "Schalterprellen" durch.

Oliver
P.S. Der INT0/1 reagiert nicht auf Nulldurchgang, sondern auf eine 
fallende Flanke.

von Michael U. (amiga)


Lesenswert?

Hallo,

@ Oliver (Gast): was hast Du nur mit seinem Taster???

INT0 bzw. INT1 ist seine Nulldurchgangserkennung,
das dürften vor ihm auch andere schon mit INT0 oder INT1 gemacht haben.

Gruß aus Berlin
Michael

von Robert K. (molch) Benutzerseite


Lesenswert?

Oliver wrote:

> Was soll der Taster an PD4?? Aus meinem laienhaften Verständnis heraus
> würde ich, wenn ich per Taster den INT1 auslösen möchte, den Taster auch
> am Pin INT1 (=PD3) anschliessen. (und in der Version mit INT0 an PD2)

Soweit ich das verstehe soll nicht der Taster sondern der Nulldurchgang 
(einer Netzspannungperiode?) einen Int. auslösen.

Leider habe ich im Code selbst keinen Fehler finden können (heisst nicht 
es gibt keinen).
Vllt. nochmal die äußere Beschaltung überprüfen.

Desweiteren muss der "negative" Impuls bzw. die fallende Flanke länger 
anliegen als ein Clockcycle um sicher erkannt werden zu können.

von Oliver (Gast)


Lesenswert?

>Soweit ich das verstehe soll nicht der Taster sondern der Nulldurchgang
>(einer Netzspannungperiode?) einen Int. auslösen.

Ok, das hab ich falsch verstanden. So ist mein Beitrag oben natürlich 
sinnlos.

Oliver

von Mathias O. (m-obi)


Lesenswert?

Hallo,

nun hab ich den Fehler nach langen Suchen gefunden. Ich habe mal vor 
längerer Zeit aus versehen den Controller falschherum in die Fassung 
gesteckt und da hat anscheinend der INT1-Pin einweg bekommen. Nun hab 
ich einfach einen anderen Controller genommen und voila, es 
funktioniert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.