Saludos
Weno esta es la situación, estoy diseñando un driver de LCD usando un PIC16F877A, el cual trabajara dependiendo de como se configure por un dip-sw si la comunicacion es por I2C o por el USART al resetear el pic, cuando lo configuro para I2C y reseteo, en la pantalla sale "I2C INICIADO", he inmediatamente comienza a recibir cualquier dato que le llegue y lo muestra en la pantalla; estoy enviando un solo dato continuamente con el PIC18F4550 (maestro) pero todos los datos que recibe el 16f (esclavo) son 0xFF
.
He probado cambiando la velocidad del master, la ultima configuracion que emplee es 400k, las resistencias de pullups son de 4.7k, y he probado con 3.3k, 2.2k, y 1k, etc. no tengo idea de que pueda ser.... ademas es la primera vez q hago este tipo de comunicacion entre pics y no dispongo de alguna EEPROM o RTC para probar
. Otra cosa mas aunq no creo q sea muy importante, estoy alimentando TODO con 4 pilas de NiMH recargables de 1.2V - 2200mA y el compilador que uso es CCS C.
Aqui les dejo el programa:
------------------------------------ MAESTRO -----------------------------------------------
#include <18F4550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //Crystal osc <= 4mhz
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT_NOSL //Brownout enabled during operation, disabled during SLEEP
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1 //No PLL PreScaler
#FUSES CPUDIV3
#use delay(clock=4000000)
#use i2c(Master,Fast=400000,sda=PIN_B0,scl=PIN_B1,force_hw)
#use fast_io(A)
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_low_volt_detect(FALSE);
setup_oscillator(False);
set_tris_a(0xFE);
output_a(0);
while(1)
{
i2c_start();
i2c_write(0x08); // Esta es la direccion del esclavo
i2c_write(0x33); // El dato es 0x33 que en ASCII seria 3
i2c_stop();
delay_ms(1000);
}
}
--------------------------------- ESCLAVO --------------------------------------
#include <16F877A.h>
#include ".\include\lcd_J (2dot0).c"
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //High speed Osc (> 4mhz)
#FUSES PUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(E)
int X=0;
void menu()
{
char ms1[]={"MODO PRUEBA"};
char ms2[]={"DIP-SW 4 5"};
char ms3[]={" I2C 0 1"};
char ms4[]={" RS232 1 0"};
send_lcd_ctrl(0x01);delay_ms(10);
lcd_goto_xy(3,1);lcd_printf(ms1);
lcd_goto_xy(3,2);lcd_printf(ms2);
lcd_goto_xy(3,3);lcd_printf(ms3);
lcd_goto_xy(3,4);lcd_printf(ms4);
}
void mensaje()
{
enum modo {test,RS232,I2C,test} opc;
char msi2c[]={"MODO I2C"};
char msrs232[]={"MODO RS232"};
char msreset[]={"PRESS RESET"};
menu();
opc=input_a()&0x03;
do{
while(opc==(input_a()&0x03)){}
delay_ms(20);
opc=input_a()&0x03;
switch(opc)
{
case I2C:
send_lcd_ctrl(0x01); delay_ms(10);
lcd_goto_xy(5,2); lcd_printf(msi2c);
lcd_goto_xy(3,3); lcd_printf(msreset);
break;
case RS232:
send_lcd_ctrl(0x01); delay_ms(10);
lcd_goto_xy(4,2); lcd_printf(msrs232);
lcd_goto_xy(3,3); lcd_printf(msreset);
break;
default:
menu();
}
}while(1);
}
void main()
{
int i;
char mensi2c[]={"I2C INICIADO"};
char mensrs232[]={"RS232 INICIADO"};
port_b_pullups(TRUE);
set_tris_a(0xFF);
set_tris_e(0xFE);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_e(0);
lcd_port('b');
init_lcd();
for(i=0;i<6;i++)
{
lcd_goto_xy((3+(i*2)),3); send_lcd('.');
delay_ms(50);
}
switch(input_a()&0x03)
{
case 1:
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
// enable_interrupts(INT_RDA);
// enable_interrupts(GLOBAL);
send_lcd_ctrl(0x01); delay_ms(10);
lcd_goto_xy(3,2); lcd_printf(mensrs232);
break;
case 2:
#use i2c(Slave,sda=PIN_C4,scl=PIN_C3,address=0x08,force_hw)
// enable_interrupts(INT_SSP);
// enable_interrupts(GLOBAL);
send_lcd_ctrl(0x01); delay_ms(10);
lcd_goto_xy(3,2); lcd_printf(mensi2c);
break;
default: mensaje();
}
delay_ms(500);
while(1)
{
if(i2c_poll())
{
X=i2c_read();
send_lcd(X);
}
}
}
-------------------------------------------------------------------------------------------
De antemano grax !!!!!!!!