Interrupciones en Arduino

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA REVISIÓN: 12/04/2017 INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO.

Views 113 Downloads 2 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA REVISIÓN: 12/04/2017

INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO. DEPARTAMENTO:

Energía Y Mecánica

CARRERA:

Ingeniería Automotriz

ASIGNATURA:

Microcontroladores y PLC

PERIODO ELECTIVO:

Octubre 2018 Febrero 2019

DOCENTE:

Ing. Sixto Reinoso

NRC:

3136

FECHA DE 17-12-2018 REALIZACIÓN: INTEGRANTES

FECHA DE ENTREGA:    



NIVEL:

VI

PRÁCTICA N°:

1

07-01-2019

Gallo Steven Revelo Héctor Sánchez Bryam Zapata Sebastian

LABORATORIO DONDE SE DESARROLLARÁ LA Aula de Clase PRÁCTICA TEMA DE LA PRÁCTICA:

INTERRUPCIONES

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.

INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO.

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA 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:

INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO. 

 

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA 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 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

INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO.

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA 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.

INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO.

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA 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

Arduino UNO

Protoboard

Cables

Resistencias

FIGURA

CARACTERÍSTICA 

Microcontrolador ATmega328.



Voltaje de entrada 7-12V.



14 pines digitales de I/O (6 salidas PWM).



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 ensamblar y probar circuitos electrónicos. Tiene la ventaja de que permite armar con facilidad un circuito, sin la necesidad de realizar soldaduras

Especiales protoboard

 

10K 330R

para

conexiones

en

INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO.

Pulsadores



Normalmente Abiertos

Leds



Diodos Led cualquier color

Displays

 

7 segmentos Ánodo común

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA REVISIÓN: 12/04/2017

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

INFORME DE PRÁCTICAS DE LABORATORIO, TALLER O CAMPO. } if(P2==LOW) { digitalWrite(led, LOW); }

CÓDIGO: SGC.DI.505 VERSIÓN: 2.0 FECHA ULTIMA REVISIÓN: 12/04/2017

//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