Documente Academic
Documente Profesional
Documente Cultură
505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
TEMA DE LA
INTERRUPCIONES
PRÁCTICA:
INTRODUCCIÓN:
Interrupciones Externas en Arduino
Estas interrupciones hardware, se diseñaron por la necesidad de reaccionar a suficiente velocidad en tiempos
inimaginablemente cortos a los que la electrónica trabaja habitualmente y a los que ni siquiera el software
era capaz de reaccionar.
Para las interrupciones externas o hardware, solo hay dos pines que las soportan en los ATmega 328 (p.e.
Arduino UNO), son las INT0 y INT1 que están mapeadas a los pines 2 y 3. Estas interrupciones se pueden
configurar con disparadores en RISING o FALLING para flancos o en nivel LOW. Los disparadores son
interpretados por hardware y la interrupción es muy rápida.
El Arduino mega tiene más pines disponibles para interrupciones externas. Pines de External Interrupts para
Mega: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2).
Estos pines pueden ser configurados para disparar una interrupción al detectar un nivel bajo, un flanco
ascendente, un flanco descendente o un cambio de nivel.
En el pin de reset también hay otra interrupción que sólo se dispara cuando detecta voltaje LOW y provoca
el reset del microcontrolador.
Para configurar una interrupción en Arduino se usa la función attachInterrupt(). El primer parámetro a
configurar es el número de interrupción, normalmente se usa el nº de pin para traducir al nº de interrupción.
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
Esto quiere decir que el Arduino UNO puede definir dos interrupciones hardware llamadas 0 y 1, conectadas
a los pines 2 y 3.
Para saber qué número de interrupción estás asociada a un pin, debemos usar la función
digitalPinToInterrupt(pin). El número de interrupción su mapeo en los pines dependerá del MCI. El uso de
número de interrupción puede provocar problemas de compatibilidad cuando el sketch funciona en diferentes
placas.
Tabla de interrupciones y número de pin asociado:
Arduino Due tiene grandes capacidades a nivel de interrupciones que permiten asociar una interrupción a
cada uno de los pines disponibles. Arduino Zero permite asociar una interrupción a todos los pines excepto
para el pin 4.
Dentro de la función llamada desde la interrupción, la función delay() no funciona y el valor devuelto
por millis() no aumenta. La razón es que estas funciones hacen uso de interrupciones que no se
disparan mientras está disparada una interrupción externa.
Los datos recibidos por el puerto serie se pueden perder mientras se está en la función llamada por la
interrupción.
Se deben declarar como “volatile” cualquier variable que sea modificada dentro de la función llamada
por una interrupción
Las siglas LCD significan “Liquid Cristal Display” ó pantalla de cristal líquido. Es una pantalla plana basada
en el uso de una sustancia liquida atrapada entre dos placas de vidrio, haciendo pasar por este una corriente
eléctrica a una zona específica, para que así esta se vuelva opaca, y además cuenta (generalmente) con
iluminación trasera.
Las pantallas LCD de color, cada pixel individual se divide en tres cédulas o sub pixeles con los colores RGB
(Rojo, Verde y Azul) respectivamente. Y así cada pixel puede controlarse para producir una gran variedad
de colores distintos.
LIBRERÍA TIMERONE.h
Hay varias versiones de esta librería corriendo por ahí. Yo he elegido esta, básicamente porque parece
soportar más modelos de Arduino (Incluyendo al MEGA) y porque parece que el código es más rápido que
el original. Podéis descargarla Aquí TimerOne.zip
#include <TimerOne.h>
Esto nos crea un objeto llamado Timer1 directamente, sin necesidad de instanciarlos. Lo siguiente es
programar el intervalo de disparo en microsegundos:
Timer1.initialize(150000); // 150 ms
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
Timer1.attachInterrupt( ISR_Callback) ;
Y con esto ya habéis programado una interrupción temporizada que saltara cada 150 ms y llamara la función
ISR_Callback
Código limpio y elegante. No tenemos que calcular en el loop si estaremos perdiéndonos algo o no.
Cuando el tiempo programado se cumple la interrupción salta y se ejecuta limpiamente.
Conceptualmente la programación orientada a eventos es la predominante en los moderno sistemas
operativos como Linux, Windows o OSX y si aprendéis a pensar así no os resultara difícil entender el
concepto bajo Visual Basic o C#.
No importa que estemos en un delay, la interrupción salta impecable.
La medida del tiempo es muy precisa.
Pero como la felicidad completa no existe tenemos que hablar de los inconvenientes:
El primero y grave, es que si jugamos con los timers, muchas de las instrucciones que dependen de ellos
dejaran de funcionar.
Entre estos están, los pines PWM y analogWrite() y la librería Servo. Dependiendo del modelo Arduino
y del Timer que usemos la cosa es grave.
Si vuestro Timer entra en conflicto con algo puede ser muy complicado comprender el problema.
Si tu Servicio ISR tarda más en ejecutarse de lo que tarda en saltar la nueva interrupción (Y te puede
pasar por un error de cálculo) antes de acabar puede volver a entrar porque ha disparado de nuevo el
Timer.
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
OBJETIVOS:
Objetivo General
Comprobar el funcionamiento de las interrupciones externas e internas mediante prácticas
desarrolladas con arduino.
Objetivos específicos
Realizar circuitos de aplicación utilizando las interrupciones del microcontrolador para compreder su
funcionamiento.
MATERIALES:
HERRAMIENTAS MATERIALES Y EQUIPOS
Microcontrolador ATmega328.
Voltaje de entrada 7-12V.
14 pines digitales de I/O (6
salidas PWM).
Arduino UNO
6 entradas análogas.
32k de memoria Flash.
Reloj de 16MHz de velocidad.
Resistencias 10K
330R
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
Displays 7 segmentos
Ánodo común
INSTRUCCIONES
TRABAJO PREVIO
1. Genere una señal de 2ms, usando la interrupción del TIMER1. Use el osciloscopio virtual para
medir la señal. Dibuje a escala mostrando los valores de tiempo y voltaje.
}
if(P2==LOW)
{
digitalWrite(led, LOW); //led=0;
}
}
2. Escriba un programa para realizar un contador MOD-10 utilizando la interrupción del TIMER 1.
Los datos se sacarán por un display de 7 segmentos. No debe existir la función delay() en ninguna
parte del programa. Mediante una interrupción externa resetea el contador. Utilice este ejercicio
para comprobar todas las interrupciones externas que tiene el microcontrolador del arduino, es
decir:
a. Interrupción externa por flanco de subida.
b. Interrupción externa por flanco de bajada.
c. Interrupción externa por cambio de estado.
d. Interrupción externa en alto.
e. Interrupción externa en bajo
#include "TimerOne.h"
const int decoder[]={64, 121, 36, 48, 25, 18, 3, 120, 0, 24};
int c=0;
int P1=1;
void setup()
{
int pin;
for(pin=3; pin<=9; pin++) //Configura los pin 1 hasta el 8 como salidas
{
pinMode(pin, OUTPUT);
}
pinMode (1,INPUT_PULLUP);
Timer1.initialize(300000); //Inicializa el timer1 y fija un periodo de 500 ms.
//Las interrupciones se ejecutan cada 500 ms.
Timer1.attachInterrupt(callback);
}
void callback()//funcion que se encarga de contar en el display
{
display7(decoder[c]);
c++;
if(c==10)
{
c=0;
}
}
void loop(){
P1=digitalRead(1);
if (P1==LOW){
c=0;
}
}
void display7(int cant) //Función para encender el display de 7 segmentos
{
digitalWrite(3, bitRead(cant, 0)); //Enciende el segmento del display segun el bit leido
digitalWrite(4, bitRead(cant, 1)); //Enciende el segmento del display segun el bit leido
digitalWrite(5, bitRead(cant, 2)); //Enciende el segmento del display segun el bit leido
digitalWrite(6, bitRead(cant, 3)); //Enciende el segmento del display segun el bit leido
digitalWrite(7, bitRead(cant, 4)); //Enciende el segmento del display segun el bit leido
digitalWrite(8, bitRead(cant, 5)); //Enciende el segmento del display segun el bit leido
digitalWrite(9, bitRead(cant, 6)); //Enciende el segmento del display segun el bit leido
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
2. Arme en el protoboard el circuito del punto 2 del trabajo previo. Cargue el programa compilado en
el Microcontrolador y verifique el funcionamiento.
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
RESULTADOS OBTENIDOS:
1. diagramas de flujo para cada uno de los programas de la práctica.
EJERCICIO 1
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
EJERCICIO 2
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
Ejercicio 1
Ejercicio 2
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
3. ¿Cuál es el mínimo y máximo tiempo que puede generar la interrupción del TIMER1??
El máximo tiempo que se puede generar una interrupción del timer seria
1
∗ 65.536 = 0.004096 𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠 = 4 𝑚𝑖𝑙𝑖𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠
16000000
CONCLUSIONES:
En la utilización del osciloscopio se tiene en cuenta que las divisiones horizontales son para
determinar el voltaje y en las verticales el tiempo y este se puede variar según el uso.
Al utilizar el osciloscopio debemos tener en cuenta su conexión para observar una lectura correcta en
su pantalla.
RECOMENDACIONES:
Al momento de realizar la conexión del circuito en protoboard, debemos manipular correctamente el
manual de conexión con el arduino para su funcionamiento.
Verificar que los puertos de conexión del arduino sean los adecuados ya que no todos cumplen las
funciones para interrupciones.
BIBLIOGRAFÍA:
CÓDIGO: SGC.DI.505
INFORME DE PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA
LABORATORIO, TALLER O CAMPO. REVISIÓN: 12/04/2017
ANEXOS:
Anexo2. Contador