Forum: Mikrocontroller und Digitale Elektronik PCF8563 Uhrzeit läuft nicht weiter.


von Christian (Gast)


Lesenswert?

Beim PCF8563 taktet nicht. Habe an Pin2 OSCO eine Sinuswelle ist das OK 
oder sollte das Signal anders aussehen. Danke inzwischen.

von djshadowman (Gast)


Lesenswert?

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.

von Christian (Gast)


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);
}

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
Noch kein Account? Hier anmelden.