Interrupción timer1 AVR


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

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 interrupció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 ejecute 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.

Para habilitar el uso de la interrupción timer1 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í.

interrupción timer1 avr timsk1

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 interrupció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.

interrupción timer1 avr 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 registro 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 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 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 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 timer1 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){

//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 del 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 que se vio  aquí.

TCNT1=216-Tretardo*(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 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 tmr1 avr por desborde

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 desborde código

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, 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= Tretardo*(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 CTC 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:

interrupción timer1 avr por comparación ejemplo

El programa realizado en el atmel studio para provocar 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:

interrupción timer1 avr modo CTC código

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 será 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.

Si he logrado ayudarte en cuanto a la utilización de la interrupción timer1 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