<?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>Interrupt Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/interrupt/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/interrupt/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Tue, 16 Mar 2021 07:28:48 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>Interrupt Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/interrupt/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pi Pico usare gli interrupt</title>
		<link>https://logicaprogrammabile.it/pi-pico-usare-gli-interrupt/</link>
					<comments>https://logicaprogrammabile.it/pi-pico-usare-gli-interrupt/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 15 Mar 2021 07:00:49 +0000</pubDate>
				<category><![CDATA[Tutorial Raspberry PI]]></category>
		<category><![CDATA[Interrupt]]></category>
		<category><![CDATA[Sistema Allarme]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=6605</guid>

					<description><![CDATA[<p>Come gestire un interrupt con la Raspberry Pi Pico In un precedente articolo, utilizzando Arduino UNO avevamo parlato degli interrupt, spiegando cosa sono e come gestirli. Anche la Raspberry Pi Pico, come la maggior parte dei microcontrollori è in grado di gestire gli interrupt. Utilizzando...</p>
<p>The post <a href="https://logicaprogrammabile.it/pi-pico-usare-gli-interrupt/">Pi Pico usare gli interrupt</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Come gestire un interrupt con la Raspberry Pi Pico</h2>
<p>In un precedente articolo, utilizzando <strong>Arduino UNO</strong> avevamo <a href="https://logicaprogrammabile.it/progetti-arduino-gestione-degli-interrupt/">parlato degli interrupt</a>, spiegando cosa sono e come gestirli. Anche la <a href="https://www.raspberrypi.org/products/raspberry-pi-pico/">Raspberry Pi Pico</a>, come la maggior parte dei microcontrollori è in grado di gestire gli interrupt. Utilizzando il linguaggio <a href="http://docs.micropython.org/en/latest/">Micropython</a> questa operazione diventa molto semplice.</p>
<p>Questo meccanismo è molto utile perché sostituisce il <a href="https://it.wikipedia.org/wiki/Polling_(informatica)">meccanismo di polling</a> che in un microcontrollore può essere molto svantaggioso. Ad esempio se devo controllare ciclicamente lo stato di un ingresso non posso mettere il microcontrollore in sleep mode perchè andrei a fermare il controllo del pin mentre un interrupt viene gestito dall&#8217;hardware e quindi è possibile superare questo limite.</p>
<p>Nel caso della Pico, programmata usando Micropython non sono sicuro se questa funzione sia disponibile anche quando il microcontrollore è in sleep mode.</p>
<p><span id="more-6605"></span></p>
<h2>Gestire le interruzioni</h2>
<p>Come accade per Arduino dobbiamo definire una funzione (che verrà richiamata quando avviene l&#8217;evento di interrupt) e definire un pin capace di gestire l&#8217;interrupt.</p>
<p>Nello schema seguente viene mostrato come ho eseguito i collegamenti di un circuito di test.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-6610" src="https://logicaprogrammabile.it/wp-content/uploads/2021/03/Pico_irq.png" alt="Pico irq" width="452" height="351" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/03/Pico_irq.png 452w, https://logicaprogrammabile.it/wp-content/uploads/2021/03/Pico_irq-300x233.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/03/Pico_irq-150x116.png 150w" sizes="(max-width: 452px) 100vw, 452px" /></p>
<p>Mentre il codice seguente descrive le istruzioni necessarie a gestire l&#8217;interrupt:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import machine
import utime

#definisco il pin 0 come ingresso
#su questo pin è collegato un pulsante con una
#resistenza di pull down
button = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_DOWN)
#definisco il pin 1 come uscita
#su questo pin collego un led e una resistenza da 330 ohm
led = machine.Pin(1, machine.Pin.OUT)

#definisco una funzione che verrà richiamata quando
#viene scatenato l'interrupt
def ev_handler(pin):
    print("bottone premuto")
    
#associo al pin in ingresso la funzione di interrupt
#l'evento videne generato usando il parametro RISING
button.irq(trigger=machine.Pin.IRQ_RISING, handler=ev_handler)

#loop che fa blinkare il led
while True:
    led.toggle()
    utime.sleep(1)</pre>
<p>Dopo le dichiarazione dei pi e della funzione il codice entra nel <strong>ciclo while</strong> ed esegue continuamente la commutazione del pin 1. Non appena premiamo il pulsante collegato al pin 0 viene generato un evento che interrompe il ciclo e richiamata la funzione <strong>ev_handler()</strong>. Terminata l&#8217;esecuzione del codice nella funzione <strong>ev_handler()</strong> viene ripresa l&#8217;esecuzione del codice del ciclo <strong>while()</strong>.</p>
<p>Da notare che l&#8217;interruzione non è asincrona quindi il codice nella funzione <strong>ev_handler()</strong> deve essere il più rapido possibile per non impattare sul codice del ciclo while().</p>
<p>The post <a href="https://logicaprogrammabile.it/pi-pico-usare-gli-interrupt/">Pi Pico usare gli interrupt</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/pi-pico-usare-gli-interrupt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Progetti Arduino gestione degli interrupt</title>
		<link>https://logicaprogrammabile.it/progetti-arduino-gestione-degli-interrupt/</link>
					<comments>https://logicaprogrammabile.it/progetti-arduino-gestione-degli-interrupt/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Tue, 29 Nov 2011 13:05:50 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Interrupt]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2253</guid>

					<description><![CDATA[<p>Cosa sono e come utilizzare gli interrupt Un interrupt (interruzione) è un evento che viene generato in presenza di una variazione di livello su un particolare pin della board Arduino. Questo evento viene gestito direttamente dal microcontrollore ed è controllabile via software tramite delle apposite...</p>
<p>The post <a href="https://logicaprogrammabile.it/progetti-arduino-gestione-degli-interrupt/">Progetti Arduino gestione degli interrupt</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Cosa sono e come utilizzare gli interrupt</h1>
<p>Un <a href="http://it.wikipedia.org/wiki/Interrupt">interrupt </a>(interruzione) è un evento che viene generato in presenza di una variazione di livello su un particolare pin della board Arduino. Questo evento viene gestito direttamente dal microcontrollore ed è controllabile via software tramite delle apposite istruzioni. Quando viene scatenata una interruzione è possibile eseguire del codice in modo automatico, interrompendo momentaneamente il normale flusso di codice all&#8217;interno del blocco loop().</p>
<p>L0 schema seguente illustra il concetto</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/11/ArduinoInterrupt.png"><img decoding="async" class="aligncenter size-full wp-image-2259" title="ArduinoInterrupt" src="https://logicaprogrammabile.it/wp-content/uploads/2011/11/ArduinoInterrupt.png" alt="Gestione Interrupt" width="296" height="233" /></a><span id="more-2253"></span></p>
<p>La variazione di stato del segnale applicato all&#8217;Arduino può essere gestita in vari modi, a seconda del parametro utilizzato per la gestione dell&#8217;interrupt. La tabella seguente mostra i parametri che determinano come deve essere generata l&#8217;interruzione.</p>
<p>
<table id="tablepress-2" class="tablepress tablepress-id-2">
<thead>
<tr class="row-1">
	<td class="column-1"></td><th class="column-2">Zero</th><th class="column-3">A+</th><th class="column-4">B</th><th class="column-5">B+</th><th class="column-6">2B</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">IDLE</td><td class="column-2">100mA</td><td class="column-3">100mA</td><td class="column-4">360mA</td><td class="column-5">200mA</td><td class="column-6">230mA</td>
</tr>
<tr class="row-3">
	<td class="column-1">Riproduzione Video Full HD</td><td class="column-2">140mA</td><td class="column-3">140mA</td><td class="column-4">420mA</td><td class="column-5">240mA</td><td class="column-6">290mA</td>
</tr>
</tbody>
</table>
</p>
<p>di seguito viene esposto lo schema del circuito che ho realizzato per testare questa funzione. Un generatore di segnali ad onda quadra è stato collegato al pin3 della board Arduino mentre sul pin8 è stato collegato un oscilloscopio. Il segnale presente sul pin8 è funzione di quello presente sul pin3 come vedremo dal codice di esempio.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/11/Schema.gif"><img decoding="async" class="aligncenter size-full wp-image-2273" title="Schema" src="https://logicaprogrammabile.it/wp-content/uploads/2011/11/Schema.gif" alt="Schema per testare la funzione interrupts" width="437" height="229" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/11/Schema.gif 437w, https://logicaprogrammabile.it/wp-content/uploads/2011/11/Schema-300x157.gif 300w" sizes="(max-width: 437px) 100vw, 437px" /></a></p>
<p>Per testare questa funzione possiamo usare lo sketch seguente</p>
<pre class="lang:arduino decode:true ">int pin = 8;
//Notare l'uso di 'volatile'
volatile int state = LOW;

void setup()
{
  //definisco il pin8 come uscita
  pinMode(pin, OUTPUT);
  //inizializzo l'uscita a livelo basso
  digitalWrite(pin, LOW);
  //Creo un gestore di interrupt e lo associo al pin3
  attachInterrupt(1, GestInt, LOW);
}

void loop()
{
  //fai qualcosa...
  delay(10);
}

void GestInt()
{
  state = !state;
  digitalWrite(pin, state);
}</pre>
<p>&nbsp;</p>
<p>Il codice gestisce gli interrupt generati dal segnale in ingresso. Quandosi verifica un&#8217;interruzione, viene eseguita automaticamente la funzione <strong>GestInt()</strong>, che permette di cambiare lo stato del pin8, rilevabile con l&#8217;oscilloscopio. I grafici sottostanti, illustrano il comportamento dei segnali a seconda del parametro utilizzato per generare l&#8217;interrupt.</p>
<p>Il primo parametro, <strong>LOW</strong>, genera una serie di interruzioni ogni qualvolta il segnale applicato al pin3 rimane basso. La funzione GestInt() viene eseguita a una frequenza di circa 47,6KHz</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/11/LOW.gif"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2277" title="LOW" src="https://logicaprogrammabile.it/wp-content/uploads/2011/11/LOW.gif" alt="Interrupt con parametro uguale a LOW" width="626" height="331" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/11/LOW.gif 626w, https://logicaprogrammabile.it/wp-content/uploads/2011/11/LOW-300x158.gif 300w" sizes="auto, (max-width: 626px) 100vw, 626px" /></a></p>
<p>Quando invece selezioniamo il parametro <strong>CHANGE</strong>, l&#8217;interruzione viene generata ogni volta che il segnale applicato al pin3 passa dal valore basso a quello alto e viceversa. La funzione <strong>GestInt()</strong> genera sul pin8 lo stesso segnale applicato al pin3.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/11/CHANGE.gif"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2275" title="CHANGE" src="https://logicaprogrammabile.it/wp-content/uploads/2011/11/CHANGE.gif" alt="Interrupt con parametro uguale a CHANGE" width="626" height="331" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/11/CHANGE.gif 626w, https://logicaprogrammabile.it/wp-content/uploads/2011/11/CHANGE-300x158.gif 300w" sizes="auto, (max-width: 626px) 100vw, 626px" /></a>Utilizzando invece il parametro <strong>RISING</strong>, l&#8217;interruzione viene generata solamente sui fronti di salita del segnale applicato sul pin3. La funzione <strong>GestInt()</strong> viene eseguita con una frequenza dimezzata rispetto al segnale applicato al pin3</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/11/RISING.gif"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2274" title="RISING" src="https://logicaprogrammabile.it/wp-content/uploads/2011/11/RISING.gif" alt="Interrupt con parametro uguale a RISING" width="626" height="331" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/11/RISING.gif 626w, https://logicaprogrammabile.it/wp-content/uploads/2011/11/RISING-300x158.gif 300w" sizes="auto, (max-width: 626px) 100vw, 626px" /></a></p>
<p>Infine impiegando il parametro <strong>FALLING</strong>, gli interrupt verranno generati quando il segnale applicato sul pin3 passa da alto a basso. Anche in questo caso la funzione <strong>GestInt()</strong> viene eseguita con una frequenza dimezzata rispetto al segnale applicato al pin3</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/11/FALLING.gif"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2276" title="FALLING" src="https://logicaprogrammabile.it/wp-content/uploads/2011/11/FALLING.gif" alt="Interrupt con parametro uguale a FALLING" width="626" height="331" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/11/FALLING.gif 626w, https://logicaprogrammabile.it/wp-content/uploads/2011/11/FALLING-300x158.gif 300w" sizes="auto, (max-width: 626px) 100vw, 626px" /></a></p>
<p>Riepilogando i pin dell&#8217;arduino sensibili alle variazioni di segnale sono i pin2 e pin3 che rispettivamente vengono specificati nella funzione <strong>attachInterrupt</strong> come 0 e 1. Nella funzione attachInterrupt , oltre a specificare il pin  che vogliamo monitorare dobbiamo specificare il nome della funzione da eseguire quando si scatena l&#8217;interruzione e il modo in cui l&#8217;interruzione deve essere interpretata.<br />
La variabili <strong>state</strong> viene dichiarata utilizzando l&#8217;attributo <strong>volatile</strong>, questo perchè la funzione gestita dall&#8217;interrupt viene eseguita in contemporanea al blocco <strong>loop()</strong> ed è necessario che in fase di compilazione la variabile sia caricata nella RAM.</p>
<p>The post <a href="https://logicaprogrammabile.it/progetti-arduino-gestione-degli-interrupt/">Progetti Arduino gestione degli interrupt</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/progetti-arduino-gestione-degli-interrupt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
