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!!
programmazione c - shift
Moderatore:
Paolino
7 messaggi
• Pagina 1 di 1
0
voti
1
voti
Scrivendo
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
riconosci immediatamente quali bit sono attivati e quali no; inoltre, eventuali modifiche alla configurazione non richiedono ricalcoli.
Chissà se
TardoFreak conferma? 
- 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
It's a sin to write
instead of
(Anonimo).
...'cos you know that
ain't
, right?
You won't get a sexy tan if you write
in lieu of
.
Take a log for a fireplace, but don't take
for
arithm.
instead of
(Anonimo)....'cos you know that
ain't
, right?You won't get a sexy tan if you write
in lieu of
.Take a log for a fireplace, but don't take
for
arithm.-

DirtyDeeds
55,9k 7 11 13 - G.Master EY

- Messaggi: 7012
- Iscritto il: 13 apr 2010, 16:13
- Località: Somewhere in nowhere
3
voti
Come detto da
DirtyDeeds l'istruzione così come scritta da
TardoFreak è 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
Scrivere
ecc.
Una volta assegnati i valori ai singoli bit, mediante gli shift, questi vengono messi in or e quindi assegnato il risultato al registro.
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
Scrivere
- Codice: Seleziona tutto
1<<WGM12
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
0
voti
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 !
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 !
0
voti
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
se devo accenderlo userò un' istruzione del tipo
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
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.
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.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
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?
Fabio
0
voti
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".
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".
7 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 4 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

