Aqui esta el programa del maestro, que me parece que es el que esta herra2, terminando de contar mi problema, sucede que el esclavo en principio lo tenia programado en asembler al igual que el maestro y no habia problema en la escritura ni la lectura, al momento de cambiar la programaciòn de mi maestro (el codigo adjunto...)se presento este problema de lectura, que por lo demas me parece comun el problema porq lo he visto pero sin solucion clara...
#include <16f874.h>
#include <string.h>
#include <math.h>
#include <float.h>
#fuses XT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000) // Frecuencia del oscilador
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7,PARITY=N) // seteo de la transmisión
#use I2C(master, sda=PIN_C4, scl=PIN_C3)
#byte port_a = 5
#byte port_b = 6
#byte port_d = 8
#byte port_e = 9
int8 dir_pic_esclavo;
int prom;
byte slave,temp,temp2;
char dato,datoh;
int escribir();
int leer();
int calcular();
void config_ad(void);
main()
{
setup_ccp1(CCP_PWM); // Configura CCP1 como PWM
setup_timer_2(T2_DIV_BY_16, 127, 1); // (1/4000000)*4*16*128= 2048 us o 0.488 khz
config_ad();
temp=0;
temp2=0;
prom=0;
dato=0;
slave=0xb01111000;
set_tris_b(0Xb00000000); // Puerta B configurada como salida
set_tris_d(0xb00000000); // Puerta D como salida
set_tris_e(0xb00000000); // Puerta E como salida
port_b=0;
port_d=0;
port_e=0;
do
{
delay_ms(500); // Tiempo de muestreo
calcular();
printf("%u
",temp); // envia la señal de temperatura a Simulink
escribir();
leer();
}
while (true);
}
//************** función que graba por i2c el módulo de humedad **********
// esta rutina no tiene problemas...
int escribir()
{
#asm
bcf slave,0
#endasm
i2c_start();
i2c_write(slave);
i2c_write(prom);
i2c_stop();
delay_ms(10);
}
//***************** función que lee por i2c dato de esclavo **************
// HE AQUI EL BENDITO PROBLEMA.....
int leer()
{
output_high(PIN_E2);
#asm
bcf slave,0
#endasm
i2c_start();
i2c_write(slave);
#asm
bsf slave,0
#endasm
i2c_start();
i2c_write(slave);
dato=i2c_read(0); // Leemos del Slave (0: sin ACK)
i2c_stop();
delay_ms(1000);
output_low(PIN_E2);
port_b=dato;
}
//******************* función de conversion A/D calcular *************
int calcular()
{
set_adc_channel(0); //ADC canal 0
delay_us(20); //esperamos para el Tad (minimo son 6,4 us) asi el C interno puede cargarse bien
temp=read_adc();
set_adc_channel(1); //ADC canal 1
delay_us(20); //esperamos para el Tad (minimo son 6,4 us) asi el C interno puede cargarse bien
temp2=read_adc(); //leo
prom=(temp-1+temp2-1)/2;
set_pwm1_duty(prom);
if(prom<15){
port_d=0Xb00100000;
output_high(PIN_D5);
}
if(prom>=15 && prom<25){
port_d=0Xb01000000;
output_high(PIN_D6);
}
if(prom>=25){
port_d=0Xb10000000;
output_high(PIN_D7);
}
}
//********** función que configura el conversor análogo digital**************
void config_ad(void)
{
setup_adc_ports(ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_DIV_32);
}
CUALQUIER AYUDA SE AGRADECE...