pilotaggio ADC7680
- Login o registrati per inviare commenti
Salve a tutti,
sono alle prese con il pilotaggio di un ADC - l'AD7680, dalla lettura del datasheet ho capito (almeno credo) che per effettuare una lettura ci vogliono 20 cicli di clock....insomma per farvela breve avevo pensato di scrivere un codice di questo tipo (lo riporto qui sotto) per potermi interfacciare (bitbanging)... oppure c'è qualcosa di più "pulito" che posso utilizzare? che cosa ne pensate?
saluti e grazie
Codice funzione di lettura dall'ADC
unsigned short LeggiADC()
{
unsigned short app;
app=0u;
//Abilitiamo l'ADC
SPI_SS_ADC_ON
//i primi 4 bit in uscita sono tutti zero --- Rif. Datasheet
SPI2_SCKw=0; SPI2_SCKw=1;
SPI2_SCKw=0; SPI2_SCKw=1;
SPI2_SCKw=0; SPI2_SCKw=1;
SPI2_SCKw=0; SPI2_SCKw=1;
//pilotiamo il clock e scriviamo i 16 utili
//MSB First
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x8000;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x4000;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x2000;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x1000;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x800;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x400;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x200;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x100;
//LSB
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x80;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x40;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x20;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x10;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x08;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x04;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x02;
SPI2_SCKw=0; SPI2_SCKw=1; app|=0x01;
//Chiudiamo il sensore
SPI_SS_ADC_OFF
return app;
}
Grazie per le tue osservazioni...per quanto riguarda app è per l'appunto una inzializzazione...perchè dici che è sbagliato?
un saluto
No no, non volevo dire che è sbagliato ma solo capire...
Dunque, la funzione che tu stai scrivendo restituisce app che immagino poi userai nel main assegnando il suo valore ad una variabile.
La mia domanda è: ti è più utile avere una variabile locale o non ti sarebbe più comoda una variabile globale da passare alla funzione per assegnarle un valore nello scope?
Certo, si tratta di una domanda fatta da uno che il tuo codice non lo conosce proprio se non per questa funzione ma era pura curiosità, non una critica :)
Ciao,
premetto che non sono un firmwarista (..l'avrai capito :-) ) so per esperienza che e' meglio non utilizzare variabili globali...sia per questioni di leggibilita' del codice ma anche perche' con le variabili globali e' molto facile incorrere in errori...questo codice fa parte di un codice molto piu' complesso.....non fatto da me tranne che per alcune funzionalita'.....
un saluto
g.
Ah ok, se ti devi "inserire" in un codice non tuo allora si :)
Perchè onestamente io cerco di utilizzare, quando possibile, variabili globali per via del fatto che trovo comodo preallocare tutto in memoria ed utilizzare all'occorrenza variabili che non cambino nome e che rischiano di sporcare il codice...
Con questa politica anche riprendere in mano un vecchio programma diventa molto semplice.
Però è sempre una questione di scelte e, forse, anche di abitudine :D
Non vedo ritardi tra l'alzare e abbassare il clock...
Io ci metterei una: delay(T_clk) tra le due funzioni..
- Login o registrati per inviare commenti


















6 ore 45 min fa
Sul discorso dei cicli di clock hai capito bene: ne servono 20 per avere un dato valido.
Infatti dice esplicitamente: "A minimum of 20 serial clock cycles are required to perform the conversion process and to access data from the AD7680".
Per quanto riguarda il codice mi sembra abbastanza pulito ma non ho capito l'inizializzazione di app...