Forum: Mikrocontroller und Digitale Elektronik RTC Problem Umwandlungs Problem?!


von Dieter B. (Gast)


Lesenswert?

Hallo Freunde,


Ich habe es endlich geschafft aus meiner RTC erste Lebenszeichen zu 
holen...
Nun sehe ich auf dem Display folgendes ..... 1 2 3 4 5 6 7 8 9 16 17 
18... ?!
Wieso macht er bei 16 weiter ?

ich habe folgenden code...


Code:

i2c_start_wait(RX8564+I2C_WRITE);// Startet die I2C Kommunkation und 
wartet auf Antwort...

i2c_write(0x02);

i2c_rep_start(RX8564+I2C_READ);
ret = i2c_readNak();

ret &= 0x7F;

(ret >> 4)  + 0x30;
(ret & 0x0f) + 0x30;

char Buffer[20];
sprintf( Buffer, "%d", ret );


ks0108GotoXY(10, 40);
ks0108Puts(Buffer);

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die RTC liefert die Zahlen in BCD.

Hier hatten wir gerade das Thema:

  Beitrag "BCD zu ASCII wandeln?!"

: Bearbeitet durch Moderator
von Dieter B. (Gast)


Lesenswert?

Yalu X. schrieb:
> Die RTC liefert die Zahlen in BCD.

hierit wandel ich es doch um -->

(ret >> 4)  + 0x30;
(ret & 0x0f) + 0x30;

von holger (Gast)


Lesenswert?

>Wieso macht er bei 16 weiter ?

Weil die meisten RTC BCD codiert arbeiten.
Einfach mal BCD bei wiki nachlesen.

von holger (Gast)


Lesenswert?

>hierit wandel ich es doch um -->
>
>(ret >> 4)  + 0x30;
>(ret & 0x0f) + 0x30;

Das geht so aber nicht durch einen Compiler.
Zeig den Originalcode.

von Dieter B. (Gast)


Lesenswert?

holger schrieb:
>>hierit wandel ich es doch um -->
>>
>>(ret >> 4)  + 0x30;
>>(ret & 0x0f) + 0x30;
>
> Das geht so aber nicht durch einen Compiler.
> Zeig den Originalcode.

Sekunden ++= (ret >> 4)  + 0x30;
Sekunden ++= (ret & 0x0f) + 0x30;

funktionert auch nicht :(

von Yalu X. (yalu) (Moderator)


Lesenswert?

Dieter B. schrieb:
> hierit wandel ich es doch um -->
>
> (ret >> 4)  + 0x30;
> (ret & 0x0f) + 0x30;

Nein, diese Audrücke tun gar nichts. Mit -Wall sollte der Compiler auch 
eine entsprechende Warnung ausgeben.

Besser:
1
Buffer[0] = (ret >> 4)   + 0x30;  // Zehner
2
Buffer[1] = (ret & 0x0f) + 0x30;  // Einer
3
Buffer[2] = '\0';                 // String-Ende
4
5
ks0108GotoXY(10, 40);
6
ks0108Puts(Buffer);

von holger (Gast)


Lesenswert?

> Das geht so aber nicht durch einen Compiler.
> Zeig den Originalcode.

Geht es doch;)

Aber:
main.c:101: warning: statement with no effect
main.c:102: warning: statement with no effect

von Dieter B. (Gast)


Lesenswert?

okay danke ;)


funktioniert :-P

was mir noch aufgefallen ist...  Ich benutze ja die Lib von Peter F. für 
ein GLCD...

Wenn es eine "0" darstellt und dann eine "1" bleibt ein kleiner rest von 
der "0" auf der rechten seite und wird erst wieder mit der 2 anderst...
bei anderen Zahlen genau das gleiche Problem...
Weiß jemand abhilfe ?! Ohne das Display zu löschen?!

von Yalu X. (yalu) (Moderator)


Lesenswert?

Dieter B. schrieb:
> funktioniert :-P

Ich hoffe, du hast dir auch Gedanken darüber gemacht, warum es jetzt
funktioniert und vorher nicht.

von Sascha W. (sascha-w)


Lesenswert?

Dieter B. schrieb:
> Wenn es eine "0" darstellt und dann eine "1" bleibt ein kleiner rest von
> der "0" auf der rechten seite und wird erst wieder mit der 2 anderst...
> bei anderen Zahlen genau das gleiche Problem...
> Weiß jemand abhilfe ?! Ohne das Display zu löschen?!
das passiert immer wenn man einen Proportionalen Font verwendet - da 
belegen die Zeichen immer nur so viel Platz wie nötig.
Abhilfe:
1)
Für Zahlenwerte einen Fixed-Font verwenden - dann kann man auch mehrere 
Werte untereinander anzeigen und die Zahlen stehen immer schön 
untereinander

2)
den entsprechenden Bereich vor der Ziffernausgabe löschen,
oder den neuen Wert ausgeben, berechnen wie breit die Ausgabe war und 
den Restbereich löschen.

Sascha

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.