- LiTime Speicher und Akkus         
Ergebnis 1 bis 6 von 6

Thema: 3 Sekunden Tastendruck auswerten

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.03.2007
    Beiträge
    64

    3 Sekunden Tastendruck auswerten

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    als Anfänger stelle ich mir die Frage wie ich auswerte ob ein Tastendruck 3 Sekunden lang stattgefunden hat.

    Mit:
    Code:
    main:
    do
    If Taster = 0
    then waitms 3000
    if Taster = 0
    then
    goto schalten
    end if
    end if
    
    schalten: 
    toggle led
    goto main
    funkioniert die Sache ja nicht sauber.

    Dann habe ich mal in der Hilfe geschaut und debounce gefunden:

    Code:
    Config Debounce = 3000
    Do
    Debounce Taster , 0 , Schalten , Sub
    Loop
    
    Schalten:
    toggle led
    return
    die 3000ms werden nicht angenommen. Der Taster wird nur sauber entprellt.


    Meine (hoffentlich nicht nervende Anfänger-) Frage:
    Wie löse ich so etwas, also eine 3S Tasterabfrage elegant?

    Danke für eure Unterstützung!


    Gruß
    Daniel

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.01.2005
    Alter
    51
    Beiträge
    294
    Die Zeit bei Debounce ist quasi zum justieren. Debounce entprellt nur, das hat nichts mit dem zu tun was Du tun willst.

    Du kannst es über Timer und Interrupts lösen.

    Oder Du gehst her und machst ganz billig eine For...next-Schleife, die läßt Du, sagen wir mal 30 mal durchlaufen und jedesmal zwischen der Abfrage wartest Du 100ms.
    Das Gegenteil von "gut" ist "gut gemeint"!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    15.04.2007
    Beiträge
    55
    Hallo
    So z.b.

    main:

    for temp = 1 to 3000
    if taster = 1 then exit
    waitms 1
    next

    toggle led

    exit:goto main
    end

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.01.2007
    Ort
    Deutschland [Bayern]
    Alter
    41
    Beiträge
    125
    @sata ... da wartet die schleife aber immer, bei nicht gedrücktem taster 2 sek. anstat bei gedrücktem taster.

    @meldano
    Du kannst das eigentlich recht simpel machen. Du nutzt eien Schleife, um dein Programm ablaufen zu lassen. In dieser Schleife prüfst du ständig, ob die Taste gedrückt ist, oder nicht. Um nun heraus zu finden, wei lange sie gedrückt ist, reicht es einfach aus, wenn du eine Variable immer dannhoch zählt, wenn der Taster gedrückt ist, und die Variable imer dann auf 0 setzt, wenn der taster los gelassen wurde.

    Du drückst die Taste. Jetzt wird die variable bei jedem durchlauf +1 gerechnet.
    Du läst die Taste los. Jetzt must du prüfen, ob der Wert der Taste geteilt durch den ( Takt minus der Abarbeitungsschritte ) den Wert besitzt, welchen du wünschst zu warten. Wenn dem so ist, kannst du etwas tun, wenn dem nicht so ist, dann nicht.
    Abschliessend setzt du die variable auf 0.

    Dadurch musst du nicht warten, sondern kannst dein Programm standardmässig udn ohne zeitverlust, oder Probleme bei Zeitkritischen Dingen, weiter laufen lassen.


    JimJim
    XUN

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.04.2005
    Ort
    Pforzheim
    Alter
    42
    Beiträge
    163
    @xunwichtig:

    könntest du bitte mal einen beispielcode posten!?
    Vielleicht wird es dann etwas klarer.

    Danke.
    MfG Ich

    -------------------------------------------------------------
    http://www.lorenzschulz.de/Roboter.html

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.03.2007
    Ort
    Titisee - Neustadt
    Alter
    45
    Beiträge
    289
    Also ich habe das auch per Variable gelößt.
    Da es mir eher darum ging das der Schallter nicht zu lange gedrückt sein darf.

    Code:
    Dim T As Word
    
    
    
    
    Main:                                                       'Hauptprogramm
    Do
                                                                'Anfang des Schwimmerschalter
      If Pind.2 = 1 Then                                        'Wenn an Pin 2 von Port D ein high level anliegt..
    
      Portd.5 = 1                                               '...setze Pin 5 von Port D auf High, Pumpe läuft
      T = T + 1
      Waitms 100                                                'Zeit wo die Pumpe an ist
      Else
      Portd.5 = 0                                               '...setze Pin 5 von Port D auf low, Pumpe aus
      T = 0                                                     'Zeit reset
      End If                                                    'Ende der Bedingung
    
       If T > 100 Then
      Gosub Error
      Else
     End If                                                     'Ende der Bedingung
    
    Loop                                                        'zum Anfang der Schleife
    End                                                         'end program
    
    Error:                                                      'Untermenü "Error"
    Do
      Portd.6 = 1                                               'Error LED leuchtet
      Portd.5 = 0                                               '...setze Pin 5 von Port D auf low, Pumpe aus                                            'setzt den Pin 7 von Port D auf low
    Loop
    Also alle 10ms zählt der Zähler T eins hoch wenn der über 100 ist geht er zum Sub.
    Zeiten mu0t hallt umstellen.
    MfG & THX
    Lordcyber
    Alias Michael

Berechtigungen

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

LiFePO4 Speicher Test