Forum: Compiler & IDEs timer0 interrupt c-code


von udo scharnitzki (Gast)


Angehängte Dateien:

Lesenswert?

Hi AVR Spezialisten,

arbeite seit 5 Tagen mit AVR. Probiere kleine Programme aus. Ich
verstehe nicht, warum in meinem Programm das Overflow Bit von Timer 0
nicht gesetzt wird. Nach Überlauf von Timer 0 springt das Programm zum
Anfang zurück und nicht, wie gewünscht in die Funktion


                     ISR(TIMER0_OVF_0x009)

In meinem Programm ist sicherlich ein dicker Fehler. Ich weiß aber
nicht wo. Mein Simulator in AVR Studio konnte mir auch nicht helfen.

Bitte um Hilfe für dieses Programm und würde mich über Alternativen
freuen.

Danke im Voraus an alle Hotliner.

Gruß

Udo

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


Lesenswert?

> ISR(TIMER0_OVF_0x009)

Woher hast du den Namen denn her?

Leider schreibst du nicht, was für einen AVR du hast, kann ich
also nicht nachgucken, wie der Vektor genau heißen muss.  Auf
jeden Fall etwas mit _vect am Ende, also vielleicht

ISR(TIMER0_OVF_vect)

Die Compilerwarnung (oder das Fehlen ebendieser) sollte dir sagen, ob
du richtig liegst oder nicht.

von udo scharnitzki (Gast)


Lesenswert?

Danke Jörg für Deine schnelle Antwort.

Habe ISR(TIMER0_OVF_vect)in den Foren gesehen und in einer Tabelle die
VECTORADRESSE 0x009 vom ATmega8 eingeben. Vorher stand in meinem
Programm nur der Funktiosaufruf ISR(TIMER0_OVF_vect). Funktion wurde
nicht angesprungen. Dann habe ich VECTOR Adresse 0x009 für vect
eingesetzt. War ein Versuch. Weil ich nicht so richtig durchblicke.
Ging auch nicht.

Ich finde so gut wie keine Dokumentation im Internet über die Funktion
ISR(TIMER0_OVF_vect). Kenne noch nicht die Zusammenhänge in der AVR
c-Programmierung.

Also der Prozessor ist der ATmega8.

Ich bin sicher, daß Du mir auf die Sprünge helfen kannst.

Gruß

Udo

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


Lesenswert?

Du hast ein WinAVR?  Dann solltest du die Dokumentation zu allererst
mal auf deiner Festplatte suchen. ;-)

Im Internet:

http://www.nongnu.org/avr-libc/user-manual/index.html

Speziell:

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

(Unterstriche in Links sind in diesem Forum leider kaputt, musst du
manuell kopieren.)

TIMER0_OVF_vect ist korrekt für den ATmega8.

Dein Code sollte weiter nichts draußen Feststellbares tun als Port C
Bit 0 auf 1 zu setzen (nach ca. 1/4 Sekunde, falls du nicht an den
Fuses für den Takt gedreht hast).

von Marian (Gast)


Lesenswert?

Woher weißt du denn, dass er nicht in die ISR springt? Wie stellst du
das fest? Wie Jörg schon geschrieben hat, kann man doch von außen gar
nicht sehen ob er es tut oder nicht. Oder hast du da ne LED dran?

von udo scharnitzki (Gast)


Lesenswert?

Hallo Marian,

zu Prüfzwecken teste ich zunächst auf dem Simulator und in der
Schaltung gebe ich die Daten kurz auf Leds aus, die mir anzeigen, daß
der Interupt angesprungen wurde. Funktioniert zufriedenstellend.

Mittlerweile funktioniert mein Timerinterrupt mit

ISR(TIMERO_OVF_vect).

Aber Vorsicht bei verschiedenen AVRs. Beim mega8 heißt die Routine

     ISR(TIMERO_OVF_vect) und beim 2313

     ISR(TIMERO_OVF0_vect).  Die "0" hatte ich anfangs übersehen.

Hat mich als Anfänger viel Zeit gekostet, bis ich in den io.h Dateien
den Unterschied bemerkte. In der Anfangszeit verliert man sehr schnell
den Überblick. Aber jetzt lichtet sich mein Blick langsam für die
C-Syntax.


Gruß

Udo

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


Lesenswert?

Steht auch in der Doku. ;-)

Beschwer' dich bei Atmel, die Namen sind aus deren XML-Dateien
generiert.  Eigentlich sollten sie mit den Namen im Datenblatt
übereinstimmen.

Ich hätte es auch lieber gesehen, wenn sie für alle Controller
einheitliche Namen benutzen würden.

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.