Zeiteinstellung DS1307

Gast #3710656
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
Gast #3710708
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?
Moderator Persönliche Seite #3710711
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.
Gast #3710720
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?
Moderator Persönliche Seite #3710725
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.....
Gast #3710726
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren