Bascom Länge eines Tastendrucks messen

schadeng

Neues Mitglied
12. Mai 2012
14
0
1
45
Sprachen
Hallo, ich mal wieder :)
Ich hoffe, dass ich bald auch mal jemandem helfen kann und nicht nur immer Hilfe benötige ;-)
Aber gut, das wird schon!

Ich versuche die Länge eines Tastendrucks zu messen. Dies muss nicht präziese geschehen. Im Prinzip reicht es zu wissen, ob der Taster länger oder kürzer als 2 Sekunden gedrückt wurde. Entprellt wird er über einen Kondensator parallel zu ihm (RC-Glied). (Wie groß sollte der Kondesator und der Widerstand sein?) Weiter ist es auch egal, ob das Programm beim Drücken des Tasters stehen bleibt.

Ein kleines Stück Code in Bascom:

Code:
Do
  If Taster_hoch = 0 Then
    Taster_drueck_dauer_ist = 0
    While Taster_hoch = 0 Or Taster_drueck_dauer_ist < Taster_drueck_dauer_soll
      Taster_drueck_dauer_ist = Taster_drueck_dauer_ist + 1
      Waitms 10
    Wend

    ' Der Taster wurde gedrückt und gehalten bis Taster_drueck_dauer_soll
    If Taster_drueck_dauer_ist => Taster_drueck_dauer_soll Then
      ' Mach was tolles
   Else
      ' Mach was anderes tolles
   End If 
Loop

Ich behaupte mal, dass das funktioniert, aber ist es auch schön?
Wie müsste mann es machen, wenn das Programm dabei nicht stehen bleiben dürfte?

Grüße und besten Dank!
 
Hi,

also wenn es nicht stehenbleiben dürfte dann würde ich es folgendermaßen machen ...
1. Zwei Flags definieren (Taster gedrückt + Zustand des Taster bei der letzten Abfrage)
2. Eine Zählvariable definieren (zB 8 Bit)
3. Einen Timer laufen lassen der regelmäßig Interrupts auslöst
4. Eine Int-Serviceroutine (ISR) die den Taster abfragt und für ein paar weitere Kleinigkeiten

Also den Timer alle paar zig Millisekunden einen Int auslösen lassen.

Dann in der ISR abfragen wie der Tasterstand jetzt ist.
Den aktuellen Stand mit dem letzten vergleichen.
Bei unterschiedlichem Zustand die Zählvariable auf 0 (0sec gedrückt/losgelassen)
Bei gleichem Zustand hat sich nichts geändert und darum die Zählvariable +1 (weitere x msec gedrückt/losgelassen)
den aktuellen Zustand einmal für den nächsten Durchlauf im Flag merken
und den aktuellen Zustand als "Taster gedrückt/losgelassen) im anderen Flag für die anderen Programmteile eintragen.

So sollte es laufen ;)

Gruß
Dino
 
Hi
Wen's nicht Bascom wär.... :agree:
Also klar... einen Zeittakt in der ISR vom Timer generieren
einen Zeitzähler
resetten, wenn Taster gedrückt wird und vorher nicht gedrückt war (Flanke)
zählen solange gedrückt ist
Auch hier wieder die Reihenfolge in der Programmschleife
Eingänge lesen
Verarbeiten
Ausgeben

Reset ist:
alter Zustand ""0 und neuer Zustand "1" dann
Reset
Alt = Neu


zählen ist
Zeittakt = 1
Taster gedrückt dann
Inc Zähler
Reset Zeittakt

Zeittakt wird in der ISR gesetzt.

In Assembler kann ich's umsetzen :dirol:, aber bei Basic fehlen mir die Befehle.... :eek:
Gruß oldmax
 
okay, Danke!
Mein Ansatz ist also im Grunde richtig. Ich dachte, da dass je eher "Normal" ist gäbe es evt. eine fertige Routine in Bascom oder sogar im Controller

Aber gut!
und was agt ihr zu dem RC-Glied? Welche Werte nehmt ihr da üblicher weise?

Ich dachte mir das so:
102210.JPG


Grüße
Oliver
 
Hi
Nun, ich selbst entprelle Kontakteingaben softwaremäßig. Aber vielleicht hilft dir die Beschaltung vom Pollin-Board. Da sind die Taster nach VCC geschaltet mit einem Pull-Down von 33 K und einem Kondensator von 330 nF parallel.
Gruß oldmax
 
Aber vielleicht hilft dir die Beschaltung vom Pollin-Board. Da sind die Taster nach VCC geschaltet mit einem Pull-Down von 33 K und einem Kondensator von 330 nF parallel.
und weil der Lehrling bei Pollin so einen Mist verzapft hat, machen das jetzt alle brav nach.
Kondensator parallel zum Taster ist grober Unfug, das ruiniert die Kontakte und bringt ordentlich Spikes auf die Versorgung.

SickBoy
 
Hi SickyBoy
Ist ja ungemein hilfreich, deine Antwort.....
Aber wenn du es besser weißt: die Frage nach einer Hardware-Lösung, dann nur heraus damit. Wird schon nicht gegen Patentrechte verstoßen. Übrigends: Entprellen softwaremäßig ist keine Kunst, nur ich hab mit Bascom nix am Hut. Wär ja mal ein Vorschlag, wenn du da vielleicht was weißt....?
Gruß oldmax
 
