Forum: Mikrocontroller und Digitale Elektronik Frage zur genauen Sekunde


von Praktikant (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Praktikant (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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 . . .

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Falk B. (falk)


Lesenswert?

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