Sei sulla pagina 1di 53

Interrupciones Timer

TIMER
Los microcontrolador AVR tiene temporizadores muy
poderosos y multifuncionales, pueden medir tiempo,
generar frecuencias, contar eventos externos, hacer
comparaciones, sincronizar tareas, generar una onda
PWM, etc

El timer0 del ATmega328 es un contador/temporizador


de 8 bits (puede contar hasta 255) sncrono, es decir, que
depende del reloj del CPU (slo su reloj, no el CPU) para
funcionar, es un mdulo independiente del ncleo del
AVR lo que reduce la carga del microcontrolador.
TIMER
TIMER
Reloj del timer0:
CPU: preescalizadores
Externo: (pin T0)se debe sincronizar antes de pasar al preescalizador

Los valores de divisin (prescaler) ya estn 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. Cada unidad tiene asociada un pin, marcado como OCx (Output
Compare x)
TIMER
Reloj del timer0: cuatro modos de funcionamiento
Normal: El timer cuenta desde 0 a 255 y se desborda reiniciando la
cuenta.

Modo CTC: En este modo, cuando hay coincidencia entre un valor


determinado y el timer reinicia a 0. tambin puede configurarse para
que al presentarse una coincidencia se genere una interrupcin o
cambie el estado de un pin.
TIMER
Modo Fast PWM: Este modo se genera 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
resolucin, a diferencia del modo Fast PWM, el timer cuenta hacia
adelante y hacia atrs 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 ms limpia pero de menor frecuencia.
TIMER
el timer0 tiene la capacidad recibir una frecuencia de
reloj externa mediante el pin T0 (PD4) y de cambiar
el estado de la salida en el pin OC0,(PD5) que es la
salida del comparador del timer:
TIMER
Para controlar los modos de funcionamiento y la
frecuencia de trabajo, el timer0 tiene asociados
varios registros.
TIMER
TCCR0A: (Timer/Counter Control Register) Este
registro configura el modo de comparacin.
TIMER
Para controlar los modos de funcionamiento y la
frecuencia de trabajo, el timer0 tiene asociados
varios registros.
TCCR0A: (Timer/Counter Control Register) Este
registro configura el modo de comparacin.
TIMER
Para controlar los modos de funcionamiento y la
frecuencia de trabajo, el timer0 tiene asociados
varios registros.
TCCR0A: (Timer/Counter Control Register) Este
registro configura el modo de comparacin.
TIMER
Para controlar los modos de funcionamiento y la
frecuencia de trabajo, el timer0 tiene asociados
varios registros.
TCCR0A: (Timer/Counter Control Register) Este
registro configura el modo de comparacin.
TIMER
TCCR0B: (Timer/Counter Control Register) Este registro
configura la frecuencia a la que trabajar el Timer, el modo de
trabajo y si el timer controlar la salida del pin asociado a el,
en este caso el pin OC0.

FOC0: Escribiendo un 1 en este bit, fuerza a que se realice la


comparacin de coincidencia y acta sobre el pin OC0 si se
usa.
TIMER
WGM02: selecciona el modo de generacin de onda.
La combinacin de CS02 a CS00 permite la seleccin
del modo de funcionamiento del timer
TIMER
WGM02: selecciona el modo de generacin de onda.
La combinacin de CS02 a CS00 permite la seleccin
del modo de funcionamiento del Timer
TIMER
La combinacin de CS02 a CS00 permite la seleccin
del modo de funcionamiento del Timer
TIMER
TCNT0: (Timer/Counter Register) Este registro es el
que guarda la cuenta del Timer/Counter0 (0 a 255)
TIMER
OCR0: (Output Compare Register) Aqu se guarda el
valor a comparar con el registro TCNT0. Cuando el
valor del registro TCNT0 coincide con el valor
guardado en este registro, se realiza el evento
programado para la coincidencia en comparacin, ya
sea generar una interrupcin o cambiar el estado del
pin OC0.
TIMER
TIMSK: (Timer Interrup Mask Register) En este
registro se encuentran los bits de habilitacin de
interrupciones para cada timer, a nosotros nos
interesa el bit TOIE0(0) y OCIE0(1) que son los
correspondientes al timer0.
TIMER
TOIE0: Escribir a 1 en este bit habilita la interrupcin
por desbordamiento del TimerCounter0
(Timer/Counter Overflow Interrupt Enable 0) si
tambin se habilitan las interrupciones globales con
el bit I en SREG.

