mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Datum bei PCF8583!


Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi  liebe Gemeinde!

Ich proge in C und habe mich mal an den PCF 8583 gewagt. Klappt alles
schön mit dem beschreiben der Uhrzeit und dem Auslesen.Probleme hab ich
jedoch beim Datum.
Das Setzen des Datums geht und ich kann mir am Display auch anschauen
welches Datum ich zuvor eingeschrieben habe.Das Problem ist jedoch,dass
weiterzählen.
Die Tage werden richtig inkrementiert aber bei den Monaten macht er mir
"irgendwas". Schreib ich z.B. das Datum 12/12 so bekomme ich beim
Überlauf 13/32 er. Bei z.B. 6/8 kommt dann 7/28er.er adiiert mir immer
20 hinzu und erhöht die Monate aber nicht.

Habt ihr vielleicht ne Idee was das sein kann? wie machst es ihr?
Wäre echt froh wenn ihr weiterhelfen könntet.

Mfg Cri

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwei schnelle Vermutungen ... ohne Datenblatt im Zugriff und ohne deinen 
Code zu kennen ...

A) Der PCF8583 erwartet/liefert BCD (daran kann ich mich erinnern).

Du musst also vor dem setzten des Datums deine binären Werte in 
(Packed-) BCD wandeln, und nach dem Auslesen von BCD nach Binär.

Datum dezimal 12. Dezember
-> Binär: 0x0C + 0x0C -> wandeln nach BCD 0x12 + 0x12

B) Der Monat muss "Monate seit dem 1.1." angegeben werden. d.H. Januar = 
0, Februar = 1, ...; Damit ist der Wert 12 ungültig und das Verhalten 
des Bausteines undefiniert.


A) + B)

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Werner!

Danke erstmal!

Ahm... Punkt A ist klar.Ich übergebe bei setzen des Datums auch 
0x12,0x12 und das kann ich dann am Display auch sehen aber beim Auslesen 
NAHC dem inkrementieren des Datums kommt halt das genannte Problem.
Punkt B versteh ich nicht so gut...wie müsste ich den das programm 
gestallten um das Datum richtig auszulesen?

mfg Cri

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist wirklich nur eine Vermutung....
Der PCF verwaltet den Monat als index, ähnlich eines Arrays in C.
Hier greift man auf das erste Element (in unserem Fall "Januar") ünder 
den index 0 (NULL) zu. Also steht für den PCF die 0 für den Januar und 
analog die 11 für den Dezember; Damit gäbe es keinen Monat 12, und nicht 
die 1 (wie für uns Menschen). Das muss aber im Datenblatt stehen.... 
habe gerde nachgesehen... vergiss es.

Andere Vermutung: Maskierst du nach dem lesen den Wochentag aus?

Pseudocode:
monat = lesen_location_6(PCF) & 0x1F;
wochentag = (lesen_location_6(PCF) & 0xE0) >> 5;

Das würde den 20-iger Sprung erklären, weil der Wochentag von 0 auf 1 
springt.

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meinst du das mask flag im CTRL-Register? Das hab ich ausgeschaltet(aber 
auch schon mit log 1 probiert->vergebens).

so lese ich den PCF aus:

uchar rec_byte_8583(void)
{
  unsigned char i,zeich = 0;
  unsigned char mask = 0x80;

  for(i=0;i<8;i++)
  {
    SCL = 0;
    wait(op_time);
    zeich = (int)SDA? (mask | zeich) : zeich;
    mask >>= 1;
    wait(op_time);
    SCL = 1;
    wait(op_time);
  }
  return(zeich);
}

und das Datum dann so:

void get_date(void)
{
      start_cond();
      wr_byte_8583(0xA0); // Adresse des PCF R/W = 0
      wr_byte_8583(0x05); // Adresse des Jahre/Datums-Registers
      start_cond();
      wr_byte_8583(0xA1); // R/W = 1 (= LESEN)
      day = rec_byte_8583();
      stop_cond();

      start_cond();
      wr_byte_8583(0xA0); // Adresse des PCF R/W = 0
      wr_byte_8583(0x06); // Adresse des W-Tage/Monate-Registers
      start_cond();
      wr_byte_8583(0xA1); // R/W = 1 (= LESEN)
      mon = rec_byte_8583();
      stop_cond();

      sprintf(get_value2,"DATE:%2x/%2x",(int)day,(int)mon);
      print_lcd(1,1,get_value2);
}

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich meine damit dass nur die unteren 5 Bit des Bytes bei Offset 6 
im PCF dem Monat gehören. Die oberen 3 Bit gehören dem Wochentag. Den 
musst du erst wegschneiden.


Damit sollte es gehen
...
      mon = rec_byte_8583();
      stop_cond();

      mon &= 0x1F; /* Maskiere Monat aus DOW/MON */ 

      sprintf(get_value2,"DATE:%2x/%2x",(int)day,(int)mon);
      print_lcd(1,1,get_value2);
}

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Werner!!!

Jetzt kapier ich auch was du meinst! der AHA - Effekt :) Ist eigentlich 
klar,dass die Bits ausmaskiert werden müssen aber ich war zu blöd um es 
zu sehen.

Ich werd das dann probieren...vielleicht gehts sichs heute noch aus. Ich 
schreib dann ob es geklappt hat oder nicht.

Danke nochmals für deine Hilfe!

Mfg Cri (hoffe du hilfst mir dann weiter falls es noch hängt ;) )

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Werner!!

Danke für deine schnellen Antworten.

Habe es gerade geändert und nun funzt es richtig!!!

Mfg Cri

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.