Interrupción timer2 AVR


Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

Interrupción timer2 AVR, mediante la interrupción timer2 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 timer2 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 timer2 produzca una interrupción, por lo que es muy importante que se sepa utilizar el timer2 AVR, sobre la utilización del timer2 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 timer2 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 timer2 AVR puede ocurrir por los siguientes en el ATmega88, los cuales son:

  • Por desbordamiento del timer2, esto ocurre cuando el timer2 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 timer2 cause una interrupción por desbordamiento.
  • Por la igualdad entre el registro TCNT2 y el registro OCR2A cuando se utiliza timer2 en modo CTC, esto quiere decir que justo en el momento que el registro TCNT2 se iguale al valor almacenado en el registro OCR2A, se puede programar el timer2 para que produzca una interrupción timer2 AVR y se ejecute un evento en el pin OC2A.
  • Por la igualdad entre el registro TCNT2 y el registro OCR2A cuando se utiliza timer2 en modo CTC, esto quiere decir que justo en el momento que el registro TCNT2 se iguale al valor almacenado en el registro OCR2A, se puede programar el timer2 para que produzca una interrupción timer2 AVR y se ejecute un evento en el pin OC2B.

Para habilitar el uso de la interrupción timer2 AVR se utiliza el registro llamado registro de mascara de interrupciones, que para el timer2 es el TIMSK2, 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í.

interrupción timer2 avr timsk2

Los bits 7 al 3 de este registro no son utilizados por lo que se les suele poner a 0.

Al poner a 1 el bit2 se habilita que el evento que cause la interrupción timer2 AVR sea cuando se iguale el registro TCNT2 al registro OCR2A en modo CTC y se produzca un evento en el pin OC2B.

Al poner a 1 el bit1 se habilita que el evento que cause la interrupción timer2 AVR sea cuando se iguale el registro TCNT2 al registro OCR2A en modo CTC y se produzca un evento en el pin OC2A.

Al poner a 1 el bit0 se habilita que el evento que cause la interrupción timer2 AVR sea cuando el registro TCNT2 alcance su máximo valor de 255 o lo que es lo mismo se desborde.

Para detectar cuando se ha producido la interrupción timer2 AVR se cuenta con el registro TIFR2.

interrupción timer2 avr timsk2

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

Para detectar si se ha producido una interrupción timer2 avr en modo CTC entre el registro TCNT2 y el registro OCR2A utilizando el pin OC2B, el bit2 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 comparación entre el registro TCNT2 y el registro OCR2A 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 timer2 avr en modo CTC entre el registro TCNT2 y el registro OCR2A utilizando el pin OC2A, 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 comparación entre el registro TCNT2 y el registro OCR2A 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 timer2 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 timer2 avr en C/C++ en el ATMEL STUDIO

Si se utiliza la interrupción timer2 AVR por desborde, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(TIMER2_OVF_vect){

//tareas a realizar dentro de la rutina de interrupción tmr2 AVR por desborde

}

Si se utiliza la interrupción timer2 AVR por comparación entre el registro TCNT2 y el registro OCR2A, siendo el pin OC2A aquel en el cual ocurrirá algún evento, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(TIMER2_COMPA_vect){

//tareas a realizar dentro de la rutina de interrupción tmr2 AVR por comparación entre el registro TCNT2 y el registro OCR2A, utilizando el pin OC2A

}

Si se utiliza la interrupción timer2 AVR por comparación entre el registro TCNT2 y el registro OCR2A, siendo el pin OC2B aquel en el cual ocurrirá algún evento, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(TIMER2_COMPB_vect){

//tareas a realizar dentro de la rutina de interrupción tmr2 AVR por comparación entre el registro TCNT2 y el registro OCR2A, utilizando el pin OC2B

}

 

Interrupción timer2 AVR por desbordamiento

La intensión del siguiente ejemplo es comprender como utilizar la interrupción timer2 AVR por desborde, no se busca complicar el ejemplo, se provocará una interrupción timer2 AVR por desborde del ATmega88, el cual estará trabajando a una frecuencia de reloj de 1Mhz, se utilizará el  timer2 como temporizador para obtener un tiempo de 100ms 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 TCNT2 para obtener los 100ms, para ello se utiliza la siguiente ecuación que se vio  aquí.

TCNT2=28-Tretardo*(FCPU/prescaler)

Se utilizará un prescaler de 1024, luego

