Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> > > 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: