Está en la página 1de 7

Interrupción timer1 AVR

Interrupción timer1 AVR, mediante la interrupción timer1 AVR se puede detener


el programa principal con el cual este trabajando el microcontrolador AVR, para
indicarle al microcontrolador que se dedique a realizar otras tareas, al finalizar
la interrupción timer1 AVR, se seguirá con el programa principal desde donde
fue interrumpido.
En esta sección que es una secuencia del tema tratado en este enlace se tratará
sobre los eventos que hacen que el timer1 produzca una interrupción, por lo que
es muy importante que se sepa utilizar el timer1 AVR, sobre la utilización del
timer1 AVR ya se ha tratado y se puede ver aquí , para lo que se va a comentar
a continuación se utilizará como base el microcontrolador AVR ATmega88 .
La programación de la interrupción timer1 AVR se hará en C/C++ con el ATMEL
STUDIO , se utilizará la librería interrupt.h de la cual se puede hallar una
descripción detallada aquí .
La interrupción timer1 AVR puede ocurrir por los siguientes motivos en el
ATmega88, los cuales son:
 Por desbordamiento del timer1 , esto ocurre cuando el timer1
alcanza su máximo valor que es 255, cuando alcanza este valor se dice que
se desborda porque ya no puede tomar otro valor mayor, y se reinicia a 0
o a algún otro valor, justo en ese momento se le puede programar si así se
desea para que el timer1 cause una interru pción por desbordamiento.
 Por la igualdad entre el registro TCNT1 y el registro
OCR1A o el registro ICR1 cuando se utiliza timer1 en modo CTC, esto
quiere decir que justo en el momento que el registro TCNT1 se iguale al
valor almacenado en el registro OCR1A o el registro ICR1, se puede
programar el timer1 para que produzca una interrupción timer1 AVR y se
ejecute un evento en el pin OC1A .
 Por la igualdad entre el registro TCNT1 y el registro OCR1A
o el registro ICR1 cuando se utiliza timer1 en modo CTC, esto quiere
decir que justo en el momento que el registro TCNT1 se iguale al valor
almacenado en el registro OCR1A o el registro ICR1, se puede programar
el timer1 para que produzca una interrupción timer1 AVR y se eje cute un
evento en el pin OC1A .
 Por captura del valor de registro TCNT1 el cual se almacena
en el registro ICR1 al producirse un evento en el pin ICP1 (pin14 del
atemega88), los eventos que producen la captura son cuando una señal que
llega al pin ICP1 pasa de un alto a un bajo o cuando la señal que llega al
pin ICP1 pasa de un bajo a un alto, esto se decide por programa, al
producirse la captura se puede habilitar que el timer1 produzca una
interrupción timer1 AVR.

1
Para habilitar el uso de la interrupción t imer1 AVR se utiliza el registro
llamado registro de mascara de interrupciones, que para el timer1 es el TIMSK1 ,
además deben estar habilitadas las interrupciones globales, lo cual en el ATMEL
STUDIO se hará con la instrucción sei(), tal como se comentó aquí .

Los bits 7, 6, 4 y 3 de este registro no son utilizados por lo que se les suele poner
a 0.
Al poner a 1 el bit5 se habilita la interrupción 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 interrupción 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 interrupción 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 inte rrupción timer1
AVR sea cuando el registro TCNT1 alcance su máximo valor de 65535 o lo que
es lo mismo se desborde.
Para detectar cuando se ha producido la interrupción timer1 AVR se cuenta
con el registro TIFR1.

Los bits 7, 6, 4 y 3 no se utilizan por lo cual se les suele poner a 0.


Para detectar si se ha producido una interrupción por captura del
valor del registro TCNT1 y almacenado en el registr o ICR1 el bit5 se tendrá que
poner a 1, cuando se produzca la interrupción este bit se pondrá a 1
automáticamente, si se quiere seguir produciendo mas interrupciones por
captura, este bit tendrá que ponerse nuevamente a 0 dentro de la rutina de
interrupciones, cuando se utiliza la rutina de interrupciones de C/C++ con el
ATMEL STUDIO, este bit se pone a 0 automáticamente.
Para detectar si se ha producido una interrupción 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

