Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Attiny13][Bascom] - Sterowanie jednym przyciskiem kilkoma funkcjami.

bbiidduull 25 Wrz 2012 16:15 2826 28
  • #1 25 Wrz 2012 16:15
    bbiidduull
    Poziom 28  

    Witam. Poszukuję pomysłu na sterowanie jednym przyciskiem (docelowo odbiornikiem podczerwieni) zapalaniem diod. Tzn. chodzi mi o coś takiego:

    Cytat:

    Wciskam przycisk
    Zaświeca się 1 dioda
    Wciskam drugi raz
    Zaświeca się dioda 2 a gaśnie 1
    Wciskam trzeci raz
    Zaświeca się dioda 1 i 2
    Wciskam czwarty
    gasną diody 1 i 2


    Napisałem program do tego, ale nie działa prawidłowo. Zliczałem w zmiennej ile razy został wciśnięty przycisk i wykonywałem komendy przypisanym liczbom, na końcu zerowałem zmienną. Może ktoś ma inny pomysł na wykonanie tego?

    0 28
  • Arrow Multisolution Day
  • #3 25 Wrz 2012 18:29
    bbiidduull
    Poziom 28  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #4 25 Wrz 2012 18:34
    Mol
    Poziom 30  

    I na czym polega nieprawidłowe działanie ?

    0
  • #5 25 Wrz 2012 18:40
    Cezary_
    Poziom 16  

    bbiidduull,
    przeanalizuj swój kod, zakładając, że przycisk jest stale naciśnięty - zobaczysz, że co 200ms pętla się wykona. Musisz zrobić coś, by zdarzeniem wyzwalającym działanie była zmiana stanu Pinb.1 z '1' na '0'. Najprościej po wykryciu stanu '0' wstaw pętlę oczekiwania na stan '1' (puszczenie klawisza). Oczywiście do tego dochodzi kwestia eliminacji odbić styków, czyli przynajmniej dwa odczyty tego samego stanu co 20 milisekund.

    0
  • #6 25 Wrz 2012 18:40
    sp3ots
    Poziom 35  

    Witam !
    Cytat:
    .....na końcu zerowałem zmienną.

    Nie ma tego w programie.
    Pozdrawiam. Stefan

    0
  • #7 25 Wrz 2012 18:40
    bbiidduull
    Poziom 28  

    Czasem nie zareaguje na wciśniecie przycisku, po wciśnięciu przycisku potrafi przeskoczyć z I=1 do I=3. Fakt, zapomniałem o zerowaniu I (pisałem program w poście gdyż nie zapisałem sobie go wcześniej).

    0
  • #8 25 Wrz 2012 18:43
    Cezary_
    Poziom 16  

    bbiidduull napisał:
    Czasem nie zareaguje na wciśniecie przycisku, po wciśnięciu przycisku potrafi przeskoczyć z I=1 do I=3.

    Bo tak naprawdę w Twoim programie to nie liczy się ilość wciśnięć, ale czas trzymania. W poprzednim poście napisałem Ci dlaczego tak jest.

    0
  • Arrow Multisolution Day
  • #9 25 Wrz 2012 19:04
    bbiidduull
    Poziom 28  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Cezary czy o to ci chodziło?

    0
  • #10 25 Wrz 2012 19:06
    Mol
    Poziom 30  

    Możesz sobie podłączyć przycisk pod zewnętrzne przerwanie i w programie przerwania na początku zrobić Disable INT0 , wtedy drgania stuku będą chyba wyeliminowane.

    0
  • #11 25 Wrz 2012 19:06
    Cezary_
    Poziom 16  

    bbiidduull,

    możesz spróbować coś takiego:

    zadeklaruj na początku programu jeszcze jedną zmienną 'T'

    Cytat:

    Dim T As Byte


    a na początku swojej pętli głównej (po 'Do') wstaw w kod:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Nie testowałem tego, to tak na szybko napisane, ale jest szansa...
    Edit: poprawiłem błędny warunek końca pętli.

    0
  • #12 25 Wrz 2012 19:10
    bbiidduull
    Poziom 28  

    Muszę cię zmartwić, siebie też. Nie działa.

    0
  • #13 25 Wrz 2012 19:15
    Cezary_
    Poziom 16  

    bbiidduull napisał:
    Cezary czy o to ci chodziło?

    No niezupełnie.
    'Wend' powino być zaraz po 'Waitms 100', a nie na kończu pętli.

    Chodzi o to, by Twoja duża pętla wykonała się, gdy przycisk będzie puszczony i wciśnięty (lub odwrotnie). Program powinien czekać na puszczenie, po puszczeniu powinien czekać na naciśnięcie - czyli na ZMIANĘ stanu przycisku. Dopiero po takiej zmianie stanu powinna być zwiększona zmienna 'I' itd..

    Dodano po 2 [minuty]:

    bbiidduull napisał:
    Muszę cię zmartwić, siebie też. Nie działa.

    No ale jak nie działa? Opisz dokładnie co się dzieje.

    0
  • #14 25 Wrz 2012 19:18
    bbiidduull
    Poziom 28  

    Szaleje cały program, diody mrugają nie tak jak ja chce, na dodatek same.
    Spróbowałem umieścić zliczania ilosci przycisnięc zamiast w IF to w WHILE. Co najważniejsze, chyba działa.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #15 25 Wrz 2012 19:19
    Cezary_
    Poziom 16  

    Przepraszam za błąd. W tym, co Ci proponowałem zamiast:

    Loop Until T <> 255

    powinno być

    Loop Until T = 255

    0
  • #16 25 Wrz 2012 19:25
    bbiidduull
    Poziom 28  

    Prosił bym jeszcze o sprawdzenie, uproszczenie kodu który po małych poprawkach, działa zadowalająco. :)

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #17 25 Wrz 2012 19:47
    Cezary_
    Poziom 16  

    Nadal w Twoim programie dłuższe trzymanie przycisku będzie zmieniało stany LED. Jeśli to nie problem, to już jak wolisz.
    Tu uproszczony kod z poprawnym wykrywanie zbocza sygnału na wejściu przycisku:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Można kod uczynić elegantszym, używając instrukcji wyboru:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #18 25 Wrz 2012 19:53
    bbiidduull
    Poziom 28  

    Zmiana stanów led po przytrzymaniu przycisku ma jedną zaletę, otóż jeśli chcę szybko przejść do stanu gdzie świecą się oba ledy. W niczym mi to nie przeszkadza.

    0
  • Pomocny post
    #19 25 Wrz 2012 20:08
    Cezary_
    Poziom 16  

    bbiidduull napisał:
    Zmiana stanów led po przytrzymaniu przycisku ma jedną zaletę, otóż jeśli chcę szybko przejść do stanu gdzie świecą się oba ledy. W niczym mi to nie przeszkadza.

    Jeśli tak, to nie ma problemu.
    Możesz jeszcze zebrać opóźnienia w jednym miejscu:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #20 27 Wrz 2012 17:59
    Benson000
    Poziom 14  

    Może problem jest w wibracji przycisku, spróbuj komendy Debounce.

    0
  • #21 27 Wrz 2012 18:00
    bbiidduull
    Poziom 28  

    Układ działa bez zarzutu. Nic się nie zawiesza, wszystko działa jak należy. Co zrobić z pinem RESET? Coś czytałem o tym ale nie zrozumiałem po co się go daje do plusa zasilania.

    0
  • #22 27 Wrz 2012 18:04
    Benson000
    Poziom 14  

    Po to, żeby układ się sam nie resetował, ale raczej jest to nie potrzebne. Jeśli chcesz go zresetować, to dajesz reset na chwilę do GND. Resetem restartujesz program.

    0
  • #23 27 Wrz 2012 18:15
    bbiidduull
    Poziom 28  

    Jak wyłączę zasilanie i ponownie włączę, też się przecież zresetuje.

    0
  • #24 27 Wrz 2012 18:20
    Benson000
    Poziom 14  

    Ale to jest sposób na poprawne wystartowanie procesora np. gdy w zasilane włączony jest kondensator dużej pojemności, to po włączeniu zasilania napięcie stopniowo wzrasta, przez co często mikrokontrolery nie startują poprawnie i trzeba je resetować. Jest to też sposób gdy robimy coś bez pętli, lub jest nie możliwa, to resetujemy.

    0
  • #25 27 Wrz 2012 18:24
    bbiidduull
    Poziom 28  

    Więc jeśli chciałbym zęby układ się nie resetował z niewiadomych przyczyn to pin RESET podciągam do plusa zasilania, a jeśli chciałbym resetować mikrokontroler wystarczy pin RESET podciągnąć do masy zasilania, tak?

    0
  • Pomocny post
    #26 27 Wrz 2012 18:34
    Mol
    Poziom 30  

    Żeby układ sam się resetował przy włączeniu zasilania , to opornik dajesz do plusa i kondensator z pinu reset do masy.

    0
  • #27 27 Wrz 2012 18:36
    bbiidduull
    Poziom 28  

    Dziękuję za pomoc. Mógłbym prosić jeszcze o pomoc w tym temacie? Link.

    0
  • #28 27 Wrz 2012 19:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    Mol napisał:
    Żeby układ sam się resetował przy włączeniu zasilania , to opornik dajesz do plusa i kondensator z pinu reset do masy.

    Nie ma takiej potrzeby. Wewnętrzne układy o to dbają.

    Cytat:
    After all reset sources have gone inactive, a delay counter is invoked, stretching the internal reset. This allows the power to reach a stable level before normal operation starts. The time-out period of the delay counter is defined by the user through the SUT and CKSEL fuses. The different selections for the delay period are presented in “Clock Sources” on page 24.

    0
  • #29 26 Paź 2014 09:58
    bbiidduull
    Poziom 28  

    Wszystko działa poprawnie aż do dziś :), zamykam.

    0