Forum: Mikrocontroller und Digitale Elektronik Atmega8, TIFR-T0V0


von PC-Anfaenger (Gast)


Lesenswert?

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?
von Krapao (Gast)


Lesenswert?

Ja
von PC-Anfaenger (Gast)


Lesenswert?

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?
von Krapao (Gast)


Lesenswert?

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.
von PC-Anfaenger (Gast)


Lesenswert?

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
von Krapao (Gast)


Lesenswert?

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.
von spess53 (Gast)


Lesenswert?

Hi

>Wenn du alle
>Vektoren der Tabelle belegst, reicht ein .org am Anfang.

Selbst das braucht man nicht.

MfG Spess
von Krapao (Gast)


Lesenswert?

Stimmt, geht ja bei den AVRs bei 0x0000 direkt mit der Vektortabelle 
los.
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.