PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zustandsabhängige Logik



Powell
29.08.2007, 11:24
Hallo zusammen,

ich bin noch relativer Neuling was Programmierung angeht, daher hier meine Frage, die sicher nicht sehr schwer zu beantworten sein sollte:

Ich habe ein Programm was über den debounce Befehl einen Tastereingang abfragt. Wenn der Taster gedrückt wird und die Prellzeit vorbei ist, wird also die fallende Flanke des Signals erkannt und ein Sub aufgerufen.

Nun möchte ich aber zusätzliche Sicherheit einbringen, und in dem Sub zuerst noch mal den Zustand des Tasters abfragen lassen: Das Programm soll den Zustand des Eingangs für 20ms prüfen, und erst wenn wirklich während dieser 20ms dauerhaft ein Tastendruck erkannt wurde, das Sub ausführen. Sollte der Eingang während dieser 20ms noch mal seinen Zustand wechseln, soll das Programm wieder in die Hauptschleife zurückkehren und das Sub nicht ausführen.

Wie kann ich das in Code umsetzen?

Danke für eure Tips

for_ro
29.08.2007, 13:11
Einfach die Debounce Zeit um 20ms verlängern.
Sicherer geht es nicht.

Gruß Rolf

Powell
29.08.2007, 13:38
Hi rolf,

Nein, das ist nicht mein Problem. Es geht darum, dass ich in meiner Schaltung noch gelegentlich Störungen eingekoppelt bekomme. Wenn die Frequenz stimmt, dann wird der Debounce Befehl überlistet, weil immer im Augenblick der Eingangsabfrage ein Signal erkannt wird. Ich möchte daher noch eine Zustandsabfrage integrieren, die überprüft, ob das Signal auch tatsächlich für eine längere Dauer (20ms) anliegt, und nicht nur zwei kurze Spitzen das Sub ausgelöst haben.

Vitis
30.08.2007, 01:56
genau dafür gibts den debounce

config debounce ist da das Stichwort

Powell
30.08.2007, 21:09
Hi,

nein, ich erklärs nochmal: Stellt euch vor mein Eingangssignal inklusive Störimpulse (damit meine ich nicht das Prellen des Tasters, sondern wirklich störimpulse) sieht aus wie ein Rechtecksignal mit einer Pulsweite von 1% - Der Controller bekommt die erste Flanke und startet den debounce, fragt 20ms später wieder ab und trifft zufällig wieder eine Spitze die eingekoppelt wurde - dann führt er das Sub aus obwohl der Taster nicht gedrückt wurde.

Vitis
31.08.2007, 07:58
so krasse Störungen kannste z.B. auf n hoch- runter- Zähler
ausfiltern, aber sinnvoll währs auf alle Fälle
mal die Leitungen unter die Lupe zu nehmen bzw. den Schaltplan
zu überarbeiten. Da sind bestimmt n paar Mängel drin.

MeckPommER
31.08.2007, 08:28
Die Idee, in der Sub nochmals zu prüfen, ob das Signal auch korrekt war, geht mir programmiertechnisch irgendwie ganz und gar gegen den Strich.

Jede Sub oder Funktion sollte allein ihre Aufgaben bewerkstelligen können. Wenn man da Aufgaben verschiebt und unsauber teilt, gibts später einen Code, den keiner mehr verstehen und bearbeiten kann. Grade wenn später Fehler auftreten, kann man beim Dezentralisieren von gleichen Aufgaben nicht mehr lokalisieren, wo der Fehler stecken könnte.

Ein erster Schritt wäre, die Leitungen und Schaltung zu überprüfen und ggf. zu verbessern.

Falls das nichts bringt, ist die Tastaturabfrage vielleicht dahingehend zu verbessern, das ein Tastendruck z.B 100ms lang verfolgt wird, ob er auch die ganzen 100ms lang vorliegt, und dann erst die Sub ausgeführt wird.

Gruß & *Daumendrück* MeckPommER

Powell
31.08.2007, 10:51
Hi zusammen,

ich geb euch vollkommen Recht mit der Ansicht, dass man derartige Störungen Hardwareseitig eliminieren sollte. Das verfolge ich auch noch parallel. Das Problem ist nur, dass ich um das ganze zu testen immer ca. 160 km weit fahren muss (die Anwendung muss auf ner Rennstrecke getestet werden, und die hab ich leider nich vor meiner haustür ^^). Deswegen wollt ich für die nächste Testfahrt alle Register ziehen. Was MeckPommER sagt trifft den Punkt doch schon mal ganz gut: Tastendruck soll 100ms lang verfolgt werden und dann erst das Sub ausgeführt - genau das meine ich ja - bloß wie setze ich das jetzt in Code um (-> wie gesagt, Anfänger in Bascom)

StevieL
03.09.2007, 10:50
Hallo,

das könnte man zum Beispiel so machen:




Taste alias PIND.0 'oder ähnlich

dim TCounter as byte

Do 'Hauptschleife
If Taste = 0 Then Call Tastendruck
'....
loop

sub Tastendruck()
Tcounter = 0
for I = 1 to 100
if Taste = 0 then incr TCounter
waitms 1
next
if TCounter < 90 then exit sub

'... Hier die Verzweigung

end sub