Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

programmazione c - shift

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] programmazione c - shift

Messaggioda Foto Utentefaberebaf » 4 nov 2011, 20:12

Salute a tutti !
Sto studiando il linguaggio C utilizzando un manuale e la lettura di sorgenti (scritti da quelli bravi), cercando di capire cosa e come esegue il lavoro un programma.
Era tutto abbastanza chiaro fino a quando non ho incontrato questa istruzione :

// Avvia il timer1, prescaler 1/64 modo operativo Clear Top Count
TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10)

Verificando, attraverso il datasheet ed il commento, il valore di TCCR1B dovrebbe essere :
TCCR1B = 00001011
perché TardoFreak non ha usato questa istruzione :
TCCR1B = 0x0B
Probabilmente per non modificare il valore di bit non coivolti nell'elaborazione ?
Da quello che ho capito, gli operatori << e >> servono a far scorrere i bit verso sinistra o destra di n posizioni.
Sintassi :
Vittima dello shift - direzione – numero di spostamenti

Mi piacerebbe riuscire a decriptare l'istruzione anche perché mi resta una sola pastiglia per il mal di testa !

Grazie!!
Avatar utente
Foto Utentefaberebaf
66 3
New entry
New entry
 
Messaggi: 79
Iscritto il: 4 nov 2007, 19:51

1
voti

[2] Re: programmazione c - shift

Messaggioda Foto UtenteDirtyDeeds » 4 nov 2011, 21:10

Scrivendo

Codice: Seleziona tutto
TCCR1B = 0x0B


non ti ricorderesti mai qual è la configurazione attivata e, in più, se dovessi modificare qualcosa dovresti ricalcolare il valore da assegnare a TCCR1B.

Scrivendo invece

Codice: Seleziona tutto
TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10)


riconosci immediatamente quali bit sono attivati e quali no; inoltre, eventuali modifiche alla configurazione non richiedono ricalcoli.

Chissà se Foto UtenteTardoFreak conferma? :-)
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

3
voti

[3] Re: programmazione c - shift

Messaggioda Foto Utentec1b8 » 4 nov 2011, 22:48

Come detto da Foto UtenteDirtyDeeds l'istruzione così come scritta da Foto UtenteTardoFreak è più "mnemonica", quindi facile da interpretare e da modificare.
Provo a spiegarla se, come mi pare di capire, non ti è chiara.
L'istruzione assegna un valore al registro TCCR1B e per calcolare questo valore utilizza delle OR, identificate dal simbolo |.
I valori in OR tra loro sono calcolati internamente alle varie parentesi e rappresentano il valore di un singolo bit, quale Bit?
Se guandi il datasheet di un micro Atmel vedrai che il registro TCCR1B ha i bit nominati nel modo seguente:
- bit 4 -> WGM13
- bit 3 -> WGM12
- bit 2 -> CS12
- bit1 -> CS11
- bit0 -> CS10

Scrivere
Codice: Seleziona tutto
0<<WGM13
significa spostare il valore 0 nel bit 4.
Scrivere
Codice: Seleziona tutto
1<<WGM12
significa spostare il valore 1 nel bit 3.
ecc.
Una volta assegnati i valori ai singoli bit, mediante gli shift, questi vengono messi in or e quindi assegnato il risultato al registro.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[4] Re: programmazione c - shift

Messaggioda Foto Utentefaberebaf » 5 nov 2011, 1:29

Innanzi tutto grazie DirtyDeeds e c1b8 per le risposte.

Vediamo se ho capito bene:

ipotizzando di cambiare solo VGM12
VGM12 ha valore 4 quindi
1 in binario vale 00000001
spostando di 4 posizioni diventa 00001000

TCCR1B inizialmente vale 00000000

TCCR1B |= (1<<VGM12)
semplificando
TCCR1B = 00000000 | 00001000
or “|” è l'unico operatore su bit che garantisce il valore che si desidera cioè 1 nella posizione 4.
quindi TCCR1B vale 00001000

E' corretto ? (ditemi di si, anche mentendo !)
Ps : la scatole delle pastiglie è vuota !
Avatar utente
Foto Utentefaberebaf
66 3
New entry
New entry
 
Messaggi: 79
Iscritto il: 4 nov 2007, 19:51

0
voti

[5] Re: programmazione c - shift

Messaggioda Foto UtenteTardoFreak » 5 nov 2011, 1:48

Ci sono diversi modi per scrivere la stessa cosa, in questo caso un' istruzione per settare/resettare bit in un registro di un microcontrollore ma di solito ci si adatta a seguire lo stile di chi ha scritto i files che definiscono tali registri e/o le librerie.
In questo caso specifico chi ha scritto i files di definizione ha deciso di definire ogni singolo bit di un registro tramite la sua posizione. Per esempio se definisco un bit tramite la posizione
Codice: Seleziona tutto
#define BIT_QUATTRO 4

se devo accenderlo userò un' istruzione del tipo
Codice: Seleziona tutto
registro |= 1<<BIT_QUATTRO;

Nota: si presume che il compilatore faccia quello che deve fare e cioè riconoscere che l' operazione di shift la può fare a livello di preprocessore e quindi di trasformarla in una semplice assegnazione senza far fare l' operazione al micro.
I files di definizione dei registri e dei bit di ogni registro degli AVR usano questo stile. Microchip invece ha scritto i files di definizione con delle strutture dove ogni bit viene indicato come un campo del registro, quindi per settare il bit 4 del registro di uscita della porta A si userà questa convenzione
Codice: Seleziona tutto
LATA.LATA4 = 1

Dipende da chi scrive i files di definizione e da come li scrive.
Quindi se è vero che ognuno ha il suo stile preferito (io preferisco utilizzare le strutture ed identificare i bits tramite il campo, mi piace di più) è anche vero che è buona cosa adattarsi ad utilizzare lo stile di chi ha scritto le definizioni. E queste variano da micro a micro.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[6] Re: programmazione c - shift

Messaggioda Foto Utentec1b8 » 5 nov 2011, 10:35

faberebaf ha scritto:E' corretto ?

Perfetto. E senza mentire!

TardoFreak ha scritto:(io preferisco utilizzare le strutture ed identificare i bits tramite il campo, mi piace di più)

Anch'io, trovo più corretto/semplice da ricordare fare riferimento ad un bit di un registro nel suo complesso (REGISTRO.BIT) e non dare nomi univoci ad ogni bit... chi se li ricorda poi tutti? :D
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[7] Re: programmazione c - shift

Messaggioda Foto Utentefaberebaf » 5 nov 2011, 11:48

E' un gran sollievo !

Grazie a tutti !

Caro TardoFreak, l'equivoco è nato dalla convinzione che, per esempio, VGM12 fosse di un solo bit (dal datascheet sembrerebbe questo) e quindi era dura che potesse contenere il valore 4.

Da questo si deduce :
1 - la stretta correlazione tra linguaggio e caratteristiche dei micro (l'avevo letto ma ora ho toccato con mano).
2 - che sono ancora una “capra” e che il cammino è ancora lungo maaa …
3 - che è bello sapere di poter contare su di Voi.

Grazie di nuovo a tutti ed alla prossima "caprata".
Avatar utente
Foto Utentefaberebaf
66 3
New entry
New entry
 
Messaggi: 79
Iscritto il: 4 nov 2007, 19:51


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti