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

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

bbiidduull 25 Wrz 2012 16:15 3618 28
REKLAMA
  • #1 11347122
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    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?
  • REKLAMA
  • #2 11347527
    Mol
    Poziom 31  
    Posty: 1168
    Pomógł: 152
    Ocena: 103
    Wklej kod.
  • REKLAMA
  • #3 11347577
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 11347595
    Mol
    Poziom 31  
    Posty: 1168
    Pomógł: 152
    Ocena: 103
    I na czym polega nieprawidłowe działanie ?
  • #5 11347622
    Cezary_
    Poziom 18  
    Posty: 242
    Pomógł: 16
    Ocena: 61
    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.
  • REKLAMA
  • #6 11347625
    sp3ots
    Poziom 38  
    Posty: 3069
    Pomógł: 523
    Ocena: 673
    Witam !
    Cytat:
    .....na końcu zerowałem zmienną.

    Nie ma tego w programie.
    Pozdrawiam. Stefan
  • #7 11347628
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    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).
  • #8 11347638
    Cezary_
    Poziom 18  
    Posty: 242
    Pomógł: 16
    Ocena: 61
    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.
  • #9 11347713
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Cezary czy o to ci chodziło?
  • REKLAMA
  • #10 11347723
    Mol
    Poziom 31  
    Posty: 1168
    Pomógł: 152
    Ocena: 103
    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.
  • #11 11347725
    Cezary_
    Poziom 18  
    Posty: 242
    Pomógł: 16
    Ocena: 61
    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: text
    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.
  • #12 11347741
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    Muszę cię zmartwić, siebie też. Nie działa.
  • #13 11347750
    Cezary_
    Poziom 18  
    Posty: 242
    Pomógł: 16
    Ocena: 61
    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.
  • #14 11347770
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    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: text
    Zaloguj się, aby zobaczyć kod
  • #15 11347773
    Cezary_
    Poziom 18  
    Posty: 242
    Pomógł: 16
    Ocena: 61
    Przepraszam za błąd. W tym, co Ci proponowałem zamiast:

    Loop Until T <> 255

    powinno być

    Loop Until T = 255
  • #16 11347801
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    Prosił bym jeszcze o sprawdzenie, uproszczenie kodu który po małych poprawkach, działa zadowalająco. :)

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #17 11347896
    Cezary_
    Poziom 18  
    Posty: 242
    Pomógł: 16
    Ocena: 61
    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: text
    Zaloguj się, aby zobaczyć kod

    Można kod uczynić elegantszym, używając instrukcji wyboru:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #18 11347923
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    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.
  • Pomocny post
    #19 11348002
    Cezary_
    Poziom 18  
    Posty: 242
    Pomógł: 16
    Ocena: 61
    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: text
    Zaloguj się, aby zobaczyć kod
  • #20 11354025
    Benson000
    Poziom 14  
    Posty: 176
    Pomógł: 7
    Ocena: 77
    Może problem jest w wibracji przycisku, spróbuj komendy Debounce.
  • #21 11354036
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    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.
  • #22 11354060
    Benson000
    Poziom 14  
    Posty: 176
    Pomógł: 7
    Ocena: 77
    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.
  • #23 11354116
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    Jak wyłączę zasilanie i ponownie włączę, też się przecież zresetuje.
  • #24 11354142
    Benson000
    Poziom 14  
    Posty: 176
    Pomógł: 7
    Ocena: 77
    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.
  • #25 11354160
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    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?
  • Pomocny post
    #26 11354198
    Mol
    Poziom 31  
    Posty: 1168
    Pomógł: 152
    Ocena: 103
    Żeby układ sam się resetował przy włączeniu zasilania , to opornik dajesz do plusa i kondensator z pinu reset do masy.
  • #27 11354204
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    Dziękuję za pomoc. Mógłbym prosić jeszcze o pomoc w tym temacie? Link.
  • #28 11354451
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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.
  • #29 14074250
    bbiidduull
    Poziom 28  
    Posty: 1322
    Pomógł: 39
    Ocena: 64
    Wszystko działa poprawnie aż do dziś :), zamykam.

Podsumowanie tematu

✨ W dyskusji poruszono problem sterowania diodami LED za pomocą jednego przycisku w mikrokontrolerze Attiny13, z wykorzystaniem języka Bascom. Użytkownik opisał trudności w implementacji, związane z nieprawidłowym zliczaniem naciśnięć przycisku oraz problemami z drganiami styków. Uczestnicy zaproponowali różne podejścia, w tym wykorzystanie zmiennych do detekcji stabilnych stanów przycisku oraz eliminację drgań za pomocą pętli oczekiwania. Ostatecznie, użytkownik uzyskał działający kod, który poprawnie reagował na naciśnięcia przycisku, a także omówił kwestie związane z pinem RESET, jego podciąganiem do zasilania oraz sposobami resetowania mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA