Control de tiempo con 16F84

Me gustaría saber cómo poder controlar o medir el tiempo con un 16F84. Quisiera, por ejemplo, saber cómo puedo conseguir un retardo en una cantidad de tiempo determinada (1 segundo, 1 minuto...).
Según he visto, en algunos casos se usa el registro TMR0, controlando cuando se desborda, y en otros simplemente se hace un bucle durante un tiempo (sin usar el TMR0)
He conseguido producir un retardo y, así, hacer que un LED parpadee. El problema es que quiero controlar el tiempo de forma exacta (dentro de las posibilidades del oscilador).

1 respuesta

Respuesta
1
Si lo quieres hacer con bucles, debes anidar más de uno.
DELAY MOVLW .100
MOVWF TGRAL
BB movlw .200
MOVWF TGRAL1
AA no
DECFSZ TGRAL1
GOTO AA
DECFSZ TGRAL
GOTO BB
RETLW 0
De este modo con dos anidados llegas a 80 milisegundos.
Con tres o más ya vas a los segundos y minutos.
Y así llegarás a las horas.
Hola.
Muchas gracias por tu solución, que me ha servido mucho. Para finalizar esta respuesta, simplemente me gustaría saber si hay alguna forma de hacer retardos grandes, sin tener que recurrir a los bucles. Lo digo, porque en vista de tu ejemplo, que dura 404 microsegundos, tendría que hacer bastantes bucles anidados para hacer un retardo de, por ejemplo, un segundo.
Muchas gracias nuevamente y saludos.
Si usas un cristal de 4 mhz y como microchip divide por 4 a esa frecuencia, resulta que el bus interno de funcionamiento lo hace a 1 mhz.
1/1mhz= 1 microsegundo.
Como cada instrucción que ejecuta PIC es de un ciclo (1 microsegundo) es fácil de calcular.
Solo los saltos son de 2 microsegundos (call, goto,
decfsz (si salta).
El tiempo se mide en microsegundos porque el microcontrolador viaja muy rápido.
No se estilña usar un cristal de 2 hz. Lo más lento suele ser 32760 hz.
Esto es todo.
Se hace de dos maneras: una es setear el timer para que genere una interrupción cada POR tiempo.
Con ayuda de un registro adicional precargado con 100 (por ejemplo) lo que se hace es decrementar ese registro cada vez que la interrupción ocurre.
Cuando ese registro llega a cero se lo vuelve a cargar con 100 y se hace lo que corresponde para ese tiempo que es de 100 * X.
Otra manera es el boucle. Se cargan uno o dos registros con un valor y se los hace decrementar hasta llegar a cero
DELAY MOVLW .100
MOVWF TGRAL
AA no
DECFSZ TGRAL
GOTO AA
RETLW 0
Este retardo de tiempo es de 404 microsegundos.
Si llamo a este retardo 10 veces obtendré un tiempo aprox. de 4.040 microsegundos. Suerte

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas