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

[Atmega8] [Bascom] -równoczesne naciśnięcie 2 przycisków

aw_ew 08 Wrz 2009 20:56 3167 16
REKLAMA
  • #1 6996294
    aw_ew
    Poziom 11  
    Witam!
    Jak w bascomie sprawdzić, czy naciśnięcie dwóch przycisków nastąpiło równocześnie lub prawie równocześnie (maksymalna różnica to 300 ms)?
  • REKLAMA
  • #2 6996331
    mirekk36
    Poziom 42  
    300ms to dla procesora taktowanego nwet częstotliwością tylko 1MHz - to prawie wieczność - więc napisanie byle jakiej nawet procedury na takie sprawdzenie nie powinno sprawić ci kłopotu - szczególnie gdy zajrzysz do HELPA Bascoma
  • #3 6996388
    nouki
    Poziom 25  
    Witam

    równocześnie: If p1=0 and p2=0 then......

    aw_ew napisał:
    Jak w bascomie sprawdzić, czy naciśnięcie dwóch przycisków nastąpiło równocześnie lub ...


    Ja zrozumiałem tak:)
  • REKLAMA
  • #4 6996436
    aw_ew
    Poziom 11  
    nouki napisał:
    Witam

    równocześnie: If p1=0 and p2=0 then......


    Nie o to mi chodzi, powyższy warunek sprawdzi czy są naciśnięte dwa przyciski ale nie to, czy zostały naciśnięte w tym samym czasie.
    W moim urządzeniu muszę zastosować tzw. sterowanie dwuręczne, czyli maszyna ma zadziałać po naciśnięciu obydwu przycisków, jeżeli zwłoka pomiędzy ich naciśnięciem będzie większa niż te 300 ms to maszyna ma nie ruszyć. Ma to uniemożliwić zblokowanie jednego z przycisków (na popularną zapałkę) i operowanie tylko tym drugim.

    Do mirekk36, może jakaś podpowiedź?
  • #5 6996512
    _Robak_
    Poziom 33  
    Dwustart ;)
    Ja bym zrobil tak... Po wcisnieciu przycisku ustawiasz flage ktora kasujesz po 300ms, wcisniecie drugiego przycisku zadziala tylko wtedy jak flaga bedzie ustawiona. A zeby ponownie ustawic flage przycisk wczesniej wcisniety musi byc zwolniony, znaczy to tyle ze trzymanie przycisku nie moze powodowac ciaglego wlaczania licznika odliczajacego 300ms. Mozesz wykorzystac do tego inna zmienna :)
  • #6 6996673
    nouki
    Poziom 25  
    A co spowoduje zablokowanie 2 przycisków?

    Wnioskuje że jest to forma jakiejś prasy...

    Wciśnięcie pierwszego czeka na wciśnięcie drugiego maszynka rusza a ręce można już podkładać.

    Przyciski powinny być moim zdaniem troszkę inaczej tzn:
    Naciskamy (dwa na raz lub 1 i trzymamy i naciskamy drugi) trzymamy nim osłona nie opadnie wtedy można puścić. By maszyna zadziałała ponownie muszą być zwolnione dwa i tak w koło.
  • #7 6996752
    aw_ew
    Poziom 11  
    Jest to maszyna do cięcia materiału. Aby maszyna ruszyła obydwa przyciski mają być wciśnięte i przytrzymane w tym stanie do końca obcinania. Wcześniejsze puszczenie któregokolwiek spowoduje natychmiastowe zatrzymanie noża.
  • REKLAMA
  • #8 6996765
    kordirko
    Poziom 22  
    Dawno temu zrobiłem układ w którym uruchamiało się jakąś funkcję przez 2 przyciski na raz.
    Dałem mu max. czas 0,3 sekundy między jednym przyciskiem a drugim.
    W praktyce okazało się że wciśnięcie dwóch przycisków na raz w odstępie
    0,3 sekundy to nie lada wyczyn ;) Udawało mi się w 50% przypadków,
    w pozostałych 50% układ wykrywał tylko jeden przycisk.
    Potem z tego pomysłu zupełnie zrezygnowałem, bo po naciśnięciu pojedynczego przycisku układ "czekał" te 0,3 sekundy,
    a taka zwłoka jest zauważalna i strasznie denerwująca,
    szczególnie jak ten przycisk trzeba było np. nacisnąć 5 razy pod rząd.
    Ostatecznie dodałem dodatkowy przycisk, i wszystkie przyciski reagowały od razu, bez czekania.
  • REKLAMA
  • #9 7001154
    wader_669
    Poziom 28  
    
    Declare Sub Instrukcje
    
    do
    If Przycisk1 = 0 Then
       Waitms 30
       If Przycisk1 = 0 Then                                    ' gdy nadal jest wcisniety
    
       waitms 270
       If Przycisk2 = 0 Then
       Call Instrukcje
       End If
    
       End If
    
    Elseif Przycisk2 = 0 Then
       Waitms 30
       If Przycisk 2 = 0 Then                                   ' gdy nadal jest wcisniety
    
       Waitms 270
       If Przycisk1 = 0 Then
       Call Instrukcje
       End If
    
       End If
    End If
    
    Loop : End
    
    Sub Instrukcje
    'instrukcje
    End Sub
    


    Jak ktos ma lepszy kod prosze pisac
  • #10 7001247
    wojnar
    Poziom 17  
    aw_ew napisał:
    Jest to maszyna do cięcia materiału. Aby maszyna ruszyła obydwa przyciski mają być wciśnięte i przytrzymane w tym stanie do końca obcinania. Wcześniejsze puszczenie któregokolwiek spowoduje natychmiastowe zatrzymanie noża.

    Do takiej funkcji muszą wystarczyć dwa przyciski połączone szeregowo.
    Naciśnięcie tylko jednego z nich maszynę nie spuści a puszczenie któregokolwiek z nich ją zatrzyma :D .
  • #11 7001705
    nouki
    Poziom 25  
    Pytałem się wcześniej. A jak przyciski są zwarte na stałe? Uwzględniasz to?

    Osobiście zastosował bym przycisk ze stykiem No i Nc i sprawdzał stany przed i po operacji.

    W tego typu maszynach raczej stosuje się bariery zaporowe ze względu na bezpieczeństwo innych ludzi.
  • #12 7002924
    aw_ew
    Poziom 11  
    Powyższy kod będzie działał odwrotnie - nie pozwoli załączyć maszyny przez 300ms.
    W grę wchodzi tylko takie sterowanie i tego się trzymam.
  • #13 7003700
    wader_669
    Poziom 28  
    No.... nie opisales dokladnie, ze procesor ma wykonywac w tych 300ms dalesz instrukcje. To zrob to na timerze z ustwianiem flagi i tyle

    Chyba, ze chcesz zeby procek nie czekal tych 300ms na wylaczenie maszyny. Wtedy taki kod powinien dzialc:
    
    Declare Sub Instrukcje
    dim i as word
    
    do
    If Przycisk1 = 0 Then
       Waitms 40                                                'mozna to ominac
       If Przycisk1 = 0 Then                                    ' gdy nadal jest wcisniety
    
    for i=0 to 269
       waitms 1
       If Przycisk2 = 0 Then
       Call Instrukcje
       exit for
       End If
    next i
    
       End If
    
    Elseif Przycisk2 = 0 Then
    ......
    
    .... 'i analogicznie
    
  • #14 7004072
    aw_ew
    Poziom 11  
    Próbuję właśnie na timerze i fladze, ale nie działa tak jak chciałem. Powinno być tak, że po naciśnięciu dowolngo przycisku rusza timer i ustawia flagę B na 1. Jeżeli w czasie odliczania nacisnę drugi przycisk, to następuje start. I tak jest. Problem w tym, że gdy trzymam wciśnięty jeden przycisk i poczekam na skończenie odliczania ( B ustawia się na 0), naciśnięcie drugiego z przycisk znów uruchamia timer i ustawia B na 1, co powoduje start.
    Wklejam to co "spłodziłem".


    
    
    
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
    
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    Config Pind.4 = Input
    Config Pind.7 = Input                                       '
    Portd.4 = 1
    Portd.7 = 1
    Portc.2 = 1
    Portc.3 = 1
    
    
    Lewy Alias Pind.4
    Prawy Alias Pind.7
    
    Dim Flaga As Byte
    Dim B As Byte                                               ' zmienna pomocnicza ustawiana na 1 podczas odliczania przez Timer0
    
    
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Odmierz1s
    
    Enable Interrupts
    
    
    B = 0
    
    Cursor Off
    Cls
    
    
    
    Do
    
    '------wyświetla stany flag na LCD, pomocniczo oczywiście -----
    Locate 1 , 1
    Lcd "   "
    Locate 1 , 1
    Lcd Flaga
    Locate 1 , 16
    Lcd B
    Locate 2 , 1
    Lcd Lewy
    Locate 2 , 16
    Lcd Prawy
    '-------------------------------------------------------------
    Debounce Lewy , 0 , Przycisk , Sub
    Debounce Prawy , 0 , Przycisk , Sub
    
    If Lewy = 1 And Prawy = 1 Then
       Gosub Wylacz
    End If
    
    Loop
    End
    
    
    
    Przycisk:
    Enable Timer0
          If Prawy = 0 And B = 1 And Lewy = 0 Then              ' tutaj mam problem
              Gosub Wlacz
              Else
              Gosub Wylacz
          End If
    Return
    
    
    
    
    Odmierz1s:
    B = 1
    Load Timer0 = 250
    Incr Flaga
      If Flaga = 125 Then
         Flaga = 0
         B = 0
         Disable Timer0
      End If
    Return
    
    
    
    Wylacz:                                                     'stop obcinania
    Reset Portc.3
    Set Portc.2
    Return
    
    Wlacz:                                                      'start obcinania
    Set Portc.3
    Reset Portc.2
    Return
    
    
    
    
    
  • #16 7082106
    aw_ew
    Poziom 11  
    Rozwiązałem to tak:

    
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    Config Pind.4 = Input
    Config Pind.7 = Input
                                       '
    Portd.4 = 1
    Portd.7 = 1
    Portc.2 = 1
    Portc.3 = 1
    Lewy Alias Pind.4
    Prawy Alias Pind.7
    
    Dim Flaga As Byte
    Dim B As Byte
    Dim C As Byte
    
    Config Timer0 = Timer , Prescale = 256
    On Timer0 Odmierz1s
    Enable Interrupts
    
    Do
    If Lewy = 0 Or Prawy = 0 Then
       If C = 1 Then
          Gosub Wylacz
       Elseif C = 0 Then
          Enable Timer0
          Gosub Dwureczne
       End If
    Elseif Lewy = 1 Or Prawy = 1 Then
       Disable Timer0
       Flaga = 0
       C = 0
       Gosub Wylacz
    End If
    
    Loop
    End
    
    
    Odmierz1s:
    B = 1
    Load Timer0 = 250
    Incr Flaga
      If Flaga = 125 Then
         Flaga = 0
         B = 0
         C = 1
         Disable Timer0
      End If
    Return
    
    
    Wylacz:                                                     'stop obcinania
    Reset Portc.3
    Set Portc.2
    Return
    
    
    Wlacz:                                                      'start obcinania
    Do
    If Lewy = 1 Or Prawy = 1 Then
       Return
       Else
       Set Portc.3
       Reset Portc.2
    End If
    Loop
    Return
    
    
    Dwureczne:
    If Lewy = 0 And Prawy = 0 And B = 1 Then
    C = 0
    Gosub Wlacz
    End If
    Return
    
    
REKLAMA