Forum: Compiler & IDEs ISR wird nicht aufgerufen trotz erkennen eines Interrupts


von Anton B. (hendschu)


Lesenswert?

So Hier mein Programm: Ich wäre euch sehr dankbar, wenn Ihr einen Fehler 
findet, da ich nach langem Ausprobieren mit meinem Latein am Ende bin 
:-(.
Der Interrupt wird Zwar im GIFR angezeigt aber die ISR wird nicht 
bearbeitet.


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#ifndef F_CPU
    #define F_CPU 1000000UL
#endif


uint8_t cnt = 0;      // Global für Kommunikation ISR / main


//Interrupt Taster INT0

  ISR(INT0_vekt)
{
  if(cnt==9)
    cnt=0;
    else
    cnt++;


}

int main (void) {


  uint8_t LEDs[10] = 
{0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};
  DDRA = 0x7F;
  MCUCR|=(1<<ISC00);
  MCUCR&=~(1<<ISC01);
  GICR|=(1<<INT0)  ;
  sei();


  while (1) {

    PORTA = LEDs[cnt];


}


return (0);
}


Gruß hendschu

von Peter II (Gast)


Lesenswert?

uint8_t cnt = 0;      // Global für Kommunikation ISR / main

kann nicht gehen, volatile ist das stichwort.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von hp-freund (Gast)


Lesenswert?

volatile für die Variable nicht vergessen...

von andy (Gast)


Lesenswert?

Hallo,wenn du eine Variable in der ISR veränderst,muss diese
als volantile eingerichtet werden,also volantile uint8_t cnt = 0;

gruss

andy

von andy (Gast)


Lesenswert?

Soll natürlich volatile heissen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

INT0_vekt ...

Gib' uns bitte Sourcecode, der erstmal ohne Fehler und Warnungen
compiliert, und nicht irgendwas nochmal abgetipptes.

von Anton B. (hendschu)


Lesenswert?

Danke für die schnellen Antworten!! Habe es nun mit volatile versucht 
allerdings habe ich noch das gleiche Problem wie vorher auch. Durch das 
Volatile sind allerdings die 2 Warnungen weg gegangen die ich nicht 
deuten konnte( Sorry Jörg). Falls ihr noch eine andere Idee habt lasst 
es mich wissen :-)

von Peter II (Gast)


Lesenswert?

Hendrik Schulten schrieb:
> Durch das
> Volatile sind allerdings die 2 Warnungen weg gegangen die ich nicht
> deuten konnte( Sorry Jörg

was waren das für warnungen?

von Vn N. (wefwef_s)


Lesenswert?

Auftretende Errors und Warnings nicht bekanntzugeben ist immer gut. 
Sonst wär das Ganze ja langweilig, so ohne rumraterei.

von Klaus Dieter (Gast)


Lesenswert?

Jörg hat sich aber explizit auf "INT0_vekt" bezogen. Das wird nicht mit 
"k" geschrieben, wird so also garantiert nicht kompiliert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klaus Dieter schrieb:
> Das wird nicht mit
> "k" geschrieben, wird so also garantiert nicht kompiliert.

Compiliert wird es, aber es bringt halt eine Warnung.  Diese wiederum
sollte einem nahelegen, dass man sich da vielleicht verschrieben
haben könnte …

von Werner (Gast)


Lesenswert?

Hendrik Schulten schrieb:
> ...
> #include <util/delay.h>
> #include <avr/interrupt.h>
>
> #ifndef F_CPU
>     #define F_CPU 1000000UL
> #endif

Wie soll dein Programm korrekte Delay-Zeiten erzeugen, wenn du dem 
Präprozessor die F_CPU erst nach Einbindung von delay.h verrätst?

von Pako (Gast)


Lesenswert?

Anton B. schrieb:
> Der Interrupt wird Zwar im GIFR angezeigt aber die ISR wird nicht
> bearbeitet.

Bist Du sicher, daß die ISR nicht bearbeitet wird?

Es gibt mehrere Möglichkeiten, was schief gehen kann:
1. MCU geht nicht die ISR (z.B. wegen falscher Vektorangabe).
2. MCU geht in die ISR, aber nicht mehr heraus (z.B. weil Requestflag 
nicht gelöscht wird).
3. Datenübergabe zwischen ISR und main() geht nicht (z.B. wegen 
fehlendem volatile).

von AVR-C (Gast)


Lesenswert?

die Warnung der Art "Vektor mit diesem Namen existiert nicht", führt 
schlicht dazu, daß die so definierte ISR nie ausgeführt wird. Nur wenn 
sie den richtigen Namen hat, wird sie nämlich statt "BADISR_vect" in die 
Vektor-Tabelle eingetragen, der einfach nach 0 springt (fast ein Reset).
Warnungen sollte man erst dann ignorieren, wenn man genau weiß, daß sie 
harmlos sind. Wer das genannt Problem hat, braucht da noch ein Weilchen.

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.