Page 1 of 1

Programmazione in C

PostPosted: 22 Jun 2015, 14:15
by rob
Salve a tutti,
ho iniziato la tesi per la magistrale di ingegneria elettronica ma non ho una profonda conoscenza del C.
Vi volevo chiedere:
1)Cosa cambia tra: SPI_MCR_HALT_MASK 0x1u e SPI_MCR_HALT_SHIFT 0;
2)per scrivere un singolo bit si impiega la funzione BITBAND_REG ma per scrivere più bit...

Re: Programmazione in C

PostPosted: 22 Jun 2015, 14:49
by deluca
Ciao rob,
chi sei, che fai, che micro stai usando, che compilatore...... ecc ecc.....?
sei su freescale?


Ti consiglio di presentarti nella sezione dedicata.
Inoltre, spiegati meglio e se potremo, ci aiuterai ad aiutarti :)

Re: Programmazione in C

PostPosted: 22 Jun 2015, 16:16
by rob
Slave e grazie per la risposta,
mi chiamo Roberto, come vi dicevo sto concludento il percorso di studi in Ing. Provengoo dalla triennale di telecomunicazioni e anche nella specialistica ho scelto esami orientati alle telecomunicazioni come microonde, maxwell, antenne, segnali, ottica, ecc (tutta teoria).. Ma queste conoscenze non sono utili nel mondo del lavoro e quindi per concludere l'Univ. mi sono buttato su un progetto pratico di elettronica. Ho fatto un solo esame in C++ alla triennale.

Per iniziare devo interfacciare un micro l'MK10DN512ZVLL10 freescale con l'accellerometro LSM330DL tramite Kinetis Design Studio IDE.

Per settare un singolo bit uso la seguente istruzione e non ho problemi:
BITBAND_REG(PTE->PDDR, 18) = 1;
Però non riesco a settare più bit....ho scritto l'istruzione seguente e non funziona.
SPI0->SPI_MCR_DCONF_MASK=0b00u;
Quindi per iniziare vi volevo chiedere come faccio a scrivere più bit (relativa ad una certa maschera) in un registro del micro.
Poi ho molti altri dubbi...

Re: Programmazione in C

PostPosted: 22 Jun 2015, 16:57
by Leonardo
Ciao Roberto,

Cosa combini con un accelerometro e un ARM Cortex M4?

Ti consiglio di prendere confidenza con le operazioni a livello di bit ed il protocollo SPI prima di buttarti sul progetto.
Parti dalle cose più semplici, hai già preso confidenza coi GPIO (pin di I/O)?

Leonardo

Re: Programmazione in C

PostPosted: 22 Jun 2015, 18:14
by rob
Ciao Leonardo,
per il momento non ci combino niente.....ho letto l'SPI di entrambi e sono partito per fare il programmino.
Solo che mi segnala un casino di errori quando setto più bit contemporaneamente. Penso che l'istruzione che uso sia sbagliata. Dopo, dovrò revedere la logica di tutto ma adesso mi interessava partire con questo.
Ho scritto l'istruzione seguente e non funziona.
SPI0->SPI_MCR_DCONF_MASK=0b00u.............

Re: Programmazione in C

PostPosted: 22 Jun 2015, 19:21
by Leonardo
Parti con troppa fretta, non è così semplice programmare i microcontrollori, sopratutto la prima volta.

Ad ogni modo prova a chiederti (e riporta la risposta sul forum):
- Cosa ti aspetti che faccia tale istruzione?
- SPI0 cos'è? la porta SPI numero 0 è configurata?
- SPI_MCR_DCONF_MASK cos'è? Perché gli assegni il valore zero?

Re: Programmazione in C

