www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zur genauen Sekunde


Autor: Praktikant (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_...

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Praktikant (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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 . . .

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.