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.