TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PalitroqueZ en 08 de Octubre de 2008, 15:48:22

Título: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
Publicado por: PalitroqueZ en 08 de Octubre de 2008, 15:48:22
Tengo un programa donde hablo con un dispositivo esclavo I2C, todo funciona chévere, pero hay una situación en la que el dispositivo se queda sin energía, No siendo así con el PIC (digamos que hay 2 fuentes de alimentación separadas), entonces mientras el esclavo está apagado, en el pic el contador de programa cae en las lineas de iniciar o detener el I2C

Viendo el listado en ASM, se queda en la línea:

...
5: btfss PORTC,3
    goto 5
...


pregunta por la señal de reloj SCL en nivel alto, que por supuesto no existe

¿como hago para salir de ese bucle infinito?

Datos:
- pic16F877A
- compilador C CCS
- comandos I2C por software: i2c_start(), i2c_stop()

Título: Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
Publicado por: LABmouse en 08 de Octubre de 2008, 15:50:15
La única que se me ocurre es con el WDT y guardas un dato en la EEPROM indicando que el reset fue después del I2C, así ya sabes que si entras nuevamente se quedara.


Título: Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
Publicado por: MLO__ en 08 de Octubre de 2008, 16:21:31
Hola.

Tambien podria ser asignando un tiempo maximo de espera de respuesta por medio de un timer.

Saludos
Título: Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
Publicado por: RICHI777 en 08 de Octubre de 2008, 16:28:16
Hola normalmente cuando se esta esperando un evento externo, digamos como en este caso que la señal de un PIN cambie de estado, conviene colocar un timer e ir checkeandolo para poder retornar si el evento no llega en determinado tiempo.

Saludos !
Título: Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
Publicado por: PalitroqueZ en 09 de Octubre de 2008, 14:01:25
Escribí una nueva función: i2c_start_modificado() que incluye un contador de TimeOut

Código: C
  1. //**************************************************
  2.  
  3. #int_timer0
  4. void  tmr0_isr(){
  5. ...
  6.      if(bTimeout){
  7.       if(iTimeOut++>10){
  8.          iTimeOut=0;
  9.          bTimeout=0;
  10.       }
  11.      }
  12. ...
  13. ...
  14. }
  15. //**************************************************
  16.  
  17. void i2c_start_modificado(){
  18.     bTimeout=1;
  19.     i2c_start();
  20.     iTimeOut=0;
  21.     bTimeout=0;
  22. }
  23. //*****************************************************
  24.  
  25. #zero_ram
  26. void main(){
  27. ...
  28.     setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_BIT);
  29.     // configura el Timer0 base de tiempo interno, pre-escaler=1:256
  30.     set_timer0(138); // retardo de ~ 30ms
  31.     enable_interrupts(INT_TIMER0);
  32. ...
  33.     enable_interrupts(global);
  34. ...
  35.     i2c_start_modificado()
  36. ...    
  37. }

la idea es que i2c_start() saldrá, pasen o no 300ms de tiempo.

Título: Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
Publicado por: RICHI777 en 09 de Octubre de 2008, 14:04:45
Excelente !