logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[bascom] obsługa krótkiego i długiego naciśnięcia przycisku

techno-mp3 07 Wrz 2010 09:43 3435 7
REKLAMA
  • #1 8484559
    techno-mp3
    Poziom 12  
    Witam serdecznie, mam problem z którym walczę już dość długo.
    W mikrokontrolery bawię się od dwóch tygodni.
    Problem polega na stworzeniu kodu do obsługi jednego przycisku:
    Krótkie naciśnięcie - program robi coś tam
    Długie naciśnięcie - program robi coś innego
    Chciałem zbudować proste menu wykorzystując jednego switcha.
    poniżej kod:

    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
    Config Lcd = 16 * 2
    Config Portd.1 = Output
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Pinb.0 = Input
    Config Debounce = 50
    Reset Portd.1
    Reset Portd.2
    Reset Portd.3
    Reset Portd.4
    Reset Pinb.0
    Dim A As Byte
    Dim B As Byte
    
    
    
    A = 0
    Pocz:
    Debounce Pinb.0 , 0 , Dodaj
    Debounce Pinb.0 , 1 , Zeruj
    
    If A = 1 Then Gosub Spr
    
    Goto Pocz
    
    Dodaj:
    Incr A
    If A = 10 Then Gosub Dlugie
    Goto Pocz
    
    Spr:
    Debounce Pinb.0 , 0 , Pocz
    
    Cls
    Lcd "krotkie"
    Wait 1
    Cls
    A = 0
    Return
    
    Zeruj:
    A = 0
    Goto Pocz
    
    Dlugie:
    Cls
    Lcd "dlugie"
    Wait 2
    Cls
    Return
    End
    


    Procek Atmega 8, ale to chyba niema znaczenia, switch podciągnięty do +5V.

    Niestety nie działa, może ktoś już próbował coś podobnego zrobić?
  • REKLAMA
  • #2 8484596
    Kuniarz
    Moderator Projektowanie
    1. brakuje set portb.0 - tą linie musisz mieć podciągniętą do plusa
    2. odliczenie 10ciu jednostek zwiększenia zmiennej A to i tak ułamek sekundy. Jeśli chcesz liczyć dłuższe odstępy, zastosuj zmienną Word i wówczas masz liczenie do 65535
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #3 8484670
    arktik1
    Poziom 27  
    myślę że tak:
    
    A=0
    
    Do
    Debounce Pinb.0 , 0 , MENU
    .....
    .....
    
    if A=1 then
    ......
    ....
    endif
    if A=2 then
    .....
    .....
    endif
    
    LOOP
    
    Menu:
    Cls
    Lcd "krotkie"
    A=1
    wait1
    if pinb.0=1 then
    return
    endif
    Cls
    Lcd "Dlugie"
    A=2
    wait1
    return
    
  • REKLAMA
  • #4 8484887
    Freddy
    Poziom 43  
    arktik1 napisał:
    myślę że tak:
    
    A=0
    
    Do
    Debounce Pinb.0 , 0 , MENU
    .....
    .....
    
    if A=1 then
    ......
    ....
    endif
    if A=2 then
    .....
    .....
    endif
    
    LOOP
    
    Menu:
    Cls
    Lcd "krotkie"
    A=1
    wait1
    if pinb.0=1 then
    return
    endif
    Cls
    Lcd "Dlugie"
    A=2
    wait1
    return
    

    Co to jest "wait1" ? Procedura ?
    Jeśli chodzi o "wait 1" to złe rozwiązanie.
  • REKLAMA
  • #5 8484945
    arktik1
    Poziom 27  
    A co jest złego w WAIT i włączaniu dwóch MENU?
    Nie rozumiem?
  • #6 8484975
    techno-mp3
    Poziom 12  
    niestety w obu kodach brakuje czegoś co by dodawało cokolwiek do zmiennej A, więc nie przyjmie ona nigdy wartości 1 lub 2 skoro na początku się ją zeruje.

    Jesli chodzi o podciągnięcie programowe to nie działa (dałem rezystor zewnętrzny).

    Próbowałem tak i działa:
    
    config debounce = 50 ' 50ms dla przycisku
    dim a as byte ' deklaracja zmiennej
    a=0 ' zerowanie zmiennej
    
    do
    debounce pinb.0, 0 , dodaj sub  ' sprawdź czy wciśnięty, jeśli tak to idz do "dodaj"
    if a = 1 then gosub krotkie
    debounce pinb.0, 1 , zeruj sub ' użytkownik puścił przycisk - zerujemy zmienną
    if a = 50 then gosub dlugie ' 50*50 ms uzytkownik trzymał przycisk
    loop
    
    dodaj:
    incr a
    return
    
    krotkie:
    ' tutaj podprogram dla krotkiego trzymania przycisku (wciśnięcia)
    return
    
    zeruj:
    a=0
    return
    
    dlugie:
    ' tutaj podprogram dla dlugiego trzymania przycisku
    return
    
    end
    


    W taki sposób działa, ale zawsze przechodzi przez podprogram "krótkie", bo zmienna musi przyjąć watrość 1, i dopiero nalicza aż do 50 gdy trzymasz przycisk.

    Problem tegoprzycisku wydaję się banalny, ale jednak nie jest.
  • Pomocny post
    #7 8484992
    arktik1
    Poziom 27  
    "niestety w obu kodach brakuje czegoś co by dodawało cokolwiek do zmiennej A, więc nie przyjmie ona nigdy wartości 1 lub 2 skoro na początku się ją zeruje."
    Myślę że jesteś w błędzie.
    To daje A=1
    
    Cls
    Lcd "krotkie"
    A=1
    wait1 
    

    A to:
    
    Cls
    Lcd "dlugie"
    A=2
    wait1
     

    możesz jej nie kasować w ogóle i tak po skoku do MENU będzie ustalona.
    A to:
    
    if A=1 then
    ......
    ....
    endif 
    
    

    powoduje że wykonywany jest program uwarunkowany wartością A.
    W ten sposób możesz zrobić menu do 20, tylko że wtedy musiał byś czekać 20 sekund by włączyć ostatnie.

    Poza tym to zrób tak:
    Config portb = Input
    Portb=&b11111111
    Masz wtedy Piny portu B podciągnięte do +

    Możesz też regulować WAIT.
    Jeśli zdążysz puścić przycisk po np. WAITMS10 to możesz to sobie wpisać zamiast WAIT

    Dlaczego też uparłeś się na naliczanie podczas wciśniętego przycisku?
    Program przecież nie musi wykonywać niczego przy przełączeniach MENU.

    Dodano po 5 [minuty]:

    "Problem tego przycisku wydaję się banalny, ale jednak nie jest."
    Problem jest banalny, tylko trochę inaczej trzeba do niego podejść.
  • #8 8485154
    techno-mp3
    Poziom 12  
    Dziękuje kolego Arktik1, miałem jakiśtam pomysł i brnąłem w złą stronę.

    wstawiam finalny działający kod:

    
    A=0
    
    Do
    Debounce Pinb.0 , 0 , Menu , Sub
    If A = 1 Then Gosub Kr
    If A = 2 Then Gosub Dl
    Loop
    
    Menu:
    Cls
    Lcd "menu 1"
    A=1
    Wait 1
    If Pinb.0 = 1 Then
    return
    endif
    Cls
    Lcd "menu 2"
    A=2
    Wait 1
    Return
    
    Kr:
    Cls
    Lcd "nac. klawisz"
    Waitms 50
    Cls
    Return
    
    Dl:
    Cls
    Lcd "przytrzymales"
    Waitms 50
    Cls
    Return
    
    End
    


    To chyba wszystko. Kod można przerobić na własny użytek w prosty sposób.

    Dziękuje!
REKLAMA