Sie sind auf Seite 1von 13

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

DEPARTAMENTO: Energía Y Mecánica CARRERA: Ingeniería Automotriz


PERIODO Octubre 2018 –
ASIGNATURA: Microcontroladores y PLC NIVEL: VI
ELECTIVO: Febrero 2019
PRÁCTICA
DOCENTE: Ing. Sixto Reinoso NRC: 3136 1
N°:
FECHA DE
17-12-2018 FECHA DE ENTREGA: 07-01-2019
REALIZACIÓN:
 Gallo Steven
 Revelo Héctor
INTEGRANTES
 Sánchez Bryam
 Zapata Sebastian
LABORATORIO DONDE SE DESARROLLARÁ LA
Aula de Clase
PRÁCTICA

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.

Aspectos importantes a tener en cuenta con el uso de interrupciones:


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

 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

Las cosas importantes de la librería. Cuando la importéis tendréis esta línea:

#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

Y ya solo falta hacer el attach de la interrupción con el servicio de gestión o ISR:

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

Entre las ventajas tenemos:

 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

NOMBRE CARACTERÍSTICA FIGURA

 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.

El protoboard o tarjeta para prototipos es


un dispositivo muy utilizado para
Protoboard ensamblar y probar circuitos
electrónicos. Tiene la ventaja de que
permite armar con facilidad un circuito,
sin la necesidad de realizar soldaduras

Cables Especiales para conexiones en


protoboard

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

Pulsadores  Normalmente Abiertos

Leds  Diodos Led cualquier color

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.

//GENERA UNA SEÑAL CUADRADA EN EL PIN 10


#include "TimerOne.h"//libreria timer One
int led=13;//Declaracion de variables y pines
int ledState=0;//estado de led en 0
void setup()
{
//Configura los pines 1 y 2 como entradas
pinMode(0, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
//Configura el pin 10 y 13 como salidas
pinMode(13, OUTPUT);
pinMode(10, OUTPUT);
Timer1.initialize(2000); //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 encender y apagar el led
{
ledState=!ledState;
digitalWrite(10, ledState);
}
void loop()//funcion repetitiva
{
int P1=digitalRead(0);
int P2=digitalRead(1);
if(P1==LOW)
{
digitalWrite(led, HIGH); //led=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

}
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

ACTIVIDADES POR DESARROLLAR:


1. Arme en el protoboard el circuito del punto 1 del trabajo previo. Cargue el programa compilado en el
Microcontrolador y verifique el funcionamiento.

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

2. Explique el funcionamiento de los programas realizados.

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

Y el mínimo seria 1 milisegundo

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

Diaz, J. A. (17 de Enero de 2016). iescamp. Obtenido de


http://www.iescamp.es/miarduino/2016/01/21/placa-arduino-uno/
Garcia, V. (26 de febrero de 2014). EPA. Obtenido de https://www.diarioelectronicohoy.com/blog/display-
multiple-de-7-segmentos
Torres, R. (29 de mayo de 2013). DiarioElectrico. Obtenido de
https://www.diarioelectronicohoy.com/blog/display-multiple-de-7-segmentos

ANEXOS:

Anexo1. Circuito osciloscopio

Anexo2. Contador

Das könnte Ihnen auch gefallen