Corso Atmega 2560 - PORTB |= (1

1 Anno 3 Settimane fa - 1 Anno 2 Settimane fa #1 da raffaele
Corso Atmega 2560 - PORTB |= (1 è stato creato da raffaele
Salve, qualcuno potrebbe spiegarmi come funziona l operatore bitwise in questo caso?
PORTB |= (1<<PORTB7)
quel che non capisco e' questo, l operatore shift a sx, sposta il valore 1 a sx di portb7 posizioni? l operando di dx non deve essere solo un numero? cosa centrano le lettere ?
Grazie
Ultima Modifica 1 Anno 2 Settimane fa da raffaele. Motivo: non mi son espresso chiaramente

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

  • raffaele
  • New Member
  • New Member
Di più
1 Anno 1 Settimana fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Corso Atmega 2560 - PORTB |= (1
Salve,

in particolare l'espressione PORTB |= (1<<PORTB7) la puoi riscrivere come:

PORTB = PORTB | (1<<PORTB7)

Quindi fa un OR tra il valore di PORTB e (1<<PORTB7) e il risultato lo scrive poi in PORTB
Fare un OR in generale serve per portare ad 1 un bit specifico. Un OR non porta mai a 0 un bit.
In questo secondo caso uno deve usare l'operatore AND.

Tornando al punto, il valore con cui viene fatto l'OR è (1<<PORTB7) ovvero 1, 00000001 spostato a sinistra il numero di volte definito dalla costante PORTB7 che presumo abbia il valore 7 al fine di ottenere 10000000 (0x80) dopo aver eseguito lo shift di 00000001. Questo permette di cambiare il bit bit 7 facendo l'OR tra PORTB e 10000000 . Il bit viene portato a 1 se vale 0, mentre rimane di valore 1 se vale 1. Gli altri bit della PORTB non sono cambiati visto che si fa l'OR tra il valore del bit e 0, per cui rimane sempre il valore del bit.

Saluti,

Mauro

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

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
1 Anno 1 Settimana fa #3 da raffaele
Risposta da raffaele al topic Corso Atmega 2560 - PORTB |= (1
Salve Mauro, grazie che qualcuno ha risposto....
risposta che non lascia dubbi sull' uso dell' operatore <<
Una cosa non ancora chiara, concentrandosi sull' operando di destra, 7 indica il numero di volte che viene spostato il bit, ma la parte letteraria cosa centra? Non bastava scrivere 7 ? La parte letteraria serve solo per rendere piu' chiara la lettura del codice? Il compilatore considera solo il numero e non considera la parte lettere? Si puo' scrivere quel che si vuole?

Grazie

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

  • raffaele
  • New Member
  • New Member
Di più
1 Anno 1 Settimana fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Corso Atmega 2560 - PORTB |= (1
Salve Raffaele,

l'espressione PORTB = PORTB | (1<<PORTB7)

si poteva scrivere direttamente PORTB = PORTB | 0b10000000;

oppure PORTB = PORTB | (1<<7);

In ogni modo non sono un grande utilizzatore di questo formato.
Il fatto di definire PORTB7 come 7, permette di utilizzarlo in altre operazioni simili anche con AND, per indicare il bit 7. Infatti 7 non indica il valore assoluto del bit visto che si scrive 0000 0111, quindi non si fa un AND o OR con tale valore. Il valore 7 indica il numero del bit e relativi shift per accedere al bit.

Se usi l'operatore AND per porre a 0 il bit 7, puoi scrivere:

PORTB &= ~ (1<< PORTB7);

Quindi "intercetti" il bit 7 usando sempre PORTB7 allo stesso modo.
Se usassi un valore diretto della maschera, avresti dovuto usare il valore 0111 1111 , senza usare la tilde per invertire.

Questo approccio è usato con i compilatori che non forniscono l'opzione diretta di accesso ai registri come XC8, in cui scrivi:

PORTBbit.RB7 = 1;

MSP430 e ATMEGA fanno uso spesso dello shift, o delle maschere.

Probabilmente l'uso delle maschere è comunque quello che si può usare sempre, ma usando lo shift si complica la lettura, rispetto all'utilizzo di una maschera diretta. Facendo uso di maschere dirette, in base all'operatore dovresti definire per il bit 7:

1000 0000
0111 1111

Per cui due maschere diverse.

Saluti,

Mauro
Ringraziano per il messaggio: raffaele

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

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
1 Anno 1 Settimana fa #5 da raffaele
Risposta da raffaele al topic Corso Atmega 2560 - PORTB |= (1
Ora e' tutto chiaro grazie.

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

  • raffaele
  • New Member
  • New Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

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

Registrati al sito LaurTec.

Login