Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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
}
4
producido la interrupción no es necesario realizarlo ya que el ATMEL STUDIO
lo hace automáticamente.
El circuito utilizado es el siguiente:
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: