/********************************************/
/*Real Time Clock Code                      */
/*                                          */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/

#include "xc.h"

void RTC_Init(void)
{
    OSCCONbits.SOSCEN = 1;
    
    //wait for warm up
    while(OSCCONbits.SOSCRDY == 0)
    {
        
    }
    
    //Set Digital Pins to Input
    TRISCbits.TRISC13 = 1;
    TRISCbits.TRISC14 = 0;
    
    //RTC write enable
    RTCCONbits.RTCWREN = 1;
    
    //RTCC Pin
    TRISDbits.TRISD8 = 0;
    
    //seconds output on RTCC pin
    RTCCONbits.RTSECSEL = 0;
    RTCCONbits.RTCOE = 0;
    
    //Setup alarm for interrupt
    RTCALRMbits.ARPT = 0xff;
    RTCALRMbits.CHIME = 1;
    RTCALRMbits.AMASK = 1;      //4 = every 10 minutes
    RTCALRMbits.ALRMEN = 1;
    
    //Set the time
    //Default is zeroed
    RTCDATEbits.YEAR10 = 0;
    RTCDATEbits.YEAR01 = 0;
    RTCDATEbits.MONTH10 = 0;
    RTCDATEbits.MONTH01 = 0; 
    RTCDATEbits.DAY10 = 0;
    RTCDATEbits.DAY01 = 0;
    RTCTIMEbits.HR10 = 0;
    RTCTIMEbits.HR01 = 0;
    RTCTIMEbits.MIN10 = 0;
    RTCTIMEbits.MIN01 = 0;
    RTCTIMEbits.SEC10 = 0;
    RTCTIMEbits.SEC01 = 0; 
    
    //Set actual time here
    RTCDATEbits.YEAR10 = 2;
    RTCDATEbits.YEAR01 = 2;
    RTCDATEbits.MONTH10 = 1;
    RTCDATEbits.MONTH01 = 2; 
    RTCDATEbits.DAY10 = 2;
    RTCDATEbits.DAY01 = 4;
    RTCTIMEbits.HR10 = 1;
    RTCTIMEbits.HR01 = 1;
    RTCTIMEbits.MIN10 = 5;
    RTCTIMEbits.MIN01 = 7;
    RTCTIMEbits.SEC10 = 0;
    RTCTIMEbits.SEC01 = 0;    

    //set alarm 
    ALRMTIMEbits.HR10 = 0;
    ALRMTIMEbits.HR01 = 0;
    ALRMTIMEbits.MIN10 = 0;
    ALRMTIMEbits.MIN01 = 0;
    ALRMTIMEbits.SEC10 = 0;
    ALRMTIMEbits.SEC01 = 0;
    
    RTCCONbits.ON = 1;
    
    //lock the registers
    RTCCONbits.RTCWREN = 0;    
    
    return;
}
