Forum: Mikrocontroller und Digitale Elektronik Fehler in Artikel? ("AVR - Die genaue Sekunde / RTC")


von Sebastian S. (sebis)


Lesenswert?

Hi,

ich implementiere gerade eine RTC in einen AVR und orientiere mich dabei 
am Artikel: AVR - Die genaue Sekunde / RTC

Ich glaube ich habe da einen kleinen Fehler gefunden, bin aber zu 
unsicher um ihn selbst zu ändern. (frickelnder Anfänger)
Folgender Code steht im Artikel:
1
// hier alles eintragen
2
//#define F_CPU      11059201L   // Nominalwert des CPU-Taktes
3
#define F_CPU        11059008L   // gemessener Wert, Abweichung -1.5s/d
4
#define F_TIMER      256L        // Timer1 ISR-Frequenz
5
#define T1_PRESCALER 1           // Hardware-Vorteiler für Timer 1, 
6
                                 // muss mit der Konfiguratiom übereinstimmen!  
7
// hier wird alles berechnet
8
#define OCRx_RELOAD ((F_CPU / (T1_PRESCALER * F_TIMER)) -1) // Periodendauer pro Interrupt /Timertakte
9
                                                            // -1, weil die Timerperiode OCR1x +1 ist
10
#define REST         (F_CPU % (T1_PRESCALER * F_TIMER))     // Divisionsrest

Hier ist das Ziel, den Timer auf den Takt genau 256 /s durchlaufen zu 
lassen. Um den Rest zu verarbeiten wird dieser in einem der 256 
Timerdurchläufe in das OCR1A addiert:
1
OCR1A = OCRx_RELOAD + REST;

Wenn ich das richtig verstehe repräsentiert der REST genau die Anzahl 
der Takte die sonst in einer Sekunde fehlen. Da aber der Takt noch durch 
den T1_PRESCALER geteilt wird müsste meiner Ansicht nach der REST vor 
der Addition ins ORC1A auch durch den T1_PRESCALER geteilt werden.
1
OCR1A = OCRx_RELOAD + (REST/T1_PRESCALER);

Im Beispiel aus dem Artikel fällt das nicht auf (Division durch 1). Ich 
bin drüber gestolpert, weil mein Timer mit Prescaler 8 läuft und die Uhr 
nachging.

VG
Sebastian

von Falk B. (falk)


Lesenswert?

Sebastian S. schrieb:
> Da aber der Takt noch durch
> den T1_PRESCALER geteilt wird müsste meiner Ansicht nach der REST vor
> der Addition ins ORC1A auch durch den T1_PRESCALER geteilt werden.

Nein, das passiert schon bei der Berechnung von OCRx_RELOAD und REST.

von Sebastian S. (sebis)


Lesenswert?

Ich bin noch nicht überzeugt, hier mal mit Werten aus meiner 
Implementation:
1
#define F_CPU        10000000L   
2
#define F_TIMER      32L        // Timer1 ISR-Frequenz
3
#define T1_PRESCALER 8           // Hardware-Vorteiler für Timer 1, 
4
                                 // muss mit der Konfiguratiom übereinstimmen!  
5
6
// hier wird alles berechnet
7
#define OCRx_RELOAD ((F_CPU / (T1_PRESCALER * F_TIMER)) -1) // Periodendauer pro Interrupt /Timertakte
8
                                                            // -1, weil die Timerperiode OCR1x +1 ist
9
#define REST         (F_CPU % (T1_PRESCALER * F_TIMER))     // Divisionsrest

REST = 128
Daraus folgt, dass für eine Sekunde der Timer 31 mal bis OCRx_RELOAD = 
39061 und einmal bis OCRx_RELOAD + REST = 39061 + 128 = 39189 hochzählt. 
Hinzu kommen 32 zusätzliche Timertakte für das zurücksetzen des Counters 
nach dem Comparematch.

--> 31 x 39061 + 1 x 39189 + 32 = 1250112 Timertakte (entspricht 
10.000.896 CPU-Takten / "Sekunde") (Uhr läuft zu langsam)

Wird der REST vorher durch den Timer Prescaler geteit, stimmt es exakt:
REST / T1_PRESCALER = 128/8 = 16

--> 31 x 39061 + 1 x 39077 + 32 = 1250000 Timertakte (entspricht 
10.000.000 CPU-Takten /s)

Ich hoffe das ist halbwegs nachvollziehbar.

von Falk B. (falk)


