Gast
#3792070
Beim PCF8563 taktet nicht. Habe an Pin2 OSCO eine Sinuswelle ist das OK oder sollte das Signal anders aussehen. Danke inzwischen.
|
Anzeige
|
PCF8563 Uhrzeit läuft nicht weiter.
Gast
#3792070
Beim PCF8563 taktet nicht. Habe an Pin2 OSCO eine Sinuswelle ist das OK oder sollte das Signal anders aussehen. Danke inzwischen.
Gast
#3792146
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.
Gast
#3792417
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);
}
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|