<?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>MCP9803 Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/mcp9803/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/mcp9803/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Sat, 14 Jan 2017 22:15:00 +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>MCP9803 Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/mcp9803/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Netduino e bus I2C, collegamento al sensore MCP9803</title>
		<link>https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/</link>
					<comments>https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Thu, 14 Apr 2011 08:25:01 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[Bus I2C]]></category>
		<category><![CDATA[MCP9803]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=787</guid>

					<description><![CDATA[<p>MCP9803 leggere i registri del sensore di temperatura Continuiamo gli articoli sul bus I2C, utilizzando sempre il nostro amato sensore di temperatura MCP9803. Questa volta ho utilizzato il Netduino per &#8216;colloquiare&#8217; con il sensore per fare un po di &#8216;pratica&#8217; con le varie classi esposte...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/">Netduino e bus I2C, collegamento al sensore MCP9803</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>MCP9803 leggere i registri del sensore di temperatura</h1>
<p>Continuiamo gli articoli sul bus <strong>I2C</strong>, utilizzando sempre il nostro amato sensore di temperatura <strong>MCP9803</strong>. Questa volta ho utilizzato il <strong>Netduino</strong> per &#8216;colloquiare&#8217; con il sensore per fare un po di &#8216;pratica&#8217; con le varie classi esposte dal <strong>.Net micro framework</strong> che permettono di utilizzare il bus <strong>I2C</strong>.</p>
<p>Devo dire che con <strong>MikroC</strong> ho un controllo maggiore (giustamente) sulla comunicazione con il sensore. L&#8217;esperienza con <strong>Netduino</strong> invece mi ha lasciato un po perplesso, forse è una mia impressione ma avrei preferito un codice più snello, forse più a basso livello.</p>
<p>Lo schema elettrico che ho creato per questa esperienza è il seguente:</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter wp-image-2189 size-full" title="Netduino_MCP98031" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Netduino_MCP98031.gif" width="643" height="336" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Netduino_MCP98031.gif 643w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Netduino_MCP98031-300x156.gif 300w" sizes="(max-width: 643px) 100vw, 643px" /></p>
<p><span id="more-787"></span>Anche in questo caso i pin A0 A1 A2 servono per personalizzare l&#8217;indirizzo del sensore. Il pin1(SDA) del sensore è collegato al pin4(SDA) del Netduino. Il pin2(SCLK) del sensore è collegato al pin5(SCL) del Netduino.<br />
Il circuito invia i dati al pc utilizzando la porta seriale. Lo schema per la comunicazione seriale è quello utilizzato negli <a title="Netduino e collegamento alla seriale(RS232) del pc" href="https://logicaprogrammabile.it/netduino-e-collegamento-alla-serialers232-del-pc/">esperimenti precedenti</a>.</p>
<p>Il codice seguente riassume tutte le fasi necessarie per leggere il valore della temperatura dal Temperature Register del sensore MCP9803.</p>
<pre class="lang:c# decode:true ">using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

using System.IO.Ports;
using System.Text;

namespace NetduinoApplication1
{
public class Program
{
public static void Main()
{
Byte[] tx = new Byte[1];
Byte[] rx = new Byte[2];

SerialPort UART1 = new SerialPort("COM1", 9600, Parity.None,
8, StopBits.One);
//apro la porta seriale
UART1.Open();

//Configurazione contenente l'indirizzo del sensore e la frequenza
//di del bus i2c
I2CDevice.Configuration cnf = new I2CDevice.Configuration(0x48, 400);

//Creo un oggetto per eseguire le richieste di lettura e scrittura
I2CDevice sensore = new I2CDevice(cnf);

//creo un oggetto I2CReadTransaction che viene associato al buffere rx
I2CDevice.I2CReadTransaction[] rd = new I2CDevice.I2CReadTransaction[]
{I2CDevice.CreateReadTransaction(rx)};

//creo un oggetto I2CWriteTransaction che viene associato al buffere tx
I2CDevice.I2CWriteTransaction[] wr = new I2CDevice.I2CWriteTransaction[]
 {I2CDevice.CreateWriteTransaction(tx)};

//Ciclo infinito
while (true)
{
//eseguo una richiesta di lettura
sensore.Execute(rd, 100);
//invio i dati sulla seriale
UART1.Write(rx, 0, rx.Length);
//attendo 2 secondi
Thread.Sleep(2000);
}

UART1.Close();
}
}
}</pre>
<p>&nbsp;</p>
<p>L&#8217;esempio è molto sintetico e tutto il codice ruota attorno alla classe <strong>I2CDevice</strong>.</p>
<p>Per utilizzare il modulo I2C del Netduino dobbiamo prima creare un oggetto di configurazione tramite la classe I2CDevice.Configuration. I parametri da passare al costruttore sono due, uno riguarda l&#8217;indirizzo del sensore (ottenuto con i 4 bit fissi preimpostati dalla casa costruttrice e i tre scelti dall&#8217;utente, A0 A1 A2, che nel nostro caso sono 1001 + 000 = 1001000 = 0x48 in esadecimale) e l&#8217;altro la frequenza di clock del segnale SCL (che stabilisce la velocità di comunicazione) impostato a 400Khz.<br />
Ora creo un oggetto I2CDevice necessario per eseguire le richieste di lettura e scrittura sul bus I2C. Il costruttore richiede come parametro l&#8217;oggetto I2CDevice.Configuration (nel nostro caso l&#8217;oggetto cnf creato precedentemente).</p>
<p>Per leggere e scrivere dal bus I2C dobbiamo creare due oggetti I2CTransaction, il primo associa al comando di lettura il buffer dove verranno contenuti i byte letti dal sensore, il secondo associa al comando di scrittura il buffer dove sono contenuti i dati da inviare al sensore.</p>
<p><strong>Netduino</strong> esegue ciclicamente (ciclo while) il metodo Execute relativo all&#8217;oggetto sensore. I parametri da passare al metodo sono l&#8217;oggetto I2CTransaction (che può essere quello di lettura o scrittura) e il tempo di timeout della richiesta.</p>
<p>Nell0 specifico il comando <em>sensore.Execute(rd, 100);</em> esegue una lettura sul bus I2C, l&#8217;oggetto rd permette di scrivere i dati letti dal sensore nel buffer rx.</p>
<p>Infine Netduino invia sulla seriale i byte relativi al registro di temperatura del sensore <strong>MCP9803</strong>.</p>
<p>Il .net micro framework rende semplice l&#8217;uso del bus I2C occupandosi di impostare il bit per la lettura/scrittura e per la gestione degli acknowledgee.<br />
In pratica ci dobbiamo solo occupare di specificare l&#8217;indirizzo del sensore e la grandezza dei buffer di lettura e scrittura.</p>
<p>Come sempre suggerimenti e critiche sono sempre graditi.</p>
<p>&nbsp;</p>
<div id="_mcePaste" class="mcePaste" style="position: absolute; left: -10000px; top: 754px; width: 1px; height: 1px; overflow: hidden;">Byte[] tx = new Byte[1];<br />
Byte[] rx = new Byte[2];SerialPort UART1 = new SerialPort(&#8220;COM1&#8221;, 9600, Parity.None,<br />
8, StopBits.One);<br />
UART1.Open();// Create a new I2C bus instance at startup.<br />
I2CDevice.Configuration cnf = new I2CDevice.Configuration(0x48, 400);<br />
I2CDevice sensore = new I2CDevice(cnf);<br />
I2CDevice.I2CReadTransaction[] rd = new I2CDevice.I2CReadTransaction[] {I2CDevice.CreateReadTransaction(rx)};<br />
I2CDevice.I2CWriteTransaction[] wr = new I2CDevice.I2CWriteTransaction[] {I2CDevice.CreateWriteTransaction(tx)};while (true)<br />
{<br />
sensore.Execute(rd, 100);<br />
UART1.Write(rx, 0, rx.Length);Thread.Sleep(2000);<br />
}UART1.Close();</div>
<p>The post <a href="https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/">Netduino e bus I2C, collegamento al sensore MCP9803</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Accedere ai registri dell&#8217;MCP9803 (2° parte)</title>
		<link>https://logicaprogrammabile.it/mcp9803-cambiare-risoluzione-campionamento/</link>
					<comments>https://logicaprogrammabile.it/mcp9803-cambiare-risoluzione-campionamento/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Tue, 05 Apr 2011 17:08:49 +0000</pubDate>
				<category><![CDATA[Elettronica]]></category>
		<category><![CDATA[MCP9803]]></category>
		<category><![CDATA[Termometro]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=747</guid>

					<description><![CDATA[<p>Gestire i registri dell&#8217;MCP9803 Nella prima parte abbiamo visto come comunicare con il sensore di temperatura MCP9803 utilizzando il bus I2C per leggere il valore di temperatura contenuto nel Temperature Register. Proveremmo ora a fare qualcosa di più interessante variando alcuni parametri del sensore. Il...</p>
<p>The post <a href="https://logicaprogrammabile.it/mcp9803-cambiare-risoluzione-campionamento/">Accedere ai registri dell&#8217;MCP9803 (2° parte)</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Gestire i registri dell&#8217;MCP9803</h1>
<p>Nella <a title="Protocollo I2C e sensore di temperatura MCP9803 (1°parte)" href="https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/">prima parte</a> abbiamo visto come comunicare con il sensore di temperatura <strong>MCP9803</strong> utilizzando il bus I2C per leggere il valore di temperatura contenuto nel Temperature Register.<br />
Proveremmo ora a fare qualcosa di più interessante variando alcuni parametri del sensore. Il circuito elettrico è sempre quello impiegato nella <a title="Protocollo I2C e sensore di temperatura MCP9803 (1°parte)" href="https://logicaprogrammabile.it/protocollo-i2c-e-sensore-di-temperatura-mcp9803-1%c2%b0parte/">prima parte</a> dell&#8217;articolo.</p>
<p>Il <strong>register pointer</strong> permette di selezionare 4 registri differenti a seconda di come vengono impostati i bit <strong>P0</strong> e <strong>P1</strong>.</p>
<p><img decoding="async" class="aligncenter wp-image-750 size-full" title="Conf_register" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register.gif" width="646" height="238" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register.gif 646w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register-300x110.gif 300w" sizes="(max-width: 646px) 100vw, 646px" /></p>
<p>Per cambiare la risoluzione del convertitore dobbiamo accedere al registro di configurazione. Come mostra la tabella della figura precedente bisogna impostare il bit P1 a 0 ed il bit P0 a 1.<span id="more-747"></span></p>
<p>La figura seguente Riporto in figura il registro <strong>Configuration register</strong>  come illustrato nel datasheet:</p>
<p><img decoding="async" class="aligncenter wp-image-751 size-full" title="Conf_register1" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register1.gif" alt="Registro di configurazione del pic" width="583" height="644" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register1.gif 583w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register1-271x300.gif 271w" sizes="(max-width: 583px) 100vw, 583px" /></p>
<p>Come è possibile osservare questo registro permette di eseguire diverse operazioni. Quella che a noi ci interessa è relativa alla sezione Resolution (Bit5 e Bit6). Quando il sensore di temperatura viene alimentato i bit di questo registro sono impostati tutti a 0 (Power-up default).</p>
<p>Le operazioni che dobbiamo eseguire per impostare la risoluzione del convertitore a 12bit sono le seguenti:</p>
<ol>
<li>Selezionare il sensore tramite l&#8217;indirizzo</li>
<li>Selezionare il registro di configurazione</li>
<li>Impostare i bit5 e il bit6 a 1</li>
<li>Selezionare il registro della temperatura</li>
<li>Leggere dal registro della temperatura</li>
</ol>
<p>Queste sono le illustrazioni presenti nel datasheet:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-752 size-full" title="Conf_register_write_data" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register_write_data.gif" alt="Scrivere un byte sul registro di configurazione" width="652" height="212" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register_write_data.gif 652w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Conf_register_write_data-300x97.gif 300w" sizes="auto, (max-width: 652px) 100vw, 652px" /></p>
<p>Il master invia un comando di Start, invia un byte contenente l&#8217;indirizzo del sensore (7bit) e il flag di lettura/scrittura, nel nostro esempio 1001000 (0x90 in esadecimale). Il sensore risponde con un acknowledges (ACK), il master invia il secondo un byte che sarà scritto sul <strong>Pointer Register</strong>. Questo valore è 00000001 (0x01 in esadecimale) che seleziona il Configuration Register. Il sensore risponde con un acknowledges. Il master invia un terzo byte 01100000 (0x60 in esadecimale) che sarà scritto nel configuration register. Il sensore risponde con un acknowledges. Il master termina la comunicazione con un comando di Stop.</p>
<p>Ora possiamo eseguire la procedura di lettura come abbiamo visto nella prima parte:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-758 size-full" title="Read_Data2byte" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data2byte1.gif" alt="Diagramma di lettura di due Byte dal registro" width="643" height="208" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data2byte1.gif 643w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Read_Data2byte1-300x97.gif 300w" sizes="auto, (max-width: 643px) 100vw, 643px" /></p>
<p>Riassumiamo la procedura:</p>
<ul>
<li>Il master invia un comando di Start</li>
<li>Il master invia un byte contenente l&#8217;indirizzo dello slave e il flag di lettura/scrittura impostato su lettura (1).</li>
<li>Il sensore risponde con un acknowledges.</li>
<li>Il master legge il primo byte dallo slave e  invia un acknowledges.</li>
<li>Il master legge il secondo Byte e invia un not acknowledges(NAK) per indicare allo slave la fine della lettura.</li>
<li>Il master invia il comando di stop.</li>
</ul>
<p>Utilizzando la tabella di esempio possiamo apprendere come i dati verranno scritti nel <strong>Temperature Register</strong>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-753 size-full" title="TA_register12bit" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/TA_register12bit.gif" alt="Registro di temperatura a 12 bit" width="675" height="354" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/TA_register12bit.gif 675w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/TA_register12bit-300x157.gif 300w" sizes="auto, (max-width: 675px) 100vw, 675px" /></p>
<p>Prendiamo per esempio la colonna 12bit ed una temperatura ambiente di 25.4375°C, il valore binario presente nel Temperature Register è 000110010111. Il primo byte letto dal pic è 00011001 mentre il secondo byte letto è 01110000.<br />
Il primo byte letto dal pic è quello più significativo mentre il secondo è quello meno significativo. Per ottenere il valore della temperatura ambiente, campionata dal sensore, dobbiamo prendere il valore binario del secondo byte e unirlo al valore binario del primo byte in questo modo</p>
<p style="text-align: center;">00011001 + 0111 =&gt; 000110010111</p>
<p>il valore ottenuto è 000110010111 che convertito in decimale diviene 407. La temperatura viene calcolata utilizzando la formula seguente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-771 size-full" title="Equazione" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Equazione1.gif" width="355" height="185" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Equazione1.gif 355w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Equazione1-300x156.gif 300w" sizes="auto, (max-width: 355px) 100vw, 355px" /></p>
<p><strong>n</strong> nel nostro caso vale -4 perché la risoluzione del convertitore è settata a 12bit, di conseguenza la nostra formula per calcolare la temperatura diventa:</p>
<p style="text-align: center;"><strong>407 * 2^-4 =&gt; 407 * 0.0625 =&gt; 25.4375°C</strong></p>
<p>Il codice di esempio seguente è compilato e caricato sul pic16f876, sono presenti numerosi commenti che illustrano il funzionamento del programma:</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);

//procedura per variare la risoluzione
//del convertitore digitale
//invio uno Start sul bus I2C
I2C1_Start();
//Invio l'indirizzo 1001000
//setto il bit per la scrittura
I2C1_Wr(0x90); //10010000
//Seleziono il registro di configurazione
I2C1_Wr(0x01); //00000001
//scrivo sul Configuration Register il valore 96
//per impostare 12bit di risoluzione
I2C1_Wr(0x60);
//termino la comunicazione
I2C1_Stop();

//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>Quello che adesso rimane da fare è il software lato pc che acquisisce i dati dalla seriale. Ho utilizzato <strong>Visual C#</strong> per creare un&#8217;applicazione windows form.<br />
Anche in questo caso il codice seguente è ricco di commenti che permettono di capire meglio il programma:</p>
<pre class="lang:c# decode:true ">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Collections;
using System.IO.Ports;

namespace SensoreTemperaturaMCP9803
{
public partial class frmMain : Form
{
//variabili per la lettura dalla seriale
Double temperaturaRX = 0;
Int16 Temperatura = 0;
Byte[] bytesRicevuti = new Byte[2];

//creo un delegate per accedere dal thread secondario a quello principale
public delegate void AggiornaTXT(string _str);

/// &lt;summary&gt;
/// questa funzione permette di accedere alla textbox da un thread secondario
/// &lt;/summary&gt;
/// &lt;param name="str"&gt;Testo da inserire nella textbox&lt;/param&gt;
public void FormTxtUpdate(string str)
{
if (this.txtTemperatura.InvokeRequired)
{
AggiornaTXT updaterdelegate = new AggiornaTXT(FormTxtUpdate);
this.Invoke(updaterdelegate, new object[] { str });
}
else
{
txtTemperatura.Text = str;
}
}

/// &lt;summary&gt;
/// Questa funzione converte un valore binario in un valore a 16 bit
/// &lt;/summary&gt;
/// &lt;param name="ValoreBinario"&gt;Valore in bit&lt;/param&gt;
/// &lt;param name="Start"&gt;Indice di partenza del BitArray&lt;/param&gt;
/// &lt;param name="NumBit"&gt;Numero di bit da convertire&lt;/param&gt;
/// &lt;returns&gt;&lt;/returns&gt;
private Int16 ConverToDecimal(BitArray ValoreBinario, Int32 Start, Int32 NumBit)
{
Int32 Ciclo = 0;
Int16 Valore = 0;

for (Ciclo = 0; Ciclo &lt; NumBit; Ciclo++)
{
if (ValoreBinario[Ciclo + Start])
Valore |= (Int16)(1 &lt;&lt; Ciclo);
}

return (Valore);
}

public frmMain()
{
InitializeComponent();
}

/// &lt;summary&gt;
/// Questo evento viene generato ala ricezione di un byte sulla seriale
/// &lt;/summary&gt;
/// &lt;param name="sender"&gt;&lt;/param&gt;
/// &lt;param name="e"&gt;&lt;/param&gt;
private void RS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//questa funzione viene eseguita in un thread secondario

//quando sono disponibili almeno 2 byte inizia
//l'elaborazione
if (RS232.BytesToRead &gt;= 2)
{
//leggi 2 byte e memorizzali nell'array bytesRicevuti
RS232.Read(bytesRicevuti, 0, 2);

//inverto l'array
Array.Reverse(bytesRicevuti);
//converto l'array di 2 byte in un array di bit
BitArray ba = new BitArray(bytesRicevuti);

//ottengo il valore della temperatura utilizzando solo i bit validi
//versione con risoluzione a 9bit
//Temperatura = ConverToDecimal(ba, 7, 8);
//calcolo il valore della temperatura
//se il valore del convertiore è a 9 bit devo moltiplicare per 0.5
//temperaturaRX = Temperatura * 0.5;

//ottengo il valore della temperatura utilizzando solo i bit validi
//versione con risoluzione a 12bit
Temperatura = ConverToDecimal(ba, 4, 12);
//calcolo il valore della temperatura
//se il valore del convertiore è a 12 bit devo moltiplicare per 0.0625
temperaturaRX = Temperatura * 0.0625;

//rappresento il valore della temperatura nella textbox
FormTxtUpdate(Convert.ToString(temperaturaRX) + " °C");
}
}

private void frmMain_Load(object sender, EventArgs e)
{
//apro la seriale per iniziare a leggere i dati
RS232.Open();
}

private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
//alla chiusura del form chiudo la comunicazione seriale
RS232.Close();
}

private void btnChiudi_Click(object sender, EventArgs e)
{
//chiudi
Close();
}
}
}</pre>
<p>&nbsp;</p>
<p>Le operazioni che esegue il programma sono riassunte in questo modo:</p>
<ul>
<li>La porta seriale viene aperta per poter acquisire i dati</li>
<li>Un gestore di evento viene scatenato quando sulla seriale arrivano dei dati</li>
<li>Il gestore di evento leggere due byte alla volta.</li>
<li>Il gestore di evento elabora i due byte in modo da ottenere il valore decimale del dato della temperatura</li>
<li>Il valore della temperatura è visualizzato su un controllo textbox</li>
</ul>
<p>Adesso potete divertirvi con il codice per creare un <strong>datalogger</strong> della temperatura e magari creare un sistema con più sensori di temperatura.</p>
<p>Come sempre suggerimenti e critiche sono sempre ben accette.</p>
<p>Buon divertimento!</p>
<p>The post <a href="https://logicaprogrammabile.it/mcp9803-cambiare-risoluzione-campionamento/">Accedere ai registri dell&#8217;MCP9803 (2° parte)</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/mcp9803-cambiare-risoluzione-campionamento/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