OCIE0:Escribir a 1 en este bit habilita la interrupcin


por coincidencia en la comparacin del
Timer/Counter0con el registro OCR0 (Output
Compare Interrupt Enable 0), si tambin se habilitan
las interrupciones globales con el bit I en SREG.
TIMER
TIFR0: (Timer Interrup Flag Register) En este
registro se encuentran las banderas de
interrupciones para cada timer, a nosotros nos
interesa el bit TOV0(0) y OCF0(1) que son los
correspondientes al timer0.
TIMER
TOV0: Cuando este bit se pone a 1 se genera la
interrupcin por desbordamiento del
Timer/Counter0. Este bit se limpia cuando entra a la
funcin que atiende la interrupcin o escribiendo un
1 en este bit.

OCF0: Cuando este bit se pone a 1 se genera la


interrupcin por coincidencia en la comparacin del
Timer/Counter0 con el registro OCR0. Este bit se
limpia cuando entra a la funcin que atiende la
interrupcin o escribiendo un 1 en este bit.
TIMER0 MODO NORMAL
TIMER0 MODO NORMAL
TIMER0 MODO NORMAL
TIMER0 MODO NORMAL

Ejemplo2: configuraremos el timer0 con un prescaler de 1024 con una


frecuencia de CPU = 8Mhz para que el Timer se desborde cada 32ms.

incluir librera <avr/io.h&gt


http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__io.
html
TIMER1

Para el Atmega 328 el registro TCNT1 del timer1 AVR est formado por
16 bits por lo que se puede contar desde 0 hasta 65535, al utilizar
timer1 AVR como contador este no aumentar sus valores o su cuenta
con cada ciclo de programa, en este caso el timer1 estar conectado al
pin T1 por donde se le har llegar una seal, la cual al cambiar de
estado har que el timer1 AVR se incremente en una unidad, estos
incrementos en su cuenta pueden se pueden dar en flanco de subida o
cada por flanco de bajada de la seal del reloj.
Al igual que el Timer0 el flanco se selecciona al modificar los registros.
TIMER1

Para habilitar el uso de la interrupcin timer1 AVR se utiliza el registro


de mascara de interrupciones, que para el timer1 es el TIMSK1, adems
deben estar habilitadas las interrupciones globales.

Los bits 7,6,4 y 3 se ponen en cero ya que no se utilizan.


TIMER1
Al poner a 1 el bit5 se habilita la interrupcin cuando se produce la
captura del valor que en ese momento tiene el registro TCNT1 y es
almacenado en el registro ICR1.

Al poner a 1 el bit2 se habilita que el evento que cause la


interrupcin timer1 AVR sea cuando se iguale el registro TCNT1 al
registro OCR1A o al registro ICR1 en modo CTC y se produzca un
evento en el pin OC1B.

Al poner a 1 el bit1 se habilita que el evento que cause la


interrupcin timer1 AVR sea cuando se iguale el registro TCNT1 al
registro OCR1A o al registro ICR1 en modo CTC y se produzca un
evento en el pin OC1A.

Al poner a 1 el bit0 se habilita que el evento que cause la


interrupcin timer1 AVR sea cuando el registro TCNT1 alcance su
mximo valor de 65535 o lo que es lo mismo se desborde.
TIMER1
Para detectar cuando se ha producido la interrupcin
timer1 AVR se cuenta con el registro TIFR1.

Los bits 7,6,4 y 3 se ponen en cero ya que no se


