<?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>bus Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/bus/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/bus/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Sat, 14 Jan 2017 22:09:23 +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>bus Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/bus/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Netduino impiegare la memoria 24LC256</title>
		<link>https://logicaprogrammabile.it/netduino-impiegare-la-memoria-24lc256/</link>
					<comments>https://logicaprogrammabile.it/netduino-impiegare-la-memoria-24lc256/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Thu, 16 Jan 2014 12:49:22 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[bus]]></category>
		<category><![CDATA[I2C]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=4010</guid>

					<description><![CDATA[<p>Come usare la memoria 24LC256 con Netduino dopo aver scritto l&#8217;articolo sull&#8217;utilizzo della memoria 24LC256 utilizzando una scheda Arduino ho realizzato questo piccolo tutorial per tutti gli utenti che possiedono una scheda Netduino. La parte teorica e lo schema elettrico del circuito rimangono invariati, l&#8217;unica...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-impiegare-la-memoria-24lc256/">Netduino impiegare la memoria 24LC256</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come usare la memoria 24LC256 con Netduino</h3>
<p>dopo aver scritto<a title="24LC256 utilizzare una memoria seriale su bus I2C" href="https://logicaprogrammabile.it/2014/utilizzare-una-memoria-seriale-24lc256/"> l&#8217;articolo sull&#8217;utilizzo della memoria 24LC256</a> utilizzando una scheda <strong>Arduino</strong> ho realizzato questo piccolo tutorial per tutti gli utenti che possiedono una scheda <strong>Netduino</strong>.<br />
La parte teorica e lo schema elettrico del circuito rimangono invariati, l&#8217;unica ovvia differenza è la scrittura del codice che in questo caso si basa sul <strong>linguaggio C#</strong>.</p>
<p><span id="more-4010"></span></p>
<p>Questo è il codice:</p>
<p>[csharp]<br />
//buffer per memorizzare indirizzi<br />
//e dati<br />
Byte[] tx_write = new Byte[3];<br />
Byte[] tx_read = new Byte[2];<br />
Byte[] rx_data = new Byte[1];</p>
<p>Int16 indirizzo = 0;<br />
Byte data = 0;<br />
Int32 ciclo = 0;</p>
<p>//creo un oggetto per usare il led onboard<br />
OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);</p>
<p>//accendo il led onboard<br />
led.Write(true);</p>
<p>//Configurazione contenente l&#8217;indirizzo della memoria 24LC256<br />
//e la frequenza del bus i2c<br />
I2CDevice.Configuration cnf = new I2CDevice.Configuration(0x50, 100);</p>
<p>//Creo un oggetto per eseguire le richieste di lettura e scrittura<br />
I2CDevice mem24LC256 = new I2CDevice(cnf);</p>
<p>//creo un oggetto I2CReadTransaction che viene associato al buffer rx_data<br />
//il buffer tx viene utilizzato per contenere i dati letti dalla memoria 24LC256<br />
I2CDevice.I2CReadTransaction[] rt_data = new<br />
    I2CDevice.I2CReadTransaction[] { I2CDevice.CreateReadTransaction(rx_data) };</p>
<p>//creo un oggetto I2CWriteTransaction che viene associato al buffere tx_write<br />
//il buffer tx viene utilizzato per spedire i due byte dell&#8217;indirizzo della<br />
//locazione di memoria che vogliamo utilizzare e il byte contenente il dato<br />
//da memorizzare nella memoria<br />
I2CDevice.I2CWriteTransaction[] wt_write = new<br />
    I2CDevice.I2CWriteTransaction[] { I2CDevice.CreateWriteTransaction(tx_write) };</p>
<p>//creo un oggetto I2CWriteTransaction che viene associato al buffere tx_read<br />
//il buffer tx_read viene utilizzato per selezionare la locazione di memoria<br />
//da cui vogliamo leggere il contenuto<br />
I2CDevice.I2CWriteTransaction[] wt_read = new<br />
    I2CDevice.I2CWriteTransaction[] { I2CDevice.CreateWriteTransaction(tx_read) };</p>
<p>//info di debug<br />
Debug.Print(&quot;START Scrittura&quot;);</p>
<p>//eseguo un ciclo per memorizzare dati in tutti e 32KB<br />
for(ciclo = 0; ciclo &lt; 32000; ciclo++)<br />
{<br />
    //compongo il buffer con l&#8217;indirizzo di memoria<br />
    //che voglio utilizzare ed il dato che voglio<br />
    //scrivere al suo interno<br />
    tx_write[0] = (Byte)((indirizzo &gt;&gt; 8) &amp; 0xff);<br />
    tx_write[1] = (Byte)(indirizzo &amp; 0xff);<br />
    tx_write[2] = data;</p>
<p>    //eseguo il comando<br />
    mem24LC256.Execute(wt_write, 10);</p>
<p>    //incremento il valore di data e lo resetto<br />
    //quando raggiunge il valore 255<br />
    data++;</p>
<p>    if (data == 255)<br />
        data = 0;</p>
<p>    //incremento il valore della<br />
    //locazione di memoria da usare<br />
    indirizzo++;</p>
<p>}</p>
<p>Debug.Print(&quot;Fine Scrittura&quot;);</p>
<p>//attendo 1 secondo<br />
Thread.Sleep(1000);</p>
<p>Debug.Print(&quot;Inizio lettura&quot;);</p>
<p>//resetto il valore dell&#8217;indirizzo<br />
indirizzo = 0;</p>
<p>for (ciclo = 0; ciclo &lt; 32000; ciclo++)<br />
{<br />
    //utilizzo il buffer tx_read per caricare<br />
    //l&#8217;indirizzo della locazione di memoria da dove<br />
    //leggere i dati<br />
    tx_read[0] = (Byte)((indirizzo &gt;&gt; 8) &amp; 0xff);<br />
    tx_read[1] = (Byte)(indirizzo &amp; 0xff);</p>
<p>    //eseguo il comando<br />
    mem24LC256.Execute(wt_read, 10);</p>
<p>    //attendo 5 ms<br />
    Thread.Sleep(5);</p>
<p>    //ora eseguo il comando per leggere i dati dalla<br />
    //locazione di memoria precedentemente selezionata<br />
    //il dato letto viene memorizzato nelbuffer rx_data<br />
    mem24LC256.Execute(rt_data, 10);</p>
<p>    //printo l&#8217;indirizzo della locazione di memoria corrente<br />
    //ed il suo contenuto<br />
    Debug.Print(indirizzo.ToString() + &quot;:&quot; + rx_data[0].ToString());</p>
<p>    //incremento il valore della<br />
    //locazione di memoria da usare<br />
    indirizzo++;<br />
}</p>
<p>Debug.Print(&quot;Fine lettura&quot;);</p>
<p>//spengo il led onboard a fine lettura<br />
led.Write(false);</p>
<p>[/csharp]</p>
<p>Il codice è ricco di commenti che spiegano cosa eseguono le istruzioni!</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-impiegare-la-memoria-24lc256/">Netduino impiegare la memoria 24LC256</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-impiegare-la-memoria-24lc256/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Protocollo I2C e sensore di temperatura MCP9803 (1°parte)</title>
		<link>https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/</link>
					<comments>https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 04 Apr 2011 12:38:50 +0000</pubDate>
				<category><![CDATA[Elettronica]]></category>
		<category><![CDATA[bus]]></category>
		<category><![CDATA[I2C]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=639</guid>

					<description><![CDATA[<p>Protocollo I2C ed uso dell&#8217;integrato MCP8903 Il mondo dell&#8217;elettronica, come sapiamo, è composto da migliaia di componenti che svolgono funzioni dedicate, come un sensore di temperatura, oppure sono capaci di gestire diverse operazioni come nel caso dei microcontrollori. La tecnologia analogica ha pian piano lasciato...</p>
<p>The post <a href="https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/">Protocollo I2C e sensore di temperatura MCP9803 (1°parte)</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Protocollo I2C ed uso dell&#8217;integrato MCP8903</h1>
<p>Il mondo dell&#8217;elettronica, come sapiamo, è composto da migliaia di componenti che svolgono funzioni dedicate, come un sensore di temperatura, oppure sono capaci di gestire diverse operazioni come nel caso dei microcontrollori.<br />
La tecnologia analogica ha pian piano lasciato il posto a quella digitale e i componenti hanno iniziato a colloquiare tra loro utilizzando vari protocolli di comunicazione (insieme di regole che determinano il funzionamento della comunicazione).<br />
Oggi, la maggior parte dei circuiti utilizza un microcontrollore, il cui compito è quello di gestire il circuito ed i componenti ad esso collegato.<br />
Nel caso di sistemi complessi i componenti che creano il circuito sono diversi e possono saturare la capacità fisica di collegamento del microcontrollore, come nel caso proposto in figura.</p>
<p><a href="https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/componenti/" rel="attachment wp-att-653"><img fetchpriority="high" decoding="async" class="aligncenter wp-image-653 size-full" title="Componenti" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/Componenti.gif" width="434" height="424" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/Componenti.gif 434w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/Componenti-300x293.gif 300w" sizes="(max-width: 434px) 100vw, 434px" /> </a></p>
<p>Ben presto si è capito che per snellire questo tipo di circuiti era necessario creare un meccanismo capace di ottimizzare l&#8217;interconnessione tra componenti e microcontrollore. Il sistema più efficace è certamente quello di adottare un bus di collegamento, che permette lo scambio di dati, tra componenti e microcontrollore, utilizzando pochi fili comuni.<br />
La figura seguente mostra un esempio di bus dove diversi componenti sono interconnessi utilizzando solo 2 fili. Il microcontrollore in questo caso deve gestire la comunicazione utilizzando un protocollo comune a tutti i componenti.<br />
<span id="more-639"></span><a href="https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/componentibus/" rel="attachment wp-att-650"><img decoding="async" class="aligncenter wp-image-650 size-full" title="ComponentiBus" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/ComponentiBus.gif" width="490" height="341" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/ComponentiBus.gif 490w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/ComponentiBus-300x208.gif 300w" sizes="(max-width: 490px) 100vw, 490px" /> </a>Diverse aziende svilupparono dei protocolli che col tempo sono divenuti degli standard, in questo modo componenti e microcontrollori hanno iniziato a scambiarsi dati in modo semplice ed efficiente.</p>
<p>La Philips negli anni &#8217;80 sviluppò il Bus <strong>I2C</strong> (<strong>I</strong>nter <strong>I</strong>ntegrated <strong>C</strong>ircuit pronunciato <em>i-quadro</em>-ci o <em>i-due-ci</em>), un protocollo seriale che usa due fili per instaurare la comunicazione con i componenti.</p>
<p>Tipicamente questo protocollo richiede un master (il microcontrollore che gestisce la comunicazione), e uno o più componenti slave (sensori, ADC, DAC, memorie ecc&#8230; che inviano i dati al microcontrollore).<br />
Gli slave vengono identificati nel bus tramite un <span style="text-decoration: underline;">indirizzo univoco</span>. Il master invia sulla linea l&#8217;indirizzo dello slave con cui vuole instaurare la comunicazione.<br />
E&#8217; possibile un sistema con più master (multimaster) ma la comunicazione deve sempre essere gestita da un master alla volta.</p>
<p>Il bus I2C permette di collegare agli stessi due fili ben 112 dispositivi. La velocità di comunicazione non è elevatissima e puoi variare, tipicamente, da un minimo di 10Kbits/s fino a 400Kbits/s (sviluppi successivi del bus I2c hanno permesso velocità fino a 3.4Mbits/S e interconnessioni di 1024 componenti).</p>
<p>I segnali presenti sui fili sono chiamati SDA (<strong>S</strong>ignal <strong>DA</strong>ta) per il trasferimento dei dati e SCL (<strong>S</strong>erial <strong>C</strong>lock <strong>L</strong>ine) per la sincronizzazione della linea. In figura è rappresentato il diagramma dei segnali:</p>
<p><img decoding="async" class="aligncenter wp-image-665 size-full" title="I2C_Protocollo" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/I2C_Protocollo.gif" width="670" height="150" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/I2C_Protocollo.gif 670w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/I2C_Protocollo-300x67.gif 300w" sizes="(max-width: 670px) 100vw, 670px" /></p>
<p>Il master deve eseguire, per avviare la comunicazione, una commutazione della linea SDA dallo stato alto allo stato basso, quando il segnale SCL è alto (vedi riquadro Start).<br />
Successivamente il master può inviare dati sulla linea SDA.<br />
Quando il segnale SCL è basso il master inizia a scrivere il valore del bit (1 o 0); quando il segnale SCL è alto, il bit è stabile e può essere letto dallo slave (riquadro BIT1).Questo procedimento si ripete per tutti i bit (Riquadro BIT2 e BIT N).<br />
Quando tutti i bit sono stati inviati, la comunicazione termina quando il master riporta la linea SDA a livello alto in concomitanza del livello alto della linea SCL (riquadro Stop).</p>
<p>Questo esempio spiega il comportamento tipico dei segnali sul bus.</p>
<p>La comunicazione tra master e slave è risulta nella pratica più complessa di quanto espresso precedentemente. Per capire meglio è utile analizzare un esempio reale, perciò ho realizzato un semplice circuito che impiega un Pic 16F876 e un sensore di temperatura digitale MCP9803 che colloquiano utilizzando il bus I2C.</p>
<p>Lo schema elettrico è il seguente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-692 size-full" title="MCP9803" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/MCP9803.gif" width="653" height="559" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/MCP9803.gif 653w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/MCP9803-300x256.gif 300w" sizes="auto, (max-width: 653px) 100vw, 653px" /></p>
<p>Il circuito utilizza un microcontrollore per comunicare con il sensore di temperatura MCP9803. I dati acquisiti vengono acquisiti e inviati tramite la porta UART del pic al pc. Il Max233 converte i segnali TTL in segnali RS232.</p>
<p>Partiamo con lo studio del datasheet del sensore MCP9803. Le caratteristiche principali sono riassunte nella tanella seguente:</p>
<table>
<tbody>
<tr>
<td>Intervallo di alimentazione</td>
<td>da 2.7Vdc a 5.5Vdc</td>
</tr>
<tr>
<td>Selezione risoluzione acquisizione</td>
<td>da 9 bit a 12 bit</td>
</tr>
<tr>
<td>Interfaccia di comunicazione</td>
<td>bus I2C</td>
</tr>
<tr>
<td>Frequenza bus I2C</td>
<td>da 10Khz a 400Khz</td>
</tr>
<tr>
<td>Intervallo temperatura</td>
<td>da -55°C a +125°C</td>
</tr>
<tr>
<td>Precisione</td>
<td>+-1°C da  da-10°C a +85°C</td>
</tr>
</tbody>
</table>
<p>Il pin 1 (SDA) del sensore è collegato direttamente al pin 15 del pic (SDA), mentre il pin 2 (SCLK) del sensore è collegato al pin 14 del pic (SCL).</p>
<p>I pin 5, 6, 7 del sensore (A0, A1, A2) permettono di definire l&#8217;indirizzo del dispositivo all&#8217;interno del bus. Sul datasheet possiamo leggere come viene impostato:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-702 size-full" title="AddressPin" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/AddressPin.jpg" width="369" height="334" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/AddressPin.jpg 369w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/AddressPin-300x271.jpg 300w" sizes="auto, (max-width: 369px) 100vw, 369px" />Per comporre l&#8217;indirizzo sono necessari 7 bit. Nei modelli 9800/xxxx gli indirizzi sono predefiniti, mentre nell&#8217;MCP9803 i bit A3, A4, A5, A6 sono scelti dalla casa costruttrice e i bit A0, A1, A2 sono impostabili dall&#8217;utente.</p>
<p>Nel circuito in questione, i pin A0, A1, A2 sono collegati a massa, quindi a valore logico 0, di conseguenza l&#8217;indirizzo del nostro sensore è 1001000 (0x48 in esadecimale).</p>
<p>Bene ora l&#8217;MCP9803 può essere identificato dal pic usando l&#8217;indirizzo a 7 bit.</p>
<p>Scorrendo il datasheet, andiamo nella sezione register:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-706 size-full" title="register_pointer" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/register_pointer1.gif" width="646" height="238" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/register_pointer1.gif 646w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/register_pointer1-300x110.gif 300w" sizes="auto, (max-width: 646px) 100vw, 646px" /></p>
<p>Il sensore ha un registro che permette di accedere ai vari registri interni, come ad esempio il Configuration Register dove possiamo cambiare la risoluzione del convertitore digitale. Vedremmo poi come cambiare la risoluzione da 9bit (valore di default) a 12bit.<br />
Quello che ci serve ora è leggere il dato del &#8216;Temperature Register&#8217;. Per selezionarlo è sufficiente porre il bit0(P0) e il bit1(P1) a 0 (Questo registro è a 0 per default ma eseguiamo comunque l&#8217;operazione ai fini didattici).</p>
<p>Ora studiamo la sezione dove è illustrata la sequenza di comunicazione tra il master ed il sensore MCP9803.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-718 size-full" title="Read_Data" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data.gif" width="516" height="222" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data.gif 516w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data-300x129.gif 300w" sizes="auto, (max-width: 516px) 100vw, 516px" /></p>
<p>Si inizia con il comando di start (SDA va basso quando SCLK è alto &#8211; vedi box rosso &#8216;S&#8217;) poi il master scrive i 7 bit dell&#8217;indirizzo dello slave (1001000) più un bit che definisce se vogliamo leggere o scrivere nei registri dello slave (Se questo bit è a 1 leggeremo i dati dallo slave se è a 0 scriveremo i dati nello slave).<br />
Questa informazione del bit che definisce la lettura o la scrittura è presente in questa sezione del datasheet.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-711 size-full" title="Add_Byte" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Add_Byte.gif" width="355" height="516" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Add_Byte.gif 355w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Add_Byte-206x300.gif 206w" sizes="auto, (max-width: 355px) 100vw, 355px" /></p>
<p>Il master invia il seguente valore binario 10010000 (0x90 in esadecimale) per scrivere sullo slave.<br />
Dopo l&#8217;invio del byte sul bus I2C, lo slave risponde con un acknowledges (pone la linea SDA bassa quando il SCLK è alto).<br />
Ora il master invia un secondo byte per scrivere sul <strong>register point</strong> il valore necessario a selezionare il registro <strong>Temperature Regiser</strong> (Bito e Bit1 a 0). Il sensore risponde con un altro acknowledges.</p>
<p>Adesso che abbiamo impostato il sensore, per leggere dal registro contenente il dato della temperatura, possiamo avviare l&#8217;operazione di lettura.<br />
Controlliamo ancora il datasheet  e appuriamo che il dato della temperatura è espresso con due byte.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-714 size-full" title="TA_register" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/TA_register.gif" width="664" height="296" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/TA_register.gif 664w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/TA_register-300x133.gif 300w" sizes="auto, (max-width: 664px) 100vw, 664px" /></p>
<p>L&#8217;operazione per leggere due byte consecutivi dal registro selezionato è rappresentata in figura:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-721 size-full" title="Read_Data2byte" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data2byte.gif" width="643" height="208" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data2byte.gif 643w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data2byte-300x97.gif 300w" sizes="auto, (max-width: 643px) 100vw, 643px" /></p>
<p>Inviamo un comando si Start, poi l&#8217;indirizzo dello slave (0x48) ed il bit di selezione lettura/Scrittura impostato a 1(lettura). Il valore binario risultante è 10010001 (0x91 in esadecimale).</p>
<p>Il sensore risponde con un acknowledges. Il master esegue la lettura del primo byte, invia un acknowledges, legge il secondo byte ed invia un not acknowledges (indica allo slave la fine della lettura).<br />
Il master termina la comunicazione inviando un comando di stop (riquadro P).</p>
<p>Il codice che permette al pic di eseguire tutte queste operazioni è stato scritto utilizzando <strong>MikroC Pro</strong> della <strong>Mikroelektronika</strong>. Il linguaggio, basato sulla sintassi del C, risulta molto semplice e facile da scrivere.<br />
Inoltre sono disponibili molte librerie che svolgono molte operazioni tra le quali quella relativa all&#8217;uso del bus I2C.</p>
<p>Il codice caricato sul pic16F876 è il seguente:</p>
<pre class="lang:c# decode:true ">unsigned short Primo_Byte = 0;
unsigned short Secondo_Byte = 0;

void main()
{
//inizializzo la porta UART
//a 9600bps
UART1_Init(9600);
//Inizializzo la porta I2C
//con una velocità di 400Khz
I2C1_Init(400000);

//Attendo 100 millisecondi
Delay_ms(100);

//invio uno Start sul bus I2C
I2C1_Start();
//Invio l'indirizzo 1001000
//setto il bit per la scrittura
I2C1_Wr(0x90); //10010000
//scrivo sul Register point il valore 0
//per accedere al Temperature Register
I2C1_Wr(0x00);

//ciclo infinito per leggere
//continuamente la temperatura
while (1)
{
//invio uno Start sul bus I2C
I2C1_Start();

//Invio l'indirizzo 1001000
//setto il bit per la scrittura
I2C1_Wr(0x91); //10010001
//leggo il primo Byte ed invio un acknowledge
Primo_Byte = I2C1_Rd(1);
//leggo il primo Byte ed invio un NOT acknowledge
Secondo_Byte = I2C1_Rd(0);
//Invio uno stop sul bus I2C
I2C1_Stop();

//Invio sulla seriale i dati letti dal sensore
UART1_Write(Primo_Byte);
UART1_Write(Secondo_Byte);

//attendo 2 secondi tra una lettura e la
//sucessiva
Delay_ms(2000);

}
}</pre>
<p>&nbsp;</p>
<p>Il pic acquisisce il segnale ed invia i dati <span style="text-decoration: underline;"><strong>grezzi</strong></span> al pc che dovrà interpretarli ed elaborarli secondo la formula presente nel datasheet:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-726 size-full" title="Equazione" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Equazione.gif" width="355" height="185" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Equazione.gif 355w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Equazione-300x156.gif 300w" sizes="auto, (max-width: 355px) 100vw, 355px" /></p>
<p>dove <strong>Code</strong> è il dato grezzo letto dal sensore, mentre <strong>n</strong> dipende dal valore di risoluzione del convertitore (-1 per 9bit di risoluzione, -2 per 10bit di risoluzione, -3 per 11bit di risoluzione e -4 per 12bit di risoluzione).</p>
<p>Il datasheet mostra una tabella di esempio che possiamo usare per capire come avviene questo calcolo:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-730 size-full" title="Esempio_TA" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Esempio_TA1.gif" width="693" height="411" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Esempio_TA1.gif 693w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Esempio_TA1-300x177.gif 300w" sizes="auto, (max-width: 693px) 100vw, 693px" /></p>
<p>L&#8217;esempio con 9bit di risoluzione e una temperatura ambiente di 125°C produce un valore binario formato da 9bit, suddivisi in due byte, il primo con valore binario di <strong>01111101 </strong>e il secondo con valore binario <strong>0</strong>0000000 (vedi riquadri 1° Byte e 2° Byte). Questi due byte devono essere uniti per formare un valore intero.<br />
Il primo byte è quello più significativo mentre il secondo è quello meno significativo, quindi uniamo il bit del secondo byte al primo:</p>
<p style="text-align: center;"><strong>01111101 + 0 = 011111010 =&gt; 0xFA (esadeciale) =&gt; 250 (Decimale)</strong></p>
<p>Ora applichiamo la formula per calcolare la temperatura</p>
<p style="text-align: center;"><strong>250 * 2^-1 = 250 * 0.5 = 125°C</strong></p>
<p>Nella seconda parte illustrerò come acquisire i dati inviati dal pic con la seriale e come cambiare la risoluzione di campionamento da 9bit a 12bit.</p>
<p>Come sempre aspetto i vostri suggerimenti.</p>
<p>The post <a href="https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/">Protocollo I2C e sensore di temperatura MCP9803 (1°parte)</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
