Bus Pirate: DS18S20 temperature sensor/it

From DP

Jump to: navigation , search
Language: English  • Italiano


Controlliamo una sonda 1wire DS18S20

Non c’è niente di meglio di un esempio pratico per capire come funziona un dispositivo del genere che altrimenti, all’apparenza, può sembrare complicato. Innanzitutto, prima di effettuare qualsiasi prova dobbiamo capire per bene in quali punti bisogna collegare il dispositivo da testare. Diamo quindi un occhio al pinout del connettore, disponibile in questa pagina.

Come vedete il pinout cambia leggermente a seconda della versione firmware.

E’ possibile vedere la propria versione digitando i o I dalla riga di comando

Avendo io la versione 3, faccio riferimento al pinout di sinistra (i riquadri gialli indicano i punti da cortocircuitare per fare l’autodiagnosi, cosa di cui non discuterò). Il significato dei nomi dei pin è il seguente:

MOSI Master data out, slave in (SPI, JTAG), Serial data (1-Wire, I2C, KB) TX* (UART)
CLK Clock signal (I2C, SPI, JTAG, KB)
MISO Master data in, slave out (SPI, JTAG) RX (UART)
CS* Chip select (SPI), TMS (JTAG)
AUX Auxiliary IO, frequency probe, pulse-width modulator
ADC Voltage measurement probe (max 6volts)
Vpu Voltage input for on-board pull-up resistors (0-5volts)
+3.3v +3.3volt switchable power supply
+5.0v +5volt switchable power supply
GND Ground, connect to ground of test circuit

Dovendo io testare una sonda 1Wire, utilizzerò i pin MOSI (vedete nella tabella che tale pin è usato per svariate cose tra cui la comunicazione 1Wire) e quindi +5V e GND per l’alimentazione della sonda. Collegherò quindi la mia sonda DS18S20 in questo modo:

DS18x20 buspirate.png

Nota: Sto utilizzando la modalità di alimentazione parassita. Dal momento che la linea 1Wire ha sempre bisogno di una resistenza di pullup, qui l’ho inserita manualmente. Il Bus Pirate ha comunque l’opzione per poter inserire da sè le resistenze di pullup, e a tal proposito è presente una guida su questo argomento.

Personalmente ho arrangiato il tutto su di una breadboard utilizzando cavetti jumper Maschio/Femmina:

DS18x20 buspirate 2.jpg

Entriamo quindi nel menù relativo al protocollo 1Wire. Digitiamo M (invio) e quindi 2 per selezionare la modalità 1-wire, il prompt cambierà indicando la modalità correntemente attiva:

DS18x20 Buspirate 3.gif

Bene, ora per prima cosa dobbiamo attivare l’alimentazione, altrimenti sul pin 5V non ci sarà tensione per alimentare la sonda. Le alimentazioni sul bus pirate vengono attivate con W (maiuscola) e disattivate con w (minuscola):

DS18x20 Buspirate 4.gif

Il Bus Pirate risponde con “POWER SUPPLIES ON” e si accende il led “VREG” sulla scheda.

