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] [atmega8][bascom] Jak zaprogramować reakcję na długie wciśnięcie przycisku?

mavi 14 Sty 2011 02:10 2412 5
REKLAMA
  • #1 9003178
    mavi
    Poziom 19  
    Posty: 493
    Ocena: 41
    Witam
    Robie pierwsze kroki w programowaniu w języku bascom. Stanąłem przed problemem zdefiniowania w tym języku pewnych warunkowych komend dla procka atmega8.
    Jeśli ktoś może mnie nakierować to z góry dziękuję.
    O to moje problemy:

    1. Konkretnie chodzi o to by układ reagował np poprzez zapalenie diody led w chwili gdy przycisk podłączony do tego układu jest naciśnięty np. przez 6 sekund.
    Czyli nacisnięcie przycisku przez 2,3 lub 5 sekund nie powoduje reakcji. W chwili gdy czas naciśnięcia przeracza 6 sekundę układ zaczyna realizować komendy z programu.

    2. Przypadek kolejny to sytuacja gdzie układ ma włączoną diodę led, tylko w chwili, gdy przycisk podłączony do układu, jest wciskany np co sekundę. W chwili gdy przestajemy naciskać przycisk, układ po 5 sekundach od ostatniego naciśnięcia przycisku wyłącza diodę led.
  • REKLAMA
  • #2 9003766
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    Witam

    Program jak wiadomo działa w jakiejś pętli. Użyj więc w tej pętli polecenia WAITMS 100 czyli oczekiwanie 100 milisekund. I teraz tak jeśli naciśniesz klawisz (zakładamy, że na porcie panuje wtedy 0 logiczne) i trzymasz go to jakaś zmienna jest inkrementowana co 100 milisekund. Jeśli zmienna ta doliczy do 60 to minie około 6 sekund i wtedy każesz prockowi coś wykonać. Jeśli jednak puścisz klawisz to zmienna ma zostać wyzerowana.

    
    
    Config Pinb.1 = Input : Klawisz1 Alias Pinb.1
    Config Pinb.2 = Input : Klawisz2 Alias Pinb.2
    
    Dim Licznik As Byte
    
    Do
     If Klawisz1 = 0 Then Incr Licznik                             'jeżeli klawisz naciśnięty to inkrementuj zmienna
     If Klawisz1 = 1 Then Licznik = 0                              'jeżeli klawisz puszczony to zmienna zawsze ma wartość 0 i nie ma ryzyka, że jak naciśniesz klawisz dwa razy po 3 sekundy to coś się wykona
     If Licznik > 60 Then WYKONAJ_COS_TAM                 'jeżeli licznik zliczy do 60 (czyli 6 sekund) to wykonaj jakąś procedurę
    Loop
    
    


    Drugi przypadek można rozwiązać analogicznie. Trudno podać gotowe rozwiązanie bo nie wiadomo co dokładnie chcesz zrobić.

    --
    pozdrawiam
  • REKLAMA
  • #3 9004776
    mavi
    Poziom 19  
    Posty: 493
    Ocena: 41
    w drugim moim problemie chodzi o to, że moduł z atmegą, załączać się będzie w chwili gdy inne urządzenie w chwili włączenia się, poprzez przekaźnik poda napięcie na styki przekaźnika podłączonego do atmegi.
    Od tego momentu urządzenie załączające atmege będzie działać przez jakiś tam czas. O fakcie tego działania będzie mówić dioda led, która będzie mrugać w tym urządzeniu mniej więcej co sekundę.
    W chwili wyłączenia się tego urządzenia, dioda led przestanie mrugać i będzie świecić się jednostajnie. Chodzi o to by atmega podłączona do tej mrugającej diody wiedziała kiedy przestanie ona migać. W chwili gdy dioda przestanie migać atmega powinna zakończyć wszystkie swoje procesy i wrócić na początek programu.

    A co do powyższej komendy to wpisałem i efekt mam taki, że dioda zapala mi się zaraz po wciśnięciu przycisku i nie czeka 6 sekund. Wydaje mi się, że przeniosłem komendy zgodnie z przykładem.:|
  • REKLAMA
  • REKLAMA
  • #5 9093175
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    Witam

    Do pętli wsadź instrukcję "waitms 100" Zapomniałem o tym. Napewno będzie działać jak chcesz.

    --
    pozdrawiam
  • #6 9096257
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2763
    Zerknij na ten fragment kodu z pod linka

    https://www.elektroda.pl/rtvforum/topic1828017-60.html#8977906

    może Ci się do czegoś przyda.
REKLAMA