Lesenswert?

Sebastian S. schrieb:
> Ich bin noch nicht überzeugt, hier mal mit Werten aus meiner

> Implementation:
> #define F_CPU        10000000L
> #define F_TIMER      32L        // Timer1 ISR-Frequenz

Willst du WIRKLICH 32 Hz haben?

> #define T1_PRESCALER 8           // Hardware-Vorteiler für Timer 1,
>                                  // muss mit der Konfiguratiom
> übereinstimmen!
> // hier wird alles berechnet
> #define OCRx_RELOAD ((F_CPU / (T1_PRESCALER * F_TIMER)) -1) //
> Periodendauer pro Interrupt /Timertakte
>                                                             // -1, weil
> die Timerperiode OCR1x +1 ist
> #define REST         (F_CPU % (T1_PRESCALER * F_TIMER))     //
> Divisionsrest
>

OCRx_RELOAD = 10 MHz / (8 *32) -1 = 39061
REST = 10 MHz % (8 *32) = 128

> REST = 128
> Daraus folgt, dass für eine Sekunde der Timer 31 mal bis OCRx_RELOAD =
> 39061 und einmal bis OCRx_RELOAD + REST = 39061 + 128 = 39189 hochzählt.

Ja. Ergibt 31*39062 + 1*(39062 + 128) = 1250112 Timer-Takte. Der Timer 
läuft mit 10 MHz / 8 = 1.250.000 Hz

Hmmm, da gibt es eine Differenz von 112 Takten 8-0

> Hinzu kommen 32 zusätzliche Timertakte für das zurücksetzen des Counters
> nach dem Comparematch.

Jain, aber so rechnet man das nicht. Eher so wie oben. Der Timer zählt 
immer OCRx+1 Takte, hier also 39061+1 bzw. 39061+1+128

> --> 31 x 39061 + 1 x 39189 + 32 = 1250112 Timertakte (entspricht
> 10.000.896 CPU-Takten / "Sekunde") (Uhr läuft zu langsam)

Stimmt!

> Wird der REST vorher durch den Timer Prescaler geteit, stimmt es exakt:
> REST / T1_PRESCALER = 128/8 = 16
>
> --> 31 x 39061 + 1 x 39077 + 32 = 1250000 Timertakte (entspricht
> 10.000.000 CPU-Takten /s)

Wo kommt jetzt die 39077 her? Und die 32?

> Ich hoffe das ist halbwegs nachvollziehbar.

Jetzt schon. Ich würde es aber anders schreiben

31* 39062 + 1* (39062 + 16) = 1250000.

Uuuuups, da hat sich ein Fehler ziemlich lange in dem Beispiel gehalten, 
das sicher hunderte Leute kopiert haben, ich auch 8-0

Also so.
1
#define REST ((F_CPU % (T1_PRESCALER * F_TIMER))/T1_PRESCALER)

von Sebastian S. (sebis)


Lesenswert?

Danke ;-)

Falk B. schrieb:
> Willst du WIRKLICH 32 Hz haben?

Ja, die 32Hz nutze ich gleichzeitig als Takt zur Erzeugung eines 
"schleichenden Sekundenzeigers". Mehr wäre overkill.

Es wird eine WS2812-LED Uhr. (BTW, vielen Dank für den asm-Schnipsel aus 
deinem Night-Rider-Lauflicht.) Im Gegensatz zum hier besprochenen 
RTC-Code habe ich da kapituliert bei dem Versuch ihn nachzuvollziehen. 
Kommt später...

VG
Sebastian

von Bernd (Gast)


Lesenswert?

Sebastian S. schrieb:
> Ja, die 32Hz nutze ich gleichzeitig als Takt zur Erzeugung eines
> "schleichenden Sekundenzeigers".
Was ist denn ein schleichender Sekundenzeiger?
Sowas wie bei den Bahnsteiguhren? Obwohl, da ist der Sekundenzeiger ja 
eher zu schnell und muss dann warten, bis die neue Minute losgeht...

von Sebastian S. (sebis)


Lesenswert?

Bernd schrieb:
> Was ist denn ein schleichender Sekundenzeiger?

Die Anzeige läuft über 60 kreisrund angeordnete LEDs (WS2812). Der 
schleichende Sekundenzeiger "springt"  nicht sekündlich von LED zu LED 
sonder fadet sanft von der aktuellen LED zu Nächsten. (Bsp. 20,5s --> 
LED[20] und LED[21] leuchten jeweils mit halber Helligkeit. Das ganze in 
1/32s Intervallen.
Aktuell noch ohne Bahnhofsuhr-Effekt, aber danke für die Idee. ;-)