Il Bus Pirate dispone di una serie di comandi che possono essere utilizzati manualmente per eseguire una serie di operazioni. Ad esempio in questo caso vogliamo conoscere il rom code della sonda collegata. Da datasheet della sonda (sto usando una DS18S20) sappiamo che per eseguire questa operazione dobbiamo inviare il comando di reset seguito dal comando ReadRom (0×33): questo comando restituisce il RomCode di un dispositivo 1Wire nel caso in cui ve ne sia uno solo sulla linea. In questo caso, dato che ho montato una sola sonda, posso eseguire questa operazione, nel prompt del bus pirate andrò quindi a scrivere:

 { 0x33 r:8


Cosa significa quello che ho scritto? Chiariamo innanzitutto che si tratta di 3 distinti comandi separati da uno spazio. Cerchiamo quindi di capire cosa fanno:

{ : (si ottiene tenendo premuto ALT, digitando 1 2 3 in sequenza sul tastierino numerico e quindi rilasciando il tasto ALT) comando per inviare il reset della linea. Tale comando è utilizzato da tutti i protocolli disponibili sul bus pirate con significati diversi. In particolare il comando { viene identificato come comando di Start comunicazione. In una comunicazione 1Wire lo start corrisponde al reset (in altri protocolli corrisponderà allo start relativo a quel protocollo, ad esempio sul bus I2C questo comando servirà all’invio del bit di start).

0×33 : è il comando, utilizzato dal bus 1wire, per eseguire il Read Rom, non si tratta quindi di un comando del bus pirate ma di un comando relativo al protocollo che stiamo analizzando, e quindi disponibile sul datasheet del dispositivo.

r:8 : il comando r serve per leggere un byte, mettendo i due punti dopo un comando si specifica al bus pirate che quel comando deve essere ripetuto per il numero di volte specificato dopo i due punti. Qui sto in pratica dicendo al bus pirate che mi deve leggere 8 bytes o, in altri termini, deve eseguire la lettura di un byte per 8 volte.

Il comando in sè, come l’ho scritto, non fa nient’altro che riflettere lo schema illustrato dal datasheet del dispositivo in questione:

Il Master invia il comando di reset Il Master invia il comando di lettura romcode e si mette quindi in attesa Lo Slave invia i dati richiesti, nel caso specifico, essendo il romcode costituito da 8 bytes, invierà 8 bytes di dati Il Master deve quindi eseguire la lettura degli 8 bytes

Premendo quindi invio il comando sarà eseguito:

DS18x20 Buspirate 5.gif

Come vedete il bus pirate risponde con un “READ 0X08 BYTES” seguito dai bytes che ha letto. Questo comando così come l’ho scritto, però, può essere abbreviato in quanto il BusPirate, per ogni protocollo, ha già disponibili una serie di Macro (insiemi di comandi) per eseguire le operazioni più comuni.

Adesso non mi venite a dire: allora perchè mi fai fare tutta questa fatica! Dovevo spiegarvi il metodo più faticoso per poter poi eseguire cose più complesse? O volete sempre le cose già belle e pronte? :D

Le macro vengono eseguite digitando un codice tra parentesi tonde, per cui ogni volta che incontrate un comando del genere: (x) si tratta di una macro, ovvero una sequenza di operazioni basilari. L’elenco delle macro disponibili, per ogni protocollo, viene ottenuto digitando (0) dalla modalità in cui vogliamo avere l’elenco. Nel caso del protocollo 1wire avremo:

DS18x20 Buspirate 6.gif

Come vediamo è disponibile una macro READ ROM, che guarda caso viene eseguita proprio con lo stesso numero utilizzato dal datasheet, ovvero 51 (o 0×33 in esadecimale). Possiamo quindi scrivere semplicemente:

   (51)


Per ottenere lo stesso risultato che abbiamo avuto in precedenza ma con una informazione aggiuntiva:

DS18x20 Buspirate 7.gif

Come vedete il bus pirate risponde dicendo che il reset della linea è andato a buon fine, dopodichè rileva un indirizzo e quindi subito dopo specifica di che tipo di dispositivo si tratta.

Se avete letto l’articolo precedente, sapete di cosa sto parlando

Bene… Dal datasheet della DS18S20, però, vedo che ci sono tanti altri comandi utili che però qui non sono implementati come macro. Questo è ovvio e ha un senso logico: il BusPirate ha le macro applicabili a qualsiasi dispositivo utilizzante tale protocollo, è ovvio quindi che ogni dispositivo in particolare, poi, avrà una serie di comandi associati alla sua specifica funzione.

Nel caso della DS18S20 che sto usando per questa prova, in particolare, c’è il comando per effettuare la lettura dello scratchpad (la memoria ram nella quale vengono memorizzati i dati). Supponendo di voler effettuare una lettura di temperatura, dal datasheet vedo che dovrei eseguire le seguenti operazioni:

  • Reset linea
  • Dal momento che ho un solo dispositivo 1wire sulla linea (e quindi posso evitare di selezionare il dispositivo con cui comunicare), posso inviare il comando Skip Rom (0xCC)
  • Invio quindi il comando Convert T (0×44) che permette alla sonda di avviare la conversione di temperatura e memorizzarne il valore nello scratchpad. La conversione può durare fino a 750mS, quindi se si effettua la lettura dello scratchpad troppo velocemente, potrebbe contenere dati non validi.
  • Nuovo reset linea
  • Nuovo invio comando Skip Rom (0xCC)
  • Invio il comando di lettura dello Scratchpad (0xBE)
  • La sonda mi risponderà inviando gli 8 bytes relativi al contenuto dello scratchpad
  • Devo quindi eseguire la lettura della linea

Sul bus pirate questi comandi possono essere eseguiti in questo modo:

 { 0xCC 0x44


Aspettiamo un po’ in quanto la conversione di temperatura, su questa sonda, richiede massimo 750mS. Questo ritardo è assolutamente importante!

Il ritardo può anche essere inserito da riga di comando utilizzando i comandi & (per ritardo di 1μS) e % (comando disponibile solo sull’ultima versione del firmware, ritardo espresso in millisecondi). Per eseguire ritardi lunghi si utilizzeranno quindi i due punti, esempio &:255 indurrà un ritardo di 255 microsecondi (è il massimo sulla mia revisione di firmware, mettete più ritardi uno dietro l’altro se avete bisogno di tempi più lunghi).

Eseguiamo quindi la lettura dello scratchpad che, come sappiamo, produrrà 9 bytes:

 { 0xCC 0xBE r:9


Il bus pirate risponderà di aver eseguito tutti i comandi e quindi restituirà la lettura dello scratchpad:

DS18x20 Buspirate 8.gif

Avendo a portata il datasheet possiamo ben interpretare quei bytes restituiti. In particolare sappiamo che sulla sonda DS18S20, il primo byte è la parte bassa del valore di temperatura e il secondo è la parte alta. In particolare i primi due bytes 0×31 0×00 indicano che la temperatura è di 24.5 °C.

Sulla DS18S20 la parte alta indica solo il segno, essendoci tutti 0 vuol dire che la temperatura è positiva. Nella parte bassa il byte 0 rappresenta il decimale (se è 1 dobbiamo aggiungere 0.5°C alla lettura). Togliendo il byte 0 effettuiamo uno shift a destra della restante parte per ottenere il valore intero e aggiungiamo eventualmente il mezzo grado se presente.

Original article by Giovanni Bernardo of www.settozero.com.