Atmega328p: ¿por qué la entrada del botón se lee como 0 cuando se presiona?

0

Me gustaría encender el LED de la placa (PB5) cuando presiono su botón (PB7).

DDRB = 0xFF; // set all B-ports as output
DDRB &= ~(1<<7); // change PB7 to input
while (1)
{
    if (PINB & (1<<7))
        PORTB |= (1<<5); // when button is pressed, turn on the LED
    else
        PORTB &= ~(1<<5); // when button is not pressed, turn off the LED
}

Sin embargo, PINB & (1<<7) devuelve 1 cuando yo excepto 0, y 0 cuando presiono el botón. Podría agregar un no operador y estaría bien, pero me gustaría saber lo que entiendo mal. ¿Por qué el octavo bit de PINB se lee como 0 cuando presiono el botón?

    
pregunta klenium

1 respuesta

1

Lo que PINB & (1<<7) devolverá depende de cómo esté conectado el botón. Devolverá el valor verdadero (no 0) si el voltaje en el pin está en el rango del nivel lógico alto y falso (0) si está en el rango del nivel lógico bajo .

En el primer caso, el pin GPIO se coloca en VCC (lógica alta) de forma predeterminada, por lo que si no se presiona el botón PINB & (1<<7) devolverá verdadero . Si presiona el botón, el voltaje en el pin será GND (lógica baja), por lo que su declaración devolverá falso (0) .

En el segundo caso la configuración se invierte. El pin es bajado a GND por defecto y cuando se presiona el botón, el voltaje será VCC. Por lo tanto, la entrada será verdadera al presionar los botones.

simular este circuito : esquema creado usando CircuitLab

En tu tablero, probablemente tengas el primer caso.

    
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas