Forum: Mikrocontroller und Digitale Elektronik Uhr Stellen MSP430 Datentyp


von Hans-Jörg (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

>  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.

von Hans-Jörg (Gast)


Lesenswert?

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?

von Chris H. (hergi)


Lesenswert?

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

von Hans-Jörg (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.