Forum: Compiler & IDEs Timer0 Asyncron Overflow Interrupt kommt nicht (Mega128)


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Anbei ein Projekt von mir, mit einem Problem, was mich ca. 2 Tage 
gekostet hat.

Das ganze läuft auf einem ATMega 128 und einem Uhrenquartz für Timer 0. 
Ich nutze  gcc 4.3.0 mit Eclipse.

Das Problem war, das ab und zu der Overflow Interrupt für Timer 0 nicht 
kam. Im Datasheet für den Mega 128 habe ich im Errata für den Timer 2 
dann folgendes gefunden:

>2. Interrupts may be lost when writing the timer registers in the
>asynchronous timer
>If one of the timer registers which is synchronized to the asynchronous
>timer2 clock is written
>in the cycle before a overflow interrupt occurs, the interrupt may be
>lost.
>Problem Fix/Workaround
>Always check that the Timer2 Timer/Counter register, TCNT2, does not have
>the value 0xFF
>before writing the Timer2 Control Register, TCCR2, or Output Compare
>Register, OCR2

Nachgedacht --> Timer 0 läuft ja auch Asynchron!

Dann das Projekt welche im Anhang ist zusamengebaut, und siehe da, der 
Overflow wird NIE ausgeführt wenn der Timer auf 0xFF steht und in OCR0 
was rein geschrieben wird(egal was!). --> die LED die bei mir an PORT B 
7 ist Blinkt nicht!

Bei mir hat sich das nur selten geäußert, das OCR0 immer mit +=9 
verwendet wurde.Nur dann halt wenn Timer 0 auf 0xff stand

Will das hier schreiben, falls einer das gleiche Problem mal haben 
sollte. In meine Projekt hab ich mir nen Workaround gebastelt, läuft 
jetzt zuverlässig!

Auch eine Frage: kann mann sich irgendwie an Atmel wenden oder kennt da 
jemand einen, das die das eventuel ins Errata aufnehmen?

Gruß Stefan

von Falk B. (falk)


Lesenswert?

@ Stefan (Gast)

>Das ganze läuft auf einem ATMega 128 und einem Uhrenquartz für Timer 0.

Ist irgendwie doof, dass Atmel es nicht geschafft hat, die Module der 
AVRs einheitlich zu gestalten. Bei den meisten AVRs ist nämlich der 
Timer 2 asynchron taktbar.

>sollte. In meine Projekt hab ich mir nen Workaround gebastelt, läuft
>jetzt zuverlässig!

Und wo ist der Workaround? In deinem Projekt im Anhang eher nicht.
Ausserdem überfährst du den Quarz immer noch.

1) er muss erst sauer anschwingen, so lange sollte man warten.
2) Du musst nach dem letzten Zugriff und Freischalten der Interrupts 
noch warten, bis der Zugriff asynchron beendet wird, sonst kann es 
passieren, dass der Interrupt nicht aktiv wird, vor allem bei Verwednung 
der Sleep Modes.

Siehe auch

http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC#Beispielprogramm

, so ist es wasserdicht.

>Auch eine Frage: kann mann sich irgendwie an Atmel wenden oder kennt da
>jemand einen, das die das eventuel ins Errata aufnehmen?

Wozu? Es steht doch im Datenblatt.

MfG
Falk

von Peter D. (peda)


Lesenswert?

Stefan wrote:
>>2. Interrupts may be lost when writing the timer registers in the
>>asynchronous timer
>>If one of the timer registers which is synchronized to the asynchronous
>>timer2 clock is written
>>in the cycle before a overflow interrupt occurs, the interrupt may be
>>lost.
>>Problem Fix/Workaround
>>Always check that the Timer2 Timer/Counter register, TCNT2, does not have
>>the value 0xFF
>>before writing the Timer2 Control Register, TCCR2, or Output Compare
>>Register, OCR2

Ja, typischer Copy&Paste-Fehler, findet man häufig in den 
AVR-Datenblättern.
Man muß immer ein bischen mitdenken.

Bei vielen AVRs ist T2 der mit dem Uhrenquarz, nur beim ATmega128 ist es 
T0.
Aber aufpassen, beim Nachfolger ATmega1281 ist es wieder T2!


Peter

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.