Premetto di non essere un grande programmatore.
Nel mio progetto ho unito due programmi trovati in rete per effettuare appunto contemporaneamente due mestieri differenti.
Il mio problema è nella gestione degli ADC, perchè originariamente il primo programma usa la lettura classica degli ADC, mentre il secondo sembra essere più sofisticata.
Detto questo c'è qualcuno che mi sappia descrivere il significato corretto di questa configurazione:
ADCSRA &= ~ bit(ADEN);
ADCSRB |= bit(ACME);
ADMUX = PORT - 1; // Port Vale 2
Con questo codice riesco a far lavorare correttamente Arduino uno sul A1, ma se in un'altra parte del programma volessi leggere A2 come posso fare?
analogRead su A2 mi da sempre 0.
Presumo che hai un Arduino UNO.
Quelli sono registri del Controller.
Informazioni trovi nel capitolo 22 e 23 del datasheet http://www.atmel.com/Images/doc8161.pdf
22.2 Analog Comparator Multiplexed Input
It is possible to select any of the ADC7..0 pins to replace the negative input to the Analog Comparator.
The ADC multiplexer is used to select this input, and consequently, the ADC must be
switched off to utilize this feature. If the Analog Comparator Multiplexer Enable bit (ACME in ADCSRB) is set and the ADC is switched off (ADEN in ADCSRA is zero), MUX2..0 in ADMUX
select the input pin to replace the negative input to the Analog Comparator, as shown in Table
22-1. If ACME is cleared or ADEN is set, AIN1 is applied to the negative input to the Analog
Comparator
Praticamente selezioni con le prime 2 righe che il ADC lavora come ADC e non come comparatore analogico. vedi anche 2.9.2
Con la terza riga selezioni sia il pin di entrata analogica che la fonte della tensione di riferimento che la rapppresentazione dei 10 bit misurati nel registro da 16 bit. vedi 23.9.1
Grazie UWE
PORT è stato dichiarato come #define PORT 2.
Non so cosa aveste in mente l'autore da cui ho pescato il codice.
Solo una curiosità, secondo te, partendo da questa configurazione iniziale con cui leggo correttamente il primo AD, come posso fare successivamente per andare a leggere l'AD3 in modalità classica 10bit per leggere sostanzialmente la tensione da 0 a 1023?
In sostanza vorrei:
Leggere l'AD A1 così come è stato indicato sopra
Commutare sul A3 e leggere la tensione applicata
Ritornare alla configurazione iniziale.
Ora mi metto a leggere le informazioni che mi hai passato.
Fino qui tutto regolare, se non facessi altro, ho il sw che acquisisce dati dall'AD1.
Poi seguendo la stessa filosofia cambio impostazioni in questo modo:
ADCSRA = 10000111
ADCSRB = 00000000
ADMUX = 01000011
I registri in questo modo fanno quello che si otterrebbe con una analogRead fatta sull'AD3.
Così facendo acquisisco correttamente.
Ma se successivamente reimposto la prima configurazione, ho dei problemi.
Volevo sapere, è possibile cambiare al volo queste configurazioni senza problemi di lettura sugli AD?
Se si allora devo investigare nel mio codice.
Ciao a tutti.
Non so perchè chi ha originariamente scritto il codice abbia scelto questa strada.
L'ad in questione viene impiegato per misurare un tempo di bit e poi per demodulare un segnale.
Comunque ho risolto il problema, aggirando l'ostacolo.
Sono riuscito a spostare il segnale da demodulare su un pin digitale con interrupt, così facendo posso impiegare la lettura standard analogRead() dei rimanti pin analogici.
In più ho aggiornato l'IDE che sul mio mac era vecchiotto.
Ora funziona egregiamente.