<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Interrupciones arduino Archives - Tutoriales de Electrónica | Matemática y Física</title>
	<atom:link href="https://www.electrontools.com/Home/WP/tag/interrupciones-arduino/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Explicaciones teóricas y ejercicios prácticos resueltos de Matemáticas &#124; Física &#124; Electrónica de nivel secundario y universitario.</description>
	<lastBuildDate>Fri, 21 Jul 2017 12:45:40 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.electrontools.com/Home/WP/wp-content/uploads/2019/04/cropped-favicon-32x32.png</url>
	<title>Interrupciones arduino Archives - Tutoriales de Electrónica | Matemática y Física</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Como usar las interrupciones en arduino</title>
		<link>https://www.electrontools.com/Home/WP/como-usar-las-interrupciones-en-arduino/</link>
					<comments>https://www.electrontools.com/Home/WP/como-usar-las-interrupciones-en-arduino/#comments</comments>
		
		<dc:creator><![CDATA[Cristian Veloso]]></dc:creator>
		<pubDate>Fri, 13 May 2016 21:20:42 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Interrupciones arduino]]></category>
		<guid isPermaLink="false">http://www.electrontools.com/Home/WP/?p=862</guid>

					<description><![CDATA[<div><img width="400" height="400" src="https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino.jpg 400w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-150x150.jpg 150w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-300x300.jpg 300w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-250x250.jpg 250w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-174x174.jpg 174w" sizes="(max-width: 400px) 100vw, 400px" /></div><p>Una interrupción es básicamente la alteración del flujo natural de un programa,&#8230;</p>
<p>The post <a href="https://www.electrontools.com/Home/WP/como-usar-las-interrupciones-en-arduino/">Como usar las interrupciones en arduino</a> appeared first on <a href="https://www.electrontools.com/Home/WP">Tutoriales de Electrónica | Matemática y Física</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div><img width="400" height="400" src="https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino.jpg 400w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-150x150.jpg 150w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-300x300.jpg 300w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-250x250.jpg 250w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/como-usar-interrupciones-en-arduino-174x174.jpg 174w" sizes="(max-width: 400px) 100vw, 400px" /></div><p>Una interrupción es básicamente la alteración del flujo natural de un programa, si pensamos en este como secuencial. Existen varios tipos de interrupciones posibles pero vamos a enumerar las dos principales, las restantes son solo derivaciones de estas.</p>
<p>Antes de entrar en detalle quiero comentar que este es un tema amplio de estudio, es imposible detallar todos los conceptos que el tema implica, con lo cual solo nos vamos a detener en contar de que se trata y para que se utiliza, dando algunos ejemplos se entiende mejor.</p>
<p>También comentar que las interrupciones no son solo propias de arduino, estas se encuentran disponibles en todos los microprocesadores comerciales.</p>
<h2>Tipos de interrupciones</h2>
<h3></h3>
<h3><strong>Interrupciones por Timer</strong></h3>
<p>Estas interrupciones son disparadas cuando se cumple un cierto tiempo que nosotros mismos definimos, son muy usadas para controlar y leer sensores cada determinado tiempo y también para crear señales PWM para alimentar motores de corriente continua.</p>
<p>Como estas interrupciones se ejecutan cada un determinado tiempo, somos dependientes del cristal y del tiempo de cada pulso de clock de nuestro arduino. Pero gracias a que utilizamos librerías no tenemos que hacer ninguna cuenta, es importante saber que somos dependientes de eso, es decir no es lo mismo tener un cristal de 32 que uno de 16 MHZ. Pero como todos los arduinos traen un cristal de 16MHZ no nos preocupemos demasiado.</p>
<p>Los timers tienen algo que se conoce como <strong>prescaler</strong>, son divisores de la frecuencia de clock, cuando dividimos la frecuencia ganamos en tiempo pero perdemos en precisión, la frecuencia del cristal se puede dividor por 1,8,64,256</p>
<p>El siguiente ejemplo ejecuta una interrupcion por timer cada 250ms y prende y apaga un led cada vez que se la atiende.</p>
<p>&nbsp;</p>
<pre style="margin-left: 15px; margin-right: 15px; background-color: #eeeeee; border: 1px solid #cccccc; box-sizing: border-box; color: #006699; font-family: monospace, monospace; font-size: 13px; overflow: auto; padding: 10px;"><span style="color: #5e6d03;">#include</span> <span style="color: #434f54;">&lt;</span><span style="color: #000000;">TimerOne</span><span style="color: #434f54;">.</span><span style="color: #000000;">h</span><span style="color: #434f54;">&gt;</span>
<span style="color: #00979c;">const</span> <span style="color: #00979c;">int</span> <span style="color: #000000;">led</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">13</span><span style="color: #000000;">;</span>  <span style="color: #434f54;">// the pin with a LED</span>
<span style="color: #00979c;">int</span> <span style="color: #000000;">ledState</span> <span style="color: #434f54;">=</span> <span style="color: #00979c;">LOW</span><span style="color: #000000;">;</span>    <span style="color: #434f54;">// El LED empieza apagado</span>
<span style="color: #00979c;">volatile</span> <span style="color: #00979c;">unsigned</span> <span style="color: #00979c;">long</span> <span style="color: #000000;">blinkCount</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span> <span style="color: #434f54;">// La definimos como volatile</span>

<span style="color: #00979c;">void</span> <span style="color: #5e6d03;">setup</span><span style="color: #000000;">(</span><span style="color: #00979c;">void</span><span style="color: #000000;">)</span>
   <span style="color: #000000;">{</span>
       <span style="color: #d35400;">pinMode</span><span style="color: #000000;">(</span><span style="color: #000000;">led</span><span style="color: #434f54;">,</span> <span style="color: #00979c;">OUTPUT</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
       <span style="color: #000000;">Timer1</span><span style="color: #434f54;">.</span><span style="color: #000000;">initialize</span><span style="color: #000000;">(</span><span style="color: #000000;">250000</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>         <span style="color: #434f54;">// Dispara cada 250 ms</span>
       <span style="color: #000000;">Timer1</span><span style="color: #434f54;">.</span><span style="color: #d35400;">attachInterrupt</span><span style="color: #000000;">(</span><span style="color: #000000;">ISR_Blink</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span> <span style="color: #434f54;">// Activa la interrupcion y la asocia a ISR_Blink</span>
       <b><span style="color: #d35400;">Serial</span></b><span style="color: #434f54;">.</span><span style="color: #d35400;">begin</span><span style="color: #000000;">(</span><span style="color: #000000;">9600</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
   <span style="color: #000000;">}</span>

   <span style="color: #00979c;">void</span> <span style="color: #000000;">ISR_Blink</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span>
   <span style="color: #000000;">{</span>   <span style="color: #000000;">ledState</span> <span style="color: #434f54;">=</span> <span style="color: #434f54;">!</span><span style="color: #000000;">ledState</span> <span style="color: #000000;">;</span>
       <span style="color: #000000;">blinkCount</span><span style="color: #434f54;">++</span>    <span style="color: #000000;">;</span>     <span style="color: #434f54;">// Contador veces se enciende el LED</span>
   <span style="color: #000000;">}</span>

   <span style="color: #00979c;">void</span> <span style="color: #5e6d03;">loop</span><span style="color: #000000;">(</span><span style="color: #00979c;">void</span><span style="color: #000000;">)</span>
   <span style="color: #000000;">{</span>
       <span style="color: #00979c;">unsigned</span> <span style="color: #00979c;">long</span> <span style="color: #000000;">N</span><span style="color: #000000;">;</span>  <span style="color: #434f54;">// Haremos copia del blinkCount</span>
       <span style="color: #d35400;">digitalWrite</span><span style="color: #000000;">(</span><span style="color: #000000;">led</span><span style="color: #434f54;">,</span> <span style="color: #000000;">ledState</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>  <span style="color: #434f54;">// Asignamos el valor del</span>
                                     <span style="color: #434f54;">// status a la salida</span>
       <span style="color: #d35400;">noInterrupts</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>               <span style="color: #434f54;">// Suspende las interrupciones</span>
       <span style="color: #000000;">N</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">blinkCount</span><span style="color: #000000;">;</span>
       <span style="color: #d35400;">interrupts</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>                 <span style="color: #434f54;">// Autoriza las interrupciones</span>

       <b><span style="color: #d35400;">Serial</span></b><span style="color: #434f54;">.</span><span style="color: #d35400;">print</span><span style="color: #000000;">(</span><span style="color: #005c5f;">"Ciclos = "</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
       <b><span style="color: #d35400;">Serial</span></b><span style="color: #434f54;">.</span><span style="color: #d35400;">println</span><span style="color: #000000;">(</span><span style="color: #000000;">N</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
       <span style="color: #d35400;">delay</span><span style="color: #000000;">(</span><span style="color: #000000;">100</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
   <span style="color: #000000;">}</span>

</pre>
<h3><strong>Interrupción por hardware</strong></h3>
<p>Estas interrupciones son muy utilizadas en rebotica, se utilizan para detectar eventos externos. Por ejemplo si queremos que cada vez que alguien apriete un botón suceda alguna acción tenemos dos opciones. La primera alternativa y sin duda la peor de todas es quedarnos esperando que alguien apriete el botón, claramente no podríamos hacer otra cosa que esperar y estaríamos gastando toda la capacidad del microprocesador en no hacer nada, simplemente esperando que alguien apriete el botón. La segunda opción es usar las interrupciones de arduino (o del micro controlador que estemos usando).</p>
<p>Usar las interrupciones nos da como ventaja que podemos hacer cualquier otra cosa mientras esperamos que el evento suceda, simplemente cuando el evento se produce se acciona una bandera de interrupción que detiene y altera el flujo natural del programa para atender esa interrupción, básicamente es un orden de prioridades.</p>
<p>Como comente recién, manejar los eventos externos mediante interrupciones es la manera correcta de hacerlo, las ventajas están a la vista, gastamos pocos recursos del micro procesador y cumplimos el mismo objetivo.</p>
<p>Pero bueno, vamos al detalle. A la hora de usar las interrupciones en arduino necesitamos lo siguiente.</p>
<ul>
<li><strong>Conocer que arduino estamos usando:</strong> No todos tienen los mismo pines de interrupción.</li>
</ul>
<ul>
<li><strong>Pin de arduino</strong> que reciba la condición de disparo.</li>
</ul>
<ul>
<li><strong>Una condición de disparo</strong></li>
</ul>
<ul>
<li><strong>Una función</strong> que se ejecute cuando la interrupción sea disparada.</li>
</ul>
<p><img decoding="async" loading="lazy" class="size-full wp-image-869 aligncenter" src="https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/vector-de-interrupcion.png" alt="como usar interrupciones arduino" width="560" height="124" srcset="https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/vector-de-interrupcion.png 560w, https://www.electrontools.com/Home/WP/wp-content/uploads/2016/05/vector-de-interrupcion-300x66.png 300w" sizes="auto, (max-width: 560px) 100vw, 560px" /></p>
<p>La condición de disparo se refiere a si la interrupción se va a ejecutar cuando detecte el paso del pin de interrupción de un estado alto a un estado bajo <strong>FALLING </strong>o cuando detecte el paso de un estado bajo a uno alto <strong>RISING</strong>.</p>
<p>Cuando eso ocurra arduino debe saber que hacer, para eso tenemos que definir una función que sera la encargada de atender la interrupción.</p>
<p>En el siguiente ejemplo se muestra como al presionar un botón vamos contando y enviando el dato por puerto serie para visualizarlo en pantalla, la interrupción es detectada y disparada cuando el pin de interrupción pasa de un estado alto a uno bajo <strong>FALLING.</strong></p>
<pre style="margin-left: 15px; margin-right: 15px; background-color: #eeeeee; border: 1px solid #cccccc; box-sizing: border-box; color: #006699; font-family: monospace, monospace; font-size: 13px; overflow: auto; padding: 10px;"><span style="color: #00979c;">int</span> <span style="color: #000000;">contador</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span>
<span style="color: #00979c;">int</span> <span style="color: #000000;">n</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">contador</span> <span style="color: #000000;">;</span>

<span style="color: #00979c;">void</span> <span style="color: #5e6d03;">setup</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span>
   <span style="color: #000000;">{</span>   <b><span style="color: #d35400;">Serial</span></b><span style="color: #434f54;">.</span><span style="color: #d35400;">begin</span><span style="color: #000000;">(</span><span style="color: #000000;">9600</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
       <span style="color: #d35400;">attachInterrupt</span><span style="color: #000000;">(</span> <span style="color: #000000;">0</span><span style="color: #434f54;">,</span> <span style="color: #000000;">ServicioBoton</span><span style="color: #434f54;">,</span> <span style="color: #00979c;">FALLING</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
   <span style="color: #000000;">}</span>
<span style="color: #00979c;">void</span> <span style="color: #5e6d03;">loop</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span>
   <span style="color: #000000;">{</span>
       <span style="color: #5e6d03;">if</span> <span style="color: #000000;">(</span><span style="color: #000000;">n</span> <span style="color: #434f54;">!=</span> <span style="color: #000000;">contador</span><span style="color: #000000;">)</span>
          <span style="color: #000000;">{</span>     <b><span style="color: #d35400;">Serial</span></b><span style="color: #434f54;">.</span><span style="color: #d35400;">println</span><span style="color: #000000;">(</span><span style="color: #000000;">contador</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
                <span style="color: #000000;">n</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">contador</span> <span style="color: #000000;">;</span>
          <span style="color: #000000;">}</span>
   <span style="color: #000000;">}</span>

<span style="color: #00979c;">void</span> <span style="color: #000000;">ServicioBoton</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span> 
   <span style="color: #000000;">{</span>    <span style="color: #000000;">contador</span><span style="color: #434f54;">++</span> <span style="color: #000000;">;</span>
   <span style="color: #000000;">}</span>

</pre>
<p>Para usar las interrupciones y no generar conflictos con otras lógicas, y no alterar demasiado el flujo del programa, la atención de la interrupción debe ser rápida, lo mas rápida que se pueda, no es para nada recomendable hacer un bucle dentro de la función que atiende la interrupción.</p>
<p>En el programa de ejemplo no seria conveniente hacer el print en pantalla dentro de la interrupción, estaríamos generando demasiada demora en la atención de la interrupción.</p>
<p>Es importante entender que cuando la interrupción se esta atendiendo todo lo demás queda en pausa, el stack pointer por ejemplo, la función <strong>millis()</strong> queda en pausa hasta que salga de la atención de la interrupción.</p>
<p>En resumen es importante tener presente lo siguiente.</p>
<ul>
<li>Cuando se esta atendiendo una interrupción, todas las demás interrupciones son ignoras hasta que no se termine de atender la interrupción presente.</li>
</ul>
<ul>
<li>Es importante no estar mucho tiempo atendiéndola, hay que hacer todo rápido y salir.</li>
</ul>
<ul>
<li>La función <strong>millis()</strong> queda congelada hasta que finalice la atención.</li>
</ul>
<ul>
<li>No hay que definir variables dentro de la interrupción, si se necesita usar variables deben ser definidas como globales fuera de ella.</li>
</ul>
<ul>
<li>Jamas hacer un <strong>Seriel.println</strong> dentro de una interrupción, primero por que tardaría demasiado y segundo por que es posible que ni siquiera funcione dependiendo de algunas variables.</li>
</ul>
<p>Como siempre digo, espero que les sea de utilidad y respondo todos sus comentarios, todo lo que quieran aportar sera bienvenido y ayuda a mejorar.</p>
<p>No dudes en dejar tu opinión.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The post <a href="https://www.electrontools.com/Home/WP/como-usar-las-interrupciones-en-arduino/">Como usar las interrupciones en arduino</a> appeared first on <a href="https://www.electrontools.com/Home/WP">Tutoriales de Electrónica | Matemática y Física</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.electrontools.com/Home/WP/como-usar-las-interrupciones-en-arduino/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
