#pragma config BWRP = OFF    // Table Write Protect Boot->Boot segment may be written
#pragma config BSS = OFF    // Boot segment Protect->No boot program Flash segment
#pragma config GWRP = OFF    // General Segment Code Flash Write Protection bit->General segment may be written
#pragma config GCP = OFF    // General Segment Code Flash Code Protection bit->No protection

//#pragma config FNOSC = FRC    // Oscillator Select->Fast RC oscillator (FRC)
#pragma config FNOSC = PRI    // Oscillator Select->Primary oscillator (XT, HS, EC)

#pragma config IESO = ON    // Internal External Switch Over bit->Internal External Switchover mode enabled (Two-Speed Start-up enabled)

#pragma config POSCMOD = NONE    // Primary Oscillator Configuration bits->Primary oscillator disabled
//#pragma config POSCMOD = HS    // Primary Oscillator Configuration bits->HS oscillator mode selected

#pragma config OSCIOFNC = ON    // CLKO Enable Configuration bit->CLKO output disabled; pin functions as port I/O
#pragma config POSCFREQ = HS    // Primary Oscillator Frequency Range Configuration bits->Primary oscillator/external clock input frequency greater than 8 MHz
#pragma config SOSCSEL = SOSCHP    // SOSC Power Selection Configuration bits->Secondary oscillator configured for high-power operation
#pragma config FCKSM = CSDCMD    // Clock Switching and Monitor Selection->Both Clock Switching and Fail-safe Clock Monitor are disabled
#pragma config WDTPS = PS32768    // Watchdog Timer Postscale Select bits->1:32,768
#pragma config FWPSA = PR128    // WDT Prescaler->WDT prescaler ratio of 1:128
#pragma config WINDIS = OFF    // Windowed Watchdog Timer Disable bit->Standard WDT selected; windowed WDT disabled
#pragma config FWDTEN = OFF    // Watchdog Timer Enable bit->WDT disabled (control is placed on the SWDTEN bit)
#pragma config BOREN = BOR3    // Brown-out Reset Enable bits->Brown-out Reset enabled in hardware; SBOREN bit disabled
#pragma config PWRTEN = ON    // Power-up Timer Enable bit->PWRT enabled
#pragma config I2C1SEL = PRI    // Alternate I2C1 Pin Mapping bit->Default location for SCL1/SDA1 pins
#pragma config BORV = V18    // Brown-out Reset Voltage bits->Brown-out Reset set to lowest voltage (1.8V)
#pragma config MCLRE = ON    // MCLR Pin Enable bit->MCLR pin enabled; RA5 input pin disabled
#pragma config ICS = PGx2    // ICD Pin Placement Select bits->PGC2/PGD2 are used for programming and debugging the device
#pragma config BKBUG = OFF    // Background Debugger Enable bit->Background debugger disabled
#pragma config DSWDTPS = DSWDTPSF    // Deep Sleep Watchdog Timer Postscale Select bits->1:2,147,483,648 (25.7 Days)
#pragma config DSWDTOSC = LPRC    // DSWDT Reference Clock Select bit->DSWDT uses LPRC as reference clock
#pragma config RTCOSC = SOSC    // RTCC Reference Clock Select bit->RTCC uses SOSC as reference clock
#pragma config DSBOREN = ON    // Deep Sleep Zero-Power BOR Enable bit->Deep Sleep BOR enabled in Deep Sleep
#pragma config DSWDTEN = ON    // Deep Sleep Watchdog Timer Enable bit->DSWDT enabled

#include "mcc.h"

void SYSTEM_Initialize(void)
{
    PIN_MANAGER_Initialize();
    INTERRUPT_Initialize();
    OSCILLATOR_Initialize();
    InitI2C();
    UART2_Initialize();
    UART1_Initialize();
    ADC1_Initialize();
    TMR1_Initialize();
    EXT_INT_Initialize();

    AD1CON1bits.ADON = 1;
}

void OSCILLATOR_Initialize(void)
{
    // RCDIV FRC/2; DOZE 1:8; DOZEN disabled; ROI disabled; 
    CLKDIV = 0x3100;
    // TUN Center frequency; 
    OSCTUN = 0x0020;
    // NOSC PRI; SOSCEN disabled; OSWEN Switch is Complete; 
    __builtin_write_OSCCONH((uint8_t) ((0x0200 >> _OSCCON_NOSC_POSITION) & 0x00FF));
    __builtin_write_OSCCONL((uint8_t) (0x0200 & 0x00FF));    
}