<?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>InputPort Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/inputport/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/inputport/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Mon, 28 Nov 2016 20:19:09 +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>InputPort Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/inputport/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Netduino, utilizzare il PCF8574AP</title>
		<link>https://logicaprogrammabile.it/netduino-utilizzare-pcf8574ap-port-expander/</link>
					<comments>https://logicaprogrammabile.it/netduino-utilizzare-pcf8574ap-port-expander/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Thu, 23 Jan 2014 17:51:12 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[I2C]]></category>
		<category><![CDATA[InputPort]]></category>
		<category><![CDATA[OutputPort]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=4049</guid>

					<description><![CDATA[<p>Come espandere le porte IO del Netduino tramite PCF8574AP Nel precedente articolo abbiamo visto come utilizzare l&#8217;integrato PCF8574AP per espandere le porte IO di Arduino. Lo stesso circuito può essere adattato anche alla scheda Netduino. Dato che ho utilizzato Arduino Leonardo, i pin SCL e...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-utilizzare-pcf8574ap-port-expander/">Netduino, utilizzare il PCF8574AP</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come espandere le porte IO del Netduino tramite PCF8574AP</h3>
<p>Nel <a title="PCF8574AP come espandere porte IO" href="https://logicaprogrammabile.it/2014/pcf8574ap-espandere-porte-io/">precedente articolo</a> abbiamo visto come utilizzare l&#8217;integrato <strong>PCF8574AP</strong> per espandere le <strong>porte IO</strong> di Arduino. Lo stesso circuito può essere adattato anche alla scheda Netduino. Dato che ho utilizzato Arduino Leonardo, i pin <strong>SCL</strong> e <strong>SDA</strong>, relativi al bus I2C, sono dedicati, mentre <strong>Netduino</strong> rispecchia la pin function della Arduino UNO e quindi i pin SDA e SCL sono disponibili rispettivamente sui pin analogico 4 e pin analogico 5.</p>
<p>In definitiva, per far funzionare il circuito, dobbiamo collegare i pin secondo la tabella seguente</p>
<table align="center">
<tbody>
<tr>
<td style="text-align: center;"><strong>PCF8574AP</strong></td>
<td style="text-align: center;"><strong>Netduino</strong></td>
</tr>
<tr>
<td>PIN 14 SCL</td>
<td style="text-align: left;">Analog PIN 5 SCL</td>
</tr>
<tr>
<td>PIN 15 SDA</td>
<td>Analog PIN 4 SDA</td>
</tr>
</tbody>
</table>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/WP_20140123_11_21_31_Pro.jpg"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-4052" alt="Netduino e PCF8574AP" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/WP_20140123_11_21_31_Pro.jpg" width="444" height="250" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/WP_20140123_11_21_31_Pro.jpg 444w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/WP_20140123_11_21_31_Pro-300x168.jpg 300w" sizes="(max-width: 444px) 100vw, 444px" /></a></p>
<p><span id="more-4049"></span></p>
<p>Per quanto riguarda il codice sorgente possiamo osservare il listato seguente che permette di accendere e spegnere i led collegati alle porte del <strong>PCF8574AP</strong></p>
<p>[csharp]<br />
//buffer per memoriaazare indirizzi<br />
//e dati<br />
Byte[] tx_write = new Byte[1];<br />
Byte[] tx_read = new Byte[1];</p>
<p>//Configurazione contenente l&#8217;indirizzo del PCF8574AP<br />
//e la frequenza del bus i2c<br />
I2CDevice.Configuration cnf = new I2CDevice.Configuration(0x38, 100);</p>
<p>//Creo un oggetto per eseguire le richieste di lettura e scrittura<br />
I2CDevice expanderPCF8574 = new I2CDevice(cnf);</p>
<p>//creo un oggetto I2CReadTransaction che viene associato al buffer tx_read<br />
//il buffer viene utilizzato per verificare lo stato delle porte del PCF8574AP<br />
I2CDevice.I2CReadTransaction[] rt_data = new<br />
I2CDevice.I2CReadTransaction[] { I2CDevice.CreateReadTransaction(tx_read) };</p>
<p>//creo un oggetto I2CWriteTransaction che viene associato al buffere tx_write<br />
//il buffer tx viene utilizzato per spedire lo stato delle porte del PCF8574AP<br />
I2CDevice.I2CWriteTransaction[] wt_write = new<br />
I2CDevice.I2CWriteTransaction[] { I2CDevice.CreateWriteTransaction(tx_write) };</p>
<p>while (true)<br />
{<br />
  //imposto tutte le porte a livello logico basso<br />
  tx_write[0] = (Byte)(0x00);<br />
  //eseguo il comando<br />
  expanderPCF8574.Execute(wt_write, 10);</p>
<p>  Thread.Sleep(1000);</p>
<p>  //imposto tutte le porte a livello logico alto<br />
  tx_write[0] = (Byte)(0xFF);<br />
  //eseguo il comando<br />
  expanderPCF8574.Execute(wt_write, 10);</p>
<p>  Thread.Sleep(1000);<br />
}<br />
[/csharp]</p>
<h3>Leggere lo stato delle porte</h3>
<p>la lettura dello stato delle porte del PCF8574AP avviene eseguendo il comando relativo all&#8217;oggetto i2creadtransaction:</p>
<p>[csharp]<br />
while (true)<br />
{<br />
  //eseguo il comando<br />
  expanderPCF8574.Execute(rt_data, 10);</p>
<p>  Debug.Print(tx_read[0].ToString());</p>
<p>  Thread.Sleep(1000);<br />
}<br />
[/csharp]</p>
<p>Anche utilizzando <strong>Netduino</strong> i comandi da eseguire per utilizzare il <strong>PCF8574AP</strong> sono molto semplici ed intuitivi.</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-utilizzare-pcf8574ap-port-expander/">Netduino, utilizzare il PCF8574AP</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-utilizzare-pcf8574ap-port-expander/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>PCF8574AP come espandere porte IO</title>
		<link>https://logicaprogrammabile.it/pcf8574ap-espandere-porte-io/</link>
					<comments>https://logicaprogrammabile.it/pcf8574ap-espandere-porte-io/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 22 Jan 2014 15:14:35 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[I2C]]></category>
		<category><![CDATA[InputPort]]></category>
		<category><![CDATA[OutputPort]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=4020</guid>

					<description><![CDATA[<p>Utilizzare un PCF8574ap per espandere le porte IO di Arduino Capita di trovarci a realizzare applicazioni in cui il numero dei pin digitali richiesti, supera quelli disponibili sulla scheda Arduino UNO. In questi casi potremmo utilizzare una scheda con un numero maggiore di pin IO...</p>
<p>The post <a href="https://logicaprogrammabile.it/pcf8574ap-espandere-porte-io/">PCF8574AP come espandere porte IO</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Utilizzare un PCF8574ap per espandere le porte IO di Arduino</h3>
<p>Capita di trovarci a realizzare applicazioni in cui il numero dei <strong>pin digitali</strong> richiesti, supera quelli disponibili sulla scheda <strong>Arduino UNO</strong>. In questi casi potremmo utilizzare una scheda con un numero maggiore di <strong>pin IO</strong> (ad esempio la Arduino MEGA, la Arduino DUE &#8230;) o scegliere dei <strong>circuiti esterni</strong> che danno la possibilità di espandere le porte IO utilizzando una comunicazione seriale <strong>I2C</strong> o <strong>SPI</strong>.</p>
<p>L&#8217;integrato <strong>PCF8574AP</strong> permette di risolvere questo problema fornendo<strong> 8 porte IO</strong> che possono essere gestite utilizzando il collegamento <strong>seriale I2C</strong>. Lo schema elettrico seguente mostra come collegare il <strong>pcf8574ap</strong> alla scheda <strong>Arduino Leonardo</strong>. L&#8217;unica osservazione riguarda le uscite del <strong>PCF8574</strong>, infatti come potete osservare i led non sono collegati direttamente alle porte dell&#8217;integrato ma bensì sono collegati tramite una resistenza alla linea dei 5Vdc. Questo perché l&#8217;integrato non è in grado di fornire la corrente sufficiente per alimentare il led; è quindi necessaria una resistenza di<strong> pull-up</strong>.</p>
<p><span id="more-4020"></span></p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574ap.png"><img decoding="async" class="aligncenter size-full wp-image-4034" alt="Arduino Leonardo PCF8574AP" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574ap.png" width="724" height="407" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574ap.png 724w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574ap-300x168.png 300w" sizes="(max-width: 724px) 100vw, 724px" /></a></p>
<p>Quando impostiamo, per esempio, il pin <strong>P0</strong> al livello logico alto, otteniamo l&#8217;accensione del led perché la corrente che fluisce dall&#8217;alimentazione attraversa la resistenza e poi il led. Quando impostiamo il pin <strong>P0</strong> al livello logico basso il led si spegne perché la corrente viene &#8216;assorbita&#8217; dall&#8217;integrato. Nelle figure seguenti potete osservare quanto detto:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_ON.png"><img decoding="async" class="aligncenter size-full wp-image-4038" alt="PCF8574ap led on" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_ON.png" width="331" height="374" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_ON.png 331w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_ON-265x300.png 265w" sizes="(max-width: 331px) 100vw, 331px" /></a></p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_OFF.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4037" alt="PCF8574 Led off" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_OFF.png" width="313" height="384" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_OFF.png 313w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/PCF8574_Led_OFF-244x300.png 244w" sizes="auto, (max-width: 313px) 100vw, 313px" /></a></p>
<p>Il codice per testare il circuito è molto semplice e permette di accendere e spegnere i led collegati ai pin delle porte dell&#8217;integrato <strong>PCF8574AP</strong>:</p>
<p>[c]<br />
#include &lt;Wire.h&gt;</p>
<p>void setup()<br />
{<br />
  Wire.begin();<br />
  delay(1000);<br />
}</p>
<p>void loop()<br />
{<br />
  //imposto tutti i pin al livello<br />
  //logico alto<br />
  Wire.beginTransmission(0x38);<br />
  //invio un byte<br />
  Wire.write((byte)0b11111111);<br />
  //fine trasmissione<br />
  Wire.endTransmission();</p>
<p>  delay(1000);</p>
<p>  //imposto tutti i pin al livello<br />
  //logico basso<br />
  Wire.beginTransmission(0x38);<br />
  //invio un byte<br />
  Wire.write((byte)0b00000000);<br />
  //fine trasmissione<br />
  Wire.endTransmission();</p>
<p>  delay(1000);<br />
}<br />
[/c]</p>
<p>Avendo espresso il valore in forma binaria riusciamo facilmente ad accendere o spegnere ogni led cambiando il valore di ogni singolo bit. Ad esempio questo codice accende e spegne solo il led sulla porta <strong>P0</strong>:</p>
<p>[c]<br />
#include &lt;Wire.h&gt;</p>
<p>void setup()<br />
{<br />
  Wire.begin();<br />
  delay(1000);<br />
}</p>
<p>void loop()<br />
{<br />
  //imposto il pin P0 al livello<br />
  //logico alto<br />
  Wire.beginTransmission(0x38);<br />
  //invio un byte<br />
  Wire.write((byte)0b00000001);<br />
  //fine trasmissione<br />
  Wire.endTransmission();</p>
<p>  delay(1000);</p>
<p>  //imposto il pin P0 al livello<br />
  //logico basso<br />
  Wire.beginTransmission(0x38);<br />
  //invio un byte<br />
  Wire.write((byte)0b00000000);<br />
  //fine trasmissione<br />
  Wire.endTransmission();</p>
<p>  delay(1000);<br />
}<br />
[/c]</p>
<h3>Leggere i valori in ingresso</h3>
<p>La lettura degli ingressi avviene semplicemente effettuando una richiesta di un byte al <strong>PCF8574AP</strong>. L&#8217;integrato provvederà automaticamente, tramite la sua architettura interna, a fornire al master lo stato delle porte. Possiamo ad esempio collegare i pin da P0 a P7 a massa o alla +5Vdc e successivamente effettuare una lettura:</p>
<p>[c]<br />
#include &lt;Wire.h&gt;</p>
<p>void setup()<br />
{<br />
  Serial.begin(9600);<br />
  delay(6000);</p>
<p>  Wire.begin();<br />
  delay(1000);<br />
}</p>
<p>void loop()<br />
{<br />
  Wire.requestFrom(0x38,1);<br />
  if(Wire.available())<br />
  {<br />
    Serial.println(Wire.read(), BIN);<br />
  }</p>
<p>  delay(1000);<br />
}<br />
[/c]</p>
<p>il codice precedente printa in binario lo stato di ogni singola porta del <strong>PCF8574AP</strong>, ad esempio proviamo a mettere a massa i pin <strong>P0</strong>, <strong>P1</strong>, <strong>P2</strong> e <strong>P3</strong> e colleghiamo alla +5Vdc i pin <strong>P5</strong>, <strong>P6</strong>, <strong>P7</strong>, <strong>P8</strong>, sul serial monitor osserveremo la stringa <strong>11110000</strong>.</p>
<p>Per semplicità ho utilizzato delle variabili scrivendole in binario ma nulla ci vieta di utilizzare le <a href="https://logicaprogrammabile.it/2012/operatori-spostare-bit/" target="_blank">funzioni di bitwise</a> per creare codice più professionale.</p>
<p>The post <a href="https://logicaprogrammabile.it/pcf8574ap-espandere-porte-io/">PCF8574AP come espandere porte IO</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/pcf8574ap-espandere-porte-io/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Netduino, linee GPIO configurarle con InputPort e OutputPort</title>
		<link>https://logicaprogrammabile.it/netduino-inputport-outputport-tristateport/</link>
					<comments>https://logicaprogrammabile.it/netduino-inputport-outputport-tristateport/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 13 Jun 2011 08:35:28 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[.Net micro framework]]></category>
		<category><![CDATA[InputPort]]></category>
		<category><![CDATA[Netduino]]></category>
		<category><![CDATA[OutPort]]></category>
		<category><![CDATA[TRiStatePort]]></category>
		<category><![CDATA[Visual C#]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=1507</guid>

					<description><![CDATA[<p>InputPort OutputPort come utilizzare e configurare le porte digitali del Netduino Pin digitali La scheda Netduino prende spunto dal progetto Arduino, infatti, la forma della scheda e la disposizione dei connettori è identica a quella di Arduino UNO. I pin digitali sono 14 e possono...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-inputport-outputport-tristateport/">Netduino, linee GPIO configurarle con InputPort e OutputPort</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>InputPort OutputPort come utilizzare e configurare le porte digitali del Netduino</h1>
<h2>Pin digitali</h2>
<p>La scheda Netduino prende spunto dal progetto Arduino, infatti, la forma della scheda e la disposizione dei connettori è identica a quella di <strong>Arduino UNO</strong>. I pin digitali sono 14 e possono essere configurati via software come ingressi o uscite (InputPort OutputPort). La possibilità di decidere programmaticamente la funzione di ognuno di questi pin permette una elevata flessibilità nell&#8217;adattare Netduino al mondo esterno.</p>
<p>La tensione di lavoro dei pin è di 3.3Vdc ma è possibile lavorare anche con tensioni in ingresso di 5Vdc (TTL). Per quanto riguarda la corrente prelevabile abbiamo valori massimi di 8 mA; i pin 2, 3, e 7 riescono a fornire 16mA massimi.</p>
<p><span style="text-decoration: underline;">I pin sono collegati direttamente al chip Atmel, occorre fare molta attenzione ai collegamenti esterni, un corto circuito o una tensione di sovraccarico potrebbero danneggiare irreparabilmente il microcontrollore.</span></p>
<h2>Configurazione pin in uscita</h2>
<p>Vediamo come configurare un pin digitale in uscita, utilizzando la classe <strong>OutputPort</strong> (Microsoft.SPOT.Hardware.OutputPort). I parametri da passare al costruttore sono l&#8217;identificativo del pin che vogliamo usare come uscita e il suo stato iniziale (Livello logico alto pari a3.3Vdc oppure livello logico basso pari a 0Vdc).<br />
Ecco un esempio che mostra come configurare il pin0 del Netduino come uscita</p>
<pre class="lang:c# decode:true ">//Pin 0 in uscita, inizializzato a livello logico basso
OutputPort pin0 = new OutputPort(Cpu.Pin.GPIO_Pin0, false);</pre>
<p>Se stiamo realizzando un circuito di esempio consiglio di inizializzare la porta in uscita a false (livello logico basso) per evitare di collegare per errore il pin a massa (corto circuito) con conseguente possibile rottura della porta del chip Atmel.<br />
La classe Pins enumera tutte le porte del Netduino disponibili per la configurazione come uscite o ingressi.</p>
<p><span id="more-1507"></span></p>
<p>L&#8217;operazione fondamentale disponibile per il pin è il cambio di livello utilizzando il metodo Write() dell&#8217;oggetto appena istanziato.<br />
Il codice seguente mostra come utilizzare il metodo Write()</p>
<pre class="lang:c# decode:true ">//Mette a livello alto (3.3Vdc) il pin D0
pin0.Write(true);
//Mette a livello basso (0Vdc) il pin D0
pin0.Write(false);
[/csharp]

Sebbene il pin0 sia configurato come uscita, possiamo leggere, tramite il metodo Read(), il livello logico impostato con il metodo Write():

[csharp]
//creo una variabile bool per memorizzare lo stato della porta
Boolean Livello = false;
//Mette a livello alto (3.3Vdc) il pin D0
pin0.Write(true);
//leggo lo stato del livello
Livello = pin0.Read();
//restituisce true
Debug.Print(Livello.ToString());
//Mette a livello basso (0Vdc) il pin D0
pin0.Write(false);
//leggo lo stato del livello
Livello = pin0.Read();
//restituisce false
Debug.Print(Livello.ToString());</pre>
<p>&nbsp;</p>
<p>La proprietà InitialState restituisce lo stato del livello al momento della creazione dell&#8217;oggetto</p>
<pre class="lang:c# decode:true">//creo una variabile bool per memorizzare lo stato della porta
Boolean Livello = false;
//Pin 0 in uscita, inizializzato a livello logico basso
OutputPort pin0 = new OutputPort(Cpu.Pin.GPIO_Pin0, false);
//Mette a livello alto (3.3Vdc) il pin D0
pin0.Write(true);
//leggo lo stato del livello al momento della creazione
//dell'oggetto pin0
Livello = pin0.InitialState;
//restituisce false
Debug.Print(Livello.ToString());</pre>
<p>La proprietà ID fornisce il nome del piedino del microcontrollore Atmel (come definito nel datasheet)</p>
<pre class="lang:c# decode:true ">//Creo un oggetto Pin
Cpu.Pin nomePin;
//Pin 0 in uscita, inizializzato a livello logico basso
OutputPort pin0 = new OutputPort(Cpu.Pin.GPIO_Pin0, false);
//Ottengo il nome del pin riferito al microcontrollore Atmel
nomePin = pin0.Id;
Debug.Print(nomePin.ToString());</pre>
<h2>Configurazione pin in ingresso</h2>
<p>Per accettare segnali in ingresso dobbiamo decidere quali pin utilizzare e configurarli con la classe InputPort (Microsoft.SPOT.Hardware.InputPort). In questo caso i parametri da passare al costruttore sono 3, il primo definisce l&#8217;identificativo del pin da utilizzare come ingresso, il secondo permette di attivare il filtro antirimbalzo (glitch filter) e il terzo permette di attivare l&#8217;eventuale resistenza di pull-up interna al microcontrollore.<br />
Il codice seguente utilizza il pin3 del Netduino come ingresso.</p>
<pre class="lang:c# decode:true ">//Definisco il pin 3 come ingresso, abilito l'antirimbalzo e la reistenza di pullup
InputPort pin3 = new InputPort(Cpu.Pin.GPIO_Pin3, true, Port.ResistorMode.PullUp);</pre>
<p>Il metodo Read() permette di leggere il livello logico presente sul pin di ingresso. Read() restituisce un valore booleano in funzione del livello logico.</p>
<pre class="lang:c# decode:true ">Boolean Livello = false;
//Pin3 in ingresso
InputPort pin3 = new InputPort(Cpu.Pin.GPIO_Pin0, true, Port.ResistorMode.PullUp);
//leggo dal pin3
Livello = pin3.Read();</pre>
<p>Le proprietà esposte dall&#8217;oggetto sono <strong>ID</strong>, <strong>GlitchFilter</strong> e <strong>Resistor</strong></p>
<pre class="lang:c# decode:true ">Boolean Livello = false;
Boolean StatoFiltro= false;
Port.ResistorMode Resistenza;
//Variabile per contenere il nome del pin
Cpu.Pin nomePin;

//nome del pin come indicato nel datasheet del microcontrollore
nomePin = pin3.Id;
Debug.Print(nomePin.ToString());
//stato del filtro antirimbalso
StatoFiltro = pin3.GlitchFilter;
Debug.Print("StatoFiltro " + StatoFiltro.ToString());
//tipo di resistenza selezionato
Resistenza = pin3.Resistor;
Debug.Print("Resistenza " + Resistenza.ToString());</pre>
<p>&nbsp;</p>
<blockquote><p>GlitchFilter</p>
<p>Il filtro antirimbalzo permette di eliminare gli impulsi spurii che si formano nei contatti metallici di un pulsante. All&#8217;atto della chiusura del pulsante il contatto non avviene immediatamente ma esiste un piccolo tempo di assestamento che da luogo a degli impulsi spurii che possono essere interpretati erroneamente dal Netduino. Attivando il filtro, introduciamo un certo ritardo prima di leggere lo stato dell&#8217;ingresso, in questo modo possiamo avere una lettura sicura poichè il contatto meccanico si è ormai stabilizzato.<br />
La figura mostra gli impulsi spurii generati dall&#8217;interruttore:</p>
<p><a href="https://logicaprogrammabile.it/netduino-inputport-outport-tristateport/filter/" rel="attachment wp-att-1541"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1541" title="GlitchFilter" src="https://logicaprogrammabile.it/wp-content/uploads/2011/06/Filter.gif" alt="Filtro antirimbalzo del Netduino" width="307" height="335" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/06/Filter.gif 307w, https://logicaprogrammabile.it/wp-content/uploads/2011/06/Filter-274x300.gif 274w" sizes="auto, (max-width: 307px) 100vw, 307px" /></a></p></blockquote>
<blockquote><p>ResistorMode</p>
<p>Questa proprietà è molto importante perché permette di eseguire delle letture sicure del livello logico in ingresso quando, il circuito esterno, non imposta un riferimento di tensione sul pin. Le resistenze di pull up permettono di forzare un livello logico alto stabile sul pin d&#8217;ingresso. Nel caso del microcontrollore SAM7X possiamo utilizzare solo le resistenze di PullUp, dato che non sono presenti quelle di pull down (Impostando Port.ResistorMode.PullDown otteniamo un eccezione).</p>
<p><a href="https://logicaprogrammabile.it/netduino-inputport-outport-tristateport/pullup/" rel="attachment wp-att-1555"><img loading="lazy" decoding="async" class="aligncenter wp-image-1555 size-full" title="Gestione Resistenza Pull up InputPort OutputPort" src="https://logicaprogrammabile.it/wp-content/uploads/2011/06/PullUp.gif" alt="Impostare le resistenze di Pull-up sul Netduino" width="351" height="524" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/06/PullUp.gif 351w, https://logicaprogrammabile.it/wp-content/uploads/2011/06/PullUp-200x300.gif 200w" sizes="auto, (max-width: 351px) 100vw, 351px" /></a></p></blockquote>
<p>Abbiamo visto che per leggere dai pin dobbiamo richiamare il metodo Read(), quindi se vogliamo tenere sempre sotto controllo lo stato dell&#8217;ingresso è necessario eseguire ciclicamente il metodo Read();  sarebbe comodo un sistema che monitorizzi l&#8217;ingresso in modo da rilevare i cambiamenti di stato. Fortunatamente il Netduino ed il .Net micro framework mettono a disposizione la classe InterruptPort che svolge proprio questa funzionalità.</p>
<h2>Configurazione pin in ingresso con InterruptPort</h2>
<p>La classe InterruptPort permette di utilizzare un pin come ingresso e di eseguire un metodo ogni qualvolta che si verifica un cambiamento di stato su tale pin. Vediamo come configurare un pin in ingresso con la classe InterruptPort</p>
<pre class="lang:c# decode:true ">InterruptPort pin0 = new InterruptPort(Cpu.Pin.GPIO_Pin0, false,
Port.ResistorMode.PullUp,
 Port.InterruptMode.InterruptEdgeBoth);</pre>
<p>Il costruttore è molto simile alla classe InputPort ma in questo caso abbiamo un parametro aggiuntivo che definisce in che modo deve essere generato l&#8217;interrupt per quel pin. Le possibili opzioni sono:</p>
<table>
<tbody>
<tr>
<td><strong> <a id="#Port.InterruptMode.InterruptEdgeBoth"></a> InterruptEdgeBoth</strong></td>
<td>L&#8217;interrupt viene generato sia sul fronte di salita che sul fronte di discesa del segnale in ingresso</td>
</tr>
<tr>
<td><strong>InterruptEdgeHigh</strong></td>
<td>L&#8217;interrupt viene generato solo sul fronte di salita del segnale in ingresso</td>
</tr>
<tr>
<td><strong> <a id="#Port.InterruptMode.InterruptEdgeLevelHigh"></a> InterruptEdgeLevelHigh</strong></td>
<td>L&#8217;interrupt viene generato quando il segnale in ingresso diventa alto</td>
</tr>
<tr>
<td><strong> <a id="#Port.InterruptMode.InterruptEdgeLevelLow"></a> InterruptEdgeLevelLow</strong></td>
<td>L&#8217;interrupt viene generato quando il segnale in ingresso diventa basso</td>
</tr>
<tr>
<td><strong> <a id="#Port.InterruptMode.InterruptEdgeLow"></a> InterruptEdgeLow</strong></td>
<td>L&#8217;interrupt viene generato solo sul fronte di discesa del segnale in ingresso</td>
</tr>
<tr>
<td><strong> <a id="#Port.InterruptMode.InterruptNone"></a> InterruptNone</strong></td>
<td>non viene generato nessun interrupt</td>
</tr>
</tbody>
</table>
<p><a href="https://logicaprogrammabile.it/netduino-inputport-outport-tristateport/interrupt/" rel="attachment wp-att-1584"><img loading="lazy" decoding="async" class="aligncenter wp-image-1584 size-full" title="Gestione Interrupt Netduino InputPort OutputPort" src="https://logicaprogrammabile.it/wp-content/uploads/2011/06/Interrupt.gif" alt="Interrupt segnale in ingresso" width="564" height="311" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/06/Interrupt.gif 564w, https://logicaprogrammabile.it/wp-content/uploads/2011/06/Interrupt-300x165.gif 300w" sizes="auto, (max-width: 564px) 100vw, 564px" /></a></p>
<p>Le opzioni sono diverse e riescono a soddisfare tutte le variazioni di segnale che possono interessare il pin in ingresso.<br />
La parte importante è la possibilità di generare un evento ogni volta che si verifica un&#8217;interrupt. Il codice di esempio mostra come farlo</p>
<pre class="lang:c# decode:true ">public static void Main()
{
//Definisco il pin0 come InterruptPort
//L'interrupt viene generato sul fronte di salita
InterruptPort pin0 = new InterruptPort(Cpu.Pin.GPIO_Pin0, false,
Port.ResistorMode.PullUp,
Port.InterruptMode.InterruptEdgeHigh);
//Creo un evento quando si scatena un interrupt
//Ogni volta che viene generato un evento viene eseguito il metodo EventoPinIngresso
pin0.OnInterrupt += new NativeEventHandler(EventoPinIngresso);

while(true)
{
//eseguo qualcosa
Thread.Sleep(100);
}
}

public static void EventoPinIngresso(uint data1, uint data2, DateTime time)
{
//eseguo qualcosa quando viene generato un interrupt
Debug.Print(data1.ToString());
Debug.Print(data2.ToString());
Debug.Print(time.ToString());
}</pre>
<p>&nbsp;</p>
<p>In questo modo ogni volta che il segnale in ingresso scatena un interrupt, Netduino esegue il codice contenuto in EventoPinIngresso.<br />
La firma del metodo EventoPinIngresso deve contenere due valori <strong>uint</strong> e una <strong>DateTime</strong>. Il primo valore (data1) contiene il numero del pin del microcontrollore, il secondo contiene il livello logico sul pin e il terzo (time) contiene il tempo in cui è stato scatenato l&#8217;evento.<br />
Da notare che la gestione dell&#8217;evento è asincrona e quindi il Netduino continua ad eseguire il codice del ciclo while ed esegue autonomamente il metodo EventoPinIngresso quando si verifica un interrupt.</p>
<p>Questa funzionalità permette di creare codice che reagisce autonomamente agli eventi esterni e fa in modo che il Netduino si adatti meglio alle esigenze progettuali moderne.</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-inputport-outputport-tristateport/">Netduino, linee GPIO configurarle con InputPort e OutputPort</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-inputport-outputport-tristateport/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