utilizan.
TIMER1
Para detectar si se ha producido una interrupcin por
captura del valor del registro TCNT1 y almacenado en el
registro ICR1 el bit5 se tendr que poner a 1, cuando se
produzca la interrupcin este bit se pondr a 1
automticamente, si se quiere seguir produciendo mas
interrupciones por captura, este bit tendr que ponerse
nuevamente a 0 dentro de la rutina de interrupciones.
Para detectar si se ha producido una interrupcin
timer1 avr en modo CTC entre el registro TCNT1 y
el registro OCR1A o el registro ICR1 utilizando el pin
OC1B, el bit2 se tendr que poner a 0, cuando se
produzca la interrupcin este bit se pondr
automticamente a 1, si se quiere seguir produciendo
mas interrupciones por comparacin entre el registro
TCNT1 y el registro OCR1A este bits habr que ponerlo
nuevamente a 0 dentro de la rutina de interrupciones
TIMER1
Para detectar si se ha producido una interrupcin
timer1 avr en modo CTC entre el registro TCNT1 y
el registro OCR1A o el registro ICR1 utilizando el pin
OC1A, el bit1 se tendr que poner a 0, cuando se
produzca la interrupcin este bit se pondr
automticamente a 1, si se quiere seguir produciendo
mas interrupciones por comparacin entre el registro
TCNT1 y el registro OCR1A este bits habr que ponerlo
nuevamente a 0 dentro de la rutina de interrupciones.
Para detectar si se ha producido una interrupcin
timer1 avr por desborde, el bit0 se tendr que poner a 0,
cuando se produzca la interrupcin este bit se pondr
automticamente a 1, si se quiere seguir produciendo
mas interrupciones por desborde este bits habr que
ponerlo nuevamente a 0 dentro de la rutina de
interrupciones.
TIMER1
Ejemplo: se tiene un microcontrolador trabajando a una
frecuencia de 1Mhz y se desea obtener un tiempo de
temporizacin de 500ms. Cuando se produzca la interrupcin
el pin PD7 cambiara de estado y se observa ese cambio en el
led conectado a ese pin.

Que valor se debe cargar en el registro TCNT1 para obtener


los 500ms

TCNT1=65536-(500ms)*(1Mhz/8)
TIMER1
TCNT1=3036
Como el prescaler ser de 8, el registro TCCR1B se
cargar con TCCR1B=0b00000010;
Como se utilizara la interrupcin timer1 AVR por
desborde, el bit0 del registro TIMSK1 se pondr a 1
por lo que TIMSK1=0b00000001.

cuando el registro TCNT1 llegue al valor de


65535 habrn transcurrido 500ms, producindose el
overflow activando una interrupcin timer1 AVR.
Carga en TCNT1 el valor 3036 y cambia el estado del
pin 7. despus se sale de la rutina de interrupcin y
sigue en el programa.
TIMER1
TIMER1
Si la interrupcin se quiere hacer por comparacin el procedimiento
es:
Hay que calcular cual ser el valor a almacenar en el registro
OCR1A para obtener los 500ms.
OCR1A= Tretardo*(FCPU/prescaler)
Como se utilizar un prescaler de 8,
OCR1A=(500ms)*(1Mhz/8)
OCR1A=62500,
No olvidar que tras la comparacin el registro TCNT1 se reinicia a 0;
ahora adems se har que produzca una interrupcin tmr1 AVR.
Como se utilizar el registro OCR1A en el modo CTC y el prescaler
ser de 8, el registro TCCR1B se cargar con TCCR1B=0b00001010;
Como se utilizara la interrupcin timer1 AVR por comparacin, el
bit1 del registro TIMSK1 se pondr a 1 por lo
que TIMSK1=0b00000010
TIMER1
En el registro OCR1A se almacenar 62500 al utilizar
el prescaler de 8 para que la comparacin ocurra
cada 500ms, cuando el registro TCNT1 se iguale al
valor almacenado en el registro OCR1A habrn
transcurrido 500ms, momento en el que por
comparacin se provocar una interrupcin timer1
AVR, deteniendo el programa principal del atmega
328, y se cambiara el estado del pin 7. No es
necesario volver a cargar el registro OCR1A con
62500 ya que este valor ya est almacenado en
OCR1A, luego se saldr de la rutina de interrupcin
para volver al programa principal.
AVR ASSEMBLER
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
EXPRESIONES
http://www.atmel.com/webdoc/avrassembler

Potrebbero piacerti anche