#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];
}
}