Interruptores de interfaz con microcontrolador

0

Estoy intentando interconectar interruptores de botón momentáneos con mi Stellaris EK-LM4F120XL.

Estoy usando una interfaz lógica positiva, para establecer momentáneamente el pin como ALTO si se presiona el botón. Una resistencia de 10K se conecta a GND desde el interruptor, que luego se conecta a Vcc, 5V. El pin seleccionado está conectado a esta unión, configurando el pin como BAJO cuando no fluye corriente y hay una señal de 0V en el pin. Luego, cuando la corriente fluye, el voltaje en el pin es Vcc y se establece en ALTO.

Usando un multímetro, esto funciona perfectamente ... Aunque, cuando se realiza la depuración, la salida no se activa como se desea ...

Mi código de activación en main es el siguiente ...

if ((GPIOX_DATA & 0xXX) == 1) // IF THE PORTS' DATA REGISTER, AT PIN, IS HIGH,
    GPIOX_DATA |= 0xXX;       // SET THIS PORTS' DATA REGISTER, AT PIN, TO HIGH

(El control de configuración del pin a través del registro de datos funciona bien, por ejemplo, los LED de a bordo ..)

Tengo entendido que no puede escribir en un pin de entrada; por lo tanto, su valor se establece según su nivel lógico. Si tiene un voltaje de umbral similar a TTL o CMOS, el 5V activo en el pin debe configurarlo como ALTO - por lo tanto == 1.

Mi código de inicio establece el pin de entrada como - DIR como entrada AFSEL a regular DEN a digital ..

Incluso he intentado agregar la desactivación analógica a través de AMSEL, borrar el control de puerto a través de PCTL ... Solo para probar el control, quiero encender un LED incorporado mientras el botón está presionado ..

¿Me estoy perdiendo algo ...?

    
pregunta Rogan Josh

1 respuesta

1

Al examinar un solo bit en un byte (o registro) utilizando & es importante recordar que el resultado de la & será un valor enmascarado, no el valor del bit que le interesa.

Por ejemplo, si tiene el valor 0b10110101 en un registro y desea examinar el bit 2, puede enmascararlo con 0b00000100:

0b10110101
0b00000100 &
==========
0b00000100 = 4

Por lo tanto, el resultado es, en decimal, 4. En su declaración if , está comparando los resultados de & operación con 1. Eso solo puede ser cierto si está examinando el bit 0 en su registro.

Si cambias tu comparación, así es que se compara el valor enmascarado con el valor de la máscara, entonces puede ser cierto para el valor que estás examinando.

Mejor aún, elimine la comparación por completo:

if (GPIOX_DATA & 0xXX) // IF THE PORTS' DATA REGISTER, AT PIN, IS HIGH,
    GPIOX_DATA |= 0xXX;       // SET THIS PORTS' DATA REGISTER, AT PIN, TO HIGH

En una comparación de if solo te interesa un estado true o false . En C, un estado falso se define como 0 y un estado verdadero se define como cualquier otro valor pero 0. Así que digamos que la ecuación GPIOX_DATA & 0xXX da como resultado 4, que es un valor verdadero, ya que no es 0.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas