Forum: Mikrocontroller und Digitale Elektronik static char im Interrupt definieren


von Grützelklüngel (Gast)


Lesenswert?

Hey zusammen,

bei dem Versuch die static-Variable im Interrupt zu deklarieren bekomme 
ich die Nachricht "invalid expression". Was ist denn daran invalid?

Ich benutze die Demo des AVR-compilers von Mikroelectronika (Mikroc) in 
der neuesten Version
1
void interrupt() org IVT_ADDR_INT6 /*iv IVT_ADDR_INT7*/ {
2
3
     SREG_I_bit=0;
4
     static char i=0x00;   //--> invalid expression
5
6
     if (V1_PHASE_A) i=1;  //graycode to binary
7
     if (V1_PHASE_B) i^=3;
8
9
     i-=stand;
10
11
     if (i==-3) i=1;
12
     if (i==3) i=-1;
13
14
     Wert_rel+=i;
15
16
     i=0;
17
     SREG_I_bit=1;
18
}

von Nico S. (Gast)


Lesenswert?

Vielleicht spricht der C-Compiler C 89 und du musst die Variable vor dem 
ersten Statement deklarieren? Also einfach die ersten beiden Zeilen 
tauschen.

von Grützelklüngel (Gast)


Lesenswert?

wunderbar, funzt prima, danke dir!

weiß jemand, wie man diese Funkton von zwei Interrupts (Int an pin 6 und 
7) triggern lassen kann? Wenn ich die Kommentarzeichen entferne, wird 
gemeckert...

von Grützelklüngel (Gast)


Lesenswert?

Die Version hier haut auch nihct so recht hin...

1
void interrupt() iv IVT_ADDR_INT6 {
2
3
4
     static char i=0x00;
5
     
6
     SREG_I_bit=0;
7
8
9
     if (V1_PHASE_A) i=1;  //graycode to binary
10
     if (V1_PHASE_B) i^=3;
11
12
     i-=stand;
13
14
     if (i==-3) i=1;
15
     if (i==3) i=-1;
16
17
     Wert_rel+=i;
18
     Stand =i;
19
     i=0;
20
     SREG_I_bit=1;
21
}
22
23
void interrupt2() iv IVT_ADDR_INT7  {
24
25
SREG_I_bit=0;
26
interrupt();
27
}

die Meldung:

14 364 Recursion or cross-calling of 'interrupt' Test Drehgeber.c

von Peter D. (peda)


Lesenswert?

Nico S. schrieb:
> Also einfach die ersten beiden Zeilen
> tauschen.

Besser den SREG_I-Mumpitz ganz weglassen. Ein Blick ins Datenblatt 
verrät nämlich, die CPU kümmert sich selber um das I-Bit.


Peter

von Peter D. (peda)


Lesenswert?

Grützelklüngel schrieb:
> Ich benutze die Demo des AVR-compilers von Mikroelectronika

Dann mußt Du dort ins Manual schauen.

Ich kenne nur den WINAVR und da geht es so:
1
ISR(..., ISR_ALIASOF(...))
oder so:
1
ISR(INT0_vect)
2
    {
3
        PORTB = 42;
4
    }
5
6
    ISR_ALIAS(INT1_vect, INT0_vect);


Peter

von Grützelklüngel (Gast)


Lesenswert?

hab jeden Interrupt einfach in eine eigene Funktion ausgelagert, die 
jeweils die eigentliche Funktion aufrufen.

Vielen Dank für eure Hilfe!

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.