///////////////////////////////////////////////////////////////////////////////
// COMUNICACION I2C
// Abril 2011
//
// Programa: Comunicacion I2C
// Version: 4
// ficheros: ***i2c_2011_v4_LCD_master.c***
// i2c_2011_v4_LCD_slave.c
// lcd.c
//
//
//
//
// Dispositivo: PIC 16F877A Compilador: CCS vs4.049
//
//
//
//
// Descripción:
// Comunicacion entre dos pics 16f877A o 18F452, mediante los pines
// SCL(C3) y SDA(C4). El esclavo lee el valor ADC y lo almacena en
// buffer[0x02]. El mestro le requiere dicho dato, diciendole la direccion
// de memoria que quiere leer. Pulsando RB7 en el maestro, este le manda
// un dato de 8bits al esclavo, que lo representa en 8 leds.
//
//
//
///////////////////////////////////////////////////////////////////////////////
#include <16f877A.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use I2C(FAST, SCL=PIN_C3, SDA=PIN_C4, FORCE_HW) //using hardware I2C, built
// into the PIC, make sure to include this line in any master I2C program
#use fast_io(A)
#use fast_io(B)
#use standard_io(C)
#use fast_io(D)
#use fast_io(E)
#byte port_a = 0x05
#byte port_b = 0x06
#byte port_c = 0x07
#byte port_d = 0x08
#byte port_e = 0x09
#define use_portd_lcd TRUE //definir portb lcd
#include <lcd.c> //libreria manejo lcd
int8 result = 0;
float valor=0;
int8 dato=0;
void main(void)
{
set_tris_b(0xFF);
port_b_pullups(false); // Resistencias de polarización del puerto B
lcd_init(); //inicializa lcd
disable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
while(TRUE)
{
// Lectura de un dato en la memoria del esclavo
i2c_start (); //Inicio comunicacion
i2c_write (0xa0); //Direccion del esclavo
i2c_write (0x02); //Direccion de memoria que queremos leer en
//el esclavo [buffer[0x02] = read_adc()].
i2c_stop(); //Parada del ciclo de escritura
i2c_start (); //Se inicia el ciclo de lectura
i2c_write (0xa1); //Añadir 1 a la direccion para pasar al modo
//lectura. A6 A5 A4 A2 A1 A0 R/W ->
// ->R/W = 0 modo escritura; 1 modo lectura
result = i2c_read(0); //Leemos en la direccion apuntada anteriormente
i2c_stop (); //Fin de la comunicacion
valor=(float)result*5/255; //Rango de 0-5v y 255 valores posibles
delay_ms(1000);
printf(lcd_putc,"\fLa medida es \n%4.3f",valor);
if(INPUT(PIN_B7));
{
i2c_start(); //Inicio comunicacion
i2c_write(0xa0); //Direccion del esclavo
i2c_write(dato); //Envia dato
i2c_stop(); //Fin de la comunicacion
delay_ms(100); //
dato=dato+1;
}
} //fin while
} //fin main