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


von Cri G. (crigri)


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

von Werner B. (Gast)


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)

von Cri G. (crigri)


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

von Werner B. (Gast)


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.

von Cri G. (crigri)


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);
}

von Werner B. (Gast)


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
1
...
2
      mon = rec_byte_8583();
3
      stop_cond();
4
5
      mon &= 0x1F; /* Maskiere Monat aus DOW/MON */ 
6
7
      sprintf(get_value2,"DATE:%2x/%2x",(int)day,(int)mon);
8
      print_lcd(1,1,get_value2);
9
}

von Cri G. (crigri)


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 ;) )

von Cri G. (crigri)


Lesenswert?

Hi Werner!!

Danke für deine schnellen Antworten.

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

Mfg Cri

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.