Problema com BITREAD

Ho un problema con bitRead.
Se eseguo bitRead passando nel serial monitor la lettera 'A', in modo che la funzione diventa così bitRead('A', 0), ottengo giustamente il valore 1, perchè il valore ASCII di 'A' è 1000001 e la prima posizione è 1.
Tutto è ok.
I problemi nascono quando io cerco di eseguire bitRead dopo tutte le altre funzioni.
Nel mio codice, bitRead ritorna sempre zero e non capisco perchè.
Sembra che la variabile 'Valbit' viene in qualche modo 'sporcata' dalle funzioni precedenti, e il risultato finale è sempre 0.
Il problema non si verifica quando eseguo bitRead da sola, senza le altre funzioni precedenti.
Perchè è così?
Grazie a tutti per l'aiuto.

char Valbit;
void setup()
{
  Serial.begin(9600);

}
void loop()
{
  if (Serial.available()>0){

    Valbit=Serial.read();

    Serial.print("VALUE=    ");
    Serial.print(Valbit);

    Serial.print(" DECIMAL VAL=      ");
    Serial.print(Valbit,DEC);
    
    Serial.print(" BINARY VAL=      ");
    Serial.println(Valbit,BIN);


//bitSet(Valbit, 1); Sets (writes a 1 to) the given bitPositionof variable x
    byte bitset=bitSet(Valbit, 0);
  
    Serial.print("bitSet=   ");
    Serial.write(bitset);

    Serial.print(" DECIMAL bitSet=   ");
    Serial.print(bitset,DEC);

    Serial.print(" BINARY bitSet=   ");
    Serial.println(bitset,BIN);


//bitClear(x, bitPosition); Clears (writes a 0 to) the given bitPosition of variable x
    byte bitclear=bitClear(Valbit, 0);

    Serial.print("bitClear= ");
    Serial.write(bitclear);

    Serial.print(" DECIMAL bitClear= ");
    Serial.print(bitclear,DEC);

    Serial.print(" BINARY bitClear= ");
    Serial.println(bitclear,BIN);

//bitWrite(x, bitPosition, value) Sets the given value (as 0 or 1) of the bit at the given bitPositionof variable x

    byte bitwrite=bitWrite(Valbit, 4,0);

    Serial.print("bitWrite= ");
    Serial.write(bitwrite);

    Serial.print(" DECIMAL bitwrite= ");
    Serial.print(bitwrite,DEC);

    Serial.print(" BINARY bitwrite= ");
    Serial.println(bitwrite,BIN);


//bitRead(x, bitPosition); Returns the value (as 0 or 1) of the bit at the given bitPositionof variable x

    int bitread=bitRead(Valbit, 0);

    Serial.print("bitRead= ");
    Serial.println(bitread);
  }
 
}

Cosa pensi che faccia la funzione "bitClear(Valbit, 0);" ?
http://arduino.cc/en/Reference/BitClear

cancella il bit 0 della variabile "Valbit" e poi metti il risultato nella variabile "bitclear".

Percui il comportamento da te descritto é giusto.

Ciao Uwe

Come detto da @uwe, l'ultima operazione che fai prima della ultima bitRead() è

byte bitwrite=bitWrite(Valbit, 4,0);

Cioè metti a 0 il 4 bit. (ovvero il bit 5° come detto da @uwe)
Quindi il bit 0 non lo tocchi ed è zero perchè è la precedente bitClear() che ha azzerato quel bit.

Per completare l'informazione inserisco il codice delle macro presente in Arduino.h

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

BitWrite può essere utilizzata senza assegnamento poiché il valore restituito è la semplice conferma dell'operatore ternario (true o false) deciso dal valore di bitvalue. Non indica la posizione del bit modificato.

Grazie a tutti!
Ho capito l'errore! :slight_smile: :smiley:
Stupidamente pensavo che il valore si modificasse solo nelle variabili d'appoggio e che Valbit rimanesse sempre pulita. :roll_eyes:
Non avevo considerato che Valbit viene modificata dalle funzioni, e poi viene assegnata alle variabili. :astonished:
Avevo immaginato che le variabili d'appoggio contenessero il valore di Valbit modificato, mentre il valore originale di Valbit rimanesse integro.
Hehehe.. che errore stupido. :wink:
Grazie ancora! :wink: