Re: Uhrenbaustein PCF8583 Kategorie: I²C-Bus (von ThomasJ - 12.02.2009 12:17) | ||
Als Antwort auf Re: Uhrenbaustein PCF8583 von Kai - 26.01.2009 20:57 | ||
| ||
> > > Hallo > > > > > > ich habe so meien Schwierigkeitenn mit dem Uhrenbaustein PCF8583 mit dem ich eine Wochenzeitschaltuhr > > > realisieren mu�. > > > Leider finde ich kein Beispei im Netz. > > > > > > Hat vieleicht jemand ein Beispiel für das Programieren des Bausteinstein wie das Einstellen derr aktuellen Zeit > > > sowie für das Auslesen der aktuellen Tageszeit... > > > > > > > > > > Hallo Thomas, > > > > leider kann ich dir auch nicht weiterhelfen, da ich ebenfalls Probleme mit dem PCF8583 habe. Mir fehlt noch > > das Verständnis für die Kommunikation, daher antwortet mir die UHr nur Unsinn. Ich benutze den Baustein > > seit 2 Jahren problemlos mit einer C2, aber da isteine gute Library vorhanden. Heute fand ich einen Beitrag > > hier im Forum wo ein ToKu schrieb er habe eine Library dafür geschrieben, vieleicht hilft er uns. > > Ich werde ihm mal eine e-mail schicken. > > > > Gru� Kai > > Schau Dir mal das hier an, zum Auslesen funktioniert das bei mir. Gesetzt habe ich den Baustein aber noch > mit der C2. Das Jahr übrigens wurde dort in den Ram geschrieben (0x10). da es nicht im PCF steht. Du > kannst jedoch von Adresse (0x05) das Schaltjahr und die folgenden lesen (vergleiche Datenblatt) und > nach einer �nderung im Register das Jahr neu berechnen und neu schreiben, wenn das dann klappt. > > > char zeile1[8], zeile2[8]; > byte minute, stunde, sekunde; > byte tag, monat, jahr; > > //--------------------------------------------------------------------------------- > void main (void) > { > LCD_Init(); > LCD_ClearLCD(); > I2C_Init(I2C_100kHz); > AbsDelay(100); > do > { > sekunde=Read_PCF(0x02) ; // Sekunden > minute=Read_PCF(0x03); // Minuten > stunde=Read_PCF(0x04); stunde= stunde & 0x3F; // Stunden mit Bitmaske > tag=Read_PCF(0x05); tag= tag & 0x3F; // Tag mit Bitmaske > monat=Read_PCF(0x06); monat=monat & 0x1F; // Monat mit Bitmaske > jahr=Read_PCF(0x10); // Jahr im RAM gespeichert > > Msg_WriteHex(sekunde); Msg_WriteChar(9); // Kontrollausgabe am PC > Msg_WriteHex(minute); Msg_WriteChar(9); // mit Tab > Msg_WriteHex(stunde); Msg_WriteChar(9); > Msg_WriteHex(tag); Msg_WriteChar(9); > Msg_WriteHex(monat); Msg_WriteChar(9); > Msg_WriteHex(jahr); > Msg_WriteChar(13); // neue Zeile > > sekunde=((sekunde>>4)*10)+ (sekunde &0x0F); // Hex in Dezimal > minute=((minute>>4)*10)+ (minute &0x0F); > stunde=((stunde>>4)*10)+ (stunde &0x0F); > tag=((tag>>4)*10)+ (tag &0x0F); > monat=((monat>>4)*10)+ (monat &0x0F); > jahr=((jahr>>4)*10)+(jahr & 0x0F); > > Display_Buffer_Set(); > LCD_CursorOff(); > LCD_CursorPos(0x00+4); LCD_WriteText(zeile1); > LCD_CursorPos(0x40+4); LCD_WriteText(zeile2); > > AbsDelay(1000); > } > while(1); > } > > > void Display_Buffer_Set(void) > { > char sep[2]; > sep=":"; > Str_WriteWord(stunde,10,zeile1,0,2); // LCD erste Zeile xx:xx:xx > Str_Copy(zeile1,sep,STR_APPEND); > Str_WriteWord(minute,10,zeile1,STR_APPEND,2); > Str_Copy(zeile1,sep,STR_APPEND); > Str_WriteWord(sekunde,10,zeile1,STR_APPEND,2); > sep="."; > Str_WriteWord(tag,10,zeile2,0,2); // LCD zweite Zeile xx.xx.xx > Str_Copy(zeile2,sep,STR_APPEND); > Str_WriteWord(monat,10,zeile2,STR_APPEND,2); > Str_Copy(zeile2,sep,STR_APPEND); > Str_WriteWord(jahr,10,zeile2,STR_APPEND,2); > } > > byte Read_PCF(byte adr) > { > byte PCF_DATA; > I2C_Start(); > I2C_Write(0xA2); //Adresse des PCF 8583 (Pin A0 =1/ ist Pin A1=0 dann 0xA0*) > I2C_Write(adr); //Adresse des zu lesenden Byte > I2C_Stop(); > I2C_Start(); > I2C_Write(0xA3); //Adresse des PCF mit Lesebit gesezt (* 0xA1) > PCF_DATA=(I2C_Read_NACK()); //lesen des Bytes Adresse adr > I2C_Stop(); > return PCF_DATA; // return I2C Data Register > } > Hallo Kai, vielen Dank für das Beispiel Info für alle die es benutzen wollen Bitte die Definition auf char zeile1[9], zeile2[9]; ändern Gru� Thomas | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum