Interrupción externa AVR


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

interrupción externa AVR atmega88La interrupción externa AVR se produce cuando en un pin preparado especialmente para este fin se produce algún evento, como por ejemplo ocurra algún cambio de estado en el pin como por ejemplo pasar de un bajo(0) a un alto(1); la interrupción externa AVR se comentará para el caso del ATmega88 pero si se quiere utilizar algún otro el procedimiento es muy similar, solo hay que guiarse de la hoja de datos del microcontrolador AVR utilizado.

La interrupción externa AVR es útil para el manejo de pulsadores, detectores de cruce por 0, teclados matriciales y mucho mas; hay 2 tipos de interrupciones externas en los microcontroladores AVR, en la imagen se tiene la  representación de los pines del Atmega88, los pines resaltados que se nombran como INT0 e INT1, son pines que están preparados para producir una interrupción externa AVR por diversos eventos que se pueden elegir por programa, otro microcontroladores AVR tienen mas pines INTx; mientras que los pines nombrados como PCINT0, PCINT1 así hasta PCINT23, son pines que están preparados para producir una interrupción externa AVR cuando en estos pines se produce un cambio de estado, esto es si sus estados pasan de alto a bajo o de bajo a alto; las interrupción externa AVR se producirá no importando si el pin elegido es una entrada o salida digital.

INTERRUPCIÓN EXTERNA AVR INT0 E INT1

Los pines INT0 e INT1 trabajan de forma independiente pero realizan el mismo tipo de tarea, a través de estos pines se pueden realizar una interrupción externa AVR, siendo la causa o el evento que produzca la interrupción uno de los siguientes motivos:

  • Un 0 o bajo en el  pin INT0 o INT1.
  • Por cambio de estado en el pin INT0 o INT1, esto  es que pase de un bajo a un alto o de un alto a un bajo.
  • Por flanco de bajada ocurrido en el pin INT0 o INT1, esto es que el estado del pin pase de un alto a un bajo.
  • Por flanco de subida ocurrido en el pin INT0 o INT1, esto es que el estado del pin pase de un bajo a un alto.

Para elegir el tipo evento que producirá la interrupción externa AVR y el pin a utilizar, se utiliza el registro llamado registro de control de la interrupción externa EICRA.

interrupción externa avr eicra

Los bits 7 a 4 del registro EICRA no son utilizados por lo que se les suele poner a 0, con bits 3 y 2 se elige utilizar el pin INT1 y con los bits 1 y 0 se elige utilizar el pin INT0, de acuerdo a las combinaciones de bits que se hagan se producirá la interrupción externa AVR por alguno de los eventos mencionados líneas arriba.

En la siguiente imagen se muestran las combinaciones de bits para la elección del evento que producirá una interrupción externa AVR por el pin INT1.

interrupción externa avr int1

En la siguiente imagen se muestran las combinaciones de bits para la elección del evento que producirá una interrupción externa AVR por el pin INT0.

interrupción externa avr int0

Para habilitar el uso de la interrupción externa AVR se utilizará el registro llamado EIMSK, además deben estar habilitadas las interrupciones globales, lo cual en el ATMEL STUDIO se hará con la instrucción sei(), como se comentó aquí.

interrupción externa avr eimsk

Los bits 7 a 2 no se utilizan por lo cual se les suele poner a 0, poniendo a 1 su bit 1 se habilita el uso de la interrupción externa AVR del pin INT1; poniendo a 1 su bit 0 se habilita el uso de la interrupción externa AVR del pin INT0.

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

interrupción externa avr eifr

Los bits 7 a 2 no se utilizan por lo cual se les suele poner a 0, para detectar si se ha producido una interrupción externa avr por el pin INT1, el bit 1 se tendrá que poner a 0, cuando se produzca la interrupción este bit se pondrá a 1, si se quiere seguir produciendo mas interrupciones por el pin INT1 este bits habrá que ponerlo nuevamente a 0 dentro de la rutina de interrupciones, cuando se utiliza la rutina de interrupciones con el ATMEL STUDIO, este bits se pone a 0 automáticamente; para detectar si se ha producido una interrupción externa avr por el pin INT0, el bit 0 se tendrá que poner a 0, cuando se produzca la interrupción este bit se pondrá a 1, si se quiere seguir produciendo mas interrupciones por el pin INT0 este bits habrá que ponerlo nuevamente a 0 dentro de la rutina de interrupciones, cuando se utiliza la rutina de interrupciones con el ATMEL STUDIO, este bits se pone a 0 automáticamente;

Rutinas de interrupción externa avr INT0 e INT1 en C/C++ en el ATMEL STUDIO

Si se utiliza la interrupción externa AVR INT0, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(INT0_vect){

//tareas a realizar dentro de la rutina de interrupción INT0

}

Si se utiliza la interrupción externa AVR INT1, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(INT1_vect){

//tareas a realizar dentro de la rutina de interrupción INT1

}

Ejemplo:

Se hará un ejemplo para la interrupción externa AVR por el pin INT0, se le hará llegar una señal la cual cambiará su estado entre altos y bajos con la ayuda de un fotorresistor, cuando se ilumine el fotorresistor su resistencia disminuirá y al pin INT0 le llegará un alto, cuando el fotorresistor no se ilumine su resistecia será alta y al pin INT0 le llegará un bajo.  Se programará para que la interrupción externa AVR ocurra por flanco de bajada,  esto es cuando la señal que llega al pin INT0 pase de un alto a un bajo; cada vez que se produzca la interrupción se cambiará el estado del pin PB0 lo cual será visible mediante un led. El circuito utilizado es el que se muestra en la imagen.

interrupción externa avr int0 ejemplo

El programa realizado en el atmel studio para el uso de la interrupción externa avr INTx, siguiendo el procedimiento comentado aquí es el siguiente:

interrupción externa avr ejemplo int0 código

INTERRUPCIÓN EXTERNA AVR PCINT0, PCINT1 … PCINT23

En los pines del microcontrolador AVR nombrados como PCINT0, PCINT1, hasta PCINT23 se pueden producir interrupciones por cambio de estado en estos pines, esto es si pasan de un alto a un bajo o si pasan de un bajo a un alto, no se tienen otras opciones como en el caso visto para la interrupción externa AVR INT0 e INT1 en los cuales se tiene hasta 4 opciones que se pueden elegir por programa.

Los pines PCINT0, PCINT1, hasta PCINT23 se encuentran formando grupos correspondientes a los puertos en los cuales se encuentran, en el atmega88 del PCINT0 a PCINT7 forman un grupo en el puerto B, del PCINT8 a PCINT14 forman otro grupo en el puerto C y del PCINT16 a PCINT23 forman un grupo en el puerto D, no cuenta con el PCINT15 ya que el puerto C solo tiene 8 pines.

La habilitación de la interrupción externa avr en este caso es mediante un solo bit común a un grupo de pines, si alguno de los pines de algún grupo provoca una interrupción, este pondrá a 1 un bit común al grupo, que es usado para detectar que se ha producido una interrupción externa avr por alguno de los pines de ese grupo.

Para habilitar la interrupción externa AVR para los grupos de pines, se utiliza el registro de control de interrupción por cambio de estado PCICR; además deben estar habilitadas las interrupciones globales, lo cual en el ATMEL STUDIO se hará con la instrucción sei(), como se comentó aquí.

interrupción externa avr pcintx pcicr

Los bits 7 a 3 no se utilizan por lo que se les suele poner a 0, al poner a 1 el bit 2 se habilita la interrupción externa AVR por cambio de estado para el grupo de pines del PCINT16 al PCINT23, al poner a 1 el bit 1 se habilita la interrupción externa AVR por cambio de estado para el grupo de pines del PCINT8 al PCINT14, al poner a 1 el bit 0 se habilita la interrupción externa AVR por cambio de estado para el grupo de pines del PCINT0 a PCINT7.

Para detectar en que grupo de pines está el pin por el que se provocó la interrupción por cambio de estado se tiene el registro PCIFR.

interrupción externa avr pcintx pcifr

Para detectar la interrupción externa avr provocada por alguno de los pines del PCINT16 al PCINT23 el bit2 se pone a cero, si por alguno de estos pines ocurre una interrupción por cambio de estado, el bit2 se pondrá automáticamente a 1, para volver a detectar una interrupción por alguno de estos pines, dentro de la rutina de interrupciones se tendrá que poner nuevamente el bit2 a 0, cuando se utiliza la rutina de interrupciones con el ATMEL STUDIO, este bit se pone a 0 automáticamente.

