× MSP430, Microcontrollori 16 bit Ultra Low Power

HELP

10 Anni 10 Mesi fa #11 da elpablito
Risposta da elpablito al topic HELP
a Ste & Mauro

Ho scoperto come si fa anche se è vero che l'istruzione mi è chiara a metà.
Riepilogo:
con l'istruzione

ADC10SA = 0x200

l'ADC dell'MSP430 a partire dall'indirizzo 200 scrive i valori delle scansioni sulle varie porte in sequenza, o fino a 32 scansioni consecutive su una singola porta.

Il problema era come assegnare ad esempio il valore contenuto in 200 e 201 prima scansione ad una
variabile per poter poi fare altri conti.

Soluzione
unsigned int adc_val[2]; // perchè fa la scansione di 2 canali

...........
...........

ADC10SA = (unsigned int)&adc_val[0];

adc_val[0] é così eguale al contenuto di 200 e 201
adc_val[1] é così eguale al contenuto di 202 e 203

Non l'ho inventata io, l'ho ricostruita. La variabile originaria è diventata un vettore e il tutto funge ma, se qualcuno me la spiega si ringrazia.

Quesito due.
Se non è riservato di default (se usato) all'ADC un segmento di Ram per le scansioni multiple a partire da 0x200 (mi andrò a rileggere il manovale, ma non lo ricordo) chi glielo dice di partire dal 0x200 ? o si da il caso che il pezzo di RAM fosse libero ed è partito da li ?
Saluti
Paolo

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
10 Anni 10 Mesi fa #12 da elpablito
Risposta da elpablito al topic HELP
Sono ancora quì
Al secondo quesito mi rispondo da me. Dopo aver consultato la bibbia si deduce che le scansioni le ha rimesse allo stesso posto perché ha trovato la Ram disponibile.
Sto al solito scherzando, ma è il vero. Una volta definito il vettore di dove andrà a mettere le scansioni, gli è stata riservata un'area di RAM, e a questo punto potrebbe anche non interessarci dove andrà a posizionarsi nella RAM.

Resta la domanda al Mauro o a qualcuno più bravo di me, di spiegarmi la sintassi di questa istruzione che è la prima volta che la vedo e non la decifro. Ho solo capito che i dati finiscono nella variabile dopo & e il tutto deve essere una cabala per sistemare i tipi. Fare um & con un unsigned int tra parentesi, che non è nessuno, è un trucco.

ADC10SA = (unsigned int)&adc_val[0];

Saluti
Paolo

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
10 Anni 10 Mesi fa #13 da Mauro Laurenti
Risposta da Mauro Laurenti al topic HELP
Discussione attiva! :)

ADC10SA e' un registro a 16 bit per cui il buffer e' nei primi 64K di memoria...poco male visto che gli MSP430G2xx non hanno piu' di 64K di memoria.

L'indirizzo di partenza potrebbe essere scritto manualmente ma poter rileggere i valori dall'indirizzo scritto in questo modo potrebbe essere noioso.
Nulla di impossibile facendo uso di puntatori. Si applicano le regole dei puntatori del C senza pensare a trucchi di scrittura delle memorie (tipo EEPROM op Flash).

Nel caso specifico l'istruzione

ADC10SA = (unsigned int)&adc_val[0];

permette di avere un buffer e trattare lo stesso senza usare i puntatori ma un array precedentemente dichiarato.

&adc_val[0] rappresenta l'indirizzo di partenza della prima locazione dell'array, per cui Il data Transfer Controller usera' come buffer dove trasferire i dati proprio l'array.
(unsigned int) e' un casting per 16 bit. Mi aspetto che funzioni anche senza ma con possibili warnings.

Dovrebbe funzionare anche in questo modo

ADC10SA = (unsigned int) adc_val;

adc_val dovrebbe coincidere con &adc_val[0]

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
10 Anni 10 Mesi fa #14 da elpablito
Risposta da elpablito al topic HELP
ok Mauro
Andrò a leggere il casting (compito a casa). Il problema incontrato dal sottoscritto è che comunque
generavo in conflitto tra variabili e puntatori, se togli (unsigned int), già fatto, si genera un errore

Description Resource Path Location Type
#515 a value of type "unsigned int *" cannot be assigned to an entity of type "unsigned int"

è per questo che ero curioso di sapere il perchè (unsigned int)sistemava il conflitto

Saluti
Paolo

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
10 Anni 10 Mesi fa #15 da Mauro Laurenti
Risposta da Mauro Laurenti al topic HELP
Sospettavo una warning senza il casting.

Effettivamente quando scrivi

&adc_val[0] hai un indirizzo.

Formalmente per come e' organizzata la memoria e' certamente a 16 bit per cui potrebbe essere caricato nel registro ADC10SA. Il casting unsigned int aggiusta in maniera formale il tutto.
In particolare il valore del registro ADC10SA e' un unsigned int mentre l'indirizzo pur essendo a 16 bit non e' unsigned int.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login