-
        

+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Anfängerproblem Tastenauswertung

  1. #1
    Thomas U.
    Gast

    Anfängerproblem Tastenauswertung

    Anzeige

    Hallo,

    ich will eine Byte-Variable per Tastendruck um jeweils 1 erhöhen. Also muss ich, um den Wert um 100 zu erhöhen 100 mal den Taster drücken – das will ich aber nicht.

    Nun möchte ich zusätzlich, dass, wenn der Taster länger als z.B. 3 sec gedrückt bleibt, sich die Variable in z.B. 10er-Schritten erhöht. Mein Problem liegt in der Auswertung des 3 sec – Tastendruck.

    Da ich den einfachen Tastendruck mit Debounce auswerte, werde ich die 3 sec-Auswertung
    wohl innerhalb der Debounce-Sub machen müssen. Nur wie mache ich die Anweisung, daß Port.x für min. 3 sec auf low sein soll, um in 10er Schritten zu erhöhen.


    Gruss, Thomas

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    Hi

    Code:
    $regfile = "4433def.dat"
    $crystal = 7372800
    
    const inter1=1
    const inter2=10
    
    Dim Intervall As Word , Temp As Byte
    
    Do
       intervall=inter1
       gosub buttons
       While Button = 1
          gosub buttons
          Incr Temp
          If Temp > 3 Then Intervall = Inter2
          for i = 1 to intervall
             incr bytevariable
          next
          Waitms 1000
       Wend
    Loop
    
    butan:
       Button=1
    return
    
    butaus:
       Button=0
    return
    
    buttons:
       Debounce M , 0 , butan , Sub
       Debounce M , 1 , butaus , Sub
    Return
    Inter1=Konstante, mit der du die Schritte bis zum umschalten auf zwei einstellen kannst (in deinem Beipiel 1 Schritt pro Sek.)

    Inter2=Konstante, mit der du die Schritte nach dem umschalten einstellen kannst (in deinem Beipiel 10 Schritte pro Sek.)


    Ich hoffe dir konnte das helfen...
    Habs zwar nicht getestet, müsste aber funktionieren

    MfG
    Martin

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    50
    Beiträge
    576
    Hallo

    Falls es jemand interessiert

    Habe obigen Code ausprobiert.
    Funktioniert aber nicht so ganz .
    Habe mich damit ein bisschen gespielt und das ist jetzt rausgekommen:
    Eine Taste zaehlt mit Debounce rauf und beim länger halten, ab einen Wert von 10* Einer, zaehlt er dann die Zehner statt die Einer rauf..
    (Ausgabe auf einem LCD)
    Code:
     '-------- Debounce und Zählen mit verschiedenen Längen --------------
     '-------- zaehlt bei zweiter Stelle schneller           --------------
    
    
     $regfile = "m8def.dat"
     $crystal = 8000000
    
     Config Lcd = 16 * 2
     Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
     Config Lcdbus = 4
     Config Lcdmode = Port
    
     Config Pind.7 = Input
     Config Pind.6 = Input
     Portd = 255                                                ' Port d auf High
     Config Debounce = 30                                       ' Tastenentbrellung mit 30ms
    
    
    Dim Zaehler As Word
    Dim Taste As Byte
    Dim Zaehlweite As Byte
    Dim Mitzaehlen As Byte
    Dim I As Byte
    
    Const Normalzaehlen = 1
    Const Schnellerzaehlen = 10
    Const Nochschnellerzaehlen = 100
    Zaehlweite = Normalzaehlen
    Zaehler = 0
    Mitzaehlen = 0
    Cls
    
    
    Do
    
    Gosub Lesen
       While Taste = 1
          Incr Mitzaehlen                                       'Mitzaehler +1
             If Mitzaehlen > 10 Then Zaehlweite = Zaehlweite + 10
                For I = 1 To Zaehlweite
                 Incr Zaehler
                Next
          Waitms 200
          Cls
          Locate 1 , 1
          Lcd Zaehler
          Gosub Lesen
       Wend
    Mitzaehlen = 0
    Zaehlweite = Normalzaehlen
    Locate 1 , 1
    Lcd Zaehler
    
    Loop
    
    End
    
    Ein:
       Taste = 1
    Return
    
    Aus:
       Taste = 0
    Return
    
    Lesen:
       Debounce Pind.7 , 0 , Ein , Sub
       Debounce Pind.7 , 1 , Aus , Sub
    Return

    und hier eine Verison, wo er die Zaehner und dann die Hunderter schneller zaehlt.

    Code:
    '-------- Debounce und Zählen mit verschiedenen Längen --------------
     '-------- zaehlt 2 und dann 3 Stellen schneller.       --------------
    
     $regfile = "m8def.dat"
     $crystal = 8000000
    
     Config Lcd = 16 * 2
     Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
     Config Lcdbus = 4
     Config Lcdmode = Port
    
     Config Pind.7 = Input
     Config Pind.6 = Input
     Portd = 255                                                ' Port d auf High
     Config Debounce = 30                                       ' Tastenentbrellung mit 30ms
    
    
    Dim Zaehler As Word
    Dim Taste As Byte
    Dim Zaehlweite As Byte
    Dim Mitzaehlen As Byte
    Dim I As Byte
    
    Const Normalzaehlen = 1
    Const Schnellerzaehlen = 10
    Const Nochschnellerzaehlen = 100
    Zaehlweite = Normalzaehlen
    Zaehler = 0
    Mitzaehlen = 0
    Cls
    
    
    Do
    
    Gosub Lesen
       While Taste = 1
          Incr Mitzaehlen                                       'Mitzaehler +1
             If Mitzaehlen > 10 And Mitzaehlen < 101 Then
                 Zaehlweite = Schnellerzaehlen
                 Mitzaehlen = Mitzaehlen + 10
                End If
    
             If Mitzaehlen > 100 Then Zaehlweite = Nochschnellerzaehlen
    
                For I = 1 To Zaehlweite
                 Incr Zaehler
                Next
          Waitms 200
          Cls
          Locate 1 , 1
          Lcd Zaehler
          Gosub Lesen
       Wend
    Mitzaehlen = 0
    Zaehlweite = Normalzaehlen
    Locate 1 , 1
    Lcd Zaehler
    
    Loop
    
    End
    
    Ein:
       Taste = 1
    Return
    
    Aus:
       Taste = 0
    Return
    
    Lesen:
       Debounce Pind.7 , 0 , Ein , Sub
       Debounce Pind.7 , 1 , Aus , Sub
    Return

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Ich will mich nicht einmischen, aber in der Hilfe zu Debounce steht:

    "When DEBOUNCE is executed again, the state of the switch must have gone back in the original position before it can perform another branch. So if you are waiting for a pin to go low, and the pin goes low, the pin must change to high, before a new low level will result in another branch."

    Somit scheidet ein längeres betätigen der Taste mit Debounce wohl aus.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    die position wird in meinem proggi ja gespeichert und ab dem sprung ins hauptprogramm ist es erstmal egal was für eine stellung der switch hat BIS DER SCHALTER WIEDER LOSGELASSEN WIRD (siehe butaus)

    im übrigen funktioniert mein code eigentlich wunderbar

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    50
    Beiträge
    576
    Hallo albundy
    Ja, so dachte ich zuerst auch, bis ich den Code von x-ryder probiert habe
    Aber in der Hilfe steht auch, dass Debounce das Programm nicht anhält..

    @x-ryder
    Sorry, wollte dich nicht blosstellen

    Ohne deinen Code hätte ich es nicht gekonnt..

    Bei dir sind aber die Variablen nicht alle definiert (dim...
    und darum funktionierte auch dein Code bei mir nicht richtig.

    und bei mir habe ich nach WEND die Variable wieder zurückgesetzt, damit man wieder mit Einer zählen kann.
    Erst beim länger drücken, zählt er dann wieder mit den Zehner.

+ Antworten

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •