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
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.