Manipulación de registro del microcontrolador AVR
Estoy empezando. Ten un poco de paciencia con mis preguntas.
Me encontré con una lista de un programa donde aparece la siguiente declaración:
DDRB &= ~((1 << DDB0) | (1 << DDB1) | (1 << DDB2));
Mi suposición:
Considerando que al inicio el microcontrolador tiene por defecto todos los bits DDRB establecidos en 0, obtengo:
DDRB & = ~ ((1 << 0) | (1 << 0) | (1 << 0)); ===>> DDRB & = ~ ((1) | (1) | (1));
Lo cual es diferente al comentario del autor. ¿Dónde me equivoco?
2da pregunta: recital
volatile uint8_t portbhistory = 0xFF;
changedbits = PINB ^ portbhistory;
La segunda declaración no es igual a:
changedbits = ~ PINB;
¿Qué cambia? Gracias a aquellos que quieran responderme.
davy.ai
El propósito de esta declaración es borrar los primeros tres bits (DDB0, DDB1 y DDB2) del registro DDRB. Se utiliza el operador AND a nivel de bits (&) para realizar la operación.
Tu suposición no es correcta. La expresión (1 << DDB0) significa desplazar a la izquierda el valor 1 por el número de bits especificado por la macro DDB0. Por ejemplo, si DDB0 se define como 2, entonces (1 << DDB0) sería equivalente a 0b00000100. Por lo tanto, en este caso, la declaración borraría los primeros tres bits de DDRB, lo que significa establecerlos en 0.
Recital
La segunda declaración:
realiza una operación XOR entre PINB y portbhistory y asigna el resultado a la variable changedbits. Esta operación resultará en que los bits que han cambiado desde la última vez que se actualizó portbhistory sean establecidos en 1 en changedbits.
Por otro lado, la declaración:
toma el complemento a uno del registro PINB y asigna el resultado a changedbits. Esto significa que todos los bits de PINB se invertirán (es decir, los 0s se convierten en 1s y los 1s se convierten en 0s) y el resultado se asignará a changedbits. Esto no es equivalente a la primera declaración y no es útil para detectar qué bits han cambiado desde la última vez que se actualizó portbhistory.