Buongiorno a tutti.
Sto lavorando ad un pezzo di codice che mi dovrebbe permettere di valorizzare una variabile di tipo uint32_t (a mo di registro PINx)con lo stato di alcuni ingressi di un micro.
Alcuni di questi ingressi sono fisicamente sulle porte del micro, altri risiedono in un port expander i2c .
Ho deciso di andare ad assemblare il valore di quel registro effettuando operazioni di 'bitshift' e 'and' per formarne il valore :
uint8_t port_a;
uint8_t port_b;
uint8_t internal_inputs =((PINB & 0x06)>>1) + (((PIND & 0xf0)>>4)<< 2) + (((PINC & 0x0c)>>2)<< 6);
_mux.GetMuxStatus(&port_a,&port_b);
Serial.println(port_a);
Serial.println(port_b);
Serial.println(internal_inputs);
uint32_t current_bus = (port_a + (port_b <<8) + (internal_inputs << 12)& 0xfffff;
Serial.println( current_bus);
Con tutti i pin degli ingressi alti (pull'up esterni) ottengo correttamente i valori di port_a,port_b e internal_inputs.
Quando vado a variare lo stato di un ingresso di port_a o port_b , varia il suo valore relativo(port_a o port_b ovviamente) e varia il valore anche di current_bus.
Se invece vado a variare lo stato di un pin collegato direttamente al micro, varia correttamente internal_inputs , ma sorpresa delle sorprese current_bus non cambia.
E' un limite di architettura del micro o mi è sfuggito qualcosa?(l'operazione di shift su internal_inputs penso coinvolga 3 byte)
Grazie in anticipo.