Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Los Timers o Temporizadores Son Características Estándar de Casi Todos Los Microcontroladores
Los Timers o Temporizadores Son Características Estándar de Casi Todos Los Microcontroladores
Cada timer tiene asociado un reloj que fija el paso que debe marcar y
una o más unidades compradoras. El reloj del timer0 es derivado del reloj
del CPU y puede tener dos fuentes distintas: si se usa la fuente de reloj
interna del CPU, el reloj del CPU pasa primero por un divisor de
frecuencia (prescaler) y la salida de este divisor va al timer, si se usa una
fuente de reloj externa por el pin T0, primero será sincronizada con el
reloj interno antes de pasar al prescaler.
Los valores de división (prescaler) ya están establecidos para cada timer,
en el caso del timer0 la frecuencia del CPU puede ser dividida por un
factor de 1, 8, 64, 256 o 1024, generando así la frecuencia de conteo.
Por cada unidad comparadora existe un pin asociado a ella, normalmente
marcado como OCx (Output Compare x) que es donde se puede generar
una frecuencia de salida por la unidad comparadora del timer.
El timer0 tiene 4 modos de funcionamiento que se pueden configurar
programando sus registros asociados:
Modo Fast PWM: Este modo permite generar una onda PWM de alta
frecuencia. El timer cuenta desde 0 a 255 y reinicia la cuenta. Con cada
cuenta el valor del timer0 se compara con un valor determinado que cuando
coinciden cambia el estado de uno de los pines de salida PWM, y cuando se
reinicia el timer este pin vuelve a cambiar su estado.
Modo Phase Correct PWM: Este modo ofrece una onda PWM de alta
resolución a diferencia del modo Fast PWM. El timer cuenta hacia adelante y
hacia atrás antes de hacer el cambio de estado del pin PWM, es decir cuenta
de 0 a 255 al llegar a 255 cuenta de 255 a 0, obteniendo una salida PWM más
limpia pero de menor frecuencia.
Registro
TCCR0 (Timer/Counter Control Register)
Salida
del comparador en modo NO-PWM (Normal ó CTC)
Salida
del comparador en modo FAST PWM
Salida
del comparador en modo PHASE CORRECT PWM
CS02:0: Con estos bits se selecciona la fuente del reloj para el timer,
puede ser interna con un prescaler o externa con una señal de reloj en el pin
T0.
Config
uración del prescaler para frecuencia del Timer/Counter0
Registro
TCNT0 (Timer/Counter Register)
Registr
o OCR0
Regitro
TIMSK (Timer/Counter Interrup Mask Register)
Registro
TIFR
En estos primero ejemplos se usara el reloj del CPU como fuente de reloj
para el timer, descartando el pin T0.
Ejemplo1: configuraremos el timç
er0 con un prescaler de 1024 con una frecuencia de CPU = 8Mhz para
que el timer se desborde cada 32ms, y una vez que se desborde
cambaremos el estado de un led en el puerto PB0:
1
2 //
3
4 #include <avr/io.h>
5
6 int main(void) {
7
8 // Timer0 modo normal, sin usar el pin OC0, prescaler de 1024
9 TCCR0 = (1 << CS00) | (1 << CS02);
10
// Puerto PB0 como salida.
11 DDRB = _BV(PB0);
12 PORTB = 0;
13
14 while(1) {
15
16 // si ya hubo desbordamiento del timer0:
if( (TIFR << (1 << TOV0)) ){
17
18
PORTB ^= (1 << PB0); // conmuta el led
19 TIFR |= (1 << TOV0); // limpia la bandera
20 }
21 }
22
23 return 0;
}
24
25
//
26
27
Como se ve, se tiene que estar haciendo la comparación del valor del
timer constantemente para saber si ya pasaron 10 ms, esto le toma
tiempo al procesador. Para ahorrar ese tiempo muerto se pueden
emplear dos métodos: el primero es haciendo que el timer se desborde
cada 10 ms, o sea, cada que pasen 79 incrementos y así hacer todo
desde la función de interrupción por desbordamiento, y el segundo es
usar la interrupción por coincidencia en comparación con el timer0 y el
registro OCR0, así el registro de comparación se carga con el valor 79
(para 10 ms) y cuando el valor del timer0 coincida con el valor del
registro OCR0, se ejecutará el código en dicha interrupción. Es necesario
reiniciar el valor del timer a 0 en la función de interrupción para que
vuelva a contar, de lo contrario el timer seguirá su cuenta hasta el
desbordamiento y no se ejecutara la interrupción en ese lapso.
.include "m48def.inc"
.def temp=r16
.def desplazar0=r17
.def desplazar1=r18
.def temp2=r19
.def temp3=r20
.org 0x00
rjmp START ; Reset Handler
.org 0x001
rjmp EXT_INT0 ; IRQ0 Handler
.org 0x002
rjmp EXT_INT1 ; IRQ1 Handler
;INICIA EL PROGRAMA
START: ldi temp, high(RAMEND); Main program start
out SPH,temp ; Set Stack Pointer to top of RAM
ldi temp, low(RAMEND)
out SPL,temp
ldi temp,0x00
out DDRD,temp ;SE DECLARA AL PUERTO D COMO ENTRADA
ldi temp,0xFF
out PORTD,temp ;SE HABILITAN LAS RESISTENCIAS DE PULL UP
EXT_INT0:
push temp ;SE GUARDA EL VALOR DE POSICION EN LA PILA
in temp, SREG ;SE GUARDA EL REGISTRO DE ESTADOS EN LA VARIABLE TEMP
out PORTB,desplazar0 ;SE CAMBIA EL ESTADO DEL PUERTO B
lsl desplazar0 ;SE DESPLAZA EL VALOR DE LA VARIABLE desplazar0 A LA IZQUIERDA
sbrc temp2,0 ;PRUEBA SI SE HA ASIGNADO A LA VARIABLE temp2 UN VALOR EN EL BIT 0 DE SER ASI
LE ASIGNA
ldi desplazar0,0x01 ;EL VALOR DE 0x01 A LA VARIABLE despazar0
sbrc desplazar0,7 ;PRUEBA SI EL BIT 7 DE LA VARIABLE despalzar0 SE ENCUENTRA SETEADO DE SER ASI
ldi temp2,0x01 ;ASIGNA EL VALOR DE 0x01 A LA VARIABLE temp2
sbrs desplazar0,7 ;COMPRUEBA SI EL BIT 7 DE LA VARIABLE desplazar0 SE ENCUENTRA SETEADO
ldi temp2,0x00 ;DE LO CONTRARIO ASIGNA EL VALOR 0x00 A LA VARIABLE temp2
out SREG, temp ;RETORNA EL VALOR DEL REGISTRO SREG
pop temp ;RETIRA EL REGISTRO DE LA PILA
reti ;RETORNA A LA POSICION DONDE SE ENCONTRABA ANTES DE REALIZARSE LA
INTERRUPCION
EXT_INT1:
push temp ;SE GUARDA EL VALOR DE POSICION EN LA PILA
in temp, SREG ;SE GUARDA EL REGISTRO DE ESTADOS EN LA VARIABLE TEMP
out PORTC,desplazar1 ;SE CAMBIA EL ESTADO DEL PUERTO C
lsr desplazar1 ;SE DESPLAZA EL VALOR DE LA VARIABLE desplazar1 A LA DERECHA
sbrc temp3,0 ;PRUEBA SI SE HA ASIGNADO A LA VARIABLE temp3 UN VALOR EN EL BIT 0 DE SER ASI
LE ASIGNA
ldi desplazar1,0x20 ;EL VALOR DE 0x20 A LA VARIABLE despazar1
sbrc desplazar1,0 ;PRUEBA SI EL BIT 7 DE LA VARIABLE despalzar1 SE ENCUENTRA SETEADO DE SER
ASI
ldi temp3,0x01 ;ASIGNA EL VALOR DE 0x01 A LA VARIABLE temp3
sbrs desplazar1,0 ;COMPRUEBA SI EL BIT 7 DE LA VARIABLE desplazar1 SE ENCUENTRA SETEADO
ldi temp3,0x00 ;DE LO CONTRARIO ASIGNA EL VALOR 0x00 A LA VARIABLE temp3
out SREG, temp ;RETORNA EL VALOR DEL REGISTRO SREG
pop temp ;RETIRA EL REGISTRO DE LA PILA
reti ;RETORNA A LA POSICION DONDE SE ENCONTRABA ANTES DE REALIZARSE LA
INTERRUPCION