Forum: Mikrocontroller und Digitale Elektronik [PIC18]RTC Datenbits umwandeln


von burschi1620 (Gast)


Lesenswert?

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:
1
   byte day=01,mth=01,year=06,dow=01,hour=00,min=00,sec=00;
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
void lcd_println(char x_pos, char y_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 */
9
  }
10
}
11
12
13
void lcd_write_char(unsigned char character)
14
{
15
16
   output_low(RW);
17
    output_high(RS);
18
    output_high(E);
19
    output_b(character);             
20
    delay_ms(2);
21
    output_low(E);
22
    delay_us(1);
23
    output_low(RS);
24
    output_high(RW);
25
    delay_us(2);
26
27
28
}
29
30
31
void lcd_move_cursor(char x_col, char y_row) /* (Spalte, Zeile) */
32
{
33
    output_low(RW);
34
    output_high(E);
35
    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

von ozo (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von holger (Gast)


Lesenswert?

@ 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';

von Markus H. (burschi1620)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Markus H. (burschi1620)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

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.