Ich möchte den Zustand eines Schaltsensors (Magnetkontakt) auslesen. Ich denke daran, den Schalter zwischen einem Interrupt-Pin meines Mikros und Masse zu verbinden und auf den CHANGE-Status zu lauschen. Auf diese Weise habe ich Entprellungsprobleme, daher frage ich mich, wie ich dieses Problem am besten lösen kann:
1 - Deaktivieren Sie das Interrupt-Listening, wenn es ausgelöst wird, und aktivieren Sie es, nachdem das Programm den Wert gelesen hat (0 -> Masse -> Schalter geschlossen ODER 1 -> Floating -> Schalter geöffnet). Ich glaube nicht, dass ein Floating-Zustand gut sein könnte. aber wenn ich den Interrupt-Eingangspin als INPUT_PULLUP setze, ist er nicht mehr schwebend und könnte gut sein, habe ich recht?
2 - Verbinden Sie den Schalter mit einem Interrupt-Pin und auch mit einem digitalen Eingangspin über einen Transistor als Schalter. Auf diese Weise lese ich beim Auslösen des Interrupts den Wert des digitalen Eingangspins. Andererseits erschwere ich auf diese Weise die Schaltung
3 - Verwendung einer Hardware-Entprellschaltung
Sind diese drei Lösungen gültig? Gibt es noch bessere als diese?
MEHR KONTEXT: Ich verwende diese Schalter als Endschalter für ein Garagentor. In meinem Code verwende ich einen Timer, um das Garagentor für zehn Sekunden anzuheben ODER bis der Endschalter-Interrupt ausgelöst wird
EDIT: Mit einer Änderung in meinem Code habe ich das Problem mit Interrupts gelöst. Sie schlagen jedoch vor, Polling zu verwenden, da es sich nicht um eine Echtzeitanwendung handelt. Daher frage ich mich: Ist es nicht besser, Interrupts zu verwenden, damit ich einen Energiesparmodus für mein Mikro verwenden und es nur bei einem Hardware-Interrupt aufwecken kann? wird ausgelöst? Wenn ich eine Polling-Lösung verwende, wäre das System nicht für eine Batteriestromversorgung geeignet; nicht wahr?
Die wirkliche Antwort ist, dass Sie überhaupt keine Interrupts dafür verwenden sollten. Sie sollten den Schalter an einen Eingangspin anschließen und den Pin regelmäßig abfragen. Die Dauer des Abfragens sollte größer sein als das Zeitintervall, in dem die Schalttransiente (Prellen) abklingt.
Außerdem müssen Sie Ihren Pin mit einem Pullup-Widerstand hochziehen. Einfach den Schalter zwischen GND und dem Pin zu verbinden ist nicht gut genug; Einige Mikrocontroller haben interne Pull-up-Widerstände, die Sie per Software aktivieren können, sodass Sie keinen externen verwenden müssen.
Ich verwende diese Schalter als Endschalter für ein Garagentor. In meinem Code verwende ich einen Timer, um das Garagentor für zehn Sekunden anzuheben ODER bis der Endschalter-Interrupt ausgelöst wird.
Dies ist eine Anwendung mit niedriger Geschwindigkeit, und ein Interrupt ist nicht erforderlich, um einen angemessenen Stopp zu erzielen. Die Auslaufzeit des Motors ist hundertmal länger, als eine einfache Eingangsabfrage- und Entprellschaltung bequem handhaben könnte.
Stellen Sie die Endschalter etwas vom Ende des Weges zurück und stellen Sie sie so ein, dass das Tor in den korrekten offenen und geschlossenen Positionen stoppt.
Ich denke an diese paar Punkte
Das RC-Filter mit externem Pull-up und Software-Entprellung ist hier die beste Option. Wenn Sie nach 20 ms denselben Wert lesen, können Sie sicher sein, dass er korrekt ist
Zurück zu deinen Fragen:
Auf jeden Fall sammelt man Erfahrung, indem man scheitert. Darauf kommt es schließlich an.
jonk