mikrocontroller.net

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


Autor: burschi1620 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
   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.
void lcd_println(char x_pos, char y_pos, char *ptr)
{
  /*** Funktion ***/

  lcd_move_cursor(x_pos,y_pos);  /* Position im DD-RAM einstellen */
  while(*ptr != 0)      /* Solange nicht Ende der Zeichenkette */
  {
    lcd_write_char(*ptr++);  /* Zeichen ausgeben und nächstes adressieren */
  }
}


void lcd_write_char(unsigned char character)
{

   output_low(RW);
    output_high(RS);
    output_high(E);
    output_b(character);             
    delay_ms(2);
    output_low(E);
    delay_us(1);
    output_low(RS);
    output_high(RW);
    delay_us(2);


}


void lcd_move_cursor(char x_col, char y_row) /* (Spalte, Zeile) */
{
    output_low(RW);
    output_high(E);
    output_b(scrn_loc[y_row - 1][x_col - 1]);             /* Cursor-Position aus Tabelle */
    delay_ms(2);
    output_low(E);
    delay_us(1);
    output_high(RW);
    delay_us(2);

}


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

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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';

Autor: Markus Hmmm (burschi1620)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Hmmm (burschi1620)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.