Controlar brillo de LED con PWM en PIC16F628A

Realmente funciona el programa como quiero, pero no comprendo cuál es el lugar mas óptimo para colocar el wdt.
El Watchdog Timer no tiene un lugar dentro del programa para colocarse pues es una característica del microcontrolador.
Se habilita con un simple fuse y su desborde se configura con una constante en la instrucción "setup_wdt (mode)"
En PIC C Compiler de CCS con tan solo usar la instrucción "restart_wdt ()" se habilitará el fuse WDT en ON automáticamente.
Si crees que tus rutinas no se completarán antes de que desborde, entonces debes resetearlo con la instrucción "restart_wdt ()"

Como seleccionaste un desborde de 18 milisegundos, "setup_wdt (WDT_18MS);" por lógica tus rutinas deben ser ejecutadas antes de ese tiempo.
Si crees que no se cumplirán en ese periodo, entonces sería conveniente aumentar el valor y resetear el Watchdog Timer cuando creas que puede desbordar.

¿Para qué quieres usar el Watchdog Timer?
¿Acaso crees que tu programa tendrá algún problema por cuelgues?
Ten en cuenta que un reset es lo último que se desea en un sistema.
Adicionalmente uso el timer 1 para hacer retardos (Es solo didácticamente lo del timer 1).
Como recomendación, no uses retardos y mucho menos cuando uses el Watchdog Timer.
 
El reset del WD, lo puedes hacer en distintas partes del programa. Por ejem. En los bucles FOR, WHILE, en subrutinas extensas, etc.
Todo depende del timeout que designes al WD.
Mientras menos margen dejes, obviamente mayor cantidad de resets y de diferentes lugares deberás hacerlo.
 
¿Para qué quieres usar el Watchdog Timer?
¿Acaso crees que tu programa tendrá algún problema por cuelgues?
Si, quiero garantizar si se cuelga, el micro salga solo del embrollo.

Logre poner el WDT en el programa de PWM cambiando el ciclo activo de pwm con el timer1 y no con el timer0. En el datasheet del micro hallé esta parte pero no comprendo su significado en los micro controladores "Una asignación de preescaler para el módulo Timer0 significa que no hay un post-escalador para el Watchdog Timer, y viceversa."
 

Adjuntos

  • 16f627a.png
    16f627a.png
    61.5 KB · Visitas: 5
En el datasheet del micro hallé esta parte pero no comprendo su significado en los micro controladores:
"Una asignación de preescaler para el módulo Timer0 significa que no hay un post-escalador para el Watchdog Timer, y viceversa."
Un poco extraña la traducción pero toma como prescaler a un divisor.
Cuando este es asignado al Timer 0 se podrá usar para que tenga un desborde más prolongado.
Teniendo este como factores de división: 1:1, 1:2, 1:4, 1:8, 1:16, 1:32, 1:64, 1:126 y 1:256
Por el contrario, cuando el prescaler es asignado al WDT, entonces será este el que pueda tener un desborde más prolongado.
Como este tiene un postescaler, podrá tener desbordes más prolongados.

Cuando el prescaler es asignado al WDT el Timer 0 correrá libremente desde 0 hasta 255 que es cuando desbordará pero no habrá interrupción.
Lo mismo pasará contrariamente; cuando el prescaler se asigna al Timer 0, el WDT correrá libremente y cuando desborde generará un reset.
Por lógica, al no tener prescaler asignado, el reset ocurrirá lo que tarde en desbordarse y sobre eso influye la frecuencia de reloj.
El bit que asigna el prescaler al Timer 0 o al WDT es el bit 3 del registro OPTION_REG (PSA) y los del divisor son los bits 2, 1 y 0 (PS2, PS1 y PS0)
En PIC C Compiler se usan constantes que se encuentran en el archivo .h correspondiente al PIC usado.

Cuando se asigna al Timer 0:
Constantes para el Timer 0.jpg
Cuando se asigna al WDT:
Constantes para el WDT.jpg
 
Atrás
Arriba