Autor Tema: Contador con timer0 en los Pic 18  (Leído 1688 veces)

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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Contador con timer0 en los Pic 18
« en: 01 de Septiembre de 2006, 13:18:12 »
Hola, hace ya un buen rato Pocher posteo esto:

Código: [Seleccionar]
#include <18F458.h>
//#fuses HS, NOPROTECT, NOWRT, PUT, NOWDT, NOLVP, NOCPD   //No funciona PROTEUS   
//#use standard_io(B)
#use fast_io(B) //Para que funcione hay que añadir los tris correspondientes

#INT_Timer0
void DesbordeTimer0()
{
   output_bit(PIN_B0,!input(PIN_B0)); //Cada 5 impulsos cambia de valor
   SET_TIMER0(251);       
}

main()
{
   output_b(0x00);
   set_tris_a(0xFF);
   set_tris_b(0x00);
//   SETUP_TIMER_0(RTCC_DIV_1|RTCC_EXT_L_TO_H); //TMR0 con 16 bits
//   SET_TIMER0(0xFFF8);
   
   SETUP_TIMER_0(RTCC_DIV_1|RTCC_EXT_L_TO_H | RTCC_8_BIT); //TMR0 con 8 bits
   SET_TIMER0(251);   
   
   ENABLE_INTERRUPTS ( INT_Timer0 );
   ENABLE_INTERRUPTS ( GLOBAL );

   while(1)
   {
   restart_wdt();
   }
}

Ahora bien, recien empiezo a programar los pic 18 y me surgio la duda de saber por qué colocan un restart_wdt() dentro del ciclo, si alguien puede despejarme esa duda se lo agradeceria.


Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5427
    • Picmania by Redraven
Re: Contador con timer0 en los Pic 18
« Respuesta #1 en: 01 de Septiembre de 2006, 14:11:17 »
Explicación Corta:

El "Watch Dog Timer" o "Temporizador Perro guardián" es un artificio que se utiliza de antiguo para evitar que los microprocesadores se queden "colgados".

Explicación Larga:

No es extraño que en microelectrónica se den circunstancias de hardware o firmware no previstas por el diseñador en las que un microprocesador se quede en un estado indeterminado del que le sea imposible salir sin una ayuda externa.

El WDT lo que hace fundamentalmente es resetear el micro tras un periodo de tiempo determinado. Su funcionamiento es similar a la Interrupción por Desbordamiento de un Timer, que se produce cuando un Timer que es incrementado continuamente pasa de su valor máximo al mínimo para comenzar de nuevo a contar.

En el caso del WDT en lugar de saltar una interrupción se genera un reset automático en el momento de producirse dicho desbordamiento.

Pero evidentemente en condiciones normales, nuestro micro funcionando correctamente, no debería producirse dicho reset automático.

Para evitar que el reset se dispare es para lo que aplicamos el restart_wdt(); o sea que "restauramos" el timer del WDT, o lo que es lo mismo: lo volvemos a poner a 0 "a mano" y vuelve de nuevo a iniciar su cuenta para acercarse al abismo y amenazarnos con resetear el micro si antes no lo "restauramos" de nuevo.

Un ejemplo tonto:

Configuramos nuestro WDT para que salte cada 5 ms, por ejemplo.

Entramos en una rutina que espera a que le lleguen una docena de caracteres vía rs232, y cada vez que le llega uno hace un restart_wdt().

Al recibir el doceavo caracter sale de la rutina y continua su ejecución normal.

Por manos del demonio se nos escapa el hacha que con la que estábamos haciendo juegos malabares y corta accidentalmente el cable de la rs232, justo cuando el PIC había recibido el caracter número 11 de los 12 que esperaba.

Por lo tanto nuestro programa se queda esperando un caracter que nunca le va a llegar, al menos durante el tiempo en que tardemos en sustituir el cable accidentado.

¿Y qué ocurre entonces con el resto de del programa que debía estar funcionando? pues que todo está detenido indefinidamente.

Pero, para eso está el WDT. Como restaurabamos el contador cada vez que recibiamos un caracter y estos iban llegando, uno a uno en su cadencia natural, el WDT no se desbordaba y todo iba bien. Pero tras recibir nuestro 11 caracter y quedarse esperando el 12 nadie ha restaurado el WDT por lo que este camina, paso a paso, tick a tick, hasta el temible desbordamiento ... y éste se produce indefectiblemente 5 ms después de haber recibido el onceavo caracter.

El PIC se resetea y todo vuelve a comenzar de nuevo.

Si hemos sido lo suficientemente inteligentes como para escribir un 1 en la EEPROM al iniciar la recepción de los susodichos 12 bytes, y teníamos previsto escribir un 0 en la EEPROM en el mismo sitio para indicar que la última recepción de 12 bytes fué un completo éxito tendremos disponible un indicador veraz y seguro de que al reiniciarse nuestro PIC sabremos fehacientemente que la última recepción fue bien o por el contrario se convirtió en un completo, total y rotundo fracaso y, por lo menos, nos tomaremos con precaución el asunto de la RS232.

Nuestro programa podrá seguir su curso evitando los terrenos pantanosos y habilitando los medios para solventar los problemas que nos hemos encontrado.

Ea, espero que esta novela te sirva de algo.

Un saludo.




« Última modificación: 01 de Septiembre de 2006, 14:19:20 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: Contador con timer0 en los Pic 18
« Respuesta #2 en: 01 de Septiembre de 2006, 20:29:41 »
Gracias RedPic, ahora ya todo me ha quedado mas claro, de hecho también tenía la duda porque sólo vi el restart_wdt(), y no con cuánto tiempo lo había precargado.

Saludos

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5427
    • Picmania by Redraven
Re: Contador con timer0 en los Pic 18
« Respuesta #3 en: 01 de Septiembre de 2006, 20:32:56 »
De hecho en el código que has posteado del maestro Pocher ese restart_wdt(); no sirve absolutamente para nada, mas que para perder tiempo dentro del bucle, ya que mas arriba podemos ver el #fuse NOWDT y eso deshabilita el reseteo del pic al desbordarse el timer.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: Contador con timer0 en los Pic 18
« Respuesta #4 en: 03 de Septiembre de 2006, 03:59:15 »
Fue por eso que me entró la duda, pero ahora ya con la explicación que me has dado me ha quedado todo más claro.

Gracias


 

anything