www.mikrocontroller.net

Forum: GCC ISR wird nicht aufgerufen trotz erkennen eines Interrupts


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Anton B. (hendschu)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: hp-freund (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
volatile für die Variable nicht vergessen...

Autor: andy (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: andy (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Soll natürlich volatile heissen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
INT0_vekt ...

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

Autor: Anton B. (hendschu)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 :-)

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: vn nn (wefwef_s)
Datum:

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

Autor: Klaus Dieter (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 …

Autor: Werner (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Pako (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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).

Autor: AVR-C (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net