Il codice per PIC 16F84A – Routine principale

Adesso che abbiamo le routines “di servizio” possiamo d analizzare la routine principale denominata “Acquisition”. Come abbiamo già detto, la prima cosa da fare nel dialogo con la sonda è chiamare la inizializza_ds1820 che si occupa degli impulsi di reset e presence.

Dopo il comando di inizializzazione bisogna inviare il comando ROM che riguarda l’identificazione della sonda attraverso il codice a 64 bit. Nel nostro caso inviamo il comando skip ROM, che corrisponde al valore esadecimale 0xCC, in quanto, avendo una sola sonda, l’identificazione è superflua.
Per far questo ci appoggiamo alla variabile ds1820, menzionata in precedenza, che passiamo alla routine scrivi_ds1820 che si occupa della trasmissione vera e propria.
Il comando skip ROM dice alla sonda di “saltare” l’invio del codice univoco da 64 bit.
Quando la sonda riceve questo comando sa che subito dopo deve attendersi un comando diretto che riguarda le sue funzioni di “sonda”.

Queste istruzioni eseguono le seguenti operazioni:

  • mettere il valore 0xCC nell’accumulatore
  • mettere il valore dell’accumulatore nel registro ds1820
  • chiama la routine scrivi ds1820
  • aspetta 600 microsecondi

Avendo già analizzato la scrvi_ds1820, le operazioni di cui sopra sono relativamente banali.

Per inciso la sonda ha anche una configuration word che può essere programmata e una memoria in cui memorizzare un valore di temperatura in base al quale la sonda può fare da allarme settando un flag quando la temperatura supera tale valore.
In questo caso non facciamo uso di nessuna di queste funzioni ma, una volta capito come funziona il dialogo, è sufficiente cambiare le parole di comando e riutilizzare le stesse routines.

Dopo il comando skip-rom (CCH) la sonda si aspetta un comando riguardante o le sue funzioni di sonda o delle operazioni di memoria. Quindi dopo il comando di ROM mandiamo un comando di funzione:

In questo caso il comando è il 0x44=converti temperatura.
Dopo questo comando la sonda rimane inattiva per il tempo necessario a leggere la temperatura e convertirne il valore in binario. Il tempo necessario dipende dalla risoluzione impostata.
Per default la sonda è impostata alla risoluzione massima di 12bit e in questo caso il tempo richiesto è di 750ms. Nel codice è impostato un valore approssimato per eccesso pari a 1s.

Dopo l’esecuzione del comando converti temperatura, la sonda ha completato il ciclo di tre passi illustrato precedentemente. Per eseguire un nuovo comando, la routine principale dovrà nuovamente eseguire l’operazione di reset e skip ROM.

Quello che dobbiamo fare adesso è leggere la scratchpad cioè la memoria in cui viene memorizzato l’ultimo valore di temperatura convertito.
Il codice si presenta così:

Si tratta delle routines viste precedentemente; come unica differenza vi è appunto il comando leggi scratchpad (0xBE) il quale dice alla sonda che subito dopo dovrà inviarci il dato di temperatura.
Quindi immediatamente dopo aver inviato il comando 0xBE facciamo due chiamate consecutive alla leggi_ds1820 vista precedentemente:

Questo perchè il dato di temperatura è contenuto in due byte e alla fine di queste istruzioni li troveremo salvati nelle due variabili temp1 e temp2.

Riaggregando le routines che abbiamo analizzato singolarmente abbiamo di seguito il codice completo della Acquisition che può essere chiamata all’interno di un programma più ampio come per esempio un termometro digitale che visualizzi il valore di temperatura su un display alfanumerico come quello mostrato in figura.

[cml_media_alt id='2053']display[/cml_media_alt]

Nota: I diagrammi e i grafici presenti i questo articolo sono tratti dal datasheet ufficiale
del componente.