#include <p18f4620.h>
#include <delays.h>
#include <usart.h>
#include <stdio.h>
#include <string.h>
#include <i2c.h>
#pragma config OSC=HSPLL
#pragma config IESO=OFF
#pragma config PWRT=ON
#pragma config WDT=OFF
#pragma config MCLRE=ON
#pragma config XINST=OFF
#pragma config DEBUG=ON
#pragma config FCMEN = OFF
#pragma config LVP=OFF
#pragma config BOREN=OFF
/** V A R I A B L E S ********************************************************/
unsigned int DATO,ACCION,KBIT;
unsigned int i,j,k;
#pragma udata
unsigned char ENVIO_I2C[10];
#pragma udata
/** P R I V A T E  P R O T O T Y P E S ***************************************/
void low_isr(void);
void high_isr(void);
unsigned char escribirI2C ( unsigned char slave_addr, unsigned char direcc, unsigned char reg_dato);
unsigned char leerI2C ( unsigned char slave_addr, unsigned char direcc);
/** V E C T O R  R E M A P P I N G *******************************************/
//Vector de interrupcion de baja prioridad
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
 _asm GOTO low_isr _endasm
}
#pragma code /* Regresa al lugar de donde dio el salto */
#pragma interruptlow low_isr
void low_isr (void)
{
 //En esta secccion se coloca las lineas de codigo
 //con grado de baja prioridad
}
 
 
//Vector de interrupcion de alta prioridad
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
 _asm GOTO high_isr _endasm
}
#pragma code /* Regresa al lugar de donde dio el salto */
#pragma interrupt high_isr
void high_isr (void)
{
       if(PIR1bits.SSPIF==1){
        DATO = ReadI2C();
    }
    KBIT = 1;
    PIR1bits.SSPIF=0;    // Borramos bandera.-
}
/** D E C L A R A T I O N S **************************************************/
#pragma code
/******************************************************************************
 * Function:        void main(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Main program entry point.
 *
 * Note:            None
 *****************************************************************************/
/************************************************************************************************/
/*************************************************************************************************************/
//PROGRAMA PRINCIPAL
void main(void)
{
    TRISD=0x00;    
    ADCON1 = 0xFF;  //DESHABILITA ENTRADAS ANALOGICAS
    RCONbits.IPEN = 1;    // habilitamos Prioridades
    IPR1bits.SSPIP = 1;    //PRIORIDAD ALTA AL I2C
    // Configuracion de las interrupciones.
    PIE1bits.SSPIE = 1;    // Habilita la interrupcion del modulo SSP
    INTCONbits.PEIE = 1; // Habilita las interrupciones de los perifericos
    INTCONbits.GIE = 1;    // Habilita las interrupciones globales!
    PIR1bits.SSPIF = 0;    // BORRO LA BANDERA DE LA INTERRUPCION        
    //Iniciamos I2C
    OpenI2C(SLAVE_7,SLEW_ON);//MASTER, 400KHZ
    SSPADD = 0xA2;
//CONDICIONES INICIALES
    i = j = KBIT = 0;
    k = 1;
while(1){
    
    if(DATO == 30){
        i = 1;
    }
    if(DATO == 40){
        j = 1;
    }
    if((i == 1)&&(DATO != 30)&&(KBIT == 1)){
        ENVIO_I2C[k] = DATO;
        k = k+1;
        KBIT = 0;
        if(k<4){
            i=0;
            k=0;
        }
    }
    if((i == 1)&&(DATO != 40)&&(KBIT == 1)){
            WriteI2C(5);
    }
    PORTD = ENVIO_I2C[1];
    Delay10TCYx(1);
    PORTD = ENVIO_I2C[2];
    Delay10TCYx(1);
    PORTD = ENVIO_I2C[3];     
}
}