The attachment is a complete set of C functions for PCF8583, tested with a 
couple of Atmel microcontrollers, see if can help.

On Sunday, September 9, 2012 10:55:30 AM UTC+3, Sunish Issac wrote:
>
> Looks like lots of function are identical for DS1307, MCP 794X and PCF 
> 8563. 
> i2c device address is different and MCP series has some additional 
> functions like storing the power failure and resumption time stamps.
>
> Apart from the above mentioned rtc's Ds1302 and PIC internal RTC also can 
> share some common functionality.
> All of them require bcd routines.
>
> Matt's (MCP 7940) and Rob's (hardware RTC)  libraries seems to be well 
> written.
> It would be better to deprecate functions and procedures in other 
> libraries and have a common API.
>
> I have MCP 794X, 1302,1307 with me and can test the libraries and 
> samples.  
>
> Suggestions and friends welcome to do the refactoring.
>
> Sunish
>

-- 
You received this message because you are subscribed to the Google Groups 
"jallib" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/jallib/-/55e3ZbV9CkIJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/jallib?hl=en.


uint8_t PCF8583_read(uint8_t address)
{
  uint8_t a;
  a=(PCF8583_A0<<1)|0xa0;
  I2C_start();
  I2C_write(a);
  I2C_write(address);
  I2C_start();
  I2C_write(a|1);
  a=I2C_read(1);
  I2C_stop();
  return a;
}

void PCF8583_write(uint8_t address,uint8_t data)
{
  I2C_start();
  I2C_write((PCF8583_A0<<1)|0xa0);
  I2C_write(address);
  I2C_write(data);
  I2C_stop();
}

uint8_t PCF8583_read_bcd(uint8_t address)
{
  return bcd2bin(PCF8583_read(address));
}

void PCF8583_write_bcd(uint8_t address,uint8_t data)
{
  PCF8583_write(address,bin2bcd(data));
}

volatile uint8_t PCF8583_status;
volatile uint8_t PCF8583_alarm;

uint8_t PCF8583_get_status(void)
{
  PCF8583_status=PCF8583_read(0);
  PCF8583_alarm=(PCF8583_status&2);
  return PCF8583_status;
}

void PCF8583_init(void)
{
  PCF8583_status=0;
  PCF8583_alarm=0;
  PCF8583_write(0,0);
  PCF8583_write(4,PCF8583_read(4)&0x3f);
  PCF8583_write(8,0x90);
}

void PCF8583_stop(void)
{
  PCF8583_get_status();
  PCF8583_status|=0x80;
  PCF8583_write(0,PCF8583_status);
}

void PCF8583_start(void)
{
  PCF8583_get_status();
  PCF8583_status&=0x7f;
  PCF8583_write(0,PCF8583_status);
}

void PCF8583_hold_off(void)
{
  PCF8583_get_status();
  PCF8583_status&=0xbf;
  PCF8583_write(0,PCF8583_status);
}

void PCF8583_hold_on(void)
{
  PCF8583_get_status();
  PCF8583_status|=0x40;
  PCF8583_write(0,PCF8583_status);
}

void PCF8583_alarm_off(void)
{
  PCF8583_get_status();
  PCF8583_status&=0xfb;
  PCF8583_write(0,PCF8583_status);
}

void PCF8583_alarm_on(void)
{
  PCF8583_get_status();
  PCF8583_status|=4;
  PCF8583_write(0,PCF8583_status);
}

void PCF8583_write_word(uint8_t address,uint16_t data)
{
  PCF8583_write(address,(uint8_t) data&0xff);
  PCF8583_write(++address,(uint8_t)(data>>8));
}

void PCF8583_write_date(uint8_t address,uint8_t day,uint16_t year)
{
  PCF8583_write(address,bin2bcd(day)|(((uint8_t) year&3)<<6));
}

void PCF8583_get_time(uint8_t *hour,uint8_t *min,uint8_t *sec,uint8_t *hsec)
{
  PCF8583_hold_on();
  *hsec=PCF8583_read_bcd(1);
  *sec=PCF8583_read_bcd(2);
  *min=PCF8583_read_bcd(3);
  *hour=PCF8583_read_bcd(4);
  PCF8583_hold_off();
}

void PCF8583_set_time(uint8_t hour,uint8_t min,uint8_t sec,uint8_t hsec)
{
//  if (hour>23) hour=0;
//  if (min>59) min=0;
//  if (sec>59) sec=0;
//  if (hsec>100) hsec=0;
  PCF8583_stop();
  PCF8583_write_bcd(1,hsec);
  PCF8583_write_bcd(2,sec);
  PCF8583_write_bcd(3,min);
  PCF8583_write_bcd(4,hour);
  PCF8583_start();
}

void PCF8583_get_date(uint8_t *day,uint8_t *month,uint16_t *year)
{
  uint8_t dy;
  uint16_t y1;
  PCF8583_hold_on();
  dy=PCF8583_read(5);
  *month=bcd2bin(PCF8583_read(6)&0x1f);
  PCF8583_hold_off();
  *day=bcd2bin(dy&0x3f);
  dy>>=6;
  y1=PCF8583_read(16)|((uint16_t) PCF8583_read(17)<<8);
  if (((uint8_t) y1&3)!=dy) PCF8583_write_word(16,++y1);
  *year=y1;
}

void PCF8583_set_date(uint8_t day,uint8_t month,uint16_t year)
{
  PCF8583_write_word(16,year);
  PCF8583_stop();
  PCF8583_write_date(5,day,year);
  PCF8583_write_bcd(6,month);
  PCF8583_start();
}

void PCF8583_get_alarm_time(uint8_t *hour,uint8_t *min,uint8_t *sec,uint8_t *hsec)
{
  *hsec=PCF8583_read_bcd(0x9);
  *sec=PCF8583_read_bcd(0xa);
  *min=PCF8583_read_bcd(0xb);
  *hour=PCF8583_read_bcd(0xc);
}

void PCF8583_set_alarm_time(uint8_t hour,uint8_t min,uint8_t sec,uint8_t hsec)
{
  PCF8583_write_bcd(0x9,hsec);
  PCF8583_write_bcd(0xa,sec);
  PCF8583_write_bcd(0xb,min);
  PCF8583_write_bcd(0xc,hour);
}

void PCF8583_get_alarm_date(uint8_t *day,uint8_t *month)
{
  *day=bcd2bin(PCF8583_read(0xd)&0x3f);
  *month=bcd2bin(PCF8583_read(0xe)&0x1f);
}

void PCF8583_set_alarm_date(uint8_t day,uint8_t month)
{
  PCF8583_write_date(0xd,day,0);
  PCF8583_write_bcd(0xe,month);
}


Reply via email to