- Messaggi: 353
- Ringraziamenti ricevuti 8
×
MSP430, Microcontrollori 16 bit Ultra Low Power
Bit masking
11 Anni 8 Mesi fa #1
da elpablito
Bit masking è stato creato da elpablito
Questa volta sono in tilt il bit masking mi va stretto.
Quale è la semantica differenza tra le due istruzioni ?
TA0CTL = TASSEL_2 | MC_1;
TA0CTL = TASSEL_2 + MC_1;
Perchè il signore si permette di usare TACTL invece di TA0CTL ?
che così facendo mi manda in tilt.
Ringrazio
Paolo
Quale è la semantica differenza tra le due istruzioni ?
TA0CTL = TASSEL_2 | MC_1;
TA0CTL = TASSEL_2 + MC_1;
Perchè il signore si permette di usare TACTL invece di TA0CTL ?
che così facendo mi manda in tilt.
Ringrazio
Paolo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Autore della discussione
- Platinum Member
Riduci
Di più
11 Anni 8 Mesi fa #2
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Bit masking
non ho mai "giocato" con gli MSP430..però se vuoi sapere qual'è la differenza tra OR e PIU'...
01|01=01
facendo il più, si sommano i due valori, facendo l'or il bit risultate è...zero quando entrrambi sono zero e uno negli altri casi...
Se voglio mettere a 1 un bit di un certo registro, se sommassi 1..dovrei controllare prima che quel bit sia zero..altrimenti mi si modificherebbero gli altri bit, invece con l'or se è già a 1..rimane a 1.
Oppure ad esempio copio un valore di 4 bit in un registro da 8bit, e voglio porre gli altri 4bit a 1..per utilizzare il +, dovrei conoscere ogni singolo bit, se invece faccio OR 11110000, i 4 bit a sinistra risulteranno a 1 indipendentemente dai valori precedenti.
Ste
01+01 = 10Quale è la semantica differenza tra le due istruzioni ?
TA0CTL = TASSEL_2 | MC_1;
TA0CTL = TASSEL_2 + MC_1;
01|01=01
facendo il più, si sommano i due valori, facendo l'or il bit risultate è...zero quando entrrambi sono zero e uno negli altri casi...
Se voglio mettere a 1 un bit di un certo registro, se sommassi 1..dovrei controllare prima che quel bit sia zero..altrimenti mi si modificherebbero gli altri bit, invece con l'or se è già a 1..rimane a 1.
Oppure ad esempio copio un valore di 4 bit in un registro da 8bit, e voglio porre gli altri 4bit a 1..per utilizzare il +, dovrei conoscere ogni singolo bit, se invece faccio OR 11110000, i 4 bit a sinistra risulteranno a 1 indipendentemente dai valori precedenti.
questa non l'ho capita..ma forse perché non conosco gli MSP430...Perchè il signore si permette di usare TACTL invece di TA0CTL ?
che così facendo mi manda in tilt.
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
11 Anni 8 Mesi fa #3
da elpablito
Risposta da elpablito al topic Bit masking
Rispondo in parte io visto che sono in trasferta e giocando con un LaunchPad
Partiamo dalla risposta che conosco:
TACTL invece di TA0CTL
Perchè nell'Header file del G2553 sono definiti dei nomi alternativi per i registri del timerA
(forse perchè nel manualedella famiglia viene nominato come TACTL) è quindi indifferente
usare l'uno o l'altro
Che differenza faccia tra + o OR è nota però il Mauro usa
P1OUT = BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
certamente non per incrementare di uno per volta il registro
le due istruzioni citate (tratte da uno degli esempi di TI) hanno lo stesso effetto
sul registro TA0CTL (ho fatto il debug e verificato i valori del registro) di qui la domanda.
Sarebbe quindi equvalente scrivere
P1OUT = BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7;
perchè se è così ,abbisogno di uno spiegone.
Grazie e salutoni
Paolo
Partiamo dalla risposta che conosco:
TACTL invece di TA0CTL
Perchè nell'Header file del G2553 sono definiti dei nomi alternativi per i registri del timerA
(forse perchè nel manualedella famiglia viene nominato come TACTL) è quindi indifferente
usare l'uno o l'altro
Che differenza faccia tra + o OR è nota però il Mauro usa
P1OUT = BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
certamente non per incrementare di uno per volta il registro
le due istruzioni citate (tratte da uno degli esempi di TI) hanno lo stesso effetto
sul registro TA0CTL (ho fatto il debug e verificato i valori del registro) di qui la domanda.
Sarebbe quindi equvalente scrivere
P1OUT = BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7;
perchè se è così ,abbisogno di uno spiegone.
Grazie e salutoni
Paolo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
11 Anni 8 Mesi fa #4
da elpablito
Risposta da elpablito al topic Bit masking
Evidentemente sono andato a verificare
P1OUT = BIT0 + BIT1 + BIT2 + BIT3; // 0000 1111
P1OUT = BIT4 | BIT5 | BIT6 | BIT7; // 1111 0000
P1OUT = BIT2 + BIT3; // 0000 1100
P1OUT |= BIT0 + BIT1; // 0000 1111
P1OUT = BIT2 + BIT3; // 0000 1100
P1OUT |= BIT0 | BIT1; // 0000 1111
I valori del commento sono quelli di P1OUT durante il DEBUG.
Un commento
Grazie
Paolo
P1OUT = BIT0 + BIT1 + BIT2 + BIT3; // 0000 1111
P1OUT = BIT4 | BIT5 | BIT6 | BIT7; // 1111 0000
P1OUT = BIT2 + BIT3; // 0000 1100
P1OUT |= BIT0 + BIT1; // 0000 1111
P1OUT = BIT2 + BIT3; // 0000 1100
P1OUT |= BIT0 | BIT1; // 0000 1111
I valori del commento sono quelli di P1OUT durante il DEBUG.
Un commento
Grazie
Paolo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
11 Anni 8 Mesi fa #5
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Bit masking
Ciao,
alcune volte nomi diversi per lo stesso registro discendono da sole ragioni di compatibilità con versioni precedenti di Code Composer Studio o IAR.
In questo modo vecchi programmi o programmi scritti in ambiente IAR possono "girare" anche su Code Composer Studio.
Relativamente alla domanda
P1DIR = BIT1 + BIT2
e
P1DIR = BIT1 | BIT2;
il risultato e' lo stesso.
...ma c'e' una differenza da tenere a mente.
considerando che BIT1 vale 0000 0001 mentre BIT2 vale 0000 0010 facendo la somma si ottiene 0000 0011 mentre facendo l'OR si ha ancora 0000 0011.
Se pero' si dovesse fare un errore del tipo:
P1DIR = BIT1 + BIT1 + BIT2;
e
P1DIR = BIT1 | BIT1 | BIT2;
nel primo caso si ha 0000 0100 mentre nel secondo si ha ancora 0000 0011.
In entrambi i casi si hanno dei comportamenti anomali ma nel caso si includa due volte un bit (per esempio in un registro), facendo uso dell'OR si potrebbe essere immuni da una distrazione.
Saluti,
Mauro
alcune volte nomi diversi per lo stesso registro discendono da sole ragioni di compatibilità con versioni precedenti di Code Composer Studio o IAR.
In questo modo vecchi programmi o programmi scritti in ambiente IAR possono "girare" anche su Code Composer Studio.
Relativamente alla domanda
P1DIR = BIT1 + BIT2
e
P1DIR = BIT1 | BIT2;
il risultato e' lo stesso.
...ma c'e' una differenza da tenere a mente.
considerando che BIT1 vale 0000 0001 mentre BIT2 vale 0000 0010 facendo la somma si ottiene 0000 0011 mentre facendo l'OR si ha ancora 0000 0011.
Se pero' si dovesse fare un errore del tipo:
P1DIR = BIT1 + BIT1 + BIT2;
e
P1DIR = BIT1 | BIT1 | BIT2;
nel primo caso si ha 0000 0100 mentre nel secondo si ha ancora 0000 0011.
In entrambi i casi si hanno dei comportamenti anomali ma nel caso si includa due volte un bit (per esempio in un registro), facendo uso dell'OR si potrebbe essere immuni da una distrazione.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.