Valore PORTB Arduino cambia durante esecuzione

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

byte A;
byte B;

void setup()
{
pinMode(8, OUTPUT);
A=DDRB;
B=PORTB;
Serial.begin(9600);

Serial.print("    A = DDRB = "); Serial.println(A, BIN);
Serial.print("       PORTB = "); Serial.println(PORTB, BIN);

digitalWrite(8, HIGH);

Serial.println("                    B0 = HIGH:");
Serial.println();

Serial.print("                  DDRB =        "); Serial.println(DDRB, BIN);
Serial.print(" DDRB un bit per volta = ");
for(int i=7; i>=0; i--)
  {
  Serial.print(bitRead(A,i));
  }
Serial.println(); Serial.println();
  
Serial.print("                 PORTB =        "); Serial.println(PORTB, BIN);
Serial.print("PORTB un bit per volta = ");
B=PORTB;
for(int i=7; i>=0; i--)
  {
  Serial.print(bitRead(B,i));
  }
Serial.println();
Serial.print("                  PINB =   "); Serial.println(PINB, BIN);
}

void loop()
{  
}
    A = DDRB = 1
       PORTB = 0
                    B0 = HIGH:

                  DDRB =        1
 DDRB un bit per volta = 00000001

                 PORTB =        1
PORTB un bit per volta = 00000001
                  PINB =   100001

Come detto ieri, PIN legge tutta la porta, mentre PORT legge solo i bit che sono stati impostati come uscita.

P.S.: i bit sono numerati da destra verso sinistra!

Grazie Datman,
ho visto la modifica al contatore i ( in detrazione) in questo modo si ottiene bit LSB a dx come è giusto che sia.

Giustissimo!! mi era sfuggito completamente

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.