Interrupcion Arduino

download Interrupcion Arduino

of 25

Transcript of Interrupcion Arduino

  • 7/21/2019 Interrupcion Arduino

    1/25

    Interrupciones en arduino

    Que es una interrupcin?

    Las interrupciones se referen al paro inmediato del uncionamiento comn del

    sistema. Esto es muy til para hacer que las cosas sucedan automticamente en

    programas que sean sensibles a estados, tambin pueden ayudar con problemas de

    temporizadores. Tambin puede serir para detener completa o parcialmente el

    sistema en caso de que algn eento especifco suceda.

    !n e"emplo de como utilizar estas interrupciones ser#a el de un lector de datos por

    e"emplo un sensor de temperatura. $uponiendo que al inicio del programa se toma

    lectura de la temperatura despus se llama una unci%n que cree la estad#sticas, se

    empaqueta, se manda por algn protocolo seguro y despus hace otra lectura.

    &hora bien si llegamos a tener una aumento de temperatura inesperado queremos

    que tome esa temperatura y la en#e, pero esto es un problema ya que el procesode creaci%n de estad#stica, empaquetado y eni% es tarado, ms sin embargo si se

    le asigna una interrupci%n a la lectura de temperaturas el programa entero

    es interrumpido y se e"ecuta la lectura para despus eniar los datos que son ms

    importantes.

    Tambin si tenemos un sistema que este eniando datos cualesquiera para

    monitorearlos, podemos asignar una interrupci%n que se accione con un bot%n para

    detener el programa y poder utilizar los datos, o para de"ar de recibir ms datos,

    segn sea el caso.

    Cmo usar una interrupcin con el arduino?

    La mayor#a de las placas arduino tienen dos interrupciones e'ternas.

    (nterrupcion e'terna ) * + pin digital -

    (nterrupcion e'terna * + pin digital / -

    Esto para el arduino !01.

    2ara usar interrupciones tenemos la unci%n*

    voidattachInterrupt( interrupcion, funcion, modo )

    3icha unci%n especifca que unci%n se inoca cuando se produce una interrupcion

    e'terna, si ya e'istia una unci%n ad"untada al pin se substituye por la nuea.

    Los parmetros de esta unci%n son* interrupcion:el nmero de la interrupci%n + Es un inty puede ser ) o esto para asignar el pin a usar -.

  • 7/21/2019 Interrupcion Arduino

    2/25

    funcion*Es la unci%n que se inocara cuando la interrupci%n suceda, estauncion 01 debe tener parametro 0( tampoco deoler nada. 4omunmente se leconoce como rutina de interrupcin de servicio.

    modo:Esto defne el criterio de la interrupci%n es decir cuando seconsiderara como interrupci%n. E'isten 5 constantes predefnidas para poderusarlas como modos.

    LOW Se dispara la interrupcin cuando el pin tenga un valor bajo ( Cero lgico o

    LOW ).

    C!"#$ $e dispara la interrupci%n cuando el pin se tenga un alor alto + !no

    l%gico o 6(76 -.

    %I&I"# $e dispara la interrupci%n cuando el pin pase de alor ba"o a alto + L18 a

    6(76 9 ) a -.

    '!LLI"# $e dispara la interrupci%n cuando el pin pase de alor alto a ba"o + 6(76

    a L18 9 a ) -.

    4omo dato queda decir que tambin se cuenta con unciones para actiar o

    desactiar el uso de las interrupciones. 4on tan solo usar la

    unci%n noInterrupts() se asegura de que no se interrumpa la porci%n

    de c%digo que le sigue a esta unci%n, tambin esta la unci%ninterrupts() que

    hace lo contrario, ya que permite las interrupciones.Esto puede ser til dependiendo

    el caso y se mane"a similar a los hilos y candados.

    2odr#amos tener una porci%n de c%digo as#*

    oid loop+- :

    no(nterrupts+-;

  • 7/21/2019 Interrupcion Arduino

    3/25

    >asicamente es un push button, un led y un par de resistencias acomodadas de

    manera que se puedan utilizar con el siguiente codigo.

    3e no utilizar las interrupciones, el led tendria un comportamiento un poco raro, ya

    que pudiese no captar bien las se?ales que se le enian.

    Esto es muy amiliar respecto a los threads y los candados.

    Manejo de Interrupciones con ArduinoEl artculo anterior conectamos un simple display de 7 segmentos a nuestro Arduinoy

    programamos un sencillo contador. Pero... Qu tal si queremos interactuar con

    eventos externos?

    Una de las ormas comunes de interactuar con cosas que suceden !uera! de nuestro

    control es por e"emplo monitorear el estado de las lneas. #entro de nuestro !loop!

    principal podemos leer continuamente el valor de una lnea de entrada y e"ecutar por

    medio de una condicional un c$digo especi%co en caso de que detectemos un cam&io.

    El pro&lema de este mtodo es que el c$digo se vuelve sumamente comple"o cuando

    tenemos que monitorear muc'as cosas o cuando nuestro loop principal simplemente

    tiene que 'acer cosas que toman demasiado tiempo.

    En esta entrada vamos a comprender como utili(ar las interrupciones externas del

    Arduino. Esto nos ser) de muc'a utilidad para interactuar ya sea con el usuario o con

    otros dispositivos de 'ard*are que emitan !se+ales! que nos permitan sa&er que un

    evento 'a sucedido.

    Antes de continuar preparen su display de 7 segmentos porque en esta entrada lo

    vamos a re,utili(ar.

    http://fuenteabierta.teubi.co/2012/12/fabricando-un-contador-simple-con.htmlhttp://fuenteabierta.teubi.co/2012/12/fabricando-un-contador-simple-con.htmlhttp://1.bp.blogspot.com/-XHVgBp7IvwI/T7sr1I1710I/AAAAAAAAATw/08lCXnwfUS8/s1600/FRI.pnghttp://fuenteabierta.teubi.co/2012/12/fabricando-un-contador-simple-con.html
  • 7/21/2019 Interrupcion Arduino

    4/25

    Una cosa a la vez...

    -os Arduino &asados en los microcontroladores Amtel A/ pueden e"ecutar una sola

    secuencia de instrucciones a la ve(. El pro&lema de esto es por e"emplo0 si ustedes

    est)n enviando n1meros a su display y luego el usuario presiona un &ot$n. 2i nuestro

    ciclo toma muc'o tiempo en e"ecutarse puede que pase muc'o tiempo antes de que

    podamos leer la lnea de nuestro usuario y perdamos el evento0 o tal ve( simplemente

    estamos ocupando un ciclo en 'acer algo interesante. Esto es una !desventa"a! de

    microcontroladores sencillos y es algo con lo que las computadoras 'an tenido que

    convivir pr)cticamente desde que ueron inventadas.

    Como manejar eventos externos?

    Aortunadamente los dise+adores de microcontroladores pensaron en este pro&lema

    'ace &astante tiempo y de a' surgieron las amosas !interrupciones!. -as

    interrupciones 3omitiendo muc'os detalles4 uncionan de manera muy sencilla5 Existe

    una lista de eventos internos o externos que genera ya sea el microcontrolador o una

    lnea externa y al detectarse estos eventos el microcontrolador detiene la secuencia de

    comandos que est) e"ecutando. -uego de esto0 llama al c$digo de%nido previamente

    que se encarga de !mane"ar! esa interrupci$n en espec%co y luego0 cuando 'a

    terminado de !atender la interrupci$n! regresa a e"ecutar la secuencia principal que

    'a&a de"ado pausada.

    6al ve( no es una soluci$n perecta pero nos permite !atender! cosas que

    consideramos importantes por e"emplo cuando un dispositivo externo enva datos va

    serial o cuando una lnea de interrupci$n cam&ia su valor de a 8 o viceversa.

    Hablando un poco ms sobre las interrupciones

    9o 'ay un !est)ndar! de como se mane"an o cuales on las interrupciones disponi&les.

    :ada a&ricante implementa dierentes tipos de interrupciones dependiendo del

    microcontrolador que 'an dise+ado y el uso que se le piensa dar. -a venta"a con los

    Arduinos es que como comparten un microprocesador com1n los desarrolladores 'an

    creado unas &i&liotecas que permiten mane"ar interrupciones de una manera muy

    sencilla.

    Nota aclaratoria: -as unciones de mane"o de interrupciones de la reerencia del

    Arduino son muy0 pero muy &)sicas. -os microprocesadores Amtel A/ tienen una

    larga lista de dierentes tipos interrupciones disponi&les. 2in em&argo el mane"ar estas

    interrupciones no resulta !tan trivial! y depende muc'o de las caractersticas de cada

    microprocesador en particular. Para aplicaciones m)s avan(adas0 si desean m)s

    inormaci$n de como programar estas interrupciones0 pueden revisar la

    documentaci$n de A/ -i&cen la secci$n dedicada almane"o de interrupciones.

    En Arduino podemos asociar el c$digo de las interrupciones a travs de la

    unci$nattac';nterrupt34. -as interrupciones o eventos que podemos asociar a laslneas mediante esta unci$n en el Arduino

  • 7/21/2019 Interrupcion Arduino

    5/25

    8. :uando el nivel l$gico de la lnea es 3-=>4

    . :uando el nivel l$gico de la lnea cam&ia independientemente de su

    estado l$gico 3:@A9E4

    B. :uando el nivel l$gico cam&ia de a 8 3/;2;94

    C. :uando el nivel l$gico cam&ia de 8 a 3DA--;94Antes de continuar0 vamos a 'acer un peque+o circuito que nos permita cam&iar los

    valores l$gicos de las lneas de interrupci$n5

    Al circuito anterior se le conoce como !resistencia pull,up!0 su unci$n es mantener unnivel l$gico en la compuerta aunque el circuito se encuentre a&ierto. Para nuestro caso

    mantendr) un 8 l$gico permanente con el pulsador a&ierto y un l$gico cuando est

    cerrado.

    -uego0 para capturar las interrupciones la tenemos un poquito m)s )cil0 simplemente

    replicamos este circuito para cuantos interruptores querramos capturar y lo

    conectamos a las lneas correspondientes. Para este e"emplo utili(aremos las lneas 80

    8F y que corresponden a las interrupciones B0 C y G del Arduino.

    Esta es una peque+a oto de como se ven los pulsadores armados en la &read&oard5

    http://en.wikipedia.org/wiki/Pull-up_resistorhttps://www.circuitlab.com/circuit/7c8h9y/pulsador-con-pull-up/http://en.wikipedia.org/wiki/Pull-up_resistor
  • 7/21/2019 Interrupcion Arduino

    6/25

    9otar)n que uso resistencias de 8H. Usualmente se recomienda el uso de

    resistencias de C.7H0 l)stimosamente no tena a la mano a la 'ora de armar el circuito0

    sin em&argo0 en la pr)ctica no 'ay demasiada dierencia ya que su 1nico tra&a"o es

    evitar que cuando presionemos el pulsador se produsca un corto circuito.

    Programando las nterrupciones

    -o primero que tenemos que 'acer es de%nir algunas constantes que nos indiquen las

    lineas que utili(aremos como interrupciones0 adem)s de algunas varia&les !volatiles!.

    En general0 utili(aremos el modi%cador !volatile! para indicarle al compilador que

    nuestra varia&le podra ser accedida desde distintas u&icaciones en el c$digo de

    nuestro programa. Esto o&liga a asignar espacio de /A< a nuestra varia&le en ve( de

    guardarla en la memoria de datos.

    // Botonesconst int BTN1 = 18;const int BTN2 = 19;const int BTN3 = 20;

    // Display 7-Segmentosconst int D0 = 4;const int D1 = ;const int D2 = !;const int D3 = 7;

    // "onta#o$%olatile int inc;

    // &ncen#i#o y 'paga#o #el #isplay%olatile int on());

    // Tiempo en *+e se $eali,o la ltima inte$$+pci.n%olatile long lastnt;

    -as constantes de nom&re !I69! representan mis &otones y las constantes !#! las

    lneas a donde tengo conectado el decodi%cador a 7 segmentos.

    !e"niendo las #unciones $ue modi"carn los valores

    http://arduino.cc/en/Reference/Volatilehttp://arduino.cc/en/Reference/Volatilehttp://4.bp.blogspot.com/-gkQVIr-XQPc/UNKdszXQ1vI/AAAAAAAAC-g/zQdiY9vCC04/s1600/19122012497.jpghttp://arduino.cc/en/Reference/Volatilehttp://arduino.cc/en/Reference/Volatile
  • 7/21/2019 Interrupcion Arduino

    7/25

    amos a de%nir un par de unciones !ayudantes! extra que se encargar)n de

    incrementar y decrementar el contador.// nc$ementa y esc$ie el nme$o al #isplay%oi# inc$ement inc55; inc = inc 6 10 inc 0; $iteTo7Seginc;:

    // Dec$ementa y esc$ie el nme$o al #isplay%oi# #ec$ement inc--; inc = inc = 0 inc 9; $iteTo7Seginc;:

    El siguiente paso es de%nir el c$digo que se encargar) de mane"ar las interrupciones0

    vamos a reali(ar unciones muy simples0 un &ot$n incrementara el contador0 el otro lodisminuira y el 1ltimo encender) y apagar) el display de 7 segmentos. :on las

    unciones anteriores el c$digo se vuelve muy )cil de entender5// "o#igo pa$a la inte$$+pcion %oi# int inc$ement;:

    // "o#igo pa$a la inte$$+pcion 4%oi# int4 #ec$ement;:

    // "o#igo pa$a la inte$$+pcion 3%oi# int3 on()) = on())

  • 7/21/2019 Interrupcion Arduino

    8/25

    attacnte$$+pt3?int3?CSN; // lnea 20//"olocamos +n 0 en n+est$o #isplay #e 7 segmentos

    $iteTo7Seginc;:

    6al ve( en este momento se estn 'aciendo la siguiente pregunta5 Por qu uso /;2;9y no otro tipo de interrupci$n? -a respuesta a esta pregunta realmente tiene muc'o

    que ver con lo que estemos programando y como querramos que uncione. En este

    caso0 quera que el contador se incrementara cuando el usuario de"ara de presionar el

    &ot$n0 como nuestro &ot$n genera un l$gico cuando esta presionado y un 8 l$gico

    cuando esta sin presionar si queremos incrementar nuestro contador "usto despues

    de que se 'a presionado el &ot$n el evento /;2;9 es el m)s adecuado. 2i en cam&io

    estuvieramos programando algo como un control de arcade posi&lemente

    de&eramos usar la interrupci$n DA--;9 para que el usuario no perci&a un !retardo!

    a la 'ora de presionar el &ot$n y ver una respuesta en el "uego.

    Qu 'acemos luego con el loop principal?

    Pues nada0 lo de"amos vaco ya que no lo utili(aremos en este e"emplo5// Eoop %aco%oi# loop :

    %onus: &liminando el 'ebote v(a so#t)are.2i toman el c$digo que puse anteriormente "unto con el circuito que coloqu0 se van a

    dar cuenta que el contador unciona de manera err)tica como se muestra en el

    siguiente video5'ttp5JJ***.youtu&e.comJ*atc'?vK:#mPvr&8Uo#ele#Ain? (@TA@T;

    // initiali,e te p+s+tton pin as an inp+t

    pin>o#e+ttonAin? NA@T;

    attacnte$$+pt0? encien#eEe#? JJ;

    attacnte$$+pt0? apagaEe#? E(K;

    :

    %oi#loop

    //a*+i p+e#es pone$ el co#igo *+e *+ie$as

  • 7/21/2019 Interrupcion Arduino

    23/25

    S

    R

    )

    /

    5

    Y

    Q

    #elay0000;

    :

    %oi#encien#eEe#

    #igitalK$itele#Ain? JJ;

    :

    %oi#apagaEe#

    #igitalK$itele#Ain? E(K;

    :

    &qu# un e"emplo prctico para usar una interrupci%n, una maqueta de un

    tren, en la cual, el &rduino controla la elocidad desde un potenci%metro

    y mediante interrupci%n, controla su direcci%n mediante un rel*

    /

    5

    Y

    Q

    S

    R

    )

    /

    5

    intp+lsa#o$Di$ = 2;

    int#i$T$en = 8;

    intpmT$en = 3;

    intpotenciomet$oT$en= 0;

    intstate = E(K;

    int%eloci#a#T$en = 0;6/co#e

    %oi#set+p

    Se$ialegin9!00;

    //con)ig+$acion #e pines

    pin>o#ep+lsa#o$Di$? NA@T;

    pin>o#e#i$T$en? (@TA@T;

    pin>o#epmT$en? (@TA@T;

    attacnte$$+pt0? #i$eccionT$en? L'EEN; //ni%el int? )+ncion? en *+e esta#

  • 7/21/2019 Interrupcion Arduino

    24/25

    Y

    Q

    S

    R

    )

    /

    5

    Y

    Q

    S

    R

    /)

    :

    %oi#loop

    //Si el sitc no esta p+lsa#o? gi$a en +na #i$eccion? si no en la cont$a$ia

    %eloci#a#T$en = analogCea#potenciomet$oT$en; // Eect+$a #el %alo$ #el potenci

    %eloci#a#T$en = 800 5 %eloci#a#T$en/!; // Aa$a estalece$ la %eloci#a# #el t$

    analogK$itepmT$en? %eloci#a#T$en;

    #igitalK$itele#Ain? JJ;

    :

    %oi##i$eccionT$en

    state = Mstate;

    #igitalK$ite#i$T$en? state; // &stalece la #i$ecci.n #el t$en

    :

    El circuito de control de la maqueta es bastante simple, el &rduino lee el

    alor desde un potenci%metro y por 28G imprime la elocidad para que

    la locomotora se muea. El c%digo de la interrupci%n a?ade el sentido en

    que tiene que circular la locomotora para eitar que, al llegar cerca del

    e'tremo de la #a, si la siguiente lectura del pulsador llega tarde, el tren

    pueda descarrilar.

    La sinta'is de la interrupci%n es bastante sencilla de escribir*

    en setup tenemos que defnir que amos a utilizar una interrupci%n, en

    qu niel, una unci%n +llamada rutina de sericio de interrupci%n- que se

    encargara de tratarla y en qu eento se dispara.

    attacnte$$+pt0? #i$eccionT$en? L'EEN;

    El eento en que queremos disparar la interrupci%n tiene 5 modos,

    debido a los 5 eentos que se pueden producir en una se?al elctrica*

    L18 lanza la interruci%n cuando el pin est a niel ba"o

  • 7/21/2019 Interrupcion Arduino

    25/25

    46&07E lanza la interrupci%n cuando el pin cambia de alor

    N($(07 lanza la interrupci%n cuando el pin pasa de niel ba"o a

    niel alto