Frage zu Atmega8, TimerCounter Das Bit TOVO bzw. TIFR wird gesetzt, wenn ein Interrupt ausgelöst werden soll. Folgende Frage - wenn bereits ein anderer Interrupt ausgelöst wird und der erst abgearbeitet wird und während dessen der Timer in Timer-Counter übergelaufen ist - wird dann auch das Bit TIFR gesetzt und der Interrupt dieses TimerControllers ausgelöst, wenn der vorige Interrupt seine Arbeit "beendet" hat?
Folgende Frage: Ich habe jetzt den Debugger laufen und beobachte die Schritte mit der F11-Taste. Ich habe jetzt mit der Maus in Timer 2 die Bits für TOIE2 und dann TOV2 gesetzt. Ich habe im Programmkopf noch keinen Interrupt mit .org für den Timer2 gesetzt. Bei TOV2 hüpft das Programm dann zu dem Interrupt-Teil, der eigentlich für Timer0 gedacht ist. Wahrscheinlich hat der nach der Adresse für Timer2 gesucht, die ncht gefunden und ist dann zur nächsten gesprungen und hat dann die Befehle dort abgearbeitet und ist dann eben zu der Sprungmarke gehüpft, die für Timer0 gedacht gewesen ist. Ist es sinnvoll sich anzugewöhnen im Programmrumpf alle Interrupts zu definieren und ggf. nach .org... nicht den Befehl rjmp XXX zu schreiben, sondern dann reti, wenn der Interrupt nicht verwendet werden soll?
Schön dass du das im Simulator nachvollziehen kannst. Im richtigen Leben würde der AVR mit dem gleichen Verhalten arbeiten, d.h. abschmieren und dein Programm würde in die Pampa reiten, was zig Stunden Fehlersuche erforderlich macht. Also nicht vergessen: Für alle freigegebenen Interrupts auch immer eine ISR schreiben. Good Practice bzw. hilfreich beim Entwickeln ist es, wenn man einen bad_irq Handler hat, bei sonstwo nicht behandelte IRQs auflaufen und wenn man dort eine Warnmeldung ausgibt.
Krapao schrieb: > Good Practice bzw. hilfreich beim Entwickeln ist es, wenn man einen > bad_irq Handler hat, bei sonstwo nicht behandelte IRQs auflaufen und > wenn man dort eine Warnmeldung ausgibt. Hi Krapao, danke fuer Deine Antworten. Wo implementiere ich denn am besten den bad_irq-Handler? Ich habe als hin- und herüberlegt - ich müsste - um es "perfekt" zu machen, jeden möglichen Interrupt am Anfang mit .org XXX definieren und jeden Interrupt, den ich nicht brauche, mit der Sprungmarke "bad_interrupt" belegen: .org XX1 rjmp XX1_inntr .org XX2 ; nicht benötigt rjmp bad_interrupt .org XX3 ... ... bad_interrupt: ... Und hier müsste man jetzt irgendwas reinschreiben, damit das Programm an der Stelle aufhört, um nachvollziehen zu können, warum das Programm abgebrochen ist??? reti
Genau so geht's. Die vielen .org sind nicht nötig, schaden aber auch nicht. Wenn du alle Vektoren der Tabelle belegst, reicht ein .org am Anfang. Das "Reinschreiben" kann im einfachen Fall eine LED plus Endlosschleife sein. Das zeigt an, dass bad_interrupt aufgerufen wurde und das µC-Programm debuggt werden mag.
Hi >Wenn du alle >Vektoren der Tabelle belegst, reicht ein .org am Anfang. Selbst das braucht man nicht. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.