2
interrupción este bit se pondrá automáticamente a 1, si se quiere seguir
produciendo mas interrupciones por comparación entre el registro TCNT1 y
el registro OCR1A este bits habrá que ponerlo nuevamente a 0 dentro de la rutina
de interrupciones, cuando se utiliza la rutina de interrupciones de C/C++ con el
ATMEL STUDIO, este bit se pone a 0 automáticamente.
Para detectar si se ha producido una interrupción 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
interrupción este bit se pondrá automáticamente a 1, si se quiere seguir
produciendo mas interrupciones por compar ación entre el registro TCNT1 y
el registro OCR1A este bits habrá que ponerlo nuevamente a 0 dentro de la rutina
de interrupciones, cuando se utiliza la rutina de interrupciones de C/C++ con el
ATMEL STUDIO, este bit se pone a 0 automáticamente.
Para detectar si se ha producido una interrupción timer1 avr por
desborde , el bit0 se tendrá que poner a 0, cuando se produzca la interrupción
este bit se pondrá automáticamente 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, cuando se utiliza la rutina de interrupciones de
C/C++ con el ATMEL STUDIO, este bits se pone a 0 automáticamente.
Rutinas de interrupción timer1 avr en C/C++ en el ATMEL STUDIO
Si se utiliza la interrupción timer1 AVR por desborde, la rutina de interrupción
se realizará dentro de la siguiente función:
ISR(TIMER1_OVF_vect){
//tareas a realizar dentro de la rutina de interrupción tmr1 AVR por desborde
}
Si se utiliza la interrupción tim er1 AVR por comparación entre el registro
TCNT1 y el registro OCR1A o el registro ICR1, siendo el pin OC1A aquel en el
cual ocurrirá algún evento, la rutina de interrupción se realizará dentro de la
siguiente función:
ISR(TIMER1_COMPA_vect){
//tareas a realizar dentro de la rutina de interrupción tmr1 AVR por comparación
entre el registro TCNT1 y el registro OCR1A o el registro ICR1 utilizando el pin
OC1A
}
Si se utiliza la interrupción timer1 AVR por comparación entre el registro
TCNT1 y el registro OCR1A o el registro ICR1, siendo el pin OC1B aquel en el
cual ocurrirá algún evento, la rutina de interrupción se realizará dentro de la
siguiente función:
ISR(TIMER1_COMPB_vect){

3
//tareas a realizar dentro de la rutina de interrupción tmr1 AVR por comparación
entre el registro TCNT1 y el registro OCR1A o el registro ICR1 utilizando el pin
OC1B
}
Si se utiliza la interrupción timer1 AVR del por captura del valor d el registro
TCNT1 que es almacenado en el registro ICR1, la rutina de interrupción se
realizará dentro de la siguiente función:
ISR(TIMER1_CAPT_vect){
//tareas a realizar dentro de la rutina de interrupción tmr1 AVR por captura del
valor del registro TCNT1 que es almacenado en el registro ICR1
}

Interrupción timer1 AVR por desbordamiento


La intensión del siguiente ejemplo es comprender como utilizar la interrupción
timer1 AVR por desborde, no se busca complicar el ejemplo, se provocará una
interrupción timer1 AVR por desborde del ATmega88, el cual estará trabajando
a una frecuencia de reloj de 1Mhz, se utilizará el timer1 como temporizador
para obtener un tiempo de 500ms de temporización, tras lo cual se producirá la
interrupción y en la rutina de atención a la interrupción se hará que el pin PD7
cambie de estado, lo cual será visible por medio de un led conectado a este pin.
Hay que calcular cual será el valor a cargar en el registro TCNT1 para obtener
los 500ms, para ello se utiliza la siguiente ecuación q ue se vio aquí .
TCNT1=2 1 6 -T r e t a r d o *(FCPU/prescaler)
Se utilizará un prescaler de 8, luego
TCNT1=65536-(500ms)*(1Mhz/8)
De donde TCNT1=3036 este valor está entre 0 y 65535 por lo que es correcto.
Como el prescaler será de 8, el registro TCCR1B se cargará
con TCCR1B=0b00000010 ;
Como se utilizara la interrupción timer1 AVR por desborde, el bit0 del
registro TIMSK1 se pondrá a 1 por lo que TIMSK1=0b00000001;
El registro TCNT1 se cargará con 3036 al utilizar el prescaler de 8 para
temporizar 500ms, cuando el registro TCNT1 llegue a su máximo valor de
65535 habrán transcurrido 500ms, momento en el que se desbordará provocando
una interrupción timer1 AVR, deteniendo el programa principal del atmega88, y
realizando lo indicado dentro de la rutina de interrupción que será
cargar nuevamente el registro TCNT1 con 3036 y cambiar el estado del pin PD7,
luego se saldrá de la rutina de interrupción para volver al programa principal, el
cambio a 0 del bit0 del registro TIFR1 que es el que detecta cuando se ha

