Uhr Stellen MSP430 Datentyp

Gast #2377533
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?
#2377545
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.
Gast #2377856
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?
#2379644
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
Gast #2380227
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!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.