PostPosted: 22 Jun 2015, 20:12
by rob
Ok, provo a spiegarti:
L'SPI (Serial Peripheral Interface) è il modulo che permette di configurare il bus per la comunicazione tra MCU e le periferiche. Questo modulo è composto da 56 registri di 32 bit. Per configurare l'SPI vado a settare i vari registri sulla base del datasheet di entrambi (il micro e la periferica in questo caso l'accelerometro lsm330dl). L'MCR è uno dei 56 registri disponibili.
Su vuoi questo è il link del datasheet del micro:
http://cache.freescale.com/files/32bit/ ... F2V2RM.pdf
L'MCR di cui sto parlando è a pag. 1140. Alla fine della pag. c'è una fig. che mostra i 32 bit da settare. Il campo DCONF è composto dai bit 28-29 e settandoli a 00 configuro il DSPI come SPI....ma come posso a scrive li?

Mi rendo conto che partire con un micro di questo tipo da 0 è un salto nel vuoto però è l'ultima occasione che ho per imparare....

Re: Programmazione in C

PostPosted: 22 Jun 2015, 21:21
by Leonardo
Ok, al momento hai un'idea di cosa sia SPI, con solo questo però andrai poco lontano..
Hai una vaga idea delle risposte alle domande di prima?

I registri generalmente sono visti semplicemente come "variabili" grazie a delle definizioni dell'ambiente di sviluppo o librerie fornite dal produttore del micro.

Facciamo un esempio: per impostare il valore 1 nel registro pippo generalmente basterà scrivere
Code: Select all
pippo = 1;


Mentre per leggerlo
Code: Select all
mia_variabile = pippo;


dove pippo è da qualche parte definito (es. in qualche libreria che richiami) come un l'indirizzo di memoria del registro (supponiamo ad 8 bit con locazione 0x123) con qualcosa di simile a

Code: Select all
#define PIPPO ((uint8_t) 0x123)


Questa naturalmente è una semplificazione, in realtà la definizione è più complicata, ma è tanto per rendere l'idea.

Ora veniamo alla tua domanda, senza utilizzare macro strane, se hai una variabile chiamata SPI0_MCR a 32 bit, es. di tipo uint32_t, come puoi fare a "pulire" i bit 28-29?

Code: Select all
SPI0_MCR = SPI0_MCR & 0xCFFFFFFF;


Tips: 0xCFFFFFFF in binario vale 1100 1111 1111 1111 1111 1111 1111 1111, prova a capire perché funziona.

Senza bruciare le tappe dovrai imparare a manipolare i bit vecchio stile prima di usare macro o funzioni black-box, prova a partire da qui: https://en.wikipedia.org/wiki/Bit_manipulation

Re: Programmazione in C

PostPosted: 22 Jun 2015, 22:46
by rob
Ok ok, faccio un AND e mi mette a 0 dove ho gli 0 cioè al 28 e 29...penso sia così...comunque prima dovrei inizializzare il registro mettendoci tutti 1 e poi fare le modifiche...adesso vedo

Re: Programmazione in C

PostPosted: 23 Jun 2015, 01:27
by Leonardo
Hai già visto il "Processor Expert" per configurare il modulo SPI?

Re: Programmazione in C

PostPosted: 23 Jun 2015, 17:13
by rob
no......
comunque ho messo:
Code: Select all
MCR = MCR & 0xCFFFFFF;

costruendo mi scrive:
[Multiple markers at this line
- each undeclared identifier is reported only once for each function it appears in
- 'MCR' undeclared (first use in this function)]
Ho pensato di inizializzare tutto il registro a 1 scrivendo e poi il setto i bit 28 e 29:
Code: Select all
MCR=0xFFFFFFFF;

Code: Select all
MCR = MCR & 0xCFFFFFF;

mi da sempre l'errore ma solo sulla prima riga....
[Multiple markers at this line
- 'MCR' undeclared (first use in this function)
- each undeclared identifier is reported only once for each function it appears in]
è come se non vedesse l'MCR...il file .h del MK10 è incluso...

Re: Programmazione in C

PostPosted: 23 Jun 2015, 20:05
by Leonardo
Ciao Roberto,

Sono sicuro che se avessimo domande sulla fisica delle antenne ci sapresti dimostrare formule chilometriche senza battere ciglio ma...

Ti consiglio caldamente di cercare un tutor o una persona interna al dipartimento che ti possa seguire nell'apprendere le basi della programmazione dei microcontrollori e che ti chiarisca prontamente anche i dubbi legati alla programmazione C, vedo come poco produttivo per te il forum in questa fase, per la natura asincrona del forum.

Non esiste nessun registro che si chiama solamente MCR ed il compilatore ti notifica infatti che l'identificatore non è dichiarato.

Re: Programmazione in C

PostPosted: 23 Jun 2015, 20:20
by rob
ok, hai ragione, per concludere mi puoi consigliare libri/manuali...

Re: Programmazione in C

PostPosted: 23 Jun 2015, 20:24
by Leonardo
Sui Freescale non ne conosco, un libro non sostituisce comunque un tutor preparato, ce ne vorrebbero a dozzine.
Se hai delle risorse umane all'interno dell'università, ti consiglio di sfruttarle.