Para detectar la interrupción externa avr provocada por alguno de los pines del PCINT8 al PCINT14 el bit1 se pone a cero, si por alguno de estos pines ocurre una interrupción por cambio de estado, el bit1 se pondrá automáticamente a 1, para volver a detectar una interrupción por alguno de estos pines, dentro de la rutina de interrupciones se tendrá que poner nuevamente el bit1 a 0, cuando se utiliza la rutina de interrupciones con el ATMEL STUDIO, este bit se pone a 0 automáticamente.

Para detectar la interrupción externa avr provocada por alguno de los pines del PCINT0 al PCINT7 el bit0 se pone a cero, si por alguno de estos pines ocurre una interrupción por cambio de estado, el bit0 se pondrá automáticamente a 1, para volver a detectar una interrupción por alguno de estos pines, dentro de la rutina de interrupciones se tendrá que poner nuevamente el bit0 a 0, cuando se utiliza la rutina de interrupciones con el ATMEL STUDIO, este bit se pone a 0 automáticamente.

Para elegir que pines de los grupos de pines serán utilizados para provocar una interrupción externa avr se cuentan con 3 registros:

El registro PCMSK2, es usado para elegir que pines del grupo PCINT16 al PCINT23 serán utilizados para provocar una interrupción externa avr por cambio de estado, si el bit2 del registro PCICR se a puesto a 1 y están habilitadas las interrupciones globales, entonces al poner a 1 el bit correspondiente al pin que se quiera utilizar, se habilitará el uso de ese pin para provocar una interrupción externa AVR, si el bit se deja a 0 entonces el pin no será utilizado para provocar interrupciones.

interrupción externa avr pcintx pcmsk2

El registro PCMSK1, es usado para elegir que pines del grupo PCINT8 al PCINT14 serán utilizados para provocar una interrupción externa avr por cambio de estado, si el bit1 del registro PCICR se a puesto a 1 y están habilitadas las interrupciones globales, entonces al poner a 1 el bit correspondiente al pin que se quiera utilizar, se habilitará el uso de ese pin para provocar una interrupción externa AVR, si el bit se deja a 0 entonces el pin no será utilizado para provocar interrupciones.

interrupción externa avr pcintx pcmsk1

El registro PCMSK0, es usado para elegir que pines del grupo PCINT0 al PCINT7 serán utilizados para provocar una interrupción externa avr por cambio de estado, si el bit0 del registro PCICR se a puesto a 1 y están habilitadas las interrupciones globales, entonces al poner a 1 el bit correspondiente al pin que se quiera utilizar, se habilitará el uso de ese pin para provocar una interrupción externa AVR, si el bit se deja a 0 entonces el pin no será utilizado para provocar interrupciones.

interrupción externa avr pcintx pcmsk0

Rutinas de interrupción externa avr PCINT0 a PCINT23 en C/C++ en el ATMEL STUDIO

Si se utiliza la interrupción externa AVR PCINT0 a PCINT7, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(PCINT0_vect){

//tareas a realizar dentro de la rutina de interrupción de PCINT0 a PCINT7

}

Si se utiliza la interrupción externa AVR PCINT8 a PCINT14, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(PCINT1_vect){

//tareas a realizar dentro de la rutina de interrupción de PCINT8 a PCINT14

}

Si se utiliza la interrupción externa AVR PCINT16 a PCINT23, la rutina de interrupción se realizará dentro de la siguiente función:

ISR(PCINT2_vect){

//tareas a realizar dentro de la rutina de interrupción de PCINT16 a PCINT23

}

Ejemplo:

Se hará un ejemplo para la interrupción externa AVR por el pin PCINT23, se le hará llegar una señal la cual cambiará su estado entre altos y bajos con la ayuda de un fotorresistor, cuando se ilumine el fotorresistor su resistencia disminuirá y al pin PCINT23 le llegará un alto, cuando el fotorresistor no se ilumine su resistecia será alta y al pin PCINT23 le llegará un bajo. Se programará para que al ocurrir la interrupción externa AVR por cambio de estado en este pin, cada vez que se produzca la interrupción se cambiará el estado del pin PB0 lo cual será visible mediante un led. El circuito utilizado es el que se muestra en la imagen.

interrupción externa avr pcintx ejemplo

El programa realizado en el atmel studio para el uso de la interrupción externa avr PCINTx, siguiendo el procedimiento comentado aquí es el siguiente:

interrupción externa avr pcintx código

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

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