Arduino DUE: ADC

considerando il seguente codice

ADC->ADC_WPMR &= ~(1<<ADC_WPMR_WPEN);
ADC->ADC_CGR |= (1 << 0); // gain 4 channel 0
ADC->ADC_CGR |= (1 << 1);
ADC->ADC_CGR |= (1 << 2); // gain 4 channel 1
ADC->ADC_CGR |= (1 << 3);
ADC->ADC_CGR |= (1 << 4); // gain 4 channel 2
ADC->ADC_CGR |= (1 << 5);
ADC->ADC_WPMR |= (1 <<ADC_WPMR_WPEN);

il gain =4 viene impostato per tutti i canali analogici e non solo per 0,1,2
perchè ?
cosa c’è di sbagliato ?
oppure è normale ?

mentre il codice seguente

ADC->ADC_WPMR &= ~(1<<ADC_WPMR_WPEN);
ADC->ADC_CGR |= (1 << 0); // gain 2 channel 0
ADC->ADC_CGR &= ~(1 << 1)
ADC->ADC_CGR |= (1 << 2); // gain 2 channel 1
ADC->ADC_CGR &= ~(1 << 3)
ADC->ADC_CGR |= (1 << 4); // gain 2 channel 2
ADC->ADC_CGR &= ~(1 << 5)
ADC->ADC_WPMR |= (1 <<ADC_WPMR_WPEN);

mi da errore

cosa c’è di sbagliato ?

gcam

Nel secondo mancano diversi punti e virgola.
Sul perché imposti i gain di tutti i canali a 4x non so, forse perché non esegui l’operazione correttamente. Quando attivi il bit per poter modificare il registro, devi eseguire l’operazione entro un certo numero di clock. Spezzettare tutto su più righe può causare il problema. Usa o una maschera a bit oppure prepara prima la variabile da passare al registro.

Esempio 1:

ADC->ADC_WPMR &= ~(1<<ADC_WPMR_WPEN);
ADC->ADC_CGR = 0b00000000000000000000000000111111; //i primi 6 bit

Esempio 2:

unsigned long tempVar = ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5));
ADC->ADC_WPMR &= ~(1<<ADC_WPMR_WPEN);
ADC->ADC_CGR = tempVar;

Ah, altra cosa: non devi rimettere ad 1 il bit WPMR_WPEN. Lo fa in automatico il chip dopo che ha modificato il registro.

Salve ragazzi, complimenti per il post. Anche se è vecchiotto mi è stato molto utile. Premetto che sono nuovo, ho esperienza nella programmazione a baso livello solo con controllori Microchip e devo settare l'ADC del mio Arduino due al massimo delle sue prestazioni. C'è pertanto oltre ai forum una guida o qualcosa dove posso studiare le varie istruzioni e la sintassi su come programmare a basso livello con i registri del SEM3 e integrare ci che c'è già postato qui? C'è qualche application note dell'ADC per portarlo a 1Msps?

EmilianoDG: C'è pertanto oltre ai forum una guida o qualcosa dove posso studiare le varie istruzioni e la sintassi su come programmare a basso livello con i registri del SEM3 e integrare ci che c'è già postato qui? C'è qualche application note dell'ADC per portarlo a 1Msps?

Ho idea che devi fare riferimento al sito della Atmel ... il datasheet si trova QUI (... ADC da pagina 1329 in poi) e cercando sul loro sito forse trovi delle Application Notes per la MCU SAM3X8E.

QUESTA la pagina dei documenti relativi a quella MCU e QUESTE delle note relative al ADC.

Guglielmo

gpb01:

EmilianoDG: C'è pertanto oltre ai forum una guida o qualcosa dove posso studiare le varie istruzioni e la sintassi su come programmare a basso livello con i registri del SEM3 e integrare ci che c'è già postato qui? C'è qualche application note dell'ADC per portarlo a 1Msps?

Grazie Guglielmo per i link. Il datasheet lo avevo già scaricato. sto studiando proprio dal sito atmel Più che altro intendevo qualcosa dove posso vedere la sintassi da usare e come strutturare il codice all'interno dell'IDE arduino per andare a settare i registri. Ad esempio ho trovato in rete(http://www.djerickson.com/arduino/) una porzione di codice che usa "REG_nomeregistro" per andare a leggere e scrivere il registro ADC_MR:

unsigned long reg; reg = REG_ADC_MR; Serial.print("REG_ADC_MR = "); Serial.println(reg, HEX);

ed:

REG_ADC_MR = (REG_ADC_MR & 0xFFF0FFFF) | 0x00020000;

quello che cercavo è una documentazione sulla sintassi che il compilatore usa. Dov'è che è documentato "REG_"?

All'interno del codice Arduino i registri di configurazione immagino vado a settarli in Setup()?

Grazie ;)

Purtroppo NON credo siano documentati ... =(

Ti devi studiare il il core di Arduino e le librerie ATMEL al contorno e ... trovi tutto !

Vai nella cartella del IDE che hai su disco e, ad esempio, quello che tu cerchi è definito in questo file :

/hardware/arduino/sam/system/CMSIS/Device/ATMEL/sam3u/include/instance/instance_adc.h

... poi guarda quanti ce ne sono in quella cartella e ... mettiti a piangere !!!

Guglielmo

EDIT : Non per nulla io sconsiglio sempre la DUE alla gente che non è del mestiere, perché : 1. Arduino DUE è molto poco supportato e pochissime librerie di terze parti sono state convertite per funzionarci. 2. Molti pochi shield sono fatti per funzionare su Arduino DUE. 3. La scheda funziona esclusivamente a 3.3V e molti dei suoi pin sono in grado di dare un decimo della corrente (max 3 mA) dei pin degli altri Arduino (max 40 mA). I rimanenti comunque non danno più di 15 mA. 4. E' sicuramente un processore molto più complesso da utilizzare. Basta guardare le oltre 1400 pagine di cui è composto il datasheet 5. Difficilmente vedrà ulteriori sviluppi dato che ... ora c'è da dedicarsi alle nuove schede.

Grazie ancora Guglielmo, in questo post del forum hai risolto gran parte dei miei dubbi. Ho comprato la Due sapendo bene cosa stessi comprando. Ora no mi resta che studiare l'atmel del quale conosco ben poco avendo sempre progettato con DSPIC. Più che altro mi era venuto il dubbio che l'IDE di arduino fosse limitato alle Reference ma poi ho visto che è possibile andare a modificare i registri del controllore.

Grazie

EmilianoDG: Ho comprato la Due sapendo bene cosa stessi comprando. Ora non mi resta che studiare l'atmel del quale conosco ben poco avendo sempre progettato con DSPIC.

Bene quindi ... "sei del mestiere" ... XD

Buono studio allora ;)

Guglielmo