Forum: Mikrocontroller und Digitale Elektronik Bascom Einschaltverzögerung, einstellbar, Verhalten?


von Bernd (Gast)


Lesenswert?

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
23
     If Taster = 1 Then
24
     Led = 0
25
     End If
26
27
     'An-Verz
28
     If Taster = 0 Then
29
     Wait Poti
30
     Led = 1
31
     End If
32
Loop
33
34
End

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von SamSon (Gast)


Lesenswert?

Vielleicht währe das eine Lösung:
1
' Hauptschleife
2
Do
3
     Poti = Getadc(7)                    'Wert von ADC1 wird in Variable Poti gespeichert
4
     Debounce Taster , 0 , Verzoegerung  'wenn Taster = 0 springe nach Verzoegerung
5
Loop
6
7
End
8
9
10
Verzoegerung:
11
Wait Poti
12
Led = 1
13
Waitms 250                                'irgend ein Wert der dir passt
14
Led = 0
15
Return

Konnte es jetzt gerade nicht testen, sollte aber funktionieren.

von Bernd (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.htm


Rufus Τ. 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.

von SamSon (Gast)


Lesenswert?

Sorry. Da hab ich wohl was missverstanden.

von Bernd (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.