es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    changedbits = PINB ^ portbhistory;
    

    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:

    changedbits = ~PINB;
    

    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.

Comments are closed.