Forum: Mikrocontroller und Digitale Elektronik RTC DS1307 Ausgabeformat


von Flor B. (florben)


Lesenswert?

Hallo zusammen,

ich benutze eine RTC DS1307 für eine Uhren-Projekt.
Ein Atmega 328P schreibt und liest die Daten von der RTC und gibt diese 
über eine UART-Schnittstelle aus.
Die RTC funktioniert auch soweit. Nur habe ich ein Problem mit dem 
Zahlenformat. Die RTC gibt alle Werte in hex aus.

gibt es eine einfache Möglichkeit diese hex Daten in Dezimal 
umzuwandeln?

Programmiersprache C

Danke im  Voraus.

von holger (Gast)


Lesenswert?

>Die RTC gibt alle Werte in hex aus.

Falsch, sie gibt sie in BCD aus. Einfach mal nach BCD suchen.

von Michael U. (amiga)


Lesenswert?

Hallo,

holger schrieb:
> Falsch, sie gibt sie in BCD aus. Einfach mal nach BCD suchen.

genaugenommen sogar im Packed BCD, also 2 Ziffern in einem Byte, 7..4 
zehner, 3..0 Einer.
Allerdings sind die Ausnahmen bei Sekundenzehner (CH-bit) und 
Stundenzahner (AM/PM-Unterscheidung) zu beachten.

Gruß aus Berlin
Michael

von derjaeger (Gast)


Lesenswert?

The time and calendar information is obtained by reading the appropriate 
register bytes. Table 2 shows
the RTC registers. The time and calendar are set or initialized by 
writing the appropriate register bytes.
The contents of the time and calendar registers are in the BCD format. 
The day-of-week register
increments at midnight. Values that correspond to the day of week are 
user-defined but must be
sequential (i.e., if 1 equals Sunday, then 2 equals Monday, and so on.) 
Illogical time and date entries
result in undefined operation. Bit 7 of Register 0 is the clock halt 
(CH) bit. When this bit is set to 1, the
oscillator is disabled. When cleared to 0, the oscillator is enabled.

von Joachim B. (jar)


Lesenswert?

holger schrieb:
> Einfach mal nach BCD suchen.
1
uint8_t bcdtoint( uint8_t bcd )
2
{  return ((uint8_t)(((bcd>>4)*10)+(bcd&15)));
3
} // uint8_t bcdtoint( uint8_t bcd )
4
5
uint8_t int2bcd( uint8_t integer )
6
{  return ((uint8_t)(((integer/10)<<4)+(integer%10)));
7
} // uint8_t int2bcd( uint8_t integer )

oder gleich am Arduino ds1307new.lib nutzen
https://github.com/olikraus/ds1307new/blob/master/DS1307new.h

PS das DS3231 ist kompatibel aber viel genauer und stabiler

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.