Hallo,

das leidige Kondensator, Taster, Widerstands-Thema :p

Also die 4,7kOhm sind eigentlich viel zu klein. Die kannst du gefahrlos schonmal auf 47kOhm erhöhen. So ein Eingang muß keine Milliamperes haben. Da reicht auch wesentlich weniger. Der PullUp ist aber auch intern per Software schaltbar. Dann kann man sich den externen Widerstand sparen.

Der Kondensator zum entprellen ... naja ... Bei den 4,7kOhm würde da dann bei jedem loslassen der Taste etwas über 1mA fließen. Das macht nix. Das könnte ja auch ne LED sein. Bei 47kOhm sind es noch weniger. Das Problem ist allerdings der Tastendruck (das Schließen des Kontaktes) und damit der Kurzschluß des Kondensators über den Taster. Selbst bei 100nF reicht der Strom um empfindliche Taster mit der Zeit zu zerstören. Bei Incrementalgebern würde ich das auf keinen Fall machen. Das wäre der sichere frühe Tod der Kontakte. Da würde ich eher noch nen 100 Ohm in Reihe zum 100nF legen damit der Strom über den Taster nicht ganz so stark ist. Dann hast du kurzzeitig mal 50mA Kurzschlußstrom (5V im Kondensator über 100 Ohm). Das würde ich als vertretbar ansehen.

Das Problem an der Pollin-Schaltung ist das der Kondensator parallel zum Pulldown nach GND liegt. Er wird also über den Taster direkt im "Kurzschluß" von den 5V (Vcc) geladen und bringt damit die Betriebsspannung zum einbrechen. Die Schaltung ist wirklich der totale Murks. (Ich hab grad nochmal schnell im Schaltplan nachgesehen).

Also mach mal aus den 4,7kOhm den 10fachen Wert => 47kOhm
dann in Reihe zum Kondensator nen 100 Ohm
dann ist das so OK. Es entprellt dann ein wenig in Hardware und die Ströme sind überall im grünen Bereich.
Die Zeitkonstante (t=R*C) würde dann mit 47k und 0,1µF etwa 4,7ms ergeben. Das sollte die größten Preller der Tasten entsorgen. Ich würde aber nicht davon ausgehen dann es dann wirklich richtig entprellt ist.

EDIT: was gefunden ...wikipedia - Prellen

Gruß
Dino
 
Hallo Oliver!

Was mir spontan noch einfällt ist:
SYSEC()
und dazu noch
SYSSECELAPSED()

Schau dir die Befehle in der BASCOM-Hilfe dioch mal an.

Letztlich entfällt damit das "manuelle" Zählen von einem Punkt zum Nächsten.

Vielleicht hilft es dir ja weiter. :wink:


Grüße,
Cassio
 
Hallo,

das leidige Kondensator, Taster, Widerstands-Thema :p

Also die 4,7kOhm sind eigentlich viel zu klein. Die kannst du gefahrlos schonmal auf 47kOhm erhöhen. So ein Eingang muß keine Milliamperes haben. Da reicht auch wesentlich weniger. Der PullUp ist aber auch intern per Software schaltbar. Dann kann man sich den externen Widerstand sparen.

Der Kondensator zum entprellen ... naja ... Bei den 4,7kOhm würde da dann bei jedem loslassen der Taste etwas über 1mA fließen. Das macht nix. Das könnte ja auch ne LED sein. Bei 47kOhm sind es noch weniger. Das Problem ist allerdings der Tastendruck (das Schließen des Kontaktes) und damit der Kurzschluß des Kondensators über den Taster. Selbst bei 100nF reicht der Strom um empfindliche Taster mit der Zeit zu zerstören. Bei Incrementalgebern würde ich das auf keinen Fall machen. Das wäre der sichere frühe Tod der Kontakte. Da würde ich eher noch nen 100 Ohm in Reihe zum 100nF legen damit der Strom über den Taster nicht ganz so stark ist. Dann hast du kurzzeitig mal 50mA Kurzschlußstrom (5V im Kondensator über 100 Ohm). Das würde ich als vertretbar ansehen.

Das Problem an der Pollin-Schaltung ist das der Kondensator parallel zum Pulldown nach GND liegt. Er wird also über den Taster direkt im "Kurzschluß" von den 5V (Vcc) geladen und bringt damit die Betriebsspannung zum einbrechen. Die Schaltung ist wirklich der totale Murks. (Ich hab grad nochmal schnell im Schaltplan nachgesehen).

Also mach mal aus den 4,7kOhm den 10fachen Wert => 47kOhm
dann in Reihe zum Kondensator nen 100 Ohm
dann ist das so OK. Es entprellt dann ein wenig in Hardware und die Ströme sind überall im grünen Bereich.
Die Zeitkonstante (t=R*C) würde dann mit 47k und 0,1µF etwa 4,7ms ergeben. Das sollte die größten Preller der Tasten entsorgen. Ich würde aber nicht davon ausgehen dann es dann wirklich richtig entprellt ist.

EDIT: was gefunden ...wikipedia - Prellen

Gruß
Dino

Auf wie viel Ohm sollte ich denn maximal erhöhen? Ab wann wirds ungünstig?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)