4
producido la interrupción no es necesario realizarlo ya que el ATMEL STUDIO
lo hace automáticamente.
El circuito utilizado es el siguiente:

El programa realizado en el atmel studio para provocar la interrupción timer1


avr y obtener una temporización de 500ms tras lo cual cambiara el estado del pin
PD7 es el siguiente:

Interrupción timer1 AVR por Comparación


La intensión del siguiente ejemplo es comprender como utilizar la
interrupción timer1 AVR por comparación, no se busca complicar el
ejemplo, se provocará una interrupció n timer1 AVR por comparación del
ATmega88, el cual estará trabajando a una frecuencia de reloj de 1Mhz,

5
se buscará que el registro TCNT1 y el registro OCR1A se igualen cada
500ms, tras lo cual se hará que un led conectado al pin PD7 cambie de
estado por interrupción. En el pin OC1A también se conectará un led pero
este parpadeará por el evento de cambio de estado en el pin OC1A que
produce la propia comparación no por interrupción.
Hay que calcular cual será el valor a almacenar en el registro OCR1A para
obtener los 500ms, para ello se utiliza la siguiente ecuación que se
vio aquí.
OCR1A= T r e t a r d o *(FCPU/prescaler)
Se utilizará un prescaler de 8, luego
OCR1A=(500ms)*(1Mhz/8)
De donde OCR1A=62500 este valor está entre 0 y 36535 por lo que es
correcto, no olvidar que tras la comparación el registro TCNT1 se reinicia
a 0; ahora ademas se hará que produzca una interrupción tmr1 AVR.
Como se utilizará el registro OCR1A en el modo C TC y el prescaler será de
8, el registro TCCR1B se cargará con TCCR1B=0b00001010;
Como se utilizara la interrupción timer1 AVR por comparación, el bit1 del
registro TIMSK1 se pondrá a 1 por lo que TIMSK1=0b00000010;
En el registro OCR1A se almacenará 62500 al utilizar el prescaler de 8 para que
la comparación ocurra cada 500ms, cuando el registro TCNT1 se iguale al valor
almacenado en el registro OCR1A habrán transcurrido 500ms, momento en el
que por comparación se provocará una interrupción timer1 AVR, deteniendo el
programa principal del atmega88, y realizando lo indicado dentro de la rutina de
interrupción que será cambiar el estado del pin PD7, 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 interrupción para volver al programa
principal, el cambio a 0 del bit1 del registro TIFR1 que es el que detecta cuando
se ha producido la interrupción no es necesario realizarlo ya que el ATMEL
STUDIO lo hace automáticamente.
El circuito utilizado es el siguiente:

6
El programa realizado en el atmel studio para pro vocar la interrupción timer1
avr por comparación entre el registro TCNT1 y el registro OCR1A, y hacer que
la comparación ocurra cada 500ms produciendo una interrupción tras lo cual
cambiara el estado del pin PD7 es el siguiente:

En el ejemplo se ha utilizado la interrupción timer1 por comparación entre el


registro TCNT1 y el registro OCR1A, es la misma idea en caso de utilizar la
comparación entre el registro TCNT1 y el registro ICR1, solo hay que estar
atentos en cuanto a la manipulación de los bits del registro TCCR1B y los
registros utilizados en este caso.

Interrupción timer1 AVR por Captura


//Para hacer el ejemplo en este caso se rá necesario la utilización de una pantalla
LCD con el microcontrolador AVR, al ser un tema que aún no se ha tratado por
ahora queda pendiente.

También podría gustarte