von Bernd (Gast)


Lesenswert?

Sebastian S. schrieb:
> sonder fadet sanft von der aktuellen LED zu Nächsten
Ah, danke. Ja, das dürfte ganz nett aussehen...

von Sebastian S. (sebis)


Lesenswert?

Hi zusammen,

es ist zwar schon etwas her, aber ich habe die Uhr fertig. Es sind ein 
paar Bilder und ein Video im uhrforum gepostet. Link: 
https://uhrforum.de/threads/diy-thread-fuer-eigenbau-und-custom.140276/post-7222837

Falls Interesse besteht kann ich irgendwann hier nochmal etwas 
ausführlicher Vorstellen.

@Bernd, danke übrigens nochmal für den Vorschlag mit dem 
Bahnhofsuhreffekt, der Sekundenzeiger ist zwar nicht zu schnell und muss 
nicht warten, aber der Minutenzeiger bewegt sich erst zur vollen Minute 
(auch schleichend).

VG
Sebastian

: Bearbeitet durch User
von HildeK (Gast)


Lesenswert?

Sebastian S. schrieb:
> Es sind ein
> paar Bilder und ein Video im uhrforum gepostet.

Sieht jedenfalls interessant aus. Mir jedoch gefällt der lange 
Minutenschwanz nicht besonders, vielleicht liegt es auch an der 
Belichtung im Video.
Ich hätte hier nur einen weichen Übergang zwischen zwei LEDs gemacht. 
Bei den Stunden ist es ähnlich, wenn auch nicht ganz so deutlich. Die 
beiden 'Zeiger' sind ja auch wesentlich langsamer unterwegs und da tut 
man sich mit einem Kometenschweif schon etwas schwerer 😀. Das wäre dann 
imho besser ablesbar. Aber: Geschmackssache!

Sebastian S. schrieb:
> Falls Interesse besteht kann ich irgendwann hier nochmal etwas
> ausführlicher Vorstellen.

Das passt perfekt in "Projekte & Code" - also: nur zu!
Es wird sicher jemand finden, der noch einen DCF-Empfänger hinzufügt...

von Sebastian S. (sebis)


Lesenswert?

Danke

HildeK schrieb:
> Mir jedoch gefällt der lange Minutenschwanz nicht besonders, vielleicht
> liegt es auch an der Belichtung im Video.

Ablesbarkeit war zweitrangig. Es gilt aktuell jedoch, je langsamer der 
Zeiger, desto länger. Der längste ist also der Stundenzeiger.

Die Gesamthelligkeit ist vom Umgebungslicht abhängig. Bei schummriger 
Abendbeleuchtung sind die Zeiger wesentlich kürzer und dunkler. Bei 
Dunkelheit geht dann der Nachtmodus an (im Video die letzten 10 
Sekunden) so störts dann nicht falls da mal Gäste schlafen.

von Bernd (Gast)


Lesenswert?

Die sanften Übergänge sehen doch ganz nett aus :-)

von Jobst M. (jobstens-de)


Lesenswert?

Jepp. Sieht gut aus! Wo hast Du den LED-Ring her?

Gruß
Jobst

von Sebastian S. (sebis)


Lesenswert?

Jobst M. schrieb:
> Wo hast Du den LED-Ring her?

Ich hatte ihn vor ca. 5-6 Jahren gekauft, such mal bei ebay nach "led 
ring 60 rgb". Direkt aus China ca. 10€ exkl. USt., aus der EU mind. 20€ 
(Achtung, manche Schelme verkaufen nur 1/4-Ring.)

von Axel R. (axlr)


Lesenswert?

Hab ich bei Mir im Billard-Club auch hingehangen. Ne alte Uhr ausm 
Schulflur, die alle Minute 60V braucht braucht, um weiterzuschalten. 
Jeweils mit inverser Polung. Da ists jedoch kein schleichender 
Sekundenzeiger, sondern, auf Wunsch, ein grüner Meteoritenregen. Aber 
vom Prinzip her, das gleiche. Sieht auch gut aus. Vielleicht finde ich 
iwo n kurzes Video dazu.

von Axel R. (axlr)


Angehängte Dateien:

Lesenswert?

Die Uhr läuft übrigens auch zu langsam 😅

: Bearbeitet durch User
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.