Autor Tema: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?  (Leído 2022 veces)

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
« 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()

« Última modificación: 08 de Octubre de 2008, 15:52:00 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
« Respuesta #1 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.



Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
« Respuesta #2 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
El papel lo aguanta todo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
« Respuesta #3 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 !

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
« Respuesta #4 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.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: ¿Como salgo de i2c_start/i2c_stop sin dispositivo esclavo?
« Respuesta #5 en: 09 de Octubre de 2008, 14:04:45 »
Excelente !


 

anything