PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pin Zustandsänderung überwachen ?



Looser
20.05.2009, 23:46
Hallo Leute ich brauch mal wieder eure Hilfe.
An einem Pin befindet sich ein Schalter ( kein Taster)der im geschlossenen Zustand auf Masse liegt. Wenn sich der Zustand des Schalters ändert soll ein Befehl (Print An) gesendet werden. Aber nur 1 mal auch wenn der Schalter weiter diesen Zustand hat. Das selbe dann auch für Print aus.

Mein Code funktioniert recht unzuverlässig. Gibt es eine andere Methode ? oder hat vieleicht jemand von euch ein anderes Beispiel ?

Do
If Pind.2 = 0 And Status = 0 Then
Print "an"
Status = 1
End If

If Pind.2 = 1 And Status = 1 Then
Print "aus"
Status = 0
End If
Loop

Jaecko
21.05.2009, 00:13
Über deine Methode wär's machbar, zuverlässiger gehts aber über Interrupts.
Ein Interrupt wird beim Pegelwechsel ausgelöst (z.B. INT0) und führt dann eine definierte Aktion aus. Hat den Vorteil, dass es auch dann funktioniert, wenn das Programm nicht gerade bei "If Pind.2 = 0 And Status = 0 Then " ist.

wkrug
21.05.2009, 11:46
Ichwürde es auch über Interrupts machen wollen.
Allerdings sollte man dran denken, den Schalter zu entprellen.

Ich würde im Interrupt nur ein Flag setzen und den eigentlichen Print auftrag in der Hauptroutine starten.

In die Interruptroutine sollte dann eine Abfrage mit rein, die nach einer Aktivierung für 10..20ms kein neues Setzen des "Print" Flags erlaubt.

Dadurch wird die Interruptroutine schön kurz und nicht durch wait's oder debounce blockiert.

for_ro
21.05.2009, 14:27
Einen externen Interrupt für einen Schalter abzufragen, ist allerdings schon ein wenig Ressourcen Verschwendung. Ein Schalter ist ja als noch träger anzusehen als ein Taster. Und prellen tun die Dinger meist ohne Ende. Ein Interrupt löst da bestimmt öfter als einmal aus. Um das zu verhindern ist auch etwas Aufwand nötig.
So etwas Langsames (der kann ja nicht im Millisekunden Bereich wieder öffnen) wie einen Schalter, würde ich immer mit einem Debounce direkt aus der Main Loop abfragen.

Gruß

Rolf

Looser
21.05.2009, 16:24
Das hört sich alles super an. Aber kann denn mal jemand von euch ein Beispiel posten ?

for_ro
21.05.2009, 19:11
Das hört sich alles super an. Aber kann denn mal jemand von euch ein Beispiel posten ?
Der Debounce Befehl ist in der Hilfe mit Beispiel erklärt.
Für die Interrupts kannst du hier mal nach "externer interrupt" oder "Int0" oder "Int1" suchen.

Gruß

Rolf