Hallo, habe mal wieder ein Problem mit meinem MSP430. Und zwar möchte ich die Uhr stellen was über verschiedene Variablen passiert. Die sind bereits in meinem Programm verankert und sehen so aus: RTCHOUR=0x12; RTCMIN=0x12; RTCSEC=0x00; RTCDAY=0x12; RTCMON=0x12; RTCYEAR=0x2012; Die Uhrzeit ist jetzt 12:12:00 am 12:12:2012, dies habe ich über das Display überprüft und stimmt auch soweit. Ich möchte die einzelnen Variablen jedoch über andere Variablen vom Typ Int definieren. Aber wie bekomme ich diese in diese Form (0x"meine Zahl")? Gibt es da eine Möglichkeit mit der Hexumwandlung strtoul bzw. strtol? Hoffe mir kann jemand helfen ist schon ein bisschen eigenartig gelöst finde ich da dies ja keine Hexwerte sind oder?
> Aber wie
bekomme ich diese in diese Form (0x"meine Zahl")?
Du brauchst nichts in Hex.
Zahl ist Zahl.
Egal ob du eine Zahl in Hex oder in Dezimal ausdrückst, es bleibt immer
dieselbe Zahl. Hex bzw. Dezimal bzw. Binär sind nur unterschiedliche
Schreibweisen.
in deinem Fall brauchst du allerdings eine BCD Kodierung, daher ist Hex
eine gute Schreibweise dafür. Aber: Du musst dir nur klar machen, dass
0x12 nichts anders als 18 ist. Warum? Weil die erste Ziffer deiner Hex
Zahl für Vielfache von 16 steht und die zweite Ziffer die Einer
darstellt.
Das ist wie im Dezimalsystem.
Die Zahl 34 bedeutet, dass du 3 10-er hast und 4 einer.
0x12 hat analog dazu 1 16-er (weil du ja im Hex-System bist) und 2
Einer.
D.h. du kannst deine Dezimalzahl 23 in Zehner und Einer zerlegen
23 / 10 -> 2 da sind die Zehner
23 % 10 -> 3 da sind die Einer.
Und dann aus den Zehnern und Einer eine gleichwertige BCD Zahl
zusammensetzen
Zehner * 16 + Einer
2 * 16 -> 32
+ 3
----
35
und hast damit eine Zahl, die wenn man sie sich in Hex ansieht, den Wert
0x23 hat.
Also schreibst du dir eine Funktion, die einen int in seine BCD
darstellung überführt
1 | unsigned char ByteToBCD( unsigned char number ) |
2 | {
|
3 | unsigned char Zehner = number / 10; |
4 | unsigned char Einer = number % 10; |
5 | |
6 | return Zehner * 16 + Einer; |
7 | }
|
und verwendest sie um die Werte deiner Variablen entsprechend in einer BCD Form aufzubereiten, so wie die RTC sie haben will.
1 | RTCHOUR = ByteToBCD( hour ); |
2 | ...
|
> ist schon ein bisschen eigenartig gelöst
Eigentlich nicht. Das hat schon seinen Grund. Mit BCD kann man eine Zahl
ganz leicht in ihre '10-er' und 'Einer' zerlegen, ohne langwierig
dividieren zu müssen. Schieben und Maskieren reicht. Und das kann jeder
popelige µC aus dem Stand.
Vielen Dank! Funktioniert Prima! Jetzt hätte ich noch eine Frage und zwar wie läuft das denn mit den Jahren (4 Stellen)? Mein Code sieht jetzt bei den Jahren so aus: RTCYEAR=((clock_year/10*16)+(clock_year%10)); Hierbei erhalte ich jedoch einen falschen Wert. Muss die Berechnung hier anders durchgeführt werden?
bsp. 2012 Hier haste net nur Zehner und Einer sondern auch Hunderter und Tausender. Für die Tausender teilst du einfach durch Tausend: 2012 / 1000 = 2 Für die Hunderter guckst du den Rest der Division durch 1000 an und teilst den durch 100: (2012%1000)/100 = 0 Entsprechend für Zehner und Einer: ((2012%1000)%100)/10 = 1 (((2012%1000)%100)%10) = 2 Also 2*4096 + 0*256 + 1*16 + 2 = 8210 aber in hex 0x2012
Chris Herch schrieb: > bsp. 2012 > > Hier haste net nur Zehner und Einer sondern auch Hunderter und > Tausender. > > Für die Tausender teilst du einfach durch Tausend: 2012 / 1000 = 2 > Für die Hunderter guckst du den Rest der Division durch 1000 an und > teilst den durch 100: (2012%1000)/100 = 0 > Entsprechend für Zehner und Einer: > ((2012%1000)%100)/10 = 1 > (((2012%1000)%100)%10) = 2 > > Also 2*4096 + 0*256 + 1*16 + 2 = 8210 aber in hex 0x2012 Vielen Dank funktioniert Perfekt!
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.