Ich bin also ein VOLLSTÄNDIGER und absoluter Anfänger im Programmieren. Ich habe einige grundlegende Dinge mit Arduinos gemacht (buchstäblich LEDs umschalten und etwas auf einem LCD anzeigen) und ich versuche mir selbst beizubringen, wie man in C programmiert. Ich bin von Beruf Hardware-Ingenieur, aber es stört mich, dass ich nicht kann Machen Sie eine der Firmware- / Software-Seiten und es gibt keine Abendkurse, um sie zu unterrichten, und ich möchte meine Karriereoptionen fördern. Ich habe Probleme zu verstehen, wie einige dieser Befehle zusammenpassen, und bin auf ein Problem gestoßen, bei dem ich einfach nicht verstehen kann, warum es nicht funktioniert.
Ich habe also eine Eingabe und eine Ausgabe. Mein Ausgang schaltet das Gate eines FET um, der eine LED einschaltet. Der Eingang kommt von einem UND-Gatter. Meine LED leuchtet also immer und wenn ich ein Eingangssignal vom UND-Gatter erhalte (2 Bedingungen wurden erfüllt), soll der Ausgang (LED-Umschalter) auf LOW gehen (LED ausschalten. Da der Ausgang auch angeschlossen ist) Bei einem der UND-Eingänge wird auch das Eingangssignal auf LOW gestellt.
Was ich tun möchte: Ich möchte nur die Eingabe als "Bedingungen erfüllt" lesen und die LED ausschalten. Es sollte dann 1 Sekunde lang ausgeschaltet und wieder eingeschaltet sein. Wenn die Eingabe wieder auf HIGH geht, wird der Vorgang wiederholt. Ich benutze einen einfachen Druck, um den Schalter als anderen UND-Gatter-Eingang zu betätigen, und habe gemessen, dass der Ausgang (MCU-Eingang) hoch geht, wenn die Taste gedrückt wird, aber der LED-Schalter (Ausgang) nicht ausgeschaltet wird. Mein Code ist (glaube ich) verdammt einfach, aber ich verstehe etwas offensichtlich nicht richtig, da es einfach nicht funktioniert.
Das ist also der Code, den ich benutze:
#include "mbed.h"
DigitalIn ip(D7);
DigitalOut op(D8);
int main() {
if (ip == 1){
op = 0;
wait (1.0);
op = 1;
}else{
op = 1;
}
}
Und das scheint mir logisch. Im Normalzustand ist der Ausgang HIGH. Wenn der Eingang das Signal vom UND-Gatter erhält, erlischt die LED 1 Sekunde lang und leuchtet dann wieder auf.
Was habe ich falsch gemacht, da dies logisch aussieht und ich einfach nicht verstehen kann, warum das nicht funktioniert?
Wenn es hilft, verwende ich den Nucleo F103RB. Wenn ich den "Blink" -Code verwende und die LED einfach so ein- und ausschalte, funktioniert das einwandfrei. Nur wenn ich die "if" -Anweisung hinzufüge, geht das schief.
Dies ist die vereinfachte Schaltung:
simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab
PS Ich weiß, dass ich sie nicht im Schaltplan hinzugefügt habe, aber die UND-Gatter haben Pulldown-Widerstände an den Ein- und Ausgängen.
DigitalIn
bereits enthältvolatile
.Antworten:
Ich hätte gedacht, dass Sie eine Schleife um Ihren Code benötigen würden -
Bevor Sie die Taste drücken können, ist Ihr Code fertig und wird beendet. Sie benötigen die Weile, um die if-Anweisung wiederholt auszuführen.
quelle
loop()
, aber das Arduino-Framework fügt Code hinzu, der sich ungefähr so verhältint main() { setup(); while(1) { loop(); } }
.Der Prozessor führt die Anweisungen nacheinander aus . Es beginnt mit einem Sprung
main()
aus dem Initialisierungscode der mbed-Bibliothek vonDigitalIn
undDigitalOut
.Führt dann den Vergleich durch
ip == 0
, führt die Anweisung innerhalb der aus{}
undmain()
endet dann ... keine weiteren Anweisungen ... Was macht es?Es könnte zurückgesetzt werden, weil unzulässige Operanden im leeren Flash-Speicher gefunden wurden. Oder es könnte in einem Fehlerbehandler hängen und SOS blinken, wie es mbeds tun. Dies hängt davon ab, wie dies implementiert wird, und wird wahrscheinlich im Moment über Sie hinausgehen.
Wenn Sie jedoch neugierig sind, können Sie nach ARM Fault Handling suchen oder herausfinden, woher der
main()
Anruf tatsächlich stammt.Wie kann man das beheben?
quelle
while(1 == 1)
nur schreibenwhile(1)
. Letzteres ist idiomatisch C, aber Ersteres ist für einen Menschen offensichtlicher, da "immer als wahr bewertet wird". Jeder anständige Compiler sollte für beide Varianten den gleichen Binärcode erzeugen.Wie von anderen richtig erwähnt, würde eine Schleife es Ihrem Code ermöglichen, wiederholt ausgeführt zu werden. Es gibt jedoch eine integrierte Möglichkeit, dies für Arduino zu tun, ohne dass eine
while
Schleife erforderlich ist. Dies geschieht durch dieloop
Funktion - ihre Anwendbarkeit auf Ihr Problem hängt davon ab, ob Sie die Arduino IDE verwenden.Es sollte ungefähr so aussehen:
Ihre Hauptfunktion ist jetzt ausgeblendet und wird erst beim Kompilieren zu Ihrem Programm hinzugefügt. Hier ist eine gute Diskussion dazu: http://forum.arduino.cc/index.php?topic=379368.0
quelle
loop()
undsetup()
von Arduino werden in den meisten Systemen nicht verwendet. Als Referenz definiert Arduino einfach somain()
etwas:void setup(); void loop(); int main() { setup(); while (true) loop(); }
Wenn Sie mit der Montage vertraut sind, kann dies auch in Ihrer Komfortzone etwas mehr sein:
int main () {
}}
quelle
goto
** stark ** schlägt vor, dass "Magie hier vor sich geht", möglicherweise mit Ausnahme vongoto cleanup;
. Im Beispiel hier bleibt dem Leser die rätselhafte Frage "Was ist so besonders, dass Sie es hier nicht verwendetwhile(1) { }
haben?".