Hallo
Habe beigefügte, mit Poti einstellbare Einschaltverzögerung in Bascom
programmiert. Funktioniert soweit: Wird die Taste gedrückt, dauert es
die eingestellte Verzögerungszeit, bis die LED leuchtet. Nach dem
Loslassen der Taste geht die LED jedoch nicht sofort aus, wie gewünscht
und auch programmiert(?). Es dauert ca. die Einschaltverzögerungszeit,
bis sie erlischt. Wo bitte liegt der Fehler?
1
'Bascom Einschaltverzögerung
2
3
$regfile = "m88def.dat"
4
$crystal = 4000000
5
6
Dim Poti As Word
7
8
'ADC definieren
9
Config Adc = Single , Prescaler = Auto , Reference = Internal
10
Start Adc
11
12
Led Alias Portb.6
13
Config Portb.6 = Output
14
15
Taster Alias Pind.2
16
Config Taster = Input
17
18
Portd.2 = 1
19
20
' Hauptschleife
21
Do
22
Poti = Getadc(7) 'Wert von ADC1 wird in Variable Poti gespeichert
Deine "Einschaltverzögerung" ist bei jedem Schleifendurchlauf auch bei
gedrückter Taste aktiv.
Du solltest also den Teil rund um "if Taster = 0" nur einmal ausführen
--- Dir allerdings auch Gedanken um das Entprellen des Tasters machen.
> Wird die Taste gedrückt, dauert es die eingestellte Verzögerungszeit,> bis die LED leuchtet.
Und wenn dein Benutzer nicht rechtzeitig genug losgelassen hat, dann
läuft dieselbe Verzögerungszeit gleich nochmal um die LED nochmal
'einzuschalten'. Und die muss eben abgewartet werden, ehe dann die
inzwischen losgelassene Taste vom Benutzer programmtechnisch registriert
werden kann.
Danke für Eure Antworten.
Rufus, ja, die Verzögerung soll bei Tastendruck aktiv sein. Während die
Verzögerung läuft muß die Taste gedrückt bleiben; wird sie losgelassen,
soll die Verzögerung unterbrochen werden.
Karl Heinz, genau das ist das Problem. Wie kann ich das
programmtechnisch verhindern?
SamSon: Dein Programm erzeugt nur ein Aufblinken für 250 msec.nach
Ablauf der Anverzögerungszeit. Die LED
soll aber nach Ablauf der Verzögerung anbleiben, wenn die Taste noch
gedrückt ist und sofort augehen, wenn sie losgelassen wird.
Eine eigentlich triviale (in konvent. Analogtechnik: Kondensator
aufladen bis Triggerschwelle erreicht ist) Aufgabenstellung, die
scheinbar garnicht so einfach zu programmieren ist.
Bernd schrieb:> Danke für Eure Antworten.>> Rufus, ja, die Verzögerung soll bei Tastendruck aktiv sein. Während die> Verzögerung läuft muß die Taste gedrückt bleiben; wird sie losgelassen,> soll die Verzögerung unterbrochen werden.
Dann ist das aber keine Verzögerung im eigentlichen Sinne, sondern eine
Begrenzung der Dauer eines Tastendrucks. Fast wie ein Monoflop.
> Karl Heinz, genau das ist das Problem. Wie kann ich das> programmtechnisch verhindern?
Indem du die nächste Wartezeit zb erst dann zulässt, wenn die Taste
zwischendurch auch wieder mal auf 1 war. Erst dann kann die nächste
Verzögerung starten.
Oder: was gleichnbedeutend ist:
du stellst fest, ob deine Taste einen 1->0 übergang gemacht hat. Es
reicht nicht, wenn die Taste auf 0 (also gedrückt IST) ist, damit die
Verzögerung wirksam wird. Sie muss genau jetzt niedergedrückt worden
sein!
Dazu kannst du dir zb immer den Tastenzustand in einer zusätzlichen
Variablen merken, so dass du im nächsten Durchgang durch die Do-Loop
Schleife vergleichen kannst, ob die Taste kurz vorher 1 war und jetzt 0
ist (denn dann ist die Taste jetzt gerade niedergedrückt worden) oder ob
sie beim letzen mal nachsehen auch schon 0 war (dann ist sie zwar
gedrückt, war aber vorher auch schon gedrückt - der Benutzer ist auf der
Taste eingeschlafen)
1
...
2
3
prevTaster = Taster
4
5
Do
6
Poti = Getadc(7) 'Wert von ADC1 wird in Variable Poti gespeichert
7
8
nowTaster = Taster
9
10
If nowTaster = 1 Then
11
Led = 0
12
End If
13
14
15
If nowTaster = 0 AND prevTaster = 1 Then
16
Wait Poti
17
Led = 1
18
End If
19
20
prevTaster = nowTaster
21
Loop
Sprich: Die Verzögerung wird nur dann wirksam, wenn du eine Flanke
gefunden hast.
Das löst jetzt aber diesen Teil ...
> wird sie losgelassen, soll die Verzögerung unterbrochen werden.
... noch nicht.
Dazu muss die ganze Warterei umgedreht werdenb und auf Timer umgestellt
werden.
Wait ist zwar einfach, aber es ist zu einfach. Auf Dauer kommst du damit
nicht weiter.
> die scheinbar garnicht so einfach zu programmieren ist.
Wenn man ein wenig Übung hat, ist es nicht schwer.
Du solltest dir mal klarwerden was du eigentlich willst.
Soll das Monoflop retriggerbar sein?
Soll es bei ansteigender oder abfallender Flanke triggern?
Zum Verständnis siehe:
http://www.elektronik-kompendium.de/sites/slt/0310121.htmRufus Τ. Firefly schrieb:> Dir allerdings auch Gedanken um das Entprellen des Tasters machen.
Solange nur ein Monoflop damit ausgelöst werden soll ist es eine der
wenigen Anwendungen wo man sich NICHT um das Entprellen scheren muss.
Zumindest falls die erste Flanke (Taste wird gedrückt) triggern soll.
SamSon- Glaube, Du hast das schon richtig verstanden ; es hat ja (fast)
funktioniert.
Udo, nein, kein Monoflop weder ein einmaliges, noch ein retriggerbares,
sondern nur ein Tastendruck, der um eine einstellbare Zeit verzögert,
eine LED einschaltet und die auch nach Ablauf der eingestellten Zeit an
bleibt, wenn die Taste über diese Zeit hinaus gedrückt bleibt.