PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Debounce



demmy
13.04.2013, 23:44
Hallo zusammen,

ich versuche gerade ein Paar Taster softwareseitig zu Entprellen bzw. einzulesen (6 Taster). Und zwar alle nach folgendem Weg:




Do
' Eingang 1
Debounce Eingang1 , 0 , On_eingang1 , Sub
Debounce Eingang1 , 1 , On_eingang1 , Sub
Loop

' EINGANG 1 ENTPRELLT
On_eingang1:

Eingang1_entprellt = Not Eingang1

Return



Zusätzlich wird in der Hauptschleife überprüft ob ein Zeichen mittels UART empfangen wurde. Ist dies der Fall, wird sofort etwas zurückgesendet.
So dass mal vorneweg, jetzt zu dem Problem.

Lese ich die Taster ohne Debounce ein (nicht entprellt), kann ich keine Verzögerung im Programmablauf bzw. beim Senden und dem Empfangen der Antwort über die UART feststellen. Verwende ich wie Oben den Debouncebefehl, wird das Programm sehr verzögert, obwohl keine Taste gedrückt wird. Das Empfangen einer Antwort mittels UART ist verzögert.

Laut Bascom Hilfe dürfte doch der Debouncebefehl nicht zu einer Verzögerung führen wenn keine Zustandsänderung des Pins stattgefunden hat oder?

Hat jemand eine Erklärung für das Verhalten?

Vielen Dank für euere Hilfe

Searcher
14.04.2013, 06:28
' Eingang 1
Debounce Eingang1 , 0 , On_eingang1 , Sub
Debounce Eingang1 , 1 , On_eingang1 , Sub

... wird das Programm sehr verzögert, obwohl keine Taste gedrückt wird...
Hat jemand eine Erklärung für das Verhalten?

Hängt damit zusammen, daß Du den gleichen Eingang einmal auf low (0) und dann auf high (1) testest. Warum machst Du das?

Bei verschiedenen Eingängen oder Abfrage des gleichen Pegel gibt es keine Verzögerung (oder nur einmal zu Beginn des Programms) wenn kein Eingang geändert wurde.

Gruß
Searcher

demmy
14.04.2013, 13:36
Naja, ich hab das versucht so zu machen, um den Zustandswechsel in beide Richtungen mitzubekommen.

Ich setze ja in dem entsprechenden Sub ein Bit, wenn der Eingang belegt wird. Wenn ich Ihn jetzt aber wieder frei mache, wie soll ich das dann erkennen? Ich möchte erreichen, das die Variable "Eingang1_entprellt" den in beide Richtungen entprellten Zustand enthällt? Also funktioniert das so nicht? Hat jemand eine andere Idee?

Searcher
14.04.2013, 17:50
Hallo,
so recht will mir keine Alternative einfallen. Dazu müsste man wissen, was an dem Eingang angeschlossen ist und welche Funktion sich dahinter verbirgt. Was soll in dem Unterprogramm dann bei high bzw low am Eingang gemacht werden? Erzähl ein bischen mehr über die Funktion, die du implementieren möchtest.

Man könnte irgendwie mit Flags arbeiten - bei low im Unterprogramm ein Flag setzten und per IF im Hauptprogramm das Debounce, das auf low abfragt, überspringen - das Gleiche für high - als erste Idee...

PS: Taster sind doch normalerweise nicht gedrückt. Debounce erkennt, ob er gedrückt ist und springt ins Unterprogramm. Die Funktion für die Taste wird ausgeführt und zurück ins Hauptprogramm. Mir ist nicht klar, warum da noch erkannt werden soll, daß die Taste wieder gelöst wurde :confused:.

Gruß
Searcher

demmy
14.04.2013, 21:55
Also wie gesagt ich möchte einfach mehrere Eingänge an denen jeweils ein Taster hängt softwareseitig entprellen.
Ich möchte aber nicht, wenn der Taster gedrückt wird und entprellt ist irgendeine Funktion oder Sub aufrufen sondern, eine Variable beschreiben. Diese hat dann immer den "sicheren" Zustand des Tasters. Mit dieser Variable arbeite ich dann in meinem Programm, nicht mit dem Eingang selber.

Ich habe inzwischen eine Lösung gefunden. Und zwar habe ich mir eine Tasterentprellung selber Programmiert. Im Hauptprogramm wird mit einer Hilfsvariable die Zustandsänderung eines Eingangs Ermittelt. Hat sich der Zustand geändert wird mit der Hilfe eines Timers ein paar ms später geprüft ob der Eingang noch immer den selben Zustand hat. Ist das der Fall, wird eine "sichere" Variable mit dem aktuellen Zustand beschrieben. Das Funktioniert so beim Drücken und beim Loslassen des Tasters.

Also so ähnlich wie Debounce, nur das mein Programm nicht langsammer wird. ;)

peterfido
15.04.2013, 19:04
Ich mache das auch immer so ähnlich. Nur ohne Timer.



$regfile = "m16def.dat" 'eingesetzter Mikrocontroller
$crystal = 8000000 'eingestellte Taktfrequenz (8MHz)
$hwstack = 100 'Standardwert
$swstack = 100 'Standardwert
$framesize = 100 'Standardwert
$baud = 9600


Config Base = 0

Dim A As Byte

Dim Tasteralt As Byte
Dim Tasterw(8) As Byte
Tastere Alias Pina
Set Porta 'Pullups


Do
Gosub Tasten
If Tasterw(0) = 0 Then 'Eingang PinA.0 auf GND gezogen
Print "Mach was"
End If

Loop
End


Tasten:
For A = 0 To 7
If Tastere.a <> Tasteralt.a Then
Tasteralt.a = Tastere.a
Tasterw(a) = 127
Else
If Tastere.a = 1 Then
If Tasterw(a) < 254 Then
Incr Tasterw(a)
End If
Else
If Tasterw(a) > 0 Then
Decr Tasterw(a)
End If
End If
End If
Next A
Return


Die Werte variieren von Fall zu Fall /Takt zu Takt.

demmy
15.04.2013, 19:46
Das bedeutet aber, das deine Entprellzeit von deiner Zykluszeit deines Programmes abhängig ist!?
Diese kann aber je nach Größe deines Programmes stark variieren!!??

peterfido
15.04.2013, 20:07
Das ist korrekt. Bei "großen" Laufzeiten passe ich einfach die 127 an. Wird es schwerwiegender kann man zusätzlich die Sprünge erhöhen. Statt decr einfach wert=wert-4 und schon ist es viermal schneller. Darauf achten, dass der Prüfwert auch erreicht wird.