por favor me ayudan con un cidigo que funcione pues yo he trabajado en ello pero no logro establecer una comunicion estable se me bloquea o no me envia nada.
gracias...
oace50
http://www.sendspace.com/file/cj0dnw
Saludos Cordiales!
Armando Almarales
Fofo almarales
Saludos y suerte
daniel zanella
Lo que necesito es establecer una comunicacion bidireccional entre minimo dos pic, que en cualquier momento el master pueda enviar o recibir un dato al slave con un pulsador o instruccion, y que los pics puedan realizar otras tareas.
no se como adjuntar un archivo, por ende copio los codigos y una imagen del circuito.
master:
#include <16F877A.h>
#device adc=10
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=
#use i2c(MASTER,sda=PIN_C4,scl=PIN_C3,force_hw)
#fuses HS,NOWDT,NOPROTECT,NOLVP
#include <lcd_d.c>
int8 dato=50, data=0;
void main()
{
lcd_init();
while (true)
{
if(input(PIN_b0)==1)
{
i2c_start();
i2c_write(0xa0); // Dirección del dispositivo
//i2c_write(dato); // Envía el dato al dispositivo
delay_ms(500);
i2c_start(); // Reinicio
i2c_write(0xa1); // Cambia dirección del dispositivo
data=i2c_read(0); // Lee del esclavo
i2c_stop();
}
if(input(PIN_b1)==1)
{
delay_ms(1000);
i2c_start();
i2c_write(0xa0); // Dirección del dispositivo
i2c_write(dato); // Envía el dato al dispositivo
delay_ms(500);
i2c_stop();
dato=dato+10;
}
//-----------------
lcd_gotoxy(1,1);
printf(lcd_putc, "slave=%4u",data);
lcd_gotoxy(1,2);
printf(lcd_putc, "master=%4u",dato);
delay_ms(10);
}
}
slave:
#include <16F877a.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xA0)
//#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address = 0xa0,force_hw)
#include <lcd_d.c>
#use standard_io (b)
int8 master=0,adc_result=0;
int1 dato=0;
//--------------------------------------
#INT_SSP
void ssp_interupt (){
BYTE state;
state = i2c_isr_state();
if(state < 0x80) //Master is sending data
{
master=i2c_read();
}
if(state >= 0x80) //Master is requesting data
{
i2c_write(adc_result);
delay_us(20);
}
}
//-----------------------------------
//======================================
void main ()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);
adc_result = read_adc();
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
lcd_init();
while(1)
{
lcd_gotoxy(1,1);
printf(lcd_putc, "AN0 %4u \n\r", adc_result);
lcd_gotoxy(1,2);
printf(lcd_putc, "master%4u \n\r", master);
adc_result = read_adc();
delay_ms(1000);
}
}
oace50
