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
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?
Das hädig zu machen ist ja kein Problem. Notfalls hilft der Taschenrechner :)
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.
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
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.
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?
Wenn Du Platz hast: sprintf ( ZurUhr, "%"X", Uhrzeit ); oder sprintf ( ZurUhr, "%"2X", Uhrzeit ); mit: char ZurUhr [ 3 ]; int Uhrzeit;
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.?
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.....
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.
Perfekt das war jetzt wirklich nicht so schwer. Danke!!!!!! Habt mir sehr geholfen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.