PCF8563 Uhrzeit läuft nicht weiter.

Gast #3792417
Lesenswert?

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 schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren