Go Down

Topic: Clock-Shield (RTC und DCF77 auf einem Shield) *Entwicklung* (Read 8 times) previous topic - next topic

jurs


Eine Umwandlung mit folgenden Code hat die lösung gebracht (natürlich hier aus dem Forum):
Code: [Select]
unsigned int BCDencode (unsigned int binval) {
unsigned int bcdval = 0;
for (int i=0; binval && i < sizeof(bcdval) * 8; i+=4) {
   bcdval += (binval % 10) << i;
   binval /= 10;
}
return bcdval;
}



Code-Künstler mit künstlerisch besonders wertvollem Code am Werk?

Code: [Select]

unsigned int Dec2BCD (unsigned int dezimal) {
  return((dezimal / 10) * 16) + (dezimal % 10);



Irgendwie bin ich ein Code-Kunstbanause, der die ganzen Bitschiebereien gar nicht zu würdigen weiß!
;-)

michael_x

wenn du nicht unsigned int   geschrieben hättest, sondern uint8_t oder byte, wäre dein Code gut (genug,  für 2 BCD Digits )  ;)
Weil der Compiler dein *16 richtig ( als shift Operation ) versteht.

Ansonsten ist dein Code das Gegenstück zu meinem 
   return (ram>>4)*10 + ram&0x0f;

BCDEncode ist auch für Maschinen geeignet, bei denen ein int ein beliebiges Vielfaches von 8 bit groß ist.
In einer RTC Library ist das natürlich "Kunst" ( sonst könnte es weg ).

Aber generell hat MueThoS Recht, ein DCF-Shield braucht (am einfachsten) auch eine RTC, damit man nach Reset keine 2-3 Minuten oder länger warten muss, bis man die Zeit lesen kann.

Würde mich übrigens theoretisch interessieren, wie man einen Sekunden-Puls auf die richtige Millisekunde genau synchronisiert kriegt, und wer (GPS ?) einem das bestätigen kann ?

Ohne solche Anforderung ist die DS1307+DCF Kombi allemal genau genug, schätze ich.

MueThoS

So ich fang dann nochmal von vorne an!   :0
Da ist mir zum ersten mal mein MAC mal so richtig abgeschmiert.
Und obwohl ich regelmäßig auf Speichern gedrückt habe ist alles was ich gestern ab 17:30 gemacht habe weg

jurs


Würde mich übrigens theoretisch interessieren, wie man einen Sekunden-Puls auf die richtige Millisekunde genau synchronisiert kriegt, und wer (GPS ?) einem das bestätigen kann ?


Ein bisschen was dazu schreibt die PTB dazu hier:
http://www.ptb.de/cms/fileadmin/internet/fachabteilungen/abteilung_4/4.4_zeit_und_frequenz/4.42/dcf77.pdf

Die handelsüblichen Decoder-Module liefern jedenfalls alle viel zu lange Bit-Impulse. Statt 100 und 200ms wie vorgesehen geben Pollin- und Conrad-Module viel längere Impulse, die oft 10, 20, 30 ms länger sind.

Wie exakt der Anfang des Impulses ist, keine Ahnung, aber wenn die Dauer des Impulses bei den Modulen oft 30 ms neben dem Soll liegt, dann würde ich auch bei der Signalisierung des Anfangs jedes Signals auch nicht von einer höheren Genauigkeit ausgehen.

Wie die PTB schon schreibt: Wer eine viel genauere Zeit per Funk empfangen möchte, der empfängt am besten die Zeit per GPS-Signal statt per DCF.

pylon

Quote
Wieso genauer als der Arduino-Quarz. Ist doch der auf der DS1307 der hier wichtig ist. Oder sehe ich hier was falsch?


Das hat mit Präzision zu tun. Ein UNO hat nicht einmal einen Quartz, der Resonator ist so ungenau, dass er für Zeitmessungen eigentlich ungeeignet ist. Aber ein DS1307 ist auch nur so genau wie ein Arduino mit Quartz, während ein DS3231 temperaturkompensiert ist und somit deutlich genauer läuft.

Quote
Der DS3232 braucht keinen externen Quarz?


Nein, der ist dort eingebaut.

Quote
Und wofür den Enable Eingang?


Ich denke, damit soll das Shield vom Strom getrennt werden können (wenn der Arduino sich zwecks Stromsparen schlafen legt), oder zumindest der enthaltene Kontroller soll sich auch schlafen legen.

Quote
Und wofür der Interrupt Ausgang?


Der DS3231 hat zwei programmierbare Alarm-Zeiten, die diesen Pin schalten können. Damit kann man z.B. den Arduino schlafen schicken und wird später wieder geweckt. Oder man kann zeitlich sehr genau Aktionen ausführen, indem der Interrupt-Handler damit aufgerufen wird.

Go Up