Académique Documents
Professionnel Documents
Culture Documents
2 Temporizador/Contador
Los temporizadores/contadores son probablemente los perifricos complejos de
mayor uso en los microcontroladores. Los temporizadores/contadores son
altamente verstiles, se pueden emplear para medir periodos de tiempo, para
determinar el ancho de un pulso, para medir una velocidad, para medir frecuencia,
o para proporcionar seales de salida. Ejemplos de aplicaciones pueden incluir la
medicin de las revoluciones por minuto de un motor de automvil, el periodo exacto
de un tiempo especfico, tal como el tiempo de trayectoria de una bala, producir
tonos para crear msica o para producir la chispa de una buja de un sistema de
ignicin, o proveer el ancho especifico de un pulso u obtener frecuencias especficas
para el control de la velocidad de un motor.
BANKSEL OPTION_REG
MOVLW B'00000000'
ANALICEMOS
MOVLW B'10100000'
MOVWF OPTION_REG
TMR0 (01h): Este es el contador propiamente dicho y puede ser ledo y escrito
en cualquier momento.
La seal que lleva al TMR0 la podemos preescalar mediante un divisor, este divisor
lo podemos asignar tanto al WDT como al TMR0 mediante el bit PSA del
OPTION_REG. El valor del rango del divisor viene determinado por los bit PS2:PS0
segn la tabla anterior.
El TMR0 es capaz de realizar una interrupcin cada vez que pasa de 255 a 0, para
permitirla hay que poner a 1 el bit T0IE del registro INTCON y el flag de la
interrupcin es el T0IF del registro INTCON.
El valor de TMR0 se inicializa con ValIni (250), con lo que cada 6 pulsaciones en la
tecla conectada al pin RA4/T0CKI, el TMR0 pasara de 255 a 0, generando una
interrupcin que incrementara el valor del contador formado por los leds conectados
al PORTA.
Lo nico a destacar es la programacin del OPTION_REG para configurar el TMRO.
Veamos dos ejemplos:
Timer0_1.c: Cada vez que se acte sobre el pulsador conectado en el pin RA4 se
incrementa un contador que se visualiza en el LCD.
Cuando este mdulo trabaja como temporizador cuenta los ciclos de instruccin (sin
prescaler) o los ciclos que recibe del prescaler. Como es un contador ascendente el
TMR0 debe ser cargado con el valor de los ciclos que se desean contar restados de
256 que es el valor de desbordamiento. Por ejemplo, para contar 28 ciclos (de
instruccin/prescaler), se carga el TMR0 con 228 (256-28). El ciclo de instruccin
tiene una duracin de 4us para una frecuencia de oscilador de 1MHz (PIC16F88).
Sin prescaler medira un tiempo de 28x4x1us = 112us. Con un prescaler 1:8, el
tiempo medido sera 28x4x8us = 896us. De manera general, el intervalo de
temporizacin T se puede calcular con la siguiente frmula:
T=N x TCI x n
Donde:
Q=256-N
Para medir 500us, con un prescaler 1:1 (prescaler asignado al perro guardin WDT)
y un TCI = 4us se necesitan 500/4 = 125 ciclos de instruccin. El valor inicial del
Ejemplo 2
T0CON.T0CS (bit 5) -> selecciona modo TIMER (0) o contador externo (1)
T0CON.PS0-2 (bits 0-2) -> bits que definen el valor del divisor previo, desde 1:2
(000) hasta 1:256 (111)
Una vez en marcha el timer podemos consultar su valor accediendo a los registros
TMR0L y TMR0H. El byte alto TMR0H no es el verdadero byte alto del contador sino
un buffer de dicho valor. La razn de esto es asegurar la consistencia al hacer
lecturas/escrituras de un contador de 16 bits en un procesador de 8 bits. Siempre
habra la
La solucin es hacer que una lectura de TMR0L cause una copia simultnea del
byte alto del contador a TMR0H. De la misma forma una escritura de TMR0L causa
la escritura simultnea de TMR0H al byte alto del contador.
Consecuencias para nosotros? Si queremos leer el valor del timer (16 bits)
debemos siempre leer primero TMR0L y luego TMR0H. En la escritura es lo
contrario, primero escribimos TMR0H (lo que no tiene ningn efecto sobre el
contador, ya que TMR0H es un buffer) y luego TMR0L (momento en el que TMR0L
y lo que tuviramos en TMR0H se vuelcan al contador. Podramos definir una macro
o funcin para no tener que estar pendientes. Por ejemplo, para escribir el valor de
TMR0 (16 bits) haramos:
Como vemos primero fijamos TMR0H (con la parte alta de x) y luego TMR0L.
Igualmente podramos definir algunas macros para arrancar/parar el timer sin tener
que acordarnos de los bits involucrados como hicimos con las interrupciones:
Trs un rato (65536 x 2 msec = 128 sec) las lucecitas se detienen, ya que el contador
cont da la vuelta completa y la condicin establecida (cont==0) detiene el timer.
Como otros compiladores, C18 tiene algunas rutinas para facilitar el manejo de los
timers:
Abajo se lista el mismo programa usando estas rutinas. Algunos comentarios sobre
los cambios:
Es preciso incluir <timers.h> para tener acceso a las declaraciones de las funciones
usadas