#include <p32xxxx.h>
#include <sys/attribs.h>





/* Config settings */
#pragma config FWDTEN = OFF, FPBDIV = DIV_1
#pragma config OSCIOFNC = ON, POSCMOD = XT, FSOSCEN = OFF, FNOSC = PRI
#pragma config CP = OFF, BWP = OFF, PWP = OFF

#define LONG_DELAY	5000

#define XTFREQ      3686400             /* On-board Crystal frequency   */
#define PLLMODE     1                   /* On-chip PLL setting          */
#define FOSC        (XTFREQ * PLLMODE)  /* Internal clock frequency     */
#define FCY         FOSC                /* Instruction Cycle frequency  */
                                        /* Note: instruction cycle is 
                                        /* half of input OSC on PIC24   */
#define BAUDRATE    9600       
#define BRGH_VAL    0

#if BRGH_VAL
#define BRG_VAL      ((FCY/BAUDRATE)/4)-1 
#else
#define BRG_VAL      ((FCY/BAUDRATE)/16)-1 
#endif


int main(void)
{ 
    int i = 0;

    /* disable JTAG port */
    DDPCONbits.JTAGEN = 0;

    RPB10R = 0x02;  /* set RPB10 as U2TX        */
    U2RXR = 0X03;   /* Set U2RX as ping RPB11   */

    /* init led bits as outputs */
    TRISBbits.TRISB8 = 0;   /* set B8 as outputs            */
    TRISBbits.TRISB9 = 0;   /* set B9 as outputs            */
    T1CON = 0x8030;         /* TMR1 on, prescale 1:256 PB   */

    /***************************** Setup UART 2 *****************************/
    /* set baud */
    U2BRG = BRG_VAL;
    
    /* No parity, one stop bit, autobaud, polled */
    U2MODEbits.UARTEN = 1;
    U2MODEbits.ABAUD = 0;
    U2MODEbits.BRGH = BRGH_VAL;
    U2STA = 0x1400;

    /* Configure uart2 receive and transmit interrupt */
#if 0
    /* clear any pending interrupts just in case */
    _U2RXIF = 0;
    _U2TXIF = 0;

    /* set the interrupt priority for receive and transmit */
    _U2RXIP = 6;
    _U2TXIP = 2;

    /* enable receive interrupts, disable transmit interrupts */
    _U2RXIE = 0;

    _U2TXIE = 0;
#endif

    for(;;)
    {
        
        if ( i == 0 )
        {
            i = 1;
            LATBbits.LATB8 = 0;
            Nop();
            LATBbits.LATB9 = 1;
            Nop();
        }
        else
        {
            i = 0;
            LATBbits.LATB8 = 1;
            Nop();
            LATBbits.LATB9 = 0;
            Nop();
        }

        /* wait for timer */
        TMR1 =  0;
        while (TMR1 < LONG_DELAY)
        {
            if ( U2STAbits.URXDA )
                U2TXREG = U2RXREG + 1;
        }    
    }
}


/*
http://www.microchip.com/forums/m506174.aspx
*/

// UART 2 interrupt handler, set at priority level 2
void __ISR(_UART2_VECTOR, ipl2) IntUart2Handler(void)
{

    Nop();


#if 0    
    // Is this an RX interrupt?
    if(INTGetFlag(INT_SOURCE_UART_RX(UART_MODULE_ID)))
    {
            // Clear the RX interrupt Flag
        INTClearFlag(INT_SOURCE_UART_RX(UART_MODULE_ID));

            // Echo what we just received.
            PutCharacter(UARTGetDataByte(UART_MODULE_ID));

            // Toggle LED to indicate UART activity
            mPORTAToggleBits(BIT_7);
    }

    // We don't care about TX interrupt
    if ( INTGetFlag(INT_SOURCE_UART_TX(UART_MODULE_ID)) )
    {
            INTClearFlag(INT_SOURCE_UART_TX(UART_MODULE_ID));
    }

#endif    
}
