Gestire i registri dell’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 circuito elettrico è sempre quello impiegato nella prima parte dell’articolo.

Il register pointer permette di selezionare 4 registri differenti a seconda di come vengono impostati i bit P0 e P1.

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.

La figura seguente Riporto in figura il registro Configuration register  come illustrato nel datasheet:

Registro di configurazione del pic

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).

Le operazioni che dobbiamo eseguire per impostare la risoluzione del convertitore a 12bit sono le seguenti:

  1. Selezionare il sensore tramite l’indirizzo
  2. Selezionare il registro di configurazione
  3. Impostare i bit5 e il bit6 a 1
  4. Selezionare il registro della temperatura
  5. Leggere dal registro della temperatura

Queste sono le illustrazioni presenti nel datasheet:

Scrivere un byte sul registro di configurazione

Il master invia un comando di Start, invia un byte contenente l’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 Pointer Register. 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.

Ora possiamo eseguire la procedura di lettura come abbiamo visto nella prima parte:

Diagramma di lettura di due Byte dal registro

Riassumiamo la procedura:

  • Il master invia un comando di Start
  • Il master invia un byte contenente l’indirizzo dello slave e il flag di lettura/scrittura impostato su lettura (1).
  • Il sensore risponde con un acknowledges.
  • Il master legge il primo byte dallo slave e  invia un acknowledges.
  • Il master legge il secondo Byte e invia un not acknowledges(NAK) per indicare allo slave la fine della lettura.
  • Il master invia il comando di stop.

Utilizzando la tabella di esempio possiamo apprendere come i dati verranno scritti nel Temperature Register:

Registro di temperatura a 12 bit

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.
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

00011001 + 0111 => 000110010111

il valore ottenuto è 000110010111 che convertito in decimale diviene 407. La temperatura viene calcolata utilizzando la formula seguente:

n nel nostro caso vale -4 perché la risoluzione del convertitore è settata a 12bit, di conseguenza la nostra formula per calcolare la temperatura diventa:

407 * 2^-4 => 407 * 0.0625 => 25.4375°C

Il codice di esempio seguente è compilato e caricato sul pic16f876, sono presenti numerosi commenti che illustrano il funzionamento del programma:

 

Quello che adesso rimane da fare è il software lato pc che acquisisce i dati dalla seriale. Ho utilizzato Visual C# per creare un’applicazione windows form.
Anche in questo caso il codice seguente è ricco di commenti che permettono di capire meglio il programma:

 

Le operazioni che esegue il programma sono riassunte in questo modo:

  • La porta seriale viene aperta per poter acquisire i dati
  • Un gestore di evento viene scatenato quando sulla seriale arrivano dei dati
  • Il gestore di evento leggere due byte alla volta.
  • Il gestore di evento elabora i due byte in modo da ottenere il valore decimale del dato della temperatura
  • Il valore della temperatura è visualizzato su un controllo textbox

Adesso potete divertirvi con il codice per creare un datalogger della temperatura e magari creare un sistema con più sensori di temperatura.

Come sempre suggerimenti e critiche sono sempre ben accette.

Buon divertimento!