Por lo tanto, soy un novato COMPLETO y absoluto en programación. He hecho algunas cosas básicas en Arduinos (literalmente alternando los LED y mostrando algo en una pantalla LCD) y estoy tratando de enseñarme a mí mismo cómo programar en C. Soy un ingeniero de hardware por profesión, pero me molesta que no pueda hacer cualquier parte del firmware / software y no hay cursos nocturnos para enseñarlo, y me gustaría ampliar mis opciones de carrera. Me cuesta entender cómo se combinan algunos de estos comandos y me he encontrado con un problema que no puedo entender por qué no funciona.
Entonces, tengo una entrada y una salida. Mi salida es alternar la puerta de un FET que enciende un LED. La entrada proviene de una puerta AND. Por lo tanto, mi LED siempre está encendido, y cuando recibo una señal de entrada de la compuerta AND (se han cumplido 2 condiciones) quiero que la salida (alternar LED) sea BAJA (apague el LED. Como la salida también está conectada a una de las entradas AND, esto también hará que la señal de entrada sea BAJA.
Lo que quiero hacer: solo quiero leer la entrada como 'condiciones cumplidas' y apagar el LED. Luego debe estar apagado durante 1 segundo y volver a encenderse. Si la entrada vuelve a ser ALTA, el proceso se repite. Estoy usando un simple impulso para hacer el cambio como la otra entrada de compuerta AND y he medido que la salida (entrada de MCU) sube cuando se presiona el botón, pero el interruptor LED (salida) no se apagará. Mi código es (creo) bastante simple, pero claramente no entiendo algo correctamente, ya que simplemente no funciona.
Entonces este es el código que estoy usando:
#include "mbed.h"
DigitalIn ip(D7);
DigitalOut op(D8);
int main() {
if (ip == 1){
op = 0;
wait (1.0);
op = 1;
}else{
op = 1;
}
}
Y para mí, eso parece lógico. En el estado habitual, la salida es ALTA. Si la entrada recibe la señal de la puerta AND, el LED se apagará durante 1 segundo y luego se encenderá nuevamente.
¿Qué es lo que he hecho mal ya que parece la forma lógica de hacerlo y no puedo entender por qué eso no funciona?
Si ayuda, estoy usando el Nucleo F103RB. Cuando uso el código de 'parpadeo' y simplemente enciendo y apago el LED de esa manera, funciona bien, es solo cuando agrego la declaración 'si' que sale mal.
Este es el circuito simplificado:
simular este circuito : esquema creado con CircuitLab
PD: Sé que no los agregué en el esquema, pero las compuertas AND tienen resistencias pulldown en las entradas y salidas.
DigitalIn
ya incluya volatile
.