Hallo Leute,
ich hab ein etwas gröberes Problem mit meiner RTC (Maxim DS1302).
Sie hat ne doofe datenbitcodierung :D
Ich verwende einen PIC18F452 der in C programmiert wird. Ziel ist es die
Uhrzeit der RTC auf einem LCD auszugeben.
Probleme:
Die Codierung ist schrott. Sie ist in der Form "byte", zählt aber
dezimal.
Sprich:
Wenn ich mich nicht irre müsste also hour=14,min=30,sek=15 14:30 Uhr
(15sek) sein.
Das is ein ziemlich großes problem für mich, denn ich kann bei meiner
selber programmierten lcd funktion nur Strings ausgeben.
1
voidlcd_println(charx_pos,chary_pos,char*ptr)
2
{
3
/*** Funktion ***/
4
5
lcd_move_cursor(x_pos,y_pos);/* Position im DD-RAM einstellen */
6
while(*ptr!=0)/* Solange nicht Ende der Zeichenkette */
7
{
8
lcd_write_char(*ptr++);/* Zeichen ausgeben und nächstes adressieren */
output_b(scrn_loc[y_row-1][x_col-1]);/* Cursor-Position aus Tabelle */
36
delay_ms(2);
37
output_low(E);
38
delay_us(1);
39
output_high(RW);
40
delay_us(2);
41
42
}
Also bräuchte ich irgendwas womit ihc das umwandeln könnte. int to
string funktioniert soweit (sprintf), jedoch kommt ab einer gewissen
zeit nur noch blödsinn raus (anfangs zählt er gut, aber dann gehen die
sekunden rauf bis 90 und dann kommen erst die minuten).
Ich denke mir bleibt nicht viel mehr übrig als sich selbst den code
umzuwandeln. Leider is das nur ziemlich mühseelig da ich im prinzip mir
die variable nicht ansehen kann und somit nur vermuten kann welchen
zustand sie haben. (serielle schnittstelle vorhanden, jedoch keine
erfahrung bzw noch nicht zum laufen gebracht)
Vielleicht hat jemand von euch vorschläge.
m.f.g. Markus
Das nun folgende kann mit hoher Wahrscheinlichkeit Schwachsinn sein,
aber:
Um ein byte dezimal auszugeben, muss du doch nur wissen, das die Ziffern
0 bis 9 im ascii code an der Stelle (dezimal) 48 beginnen.
Also output_b(48+1) sollte das Zeichen '1' ergeben.
Und jetzt könntest du ja das auzugebende byte vorher in seine
dezimalstellen zerlegen. Und die dann einzeln ausgeben.
Aber damit hättest du quasi ein ganz primitives itoa gebastelt. Und
deinem Text entnehme ich, das du das ja benutzt hast.
burschi1620 wrote:
> Probleme:> Die Codierung ist schrott. Sie ist in der Form "byte", zählt aber> dezimal.
Ja, deshalb nehme ich keinen extra RTC.
Ich nehme einfach nen Timerinterrupt und lasse darin Uhrzeit und Datum
zählen. Dann habe ich alles schon im RAM und in dem Format, wie ich es
will.
Hier z.B. ein Uhrencode von mir:
Beitrag "DCF77 Uhr in C mit ATtiny26"
Peter
@ Markus
Das Ding zählt im BCD Code.
Wenn du 59 hex ausliest kommst du mit printf
auf 89 (5*16 +9).
So gehts:
char einer,zehner;
einer = (wert & 0x0F) + '0';
zehner = (wert >> 4) + '0';
Danke erstmal für die antworten.
@ Peter Dannegger, ja, timerlösung hab ich auch schon oft gelesen nur
bin ich relativ schüchtern was das betrifft... Hab keine gscheite
unterweisung in timern bekommen (nur bisschen wischi waschi auf nem
8051, und sogar das nur in theorie) und ich befürchte dass ich es nicht
zambekomm.
Sollte die RTC wirklich nicht funktionierten wie ich das will werd ich
wohl darauf zurückgreifen müssen.
@ holger, Ich denke, ich versteh was du meinst. Ich werde mir den code
morgen mal ansehen und weitertüftlen. Danke
Witzigerweise hab ich gerade das problem, dass sich die uhrzeit der rtc
nun gar nichtmehr auslesen lässt. Ich vermute es liegt an der hardware,
morgen wird alles mit durchgangsprüfer mal durchgecheckt und ne andere
RTC ausprobiert.
Sollte die rtc funktionieren kann ich mich endlich ans hauptprogramm
wagen - freu
Markus Hmmm wrote:
> @ Peter Dannegger, ja, timerlösung hab ich auch schon oft gelesen nur> bin ich relativ schüchtern was das betrifft...
Da besteht kein Grund schüchtern zu sein, Timer sind in fast jeder
Anwendung nötig.
Jede Steuerung muß Signale mit bestimmmten Zeitbedingungen auswerten und
erzeugen.
Ohne Timer wirst Du also nicht weit kommen.
Ich kennen keinen MC, der nicht mindestens einen Timer hat, die meisten
haben aber 2..3.
Eine gute Übung wäre, eine LED exakt im 1s Takt blinken zu lassen, geht
natürlich nur mit nem Quarz als CPU-Takt, nicht mit dem internen
RC-Oszillator.
Und die Timerreloadwerte und Teiler durch Rechnen ermitteln, nicht durch
ausprobieren.
Peter
ja das ist mir durchaus bewusst, nur derzeit konzentrier ich mich in dem
projekt lieber nur auf das nötigste und das "einfachste". Ich muss noch
interrupts nachlernen weil ich die benötigen werde und ich hab genau
null (praktische) ahnung davon, ich weiß nichtmal wie man einen
initialisiert g.
aber um nicht vom thema abzukommen. Ich werd mich mit timern befassen,
durch die gemütliche "delay funktion" (relativ exakte delays in us und
ms bereich) vom PIC werd ich mich aber erst nach dem projekt befassen.
Achja: Klar könnte ich auch so die Uhrzeit lösen, also mit der delay
funktion, jedoch würde das den genauigkeitsrahmen (+- 15min im jahr)
sprengen.
Markus Hmmm wrote:
> Achja: Klar könnte ich auch so die Uhrzeit lösen, also mit der delay> funktion
Das bezweifle ich.
Die Delayfunktion dürfte extrem ungenau sein und taugt nur dazu,
Minimalzeiten zu garantieren.
Nur der Timer kann unabhängig von der Programmausführungszeit und von
Interrupts laufen.
Peter