Forum: Mikrocontroller und Digitale Elektronik Zeiteinstellung DS1307


von Stefan (Gast)


Lesenswert?

hallo Zusammen,
ich bin dabei den DS1307 zu programmieren. Ich möchte jetzt über Taster 
die aktuelle Uhrzeit und das Datum einstellen. Die RTC läuft bereits.
Mein Problem: Die RTC benötigt zum einstellen der aktuellen Zeit die 
Werte in hex- Form (zb. 0x01 = 1 in Dez.) Ich hatte jetzt vor über den 
Taster bei jedem Drücken eine Variable hochzählen zulassen. Allerdings 
ist diese ja dann nicht in Hex. Wie kann ich das Zahlenformat in Hex 
umwandeln? Ich weiß es gibt sprintf() aber einen array nimmt der RTC 
nicht.
Kann man die Variable mit irgendetwas mal nehmen und hat dan Hex? Meine 
hätte mal so was gelesen, ich kann da aber auch was verwechseln.
Vielen Dank schon einmal
Gruß Stefan

von Lloyd (Gast)


Lesenswert?

Blatt Papier, Bleistift, ASCII Tabelle, Hirn an, fertig.

von Stefan (Gast)


Lesenswert?

okay sorry,
ich möchte ne Funktion schreiben, die das automatisch berechnet. War 
jetzt die frage ob es da in der Bibliothek etwas gibt ehe ich mir da die 
ganze arbeit machen. Ich programmiere mit dem AVR studio (C). Hab einen 
Atmega8. Gibt es da schon etwas?

von Stefan (Gast)


Lesenswert?

Das hädig zu machen ist ja kein Problem. Notfalls hilft der 
Taschenrechner :)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan schrieb:
> Mein Problem: Die RTC benötigt zum einstellen der aktuellen Zeit die
> Werte in hex- Form (zb. 0x01 = 1 in Dez.)

Deine Darstellung ist nicht korrekt. Bei Hex-Zahlen wäre 0xAB auch eine 
korrekte Uhrzeit. Es ist aber so, dass jeweils eine Ziffer pro Nibble 
(=Halbbyte = 4Bit) gespeichert wird. Diese Darstellung nennt man BCD und 
hat mit dem Hexadezimalsystem nichts zu tun.

Sonst kann ich mich nur meinem Vorredner anschließen: Einfach überlegen, 
wie Du zwei Ziffern in die BCD-Darstellung bringst. Eine ASCII-Tabelle 
ist dafür aber gar nicht notwendig. Es ist viel einfacher.

von Max H. (hartl192)


Lesenswert?

Stefan schrieb:
> Wie kann ich das Zahlenformat in Hex
> umwandeln?
Der µC arbeitet intern binär, und hex ist nur eine Art kurzschreibweise 
von binär. https://de.wikipedia.org/wiki/Hexadezimalsystem

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

BCD-Darstellung geht so:
1
stunde_bcd = (stunde_zehner << 4) + stunde_einer;    // | statt + geht auch

Dasselb für die Minuten usw. Eine Lib ist für so etwas triviales nicht 
notwendig.

von Stefan (Gast)


Lesenswert?

ja aber mein Problem: Übergebe ich dem RTC eine 0x0A wird die Uhr auf 10 
gestellt. Übergebe ich ihm nur eine 10 wird sie logischerweise auf 16 
gestellt. Da ich eine Variable hochzählen möchte kann ich schlecht 
direkt ne Hex- Zahl geben. Aus deisem grun müste ich die Variable vor 
dem Übergeben umformen. Nur wie?

von Amateur (Gast)


Lesenswert?

Wenn Du Platz hast: sprintf ( ZurUhr, "%"X",  Uhrzeit );
oder                sprintf ( ZurUhr, "%"2X", Uhrzeit );
mit:
char ZurUhr [ 3 ];
int  Uhrzeit;

von Stefan (Gast)


Lesenswert?

Frank M. schrieb:
> BCD-Darstellung geht so:
> stunde_bcd = (stunde_zehner << 4) + stunde_einer;    // | statt + geht
> auch

@ Frank:
das heißt ich muss meinen Wert (zb. 10) aufteilen in Einer und Zehner 
und dann wie du oben schreibst verschieben usw.?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan schrieb:
> ja aber mein Problem: Übergebe ich dem RTC eine 0x0A wird die Uhr auf 10
> gestellt. Übergebe ich ihm nur eine 10 wird sie logischerweise auf 16
> gestellt. Da ich eine Variable hochzählen möchte kann ich schlecht
> direkt ne Hex- Zahl geben. Aus deisem grun müste ich die Variable vor
> dem Übergeben umformen. Nur wie?

Vergiss das mit dem Hex! Du bist komplett auf dem Holzweg! Das Format 
heisst BCD bei einer DS1307!

Hier ein ausführliches Beispiel:
1
stunde = 21;                                    // 21 Uhr
2
stunde_zehner = stunde / 10;                    // = 2
3
stunde_einer =  stunde - stunde_zehner * 10;    // = 1
4
stunde_bcd = (stunde_zehner << 4) + stunde_einer;
5
Jetzt nochs stunde_bcd in die RTC schreiben, fertig.

Das ist doch nicht soooo schwer.....

von Stefan (Gast)


Lesenswert?

Amateur schrieb:
> Wenn Du Platz hast: sprintf ( ZurUhr, "%"X",  Uhrzeit );
> oder                sprintf ( ZurUhr, "%"2X", Uhrzeit );
> mit:
> char ZurUhr [ 3 ];
> int  Uhrzeit;



Was meinst du wenn ich Platz habe? Speicherplatz meinst du? Joa sieht 
schlecht aus. Meiner Atmega8 ist voll. Muss mein Programm erst 
umschreiben. Aber deins und das vom Franlk werde ich mal ausprobieren 
die Tag.
Danke schon einmal.

von Stefan (Gast)


Lesenswert?

Perfekt das war jetzt wirklich nicht so schwer. Danke!!!!!! Habt mir 
sehr geholfen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan schrieb:
> @ Frank:
> das heißt ich muss meinen Wert (zb. 10) aufteilen in Einer und Zehner
> und dann wie du oben schreibst verschieben usw.?

Ja, siehe obiges Beispiel für die Stunde und google mal nach 
BCD-Darstellung.

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.