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

Atmega 8 - Wielokrotne wyzwalanie przerwań przy naciśnięciu przycisku INT0

Geron 31 Sie 2006 14:09 1998 5
REKLAMA
  • #1 2973070
    Geron
    Poziom 12  
    Posty: 71
    Pomógł: 3
    Ocena: 2
    Po pierwsze - witam na forum (mój pierwszy post tutaj).

    Włączam obsługę przerwań na początku programu:
    sei();
    GICR =0x40;
    MCUCR =0x02; zbocze opadające
    ...
    ...

    Na nogę INT0 podpiąłem zwykły przycisk monostabilny (zwiera do masy) z pull-up`em 1KΩ. Jego naciśnięcie powoduje zaświecenie diody na innym wyjściu. (może trywialne, ale dopiero się uczę)
    Problem w tym, że obsługa przerwań załącza się więcej niż jeden raz po naciśnięciu guzika (mimo wyzwalania zboczem).

    Czy to możliwe, żeby sygnał się jakoś zakłócał na wejściu INT0. Jak temu zaradzić?
    Z góry dzięki za pomoc :)
    Pozdr.
  • REKLAMA
  • Pomocny post
    #2 2973113
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 139
    Ocena: 32
    Jest to normalne w przypadku przycisków...
    Drganie styków powoduje pojawienie się więcej niż jednego zbocza...
    Poczytaj na forum o niwelacji drgań styków...
  • REKLAMA
  • #3 2973625
    johny_w
    Poziom 24  
    Posty: 674
    Pomógł: 80
    Ocena: 64
    Tak jak napisał kolega Pubus chodzi o drgania styków. Mój sposób jest następujący:

    Najpierw musisz wiedzieć jak długo przycisk daje impulsy po jednym wciśnięciu (najlepiej sprawdzić na oscyloskopie). Następnie po odebraniu przerwania blokujesz je na czas drgań. W ten sposób unikniesz serii wywołań procedury przerwania. To tak w wielkim skrócie. Gdyby były potrzebne szczegółowe wskazówki daj znać, pozdrawiam.
  • REKLAMA
  • #4 2973850
    Geron
    Poziom 12  
    Posty: 71
    Pomógł: 3
    Ocena: 2
    No OK. Dzięki.

    Dałem kondziora 100n między styki przycisku i wpisałem pauzę w obsługę przerwania - Jest lepiej, ale pauza to ok 500ms, a jeszcze czasami zdaża się, że podwójnie wywołuje przerwanie. Może poprostu przycisk jest do bani :) (chiński jakiś :) ) .........

    Przy okazji.: Czy złe ustawienie zegara może spowodowć uszkodzenie chipu?

    Podpiąłem kryształ 8MHz i nie zauważyłem, że FuseBity w PonyProg2000 są zapisywane (albo może tylko odczytywane) w ujemnej logice. Tak czy siak jedne Atmega już mi padła w momencie ustawiania zegara.

    Pozdrawiam.
    Dziękuję za pomoc.
  • REKLAMA
  • Pomocny post
    #5 2974083
    johny_w
    Poziom 24  
    Posty: 674
    Pomógł: 80
    Ocena: 64
    500ms to trochę za dużo jak na drgania styków. To jest microswitch czy jakiś przycisk przemysłowy? Spróbuj wyzwalać przerwanie stanem niskim a nie zboczem opadającym.

    Ustawiając inny zegar nie spalisz chipu. Co najwyżej ustawiając niższy zegar niż dotychczas możesz mieć problemy z zaprogramowaniem jeśli nie zmienisz też częstotliwości w programatorze.

    Jednak jest możliwość ustawienia za pomocą tych fusebitów taktowanie zegarem zewnętrznym (CKSEL3..0 zaprogramowane czyli 0000). Wtedy rzeczywiście procek wygląda jak ubity. Przy tych ustawieniach należy odłączyć kwarc a na XTAL1 podać sygnał prostokątny, np. 1Mhz. Sygnał bierzesz z generatora lub z innego procka.
  • #6 2974194
    Geron
    Poziom 12  
    Posty: 71
    Pomógł: 3
    Ocena: 2
    Taki mikro to on nie jest (przycisk). Taki jak często stosuje się w samochodach przy alarmach, instalacjach gazowych itp. (wycina się dziurkę w plastikowej zaślepce ....), - z czerwonym łepkiem.

    1. Rzeczywiście, przy wyzwalaniu niskim poziomem działa już naprawdę dobrze. Dzięki.

    2. Rzeczywiście, musiałem wpisać zewnętrzne taktowanie do poprzedniego chipu. Myślałem, że wpisuję CKSEL = "1111" i SUT "11" (Crystal Oscillator, slowly rising power 8MHz), a zamiast tego wszystko wyzerowałem :).
    Spróbuję podpiąć "padnięty" chip do obecnie działającego i na nowo przeprogramować.

    OK w tym temacie dla mnie wszystko jasne. Dziękuję za pomoc.
    Pozdrawiam.
REKLAMA