Hola a todos, estoy intentando configurar 2 pics en modo maestro y esclavo para comunicar por I2C utilizanco CCS C, he visto un monton de post en inet, pero no consigo hacer que me funcione, de momento solo consigo que el maestro mande un dato por I2C (EL 19)y lo veo con el I2C debuger del Proteus,no se porque narices no me muestra nada el esclavo por pantalla.
La idea es que el maestro mande un byte o un dato,¿podria mandar un string?
, y que la reciba el esclavo y la guarde en una variable, parece sencillo pero mas vueltas que le doy y no lo saco.
Mi problema creo que esta en el esclavo ya que si desconecto de los pines en el proteus del esclavo, el maestro manda sin problemas,yo creia que en el esclavo habilitando las interrupciones SSP y la global, usando #use I2c .....
y solamente con 3 lineas de codigo me serviria,del tipo i2c_start();i2c_write(0xa1); dato = i2c_read(); i2c_stop();
¿¿por cierto en el esclavo tengo que poner la linea i2c_write(0xa1),??Pensaba que esta linea era la direccion del dispositivo a donde se quiere enviar la trama, pero en el esclavo no le veo sentido usarla, ya que solo tengo el maestro y el esclavo.
El Codigo seria el siguiente:
Maestro:
#include <16F886.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#include <string.h>
#include <stdlib.h>
#use delay(clock=2000000) //Osc Interno a 2 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3) //Configuracion I2c
#use fast_io(b)
char adac_msb;
char adac_lsb;
void main()
{
enable_interrupts(INT_SSP);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc_ports(NO_ANALOGS);
do
{
adac_msb=0x19;
adac_lsb=0x99;
i2c_start();
i2c_write(0xa1);
i2c_write(adac_msb);
i2c_stop();
delay_ms(3000);
}
while(1);
}
Escalavo:
#include <16F886.h>
#use delay (clock=2000000)
#use standard_io(c)
#use I2C(SLAVE, Fast,sda=PIN_C4,scl=PIN_C3, ADDRESS=0xa1, FORCE_HW)
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232
int dato;
#int_SSP
SSP_isr()
{
while (1) {
i2c_start();
i2c_write(0xa1);
dato = i2c_read();
i2c_stop();
}
puts(dato);
printf("El dato es:%u",dato);
putc(dato);
}
void main()
{
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
}
Agradezco cuaquier pista que me podais dar para solucionar este sencillo problema.
Gracias.