Beim PCF8563 taktet nicht. Habe an Pin2 OSCO eine Sinuswelle ist das OK oder sollte das Signal anders aussehen. Danke inzwischen.
Erst wenn er mit "Daten" gefüttert wird, fänger auch an zu "laufen". Nur Spannungsversorgung ran bekommst Du 0:00:00 raus und die Zeit steht.
Die Routine dazu: Das Setzen und Auslesen der Uhrzeit funktioniert. Jedoch steht die Zeit still. #include "twimaster.h" #include "PCF8563.h" #include <avr/delay.h> #define BIN2BCD(b) (((b)%10) | (((b)/10)<<4)) #define BCD2BIN(b) (((b)&0xf) + ((b)>>4)*10) #ifndef F_CPU #define F_CPU 4000000L #endif int init_rtc(void){ int tmp=0; int val=0; for(tmp=0;tmp<100;tmp++); //theoretisch unnötig. Praktisch schon i2c_start(PCF8574A_WRITE);; i2c_write(0x00); i2c_write(0x00); //ControlRegister0 i2c_write( (1<<4) | (1<<0) ); //ControlRegister1: TP & TIE setzen i2c_stop(); for(tmp=0;tmp<100;tmp++); i2c_start(PCF8574A_WRITE); i2c_write(0x09); i2c_write(0x80); //AE disabled min i2c_write(0x80); //AE disabled hour i2c_write(0x80); //AE disabled day i2c_write(0x80); //AE disabled weekday i2c_write(0x80); //CLKOUT enabled@32.768kHz i2c_write(0x82); //Timer mit 1Hz aktivieren i2c_write(0x01); //Timer laden 1s (test) i2c_stop();; for(tmp=0;tmp<100;tmp++); i2c_start(PCF8574A_WRITE); i2c_write(0x02); i2c_rep_start(PCF8574A_READ); val = i2c_readNak(); i2c_stop(); if(val & 0x80) //Stromausfall? VL-Flag reset und Date/Time reset return(1); //Bit7==1 -> Stromausfall - reset_rtc() angezeigt else return(0); } void time2clock(void) { i2c_start(PCF8574A_WRITE); i2c_write(0x02); i2c_write(BIN2BCD(DT.sec)); i2c_write(BIN2BCD(DT.min)); i2c_write(BIN2BCD(DT.hour)); i2c_stop(); return 0; } void start_clock(void) { i2c_start(PCF8574A_WRITE); i2c_write(0x00); i2c_write(0b00000000); i2c_write(0b00010001); i2c_stop(); i2c_start(PCF8574A_WRITE); i2c_write(0x0E); i2c_write(0b10000010); i2c_stop(); return 0; } void getTime(void) { int ret=0; int sekunde; i2c_start_wait(PCF8574A_WRITE); // set device address and write mode i2c_write(0x02); // write address = 5 i2c_rep_start(PCF8574A_READ); // set device address and read mode DT.sec = i2c_readAck() & 0x7F; DT.min = i2c_readAck() & 0x7F; DT.hour = i2c_readAck() & 0x3F; DT.sec = BCD2BIN(DT.sec); DT.min = BCD2BIN(DT.min); DT.hour = BCD2BIN(DT.hour); //Date DT.day = i2c_readAck() & 0x3F; DT.wday = i2c_readAck(); DT.mon = i2c_readAck() & 0x1F; DT.year = i2c_readNak(); i2c_stop(); } void init_PCF8574A() { i2c_init(); } void init_PCF8563() { i2c_init(); } void set_output_PCF8563(int data) { int i; i2c_start(PCF8563_WRITE); i2c_write(data); i2c_stop(); } int read_Input_PCF8563() { int temp=0; i2c_start(PCF8563_WRITE); i2c_write(PCF8563_READ); temp = i2c_read(0); i2c_stop(); return(temp); } int check_i2c_PCF8563() { int ret=0; ret = i2c_start(PCF8563_WRITE); // set device address and write mode if ( ret ) { /* failed to issue start condition, possibly no device found */ i2c_stop(); uart_puts("63 Fehler ret"); // activate all 8 LED to show error */ }else { uart_puts("63 i2c ok!"); } return(ret); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.