Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 341 → Rev 342

/PIC Projects/PICX_27J13/sensor_rtc_DS3231.c
0,0 → 1,114
#include "defines.h"
#include "sensor_rtc_DS3231.h"
#include "base_I2C.h"
 
void DS3231_Begin() {
char reg[3];
reg[0] = DS3231_CONTROL;
/* Control Register (0x0E)
* Bit 7 - !EOSC
* Bit 6 - BBSQW
* Bit 5 - CONV
* Bit 4 - RS2
* Bit 3 - RS1
* Bit 2 - INTCN
* Bit 1 - A2IE
* Bit 0 - A1IE
*/
reg[1] = 0x04;
 
/* Control Register 2 (0x0F)
* Bit 3 = EN32kHZ
*/
reg[2] = 0x00;
 
// Set the configuration registers
I2C_Master_Send(DS3231_ADDRESS, 3, reg);
char result;
do {
result = I2C_Get_Status();
} while (!result);
}
 
char DS3231_Get_Status(void) {
/* Status Register (0x0F)
* Bit 7 - OSF
* Bit 3 - EN32kHz
* Bit 2 - BSY
* Bit 1 - A2F
* Bit 0 - A1F
*/
char value;
I2C_Master_Restart(DS3231_ADDRESS, 0x0F, 1);
char result;
do {
result = I2C_Get_Status();
} while (!result);
I2C_Read_Buffer(&value);
return value;
}
 
void DS3231_Set_Time(char sec, char min, char hour, char day, char date,
char month, char year, char h_mil, char h_am_pm) {
 
// Format the data in a way that the chip expects
char output[8];
output[0] = DS3231_SECONDS;
output[1] = ((sec / 10) << 4) | (sec % 10);
output[2] = ((min / 10) << 4) | (min % 10);
output[3] = ((hour / 10) << 4) | (hour % 10);
if (!h_mil) {
output[3] |= (h_am_pm) ? 0x60 : 0x40;
}
output[4] = day;
output[5] = ((date / 10) << 4) | (date % 10);
output[6] = ((month / 10) << 4) | (month % 10);
output[7] = ((year / 10) << 4) | (year % 10);
 
// Check the status to make sure that it isnt currently busy
char status = DS3231_Get_Status();
while (status & 0x04)
status = DS3231_Get_Status();
 
// Write the data to the chip
I2C_Master_Send(DS3231_ADDRESS, 8, output);
char result;
do {
result = I2C_Get_Status();
} while (!result);
}
 
void DS3231_Get_Time(char *sec, char *min, char *hour, char *day, char *date,
char *month, char *year, char *h_mil, char *h_am_pm) {
 
// Check the status to make sure that it isnt currently busy
char status = DS3231_Get_Status();
while (status & 0x04)
status = DS3231_Get_Status();
 
// Request time data from the chip
char input[7];
I2C_Master_Restart(DS3231_ADDRESS, 0x00, 7);
char result;
do {
result = I2C_Get_Status();
} while (!result);
I2C_Read_Buffer(input);
 
// Parse BCD format into decimal and return
*sec = ((input[0] >> 4) * 10) + (input[0] & 0x0F);
*min = ((input[1] >> 4) * 10) + (input[1] & 0x0F);
if (input[2] & 0x40) {
*h_mil = 0;
*h_am_pm = (input[2] & 0x20) ? 1 : 0;
*hour = (((input[2] >> 4) & 0x01) * 10) + (input[2] & 0x0F);
} else {
*h_mil = 1;
*hour = ((input[2] >> 4) * 10) + (input[2] & 0x0F);
}
*day = input[3];
*date = ((input[4] >> 4) * 10) + (input[4] & 0x0F);
*month = ((input[5] >> 4) * 10) + (input[5] & 0x0F);
*year = ((input[6] >> 4) * 10) + (input[6] & 0x0F);
}