TCNT2=256-(100ms)*(1Mhz/1024)

De donde TCNT2=158,3438 este valor está entre 0 y 255 por lo que es correcto, pero como en el registro TCNT2 solo se pueden cargar números enteros, se cargará con un valor cercano a este, se hará para TCNT2=159, no será exactamente 100ms lo que se obtenga pero si muy cercano y aceptable en este caso.

Como el prescaler será de 1024, el registro TCCR2B se cargará con TCCR2B=0b00000111;

Como se utilizara la interrupción timer2 AVR por desborde, el bit0 del registro TIMSK2 se pondrá a 1 por lo que TIMSK2=0b00000001;

El registro TCNT2 se cargará con 159 al utilizar el prescaler de 1024 para temporizar 100ms, cuando el registro TCNT2 llegue a su máximo valor de 255 habrán transcurrido 100ms, momento en el que se desbordará provocando una interrupción timer2 AVR, deteniendo el programa principal del atmega88, y realizando lo indicado dentro de la rutina de interrupción que será cargar nuevamente el registro TCNT2 con 159 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 TIFR2 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:

interrupción tmr2 avr por desborde

El programa realizado en el atmel studio para provocar la interrupción timer2 avr y obtener una temporización de 100ms tras lo cual cambiara el estado del pin PD7 es el siguiente:

interrupción timer2 por desborde código

Interrupción timer2 AVR por Comparación

La intensión del siguiente ejemplo es comprender como utilizar la interrupción timer2 AVR en modo CTC, no se busca complicar el ejemplo, se provocará una interrupción timer2 AVR por comparación del ATmega88, el cual estará trabajando a una frecuencia de reloj de 1Mhz, se buscará que el registro  TCNT2 y el registro OCR2A se igualen cada 100ms, tras lo cual se hará que un led conectado al pin PD7 cambie de estado por interrupción. En el pin OC2A también se conectará un led pero este parpadeará por el evento de cambio de estado en el pin OC2A que produce la propia comparación no por interrupción.

Hay que calcular cual será el valor a almacenar en el registro OCR2A para obtener los 100ms, para ello se utiliza la siguiente ecuación que se vio  aquí.

OCR2A= Tretardo*(FCPU/prescaler)

Se utilizará un prescaler de 1024, luego

OCR2A=(100ms)*(1Mhz/1024)

De donde OCR2A=97,6563 este valor está entre 0 y 255 por lo que es correcto, pero como en el registro OCR2A solo se pueden almacenar números enteros, se almacenará un valor cercano a este, se hará para OCR2A=97, la comparación no ocurrirá exactamente a los 100ms pero si a un tiempo muy cercano y aceptable en este caso, no olvidar que tras la comparación el registro TCNT2 se reinicia a 0; ahora ademas se hará que produzca una interrupción tmr2 AVR.

Como el prescaler será de 1024, el registro TCCR2B se cargará con TCCR2B=0b00000111;

Como se utilizara la interrupción timer2 AVR por comparación, el bit1 del registro TIMSK2 se pondrá a 1 por lo que TIMSK2=0b00000010;

En el registro OCR2A se almacenará 97 al utilizar el prescaler de 1024 para que la comparación ocurra cada 100ms, cuando el registro TCNT2 se iguale al valor almacenado en el registro OCR2A habrán transcurrido 100ms, momento en el que por comparación se provocará una interrupción timer2 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 OCR2A con 97 ya que este valor ya está almacenado en OCR2A, luego se saldrá de la rutina de interrupción para volver al programa principal, el cambio a 0 del bit1 del registro TIFR2 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:

interrupción timer2 avr por comparación ejemplo

El programa realizado en el atmel studio para provocar la interrupción timer2 avr por comparación entre el registro  TCNT2 y el registro OCR2A, y hacer que la comparación ocurra cada 100ms produciendo una interrupción tras lo cual cambiara el estado del pin PD7 es el siguiente:

interrupción timer2 avr en modo CTC código

En el ejemplo se ha utilizado la interrupción timer2 en modo CTC por comparación entre el registro  TCNT2 y el registro OCR2A utilizando el pin OC2A para producir un evento, es la misma idea en caso de utilizar el pin OC2B, solo hay que estar atentos en cuanto a la manipulación de los bits los registros para este caso.

Si he logrado ayudarte en cuanto a la utilización de la interrupción timer2 AVR comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.

Atte: MrElberni.

Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0