PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster zum Stellen wie bei Digitaluhr u.a.



Millenniumpilot
04.09.2005, 12:42
Hallo Ihr,

im Augenblick habe ich echt keine Idee, wie ich in Bascom einen Taster zum Stellen von Parametern (Uhrzeit, Messwertevorwahl etc) programmieren kann.
Ich möchte dafür nur einen Taster benutzen, der folgendermaßen funktioniert: beim kurzen Betätigen wird ein Wert um 1 erhöht, beim längeren drücken des Tasters wird nach einer kurzen Zeit ein automatischer Repeat dazugeschalten, so das der zu stellende Wert schnell hochzählt. So wie man das halt von vielen Geräten kennt.
Ich suche keinen fertigen Code (wenn den aber jemand hat,... ;-) ) ,
ein kurzer Schubs in die richtige Richtung würde mir schon reichen.
Ich hatte die Idee, über einen zusätzlichen Timer und einer Hilfsvariablen zu schauen, ob der Taster länger als 1s gedrückt worden ist. Aber irgendwie gefällt mir die Idee nicht, dafür einen extra Timer benutzen zu müssen - es sei denn , es geht nicht anders.

Habt Ihr einen Rat für mich?
Gruß Dirk

Marco78
04.09.2005, 14:05
Ich denke es geht ohne Timer.
Erstmal den Tasrer abfragen und eine kurze Zeit warten um ihn zu entprellen. Dann schonmal +1 durchführen. Das wird ja auch jeden Fall gebraucht, egal wie lange er gedrückt wird. Dann eine Sekunde warten und prüfen ob der Taster immer noch gedrückt ist.
Wenn ja, dann GOSUB schnell_zählen Sonst END IF.

Aber das eine Sekunde warten behindert den Programmablauf ggf. In der Zeit kann nichts anderes gemacht werden. (Außer INT auslösen)

Millenniumpilot
04.09.2005, 14:34
Hallo Marco,

also doch mit wieder mit Timer, wegen der 1s - oder?
Ich hatte noch die Idee, auf das Loslassen des Tasters zu testen.
Wenn Zeit H/L -> L/H kleiner 1s, dann 1 Impuls. Eventuell einen Interupteingang benutzen.
Wenn innerhalb 1s nicht losgelassen wurde (kein L/H), dann repeat

Gruß Dirk

PicNick
04.09.2005, 15:04
Alles, was du sagst, < 1 s, > 1 s, etc. hat irgendwas mit Zeit zu tun. Irgendwer muß also irgendwas zählen, da geht's nicht vorbei

Marco78
04.09.2005, 16:23
also doch mit wieder mit Timer, wegen der 1s - oder?
waitms 1000
da wird eine Sekunde nichts gemacht außer abwarten was danach geschehen soll.
Ist übrigens Codesparender als wait 1

Das kannst du aber so nur machen wenn während des stellens keine anderen Operationen ausgeführt werden müssen. Interrupts werden in dieser Zeit dennoch behandelt.

Millenniumpilot
05.09.2005, 11:31
Hallo Marco,

dann müsste ich also alles, außer der Tastaturabfrage in Interuptroutinen auslagern? Also Aktualisierung von Werten im LCD usw.

Gruß Dirk

Marco78
05.09.2005, 17:19
Wenn sowas passieren soll ja.
Dann wäre aber ein externer INT für den Taster und ein Timer evtl doch die bessere Lösung?!

Andree-HB
05.09.2005, 18:20
...hab`s gerade selber vor ein paar Tagen eingebaut, mit zwei Tastern stellt man Variable T vor/zurück :




Dim T As Word
Config Pinc.4 = Input
Config Pinc.3 = Input

do
If Pinc.4 = 0 Then
Waitms 80
If Pinc.4 = 0 Then
Incr T
End If
End If

If Pinc.3 = 0 Then
Waitms 80
If Pinc.3 = 0 Then
Decr T
End If
End If
print T
loop
end

Millenniumpilot
06.09.2005, 09:50
Hallo Andree,

vielen Dank für den Tip. Probiere ich heute Abend gleich mal aus. Ich kann das schlecht abschätzen, aber reichen die 80ms zum rechtzeitigen Loslassen das Tasters nach einer Ziffer aus?

Millenniumpilot
06.09.2005, 19:57
Hallo Andree,

hat funktioniert ;-)
Leider bin schon etwas älter, sprich langsamer, und mußte daher die Verzögerung auf 120ms einstellen.
Nochmals vielen Dank.

Gruß Dirk

hrei
06.09.2005, 21:02
Versehentliche Doublette. Verzeihung.

hrei
06.09.2005, 21:03
Hallo Andree,

hat funktioniert ;-)
Leider bin schon etwas älter, sprich langsamer, und musste daher die Verzögerung auf 120ms einstellen.
Nochmals vielen Dank.

Gruß Dirk

Aaach so... Ich hatte befürchtet, daß Du einen meiner fast in jedem Programm vorhandenen Lösungsansatz von vorn herein ausschließt. Wenn Du Dich auf zwei oder drei Tasten einlassen kannst, dann könnte diese Funktion doch interessant sein:



Function Adjust_value(byval Up_down As Byte, byvalue schritt as byte)
Cls

Adj1:
Locate 2 , 1
Lcd Up_down ; " "
Taste = Analog_key()
If Taste = 32 Then Up_down = Up_down + schritt
If Taste = 33 Then Up_down = Up_down - schritt
If Taste = 10 Then
Adjust_value = Up_down
Exit Sub
End If

Goto Adj1

End Function



Die dazugehörige Tastaturabfrage (hier die klassische Tastatur an einem Analogport) die lustigen Zuordnungen von 10 - 32 - 33 haben ihren Grund einfach darin, daß die von mir häfig eingesetzen IR-Fernbedienungen diesen Code -prgup - prgdwn - ok - liefern und ich nur die Funktion austauschen muss, um umzusteigen) könnte dann so aussehen:



'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Analog_key() As Byte
Local Ws As Word
Analog_key = 255
Start Adc
Ws = Getadc(1)
If Ws < 900 Then
Select Case Ws
Case 0 To 100
Analog_key = 32
Case 400 To 600
Analog_key = 33
Case 650 To 750
Analog_key = 10
End Select
Call Beep_confirm()
End If
Waitms 100
End Function


Die Adjust_value Routine ist flexibel ausgelegt und erlaubt die Angabe einer Schrittweit pro Tastendruck. Das kann ganz nützlich sein, z. B. bei der Einstellung von Variablen von D/A Wandlern, wo man oft in 10ner Schritten voranschreiten möchte.

Eine Veränderung einer Variable via Tasten sähe als Aufruf dann so aus
(am Beispiel der Systemvariablen _min):

_min = adjust_value (_min, 1)

Das Spielchen kann man noch durch Minimum- und Maximumwerte erweitern etc. (entsprechende If Abfrage zum Rücksetzten).

Grüße
Henrik

Millenniumpilot
07.09.2005, 05:02
Hallo Henrik,

schaue ich mir auf alle Fälle heute Abend mal an. Ich wollte sowieso das Display von Pollin 4x27 einsetzen und die daneben befindlichen Tasten benutzen (ich löte dort einfach Kurzhubtaster 3301 auf). Durch die 27 Zeichen habe ich auch einer Seite noch Platz für eine einfache Menüführung. Da passt Dein Tip gerade ;-) Das mit der IR-Fernbedienung ist natürlich auch eine nette Idee. Auf alle Fälle packe ich den Codeschnippsel in meine Sammlung.

Gruß Dirk