Hallo liebe Microcontroller.net- Gemeinde! Ich tüftel momentan an der Implementierung einer RTC rum und bin auf dieses Tutorial hier gestoßen: http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC#Beispielprogramm Soweit ist das auch alles klar und schlüssig, nur ich habe ein riesen Verständnisproblem. In der Interrupt-Routine, warum wird da das TCNT2 Register mit 2 beschrieben, wenn die RTC zu schnell läuft und mit 4, wenn sie zu langsam läuft? Aus dem Bauch heraus hätte ich gesagt man muss TCNT2 mit 255 beschreiben, wenn sie zu schnell läuft und mit 1 wenn sie zu langsam läuft?! Blicke da leider garnicht durch, kann mir das bitte jemand erklären? Liebe Grüße
Praktikant schrieb: > Soweit ist das auch alles klar und schlüssig, nur ich habe ein riesen > Verständnisproblem. In der Interrupt-Routine, warum wird da das TCNT2 > Register mit 2 beschrieben, wenn die RTC zu schnell läuft und mit 4, > wenn sie zu langsam läuft? WEil irgendjemand durch Versuch und Irrtum herausgefunden hat, dass der Timer nach dem Overflow in der Zwischenzeit schon bis 3 gezählt hat, wenn man in der Overflow Routine an diese Stelle der Abfrage kommt. Was ich davon halte, sag ich lieber nicht.
Wahnsinn, das ging ja wirklich flott! Ja ich hab mir schon gedacht, dass laut dem Code eigentlich der Timer bei 3 "starten" müsste....Mei da kann man sich natürlich lange den Kopf zerbrechen....Vielen Dank für diese aufschlussreiche Antwort! Müsste man doch eigentlich auch mit nem JTAGICE "ansehen" können, oder? Gruß Jan
@ Karl heinz Buchegger (kbuchegg) (Moderator)
>Was ich davon halte, sag ich lieber nicht.
Doch sag mal, ich kenn da jemanden, der hat das Programm verbrochen . .
.
Aber bitte vorher mal das Programm UND die Kommentare/Hinweise GENAU
ansehen.
MfG
Falk, der jemanden kennt . . .
Falk Brunner schrieb: > @ Karl heinz Buchegger (kbuchegg) (Moderator) > >>Was ich davon halte, sag ich lieber nicht. > > Doch sag mal, ich kenn da jemanden, der hat das Programm verbrochen . . > . TCNT2 = TCNT2 + 1 bzw TCNT2 = TCNT2 - 1 was natürlich nicht so einfach ist, weil das ja keine atomare Operation ist und der Timer während der Addition den nächsten Tick machen könnte. -> Nicht den TCNT verändern, sondern umstellen auf CTC (bzw. PWM mit einer vorgebbaren Obergrenze) und die Obergrenze bis zu der der Timer zählt verändern. Das ist dann unkritischer. Aber auf jeden Fall, müssen die 2 bzw. 4 da aus dem Code raus und dokumentiert werden wie es zu den 2 bzw. 4 kommt. bzw. so. #define TCNT_DURING_ISR_AT_CORRECTION_POINT 3 #define NEW_TCNT_IF_TO_SLOW TCNT_DURING_ISR_AT_CORRECTION_POINT + 1 #define NEW_TCNT_IF_TO_HIGH TCNT_DURING_ISR_AT_CORRECTION_POINT - 1 Jetzt muss man noch erklären wo der Wert für TCNT_DURING_ISR_AT_CORRECTION_POINT hergekommen ist (ausgemessen, durch versuch und irrtum festgestellt, ...) und den Leser auffordern, sich den selber auszumessen. (Die Makronamen sind natürlich viel zu lang. ist schon klar.) > > Aber bitte vorher mal das Programm UND die Kommentare/Hinweise GENAU > ansehen. Ich habs gelesen. Und wenn jemand einen anderen Systemquarz benutzt wundert er sich warum seine Uhr plötzlich nicht mehr stimmt, weil die Korrektur falsch ist. Das ganze ist (wie auch im Artikel erwähnt) ein Tanz auf den Timing-Eiern. Und wir alle wissen, wie gut unsere Besucher die Artikel lesen :-)
@Karl heinz Buchegger (kbuchegg) (Moderator) > TCNT2 = TCNT2 + 1 >bzw > TCNT2 = TCNT2 - 1 >was natürlich nicht so einfach ist, weil das ja keine atomare Operation >ist und der Timer während der Addition den nächsten Tick machen könnte. Eben, was noch zusätzlich erschwert wird, wenn der Timer ASYNCHRON läuft, mit 32 kHz. Da liest man nicht einfach mal den Timer und schreibt ihn zurück. >-> Nicht den TCNT verändern, sondern umstellen auf CTC und die >Obergrenze bis zu der der Timer zählt verändern. Das ist dann >unkritisch. Ja, das wäre ein Möglichkeit. >Das ganze ist (wie auch im Artikel erwähnt) ein Tanz auf den >Timing-Eiern. Nöö, wenn man sich an die Randbedingungen hält ist das wasserdicht. Da gibt es ganz andere zeitkritische Dinge. MFG Falk
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.