Pregunta de novato: programación en C para AVR

0

Las siguientes líneas que funcionan exactamente opuestas a lo que estoy esperando, agradecerían corregir mi comprensión:

botón conectado con Pin D2 & Led B2:

    if (PIND & (1 << PD2) ) 
        {
        (PORTB ^= (1 << PB2));
        _delay_ms(500);
        }
    else
        PORTB |= (1 << PB2);

Por lo que entiendo hasta ahora: cuando se presiona el botón [PD2 tendrá un valor alto (1)], que cuando y con la máscara (que es otro 1 en la ubicación de PD2), deberíamos cumplir con la condición if y el LED continuará cambiando según el valor de retardo especificado. SIN EMBARGO, lo que obtengo es exactamente lo contrario: tan largo como cuando presiono el botón, el LED se enciende constantemente uno, cuando no se presiona ningún botón, ocurre el comportamiento de cambio.

Estoy un poco perdido donde estoy equivocado

    
pregunta Mo Tahoon

1 respuesta

1

El comportamiento que describe más probablemente indica que el cierre del conmutador está causando que el bit del puerto se lea bajo, no alto.

Esto sería bastante normal, ya que es bastante tradicional usar una resistencia de pull-up para poner un estado determinista en una entrada cuando el interruptor conectado está abierto, y hacer que el cierre del interruptor anule esto al conectarse a tierra.

Si bien algunos otros microcontroladores se pueden configurar con un pull-up interno o un pull-down interno, el AVR ofrece solo resistencias internas de pull-up. Para hacer las cosas al revés, con un botón que indica alta cuando se cerraron los contactos, deberá usar una resistencia desplegable externa.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas