#include <stdio.h>
#include <stdlib.h>
#include "sw_i2c.h"
#include "rtc.h"
#ifndef COMUN_H
#include "comun.h"
#endif
/*
*
*/
void ds1307_init(void) {
BYTE seconds = 0;
i2cs_start();
i2cs_write(0xD0); // SELECCIONA RTC CON ORDEN WR
i2cs_write(0x00); // REG 0
i2cs_start();
i2cs_write(0xD1); // RD from RTC
seconds = bcd2bin(i2cs_read()); // Read current "seconds" in DS1307
i2cs_stop();
seconds = bin2bcd(seconds & 0x7F);
__delay_us(3);
i2cs_start();
i2cs_write(0xD0); // WR to RTC
i2cs_write(0x00); // REG 0
i2cs_write(seconds); // Start oscillator with current "seconds value
i2cs_start();
i2cs_write(0xD0); // WR to RTC
i2cs_write(0x07); // Control Register
// i2c_write(0x80); // Disable squarewave output pin
i2cs_write(0x10); // Disable squarewave output pin
i2cs_stop();
}
void ds1307_OUT(void) {
i2cs_start();
i2cs_write(0xD0); // WR to RTC
i2cs_write(0x07); // WR to RTC
i2cs_write(0x10); // Enable squarewave output pin
i2cs_stop();
}
void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec) {
sec &= 0x7F;
hr &= 0x3F;
i2cs_start();
i2cs_write(0xD0); // I2C write address
i2cs_write(0x00); // Start at REG 0 - Seconds
i2cs_write(bin2bcd(sec)); // REG 0
i2cs_write(bin2bcd(min)); // REG 1
i2cs_write(bin2bcd(hr)); // REG 2
i2cs_write(bin2bcd(dow)); // REG 3
i2cs_write(bin2bcd(day)); // REG 4
i2cs_write(bin2bcd(mth)); // REG 5
i2cs_write(bin2bcd(year)); // REG 6
//i2c_write(0x80); // REG 7 - Disable squarewave output pin
i2cs_write(0x10); // Enable squarewave output pin
i2cs_stop();
}
void ds1307_get_date(BYTE * day, BYTE * mth, BYTE * year, BYTE * dow) {
i2cs_start();
i2cs_write(0xD0);
i2cs_write(0x03); // Start at REG 3 - Day of week
i2cs_start();
i2cs_write(0xD1);
*(dow) = bcd2bin(i2cs_read() & 0x7f); // REG 3
*(day) = bcd2bin(i2cs_read() & 0x3f); // REG 4
*(mth) = bcd2bin(i2cs_read() & 0x1f); // REG 5
*(year) = bcd2bin(i2cs_read()); // REG 6
i2cs_stop();
}
void ds1307_get_time(BYTE * hr, BYTE * min, BYTE * sec) {
i2cs_start();
i2cs_write(0xD0);
i2cs_write(0x00); // Start at REG 0 - Seconds
i2cs_start();
i2cs_write(0xD1);
*(sec) = bcd2bin(i2cs_read() & 0x7f);
*(min) = bcd2bin(i2cs_read() & 0x7f);
*(hr) = bcd2bin(i2cs_read() & 0x3f);
i2cs_stop();
}
BYTE bin2bcd(BYTE binary_value) {
BYTE temp;
BYTE retval;
temp = binary_value;
retval = 0;
while (TRUE) {
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if (temp >= 10) {
temp -= 10;
retval += 0x10;
} else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}
}
return (retval);
}
// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value) {
BYTE temp;
temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;
// Now return: (Tens * 8) + (Tens * 2) + Ones
return (temp + (temp >> 2) + (bcd_value & 0x0f));
}