rtcc.c - Demonstrates use of the Real Time Clock Calendar Module with an external 32.768 kHZ crystal for timekeeping.ΒΆ
Only works a device with a real time clock calendar module (some PIC24H/F, dsPIC33F devices, few PIC24E/dsPIC33E).
#include "pic24_all.h"
#include <stdio.h>
#if !defined(_LPOSCEN) || !defined(_RTCSYNC)
# warning "This example only works with a device that has a secondary oscillator."
# warning "and an RTCC module."
int main(void) {
return 0;
}
#else
typedef union _unionRTCC {
struct { //four 16 bit registers
uint8_t yr;
uint8_t null;
uint8_t date;
uint8_t month;
uint8_t hour;
uint8_t wday;
uint8_t sec;
uint8_t min;
} u8;
uint16_t regs[4];
} unionRTCC;
unionRTCC u_RTCC;
uint8_t getBCDvalue(char *sz_1) {
char sz_buff[8];
uint16_t u16_bin;
uint8_t u8_bcd;
outString(sz_1);
inStringEcho(sz_buff,7);
sscanf(sz_buff,"%d", (int *)&u16_bin);
u8_bcd = u16_bin/10; //most significant digit
u8_bcd = u8_bcd << 4;
u8_bcd = u8_bcd | (u16_bin%10);
return(u8_bcd);
}
void getDateFromUser(void) {
u_RTCC.u8.yr = getBCDvalue("Enter year (0-99): ");
u_RTCC.u8.month = getBCDvalue("Enter month (1-12): ");
u_RTCC.u8.date = getBCDvalue("Enter day of month (1-31): ");
u_RTCC.u8.wday = getBCDvalue("Enter week day (0-6): ");
u_RTCC.u8.hour = getBCDvalue("Enter hour (0-23): ");
u_RTCC.u8.min = getBCDvalue("Enter min (0-59): ");
u_RTCC.u8.sec = getBCDvalue("Enter sec(0-59): ");
}
//set date
void setRTCC(void) {
uint8_t u8_i;
__builtin_write_RTCWEN(); //enable write to RTCC, sets RTCWEN
RCFGCALbits.RTCEN = 0; //disable the RTCC
RCFGCALbits.RTCPTR = 3; //set pointer reg to start
for (u8_i=0; u8_i<4; u8_i++) RTCVAL = u_RTCC.regs[u8_i];
RCFGCALbits.RTCEN = 1; //Enable the RTCC
RCFGCALbits.RTCWREN = 0; //can clear without unlock
}
void readRTCC(void) {
uint8_t u8_i;
RCFGCALbits.RTCPTR = 3; //set pointer reg to start
for (u8_i=0; u8_i<4; u8_i++) u_RTCC.regs[u8_i] = RTCVAL;
}
void printRTCC(void) {
printf ("day(wday)/mon/yr: %2x(%2x)/%2x/%2x, %02x:%02x:%02x \n",
(uint16_t) u_RTCC.u8.date,(uint16_t) u_RTCC.u8.wday, (uint16_t) u_RTCC.u8.month,
(uint16_t) u_RTCC.u8.yr, (uint16_t) u_RTCC.u8.hour, (uint16_t) u_RTCC.u8.min, (uint16_t) u_RTCC.u8.sec);
}
int main(void) {
__builtin_write_OSCCONL(OSCCON | 0x02); // OSCCON.SOSCEN=1;
configBasic(HELLO_MSG); //say Hello!
getDateFromUser(); //get initial date/time
setRTCC(); //set the date/time
while (1) {
while (!RCFGCALbits.RTCSYNC) doHeartbeat();
readRTCC();
printRTCC();
DELAY_MS(30);
}
}
#endif