Autor Tema: el esclavo me responde un 0xff po bus i2c..  (Leído 2044 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado vicontte

  • PIC10
  • *
  • Mensajes: 5
el esclavo me responde un 0xff po bus i2c..
« en: 27 de Octubre de 2005, 16:15:00 »
RebotadoHola que tal....

Estoy realizando una comunicacion entre PIC "s 16F874, por bus i2c y tengo problema al momento de realizar la lectura del esclavo, que me envia un 0xff, a pesar de que he visto que este tema se a tratado en otro post no he resuelto el tema y tampoco he visto solucion en el foro, por fa si alguien pudiese orientarme al respecto...RebotadoLlorica

Desconectado vicontte

  • PIC10
  • *
  • Mensajes: 5
RE: el esclavo me responde un 0xff po bus i2c..
« Respuesta #1 en: 27 de Octubre de 2005, 16:32:00 »
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...

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: el esclavo me responde un 0xff po bus i2c..
« Respuesta #2 en: 28 de Octubre de 2005, 13:16:00 »
Creo que tu problema esta aqui...



output_high(PIN_E2);
#asm
bcf slave,0
#endasm
i2c_start();
i2c_write(slave);
#asm
bsf slave,0
#endasm
i2c_stop();
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;




Creo que es alli el problema, a mi me paso con un chip de expansion serial, si no haces primero el Stop no lee el nuevo arranque.Sonrisa GiganteSonrisa GiganteSonrisa Gigante

Puedo preguntar  que lee del esclavo??
Y por que las lineas en assembler ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado vicontte

  • PIC10
  • *
  • Mensajes: 5
RE: el esclavo me responde un 0xff po bus i2c..
« Respuesta #3 en: 28 de Octubre de 2005, 16:42:00 »
Gracias por vuestra respuesta amigo MGLSOFT, pero la verdad que el problema va mas alla aun.....
El asunto es que el maestro esta leyendo continuamente los valores de una conversion A/D del esclavo, y le esta continuamente mandando un dato del maestro, he visto bastantes codigos que hacen cosas similares pero no doy con este problema, he intentado varias formas incluyendo lo que tu me propones (de poner una condicion de stop), pero igual el esclavo entrega un 0xff....

ah y las lineas en asembler son solo para lebantar el bit menos significativo, para indicar una accion de lectura ....lo puse asi porque lo encontre simpatico pero se puede hacer de varias formas por ejemplo:
...
i2c_star();
i2c_write(slave+1);// da lo mismo...
dato=i2c_read(0);
...
de todas formas seguire trabajando en esto...

Desconectado vicontte

  • PIC10
  • *
  • Mensajes: 5
RE: el esclavo me responde un 0xff po bus i2c..
« Respuesta #4 en: 28 de Octubre de 2005, 16:49:00 »
Me parece extraño pero en este link esta el mismo problema pero tampoco encontraron solucion creo??

http://miarroba.com/foros/ver.php?foroid=46840&temaid=2476291&marcar=entre

?????

Desconectado vicontte

  • PIC10
  • *
  • Mensajes: 5
RE: el esclavo me responde un 0xff po bus i2c..
« Respuesta #5 en: 03 de Noviembre de 2005, 12:43:00 »
lamentablemente aun no pasa nadaArdiendoArdiendoArdiendo

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
RE: el esclavo me responde un 0xff po bus i2c..
« Respuesta #6 en: 03 de Noviembre de 2005, 17:04:00 »
Esta claro que no estas realizando bien la secuencia de lectura:

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;
}

esta es tu función y la secuencia correcta es comentada es:

i2c_start();               => Comenzar secuencia de ordenes
i2c_write(slave);      => Orden de escritura al esclavo (bit menos significativo 0)
i2c_write(nº reg);    => Escribimos en el esclavo el nº del registro a leer
i2c_start();               => Nueva secuencia de ordenes
i2c_write(slave+1);  => Orden de lectura al esclavo (bit menos significativo 1)
dato=i2c_read();      => Leemos el registro del esclavo

Como se puede observar antes de leer un registro del esclavo hay que decirle cual se va a leer. Los dispositivos esclavos trabajan mediante registros, por desgracia no dices cual es la estructura de registros del esclavo ni que dispositivo es, pero lo normal seria, que el registro cero fuera el de control y el resultado de la conversion estuviera en el registro 1 y el 2 si es de mas de 8 bits de precisión. En el registro de control le daremos la orden de realizar la medida y en el mismo registro veremos si la conversion ha terminado (en un flag) si es así podremos leer el/los registro/s de resultados.

Un saludo al foro.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús