Salve,
c'è una questione che non riesco a comprendere. Sto usando lo sketch blink con qualche modifica per fare delle prove sui registri DDRB e PORTB per capirne il funzionamento. Ho letto il datasheet e sto applicando i concetti.
Sotto ho riportato un estratto dell'output monitor seriale; quello che non capisco è perchè quando faccio la lettura di tutti gli 8 bit della PORTB me li riporta tutti come "0" ( come fossero tutti LOW) mentre la PORTB0 ( PIN 8) è impostata HIGH; mentre la Serial.println(PORTB, BIN)
mi da correttamente "1".
Forse è un problema di sketch ma non riesco a capire il motivo
Grazie
byte A;
byte B;
void setup() {
pinMode(8, OUTPUT);
A=DDRB;
B=PORTB;
Serial.begin(9600);
}
void loop() {
Serial.println("leggo A ");
Serial.println(A, BIN);
delay(2000);
Serial.println("leggo DDRB valore ");
Serial.println(DDRB, BIN);
Serial.println("leggo PORTB valore iniziale");
Serial.println(PORTB, BIN);
digitalWrite(8, HIGH);
Serial.println("leggo PORTB valore con HIGH");
Serial.println(PORTB, BIN);
Serial.println("leggo DDRB uno per volta");
for(int i=0; i<8; i++) {
Serial.print(bitRead(A,i), BIN);
if(i<7){ //istruzione IF per tabulare i valori
Serial.print("/");}
else {Serial.println("");}
delay(2000);}
Serial.println("leggo PINB valore con HIGH ");
Serial.println(PINB, BIN);
delay(2000);
Serial.println("leggo PORTB uno per volta");
for(int i=0; i<8; i++) {
Serial.print(bitRead(B,i), BIN);
if(i<7){ //istruzione IF per tabulare i valori
Serial.print("/");}
else {Serial.println("");}
delay(2000);}
}
OUTPUT monitor seriale
leggo A
1
leggo DDRB valore
1
leggo PORTB valore iniziale
0
leggo PORTB valore con HIGH
1
leggo DDRB uno per volta
1/0/0/0/0/0/0/0
leggo PINB valore con HIGH
100001 leggo PORTB uno per volta 0/0/0/0/0/0/0/0
E' normale che si comporti così.
Tu assegni a B il valore di PORTB nel setup, poi nel loop cambi lo stato del pin (e di conseguenza PORTB):
digitalWrite(8, HIGH);
ma poi controlli il valore di B che contiene il valore che gli hai assegnato nel setup.
Non è che se assegni ad una variabile il valore di un altra (nel tuo caso assegni a B il valore contenuto in PORTB) allora questa poi ne segue i cambiamenti.
Se proprio vuoi continuare ad usare B devi riassegnare il valore ogni volta prima di farci sopra le indagini, ma è inutile e superfluo puoi usare direttamente PORTB