mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik static char im Interrupt definieren


Autor: Grützelklüngel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void interrupt() org IVT_ADDR_INT6 /*iv IVT_ADDR_INT7*/ {

     SREG_I_bit=0;
     static char i=0x00;   //--> invalid expression

     if (V1_PHASE_A) i=1;  //graycode to binary
     if (V1_PHASE_B) i^=3;

     i-=stand;

     if (i==-3) i=1;
     if (i==3) i=-1;

     Wert_rel+=i;

     i=0;
     SREG_I_bit=1;
}

Autor: Nico S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grützelklüngel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Grützelklüngel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Version hier haut auch nihct so recht hin...

void interrupt() iv IVT_ADDR_INT6 {


     static char i=0x00;
     
     SREG_I_bit=0;


     if (V1_PHASE_A) i=1;  //graycode to binary
     if (V1_PHASE_B) i^=3;

     i-=stand;

     if (i==-3) i=1;
     if (i==3) i=-1;

     Wert_rel+=i;
     Stand =i;
     i=0;
     SREG_I_bit=1;
}

void interrupt2() iv IVT_ADDR_INT7  {

SREG_I_bit=0;
interrupt();
}


die Meldung:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
ISR(..., ISR_ALIASOF(...))
oder so:
ISR(INT0_vect)
    {
        PORTB = 42;
    }

    ISR_ALIAS(INT1_vect, INT0_vect);


Peter

Autor: Grützelklüngel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jeden Interrupt einfach in eine eigene Funktion ausgelagert, die 
jeweils die eigentliche Funktion aufrufen.

Vielen Dank für eure Hilfe!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.