comporre byte

Salve da questo codice:

byte1 = SPI.transfer(0x00);
byte2 = SPI.transfer(0x00);
byte3 = SPI.transfer(0x00);

ottengo tre byte da un ADC a 24 bit (ADS1252)

A questo punto come faccio ad ottenere un unico valore ?

che rappresenta il valore acquisito.

}

Prova a studiarti QUESTO più QUESTI e ... vediamo se ci arrivi da solo :wink:

Ovviamente dovrai dichiarare una variabile di tipo :

unsigned long miaVariabile;

... lunga 32 bit dove mettere i tuoi 24 :wink:

Guglielmo

grazie. Ho dato una lettura veloce.
Ho capito che:
i byte devono essere trasferiti su una nuova variabile di tipo long (32 bit).
il primo byte rappresenta i bit da 0 a 7
il secondo byte rappresenta i bit da 8 a 15
il terzo byte rappresenta i bita da 16 a 24
Il posizionamento dei bit nella nuova variabile lo eseguo attraverso gli operatori shift left o shift right.

quindi:

long var;

byte1 = SPI.transfer(0x00);
byte2 = SPI.transfer(0x00);
byte3 = SPI.transfer(0x00);

var |= byte1 ;
var <<= 8;
var |= byte2 ;
var <<= 8;
var |= byte3 ;

alla fine var contiene il valore unificato ?

Praticamente ho montato l'ADS1252 su un adattatore (la mia prima saldatura SMD)
Ho utilizzato pasta salda.

Domanda come faccio ad eliminare la pasta salda in eccesso ?
Basta utilizzare un normale solvente tipo acetone per le unghie e cotonfioc (o come si chiama)

Visto le immagini allegate:

il puntino di riferimento qual'è ?
Come faccio a capire i pin corretti ?

Edit: il riferimento è il cerchietto che somiglia alla c del copyright ?

pinout.JPG

Attento, come stai facendo tu (... ovvero partendo da byte1) ... te lo trovi tutto a sinistra (fai due volte lo shift) ... devi partire da quello che dovrà finire tutto a sinistra (byte3 - bit 23..16) poi proseguire con quello di mezzo (byte2 - 15..8) ed infine quello iniziale (byte1 - 7..0).

Inoltre, per evitare possibili guai ...

unsigned long var;

La pasta salda (flussante) in eccesso lo togli con un solvente ... esistono quelli specifici, va bene l'acetone (se ancora lo trovi) e ... ottimo, è il "tetracloruro di carbonio" ... che però difficilmente ti vendono data la tossicità :wink:

I pin li identifichi guardando il datasheet del componente ... a pag. 2. SI, il piccolo cerchio che vedi sul disegno, lo trovi anche sul componente.

Guglielmo

mi è venuto un dubbio. se devo collegare i tre adc allo stesso arduino come faccio ?

i pin sclk (pin 6) li collego al pin 13 arduino
i pin dout/drdy (pin 5) li collego al pin 12 arduino

per accedere al valore acquisito di ogni singolo adc devo utilizzare il pin clk (pin 4) collegando il pin di ogni singolo adc ad un pin diverso dell'arduino ?

Ma con che libreria li leggi ???
... perché NON mi sembra che quel chip abbia un'interfaccia standard ... mi sembra piuttosto che occorre un programma che deve aspettare il DRDY e a quel punto leggere dando un segnale di clock su SCLK e leggere i bit su DOUT ... :roll_eyes:

Guglielmo

... ho visto QUESTA discussione ... :roll_eyes:

Il chip è quindi in grado di parlare con la porta SPI con solo DUE fili ... dato che NON ha il CS, ma .. questo a te crea un bel problema, dato che ne vuoi gestire TRE !

I pin dell'SPI sono fissi e non li puoi cambiare (11, 12, 13) e ... senza il CS come disabiliti i chip non coinvolti ?

Vedo due soluzioni ...

  1. Ti scrivi tu una libreria che gestisce DUE pin qualsiasi (il protocollo che usa NON è difficile)

  2. Aggiungi dell'HW in modo da selezionare quale coppia DRDY/DOUT - SCLK è attiva (bastano degli switch elettronici)

Guglielmo

la seconda soluzione la escludo non ho idea di come si fa.

La prima potrei provare. Il punto di partenza è la libreria ufficiale SPI di arduino ?

Una terza soluzione potrebbe essere, tre arduino di cui due mini light 05, ognuno dei quali gestisce il proprio ADC. dopodichè i mini inviano il valore all'arduino master ? c'è da valutare le prestazioni e le velocità ?

Però prima provo la soluzione software. suggerimenti da dove partire ?

grazie

gcam:
Però prima provo la soluzione software. suggerimenti da dove partire ?

Io partirei a mente sgombra, senza pensare all'SPI dal datasheet ...
... è spiegato piuttosto bene come funziona, da pagina 9 in poi. Guarda anche gli schemi di Fig. 12 e seguenti.

Si tratta di aspettare che i dati siano pronti (DRDY = LOW) quindi fornirgli un clock (un segnale LOW - HIGH - LOW con una certa tempistica) su SCLK e, in corrispondenza, leggere i dati su DOUT (stesso pin di DRDY). Non mi sembra una cosa così impossibile :wink:

Guglielmo

gcam:
la seconda soluzione la escludo non ho idea di come si fa.

Non la scartare ... cerca "digital multiplexer" e vedrai che ci sono tantissimi chip in cui dai un indirizzo e colleghi le entrare selezionate con le uscite fisse :wink:

Guglielmo

gpb01:
Ma con che libreria li leggi ???
... perché NON mi sembra che quel chip abbia un'interfaccia standard ... mi sembra piuttosto che occorre un programma che deve aspettare il DRDY e a quel punto leggere dando un segnale di clock su SCLK e leggere i bit su DOUT ... :roll_eyes:

Guglielmo

sono partito da questo link: ADS1252: Tutorial on High precision (24-bit) ADC - Sensors - Arduino Forum
che coincide con il tuo link. Devo dire che ancora non ho provato a collegarli ed utilizzarli.

ritornando alla soluzione hardware: basta collegare i pin dell'adc (DRDY/DOUT - SCLK) a due ingressi del multiplexer e poi selezionare da arduino a quali canali accedere e quindi a quale adc accedere ?

SI, ma occhio che un pin e in ingresso ed uno in uscita ... quindi uno in un verso ed uno nell'altro ... mi sa che ti servono DUE multiplexer o ... dei "digital switch" (veri interruttori digitali pilotati come un mux). Prova a cercare su Google :wink:

Guglielmo

P.S. : Prova a guardare QUI ... o qualche cosa di simile :wink: