jueves, 4 de octubre de 2012

Picloops al rescate!

Es bastante común cuando se programa en general, y cuando se programa con microcontroladores como el PIC12F675 en particular, tener que establecer una base de tiempo con bastante precisión.
La forma mas precisa de hacerlo es por medio de alguno de los dos timers disponibles (T0 o T1) implementando un manejador de interrupción (interrupt handler) que satisfaga el requerimiento de interrupción (interrupt service request, isr).
Sin embargo, la implementación de un manejador de interrupciones tiene sus complicaciones y puede estar "contaminado" por interacciones con otras partes del programa.
Otra alternativa es establecer un retardo por software; si además se enmascaran las interrupciones (crlf INTCON) el retardo puede ser bastante preciso, aún con el clock interno del PIC.
En efecto, cada instrucción simple (excepto algunos saltos) consume 4 ciclos de reloj, y el reloj opera en estas condiciones a 4 MHz, es decir cada instrucción toma 1 uSeg en ejecutarse.
Un loop simple como
            .....
            movlw    100
            movf      cnt,1
loop     decfsz    cnt,1
            goto       loop
           ....

Demorará una cantidad fija de ciclos de CPU por cada iteración mas algun retardo de comienzo y de fin. Por lo tanto variando la cantidad de veces que se itera se puede demorar distintos tiempos; esta configuración de código sirve para demorar entre unos pocos microsegundos y algo menos de 200 milisegundos.
Para implementar puertos serie por software se necesitan retardos para el muestreo entre bits sucesivos del orden de 200 microsegundos para 4800 bps, por lo que resulta mas que adecuado.
Pero siempre puedo "apilar" contadores si quiero demorar mas, por ejemplo si quisiera demorar 1 segundo haría


movlw 6
movwf DelayC
movlw 19
movwf DelayB
movlw 173
movwf delayA
loop decfsz delayA,1
goto loop
decfsz DelayB,1
goto loop
decfsz DelayC,1
goto loop
retlw 0


Donde los contadores DelayA,DelayB y DelayC operan en cascada para multiplicar el lazo básico, el máximo que puedo alcanzar con tres contadores es de algo mas de 3 horas de retardo (nada impide que coloque mas contadores en cascada).
El programa PicLoops es útil a la hora de calcular este tipo de timers de precisión. Dado que la arquitectura de las instrucciones es similar en las distintas familias de controladores Microchip (PIC) bastará adecuar el reloj con el que opera el circuito para obtener la calibración correcta.

No hay comentarios:

Publicar un comentario

Buscar este blog

Páginas vistas en total