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

[Przerwania] Atmega 32 - jak poprawnie obsłużyć przerwania w projekcie skrzyżowania?

kamillo32 01 Gru 2013 17:56 2250 21
  • #1 13013633
    kamillo32
    Poziom 11  
    Witam
    Potrzebuje pomocy w obsłudze przerwań. Muszę zrobić projekt skrzyżowania na zajęcia z sieci automatyki, i napotkałem problem z przerwaniami. Próbowałem na wiele sposobów coś napisać, ale bez skutku. Potrzebuje jakiś testowy kod, który np: będzie mi zapalać i gasić diodę podpiętą do jakiegoś portu. Oto kod poprany z jakiejś strony, lecz też mi nie działa :(
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 13013909
    kamillo32
    Poziom 11  
    Dobra już poprawiłem kod lecz nie jestem pewien co do funkcji ISR()

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 13013922
    kamillo32
    Poziom 11  
    Poprawiłem teraz kod z przykładem z tej strony co podałeś

    Dodano po 5 [minuty]:

    ale dalej nie działa. Nie ma żadnej reakcji po wciśnięciu przycisku(przycisk zwiera do masy)

    Dodano po 40 [minuty]:

    Pomoże ktoś?
  • #6 13014285
    mi14chal
    Poziom 28  
    Nie pisze się tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tylko tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 13014290
    BlueDraco
    Specjalista - Mikrokontrolery
    DDRD |= 0<<PD2;

    Czyli "nie zmieniaj wartości DDRD". Bez tej linii będzie działać tak samo, jak z nią.
    No i oczywiście do obsługi przycisku nigdy nie używamy przerwania zgłaszanego sprzętowo zboczem. Od "nigdy" są dwa wyjątki, ale Twojego przypadku nie dotyczą.
  • #8 13014725
    kamillo32
    Poziom 11  
    nie zwróciłem uwagi że dałem tam 0<<. Zaraz zobacze czy działa

    Dodano po 6 [minuty]:

    Dalej nie działa. Mógłby ktoś podać jakiś kod obsługi tego? bo ja już nie mam pomysłu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 13014789
    BlueDraco
    Specjalista - Mikrokontrolery
    Linię 2 portu D ustawiłeś jako wyjście i nadal próbujesz używać przerwania od przycisku. Przycisk na przerwaniu Ci nie zadziała, a przy ustawieniu INT0 jako wyjścia możesz upalić bufor wyjściowy zwierając go przyciskiem do masy.
  • #10 13014825
    kamillo32
    Poziom 11  
    Czyli co mam zrobić, żeby wywołać przerwanie przyciskiem? Dać DDRD &= ~1<<PD2; ?
  • #11 13014902
    BlueDraco
    Specjalista - Mikrokontrolery
    A po co chcesz uruchamiać przerwanie, które zagwarantuje błędne działanie urządzenia?
    Oczywiście linia, do której ma być podłączony przycisk, musi być wejściem. Domyślnie wszystkie linie portów są wejściami, więc nie musisz nic robić, tylko powinieneś włączyć pociąganie, i wtedy już będziesz mógł się przekonać, że to nie działa.
    http://mikrokontrolery.blogspot.com/2011/02/o-drganiach-stykow-bez-bajek-przykad.html
  • #12 13014941
    kamillo32
    Poziom 11  
    Czyli ten program jest dobry tylko muszę wyeliminować drgania styków? Na arduino wszystko działa tak jak trzeba
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 13014966
    BlueDraco
    Specjalista - Mikrokontrolery
    Ten program jest zły, bo nie da się w nim w prosty i poprawny sposób zignorować drgać styków. żeby zignorować drgania musisz użyć przerwania timera, a jeśli użyjesz przerwania timera - nie ma sensu używać przerwania od przycisku.
  • #14 13015074
    kamillo32
    Poziom 11  
    A więc powiedz mi jak mam zrobić to, żeby działało za pomocą przycisku? arduino mega radzi sobie z tym bez problemu, ale potrzebuje przenieść ten projekt na mniejszą płytkę.
  • #15 13015089
    dondu
    Moderator na urlopie...
    Zobacz rozwiązania przedstawione tutaj: http://mikrokontrolery.blogspot.com/2011/03/epp-drgania-stykow.html

    Poza tym, to co napiszesz w Arduino, możesz przecież użyć a dowolnym własnym projekcie.

    Tutaj masz także bibliotekę MegaSuperDebounce: http://mikrokontrolery.blogspot.com/2011/04/biblioteki.html
  • #16 13015142
    kamillo32
    Poziom 11  
    Wiem że mogę użyć arduino w projekcie ale chciałbym przerzucić to na mniejszy procesor, na razie na atmege 32 a potem na atmege 16.

    Zrobiłem kod tak, ale przerwanie raczej nie obsłuży opóźnienia :P

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #18 13015177
    kamillo32
    Poziom 11  
    No niestety ale muszę wykorzystać ten nieszczęsny przycisk. Obecny kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 13015335
    BlueDraco
    Specjalista - Mikrokontrolery
    Ślepy zaułek. Obejrzyj kod, który podlinkowałem - dwie linie kodu w przerwaniu timera załatwiają sprawę.
  • #20 13015387
    Wojtek75
    Poziom 24  
    kamillo32 napisał:
    No niestety ale muszę wykorzystać ten nieszczęsny przycisk. Obecny kod:

    Jeżeli zwierasz switch'a do masy to może "jakoś" zadziała. Z tym, że tylko, dlatego że przez drganie styków tego switch'a kilka razy zmieni ci się zbocze na wejściu.
    Gdybyś podawał stan niski z wyjścia INT jakiegoś innego układu i miało zadziałać natychmiast po pojawieniu się tego stanu to trzeba by było jeszcze zmienić konfig dla tego przerwania na zbocze opadające.
    Dlatego tak jak już koledzy wspomnieli to nie jest właściwe rozwiązanie. Po co się pchać na siłę w maliny?
  • #21 13015607
    kamillo32
    Poziom 11  
    Czyli nie da się normalnie wykorzystać w jakiś sposób przerwania za pomocą przycisku? po coś chyba jest ten PIN int0, int1
  • #22 13015620
    dondu
    Moderator na urlopie...
    kamillo32 napisał:
    ... po coś chyba jest ten PIN int0, int1

    To w jaki sposób wykorzystujesz przerwanie zależy tylko od Ciebie. Dlatego już pisałem, że możesz nawet dać opóźnienie programowe w funkcji przerwania, tak jak zrobiłeś, tylko musisz znać tego konsekwencje. Jeżeli więc konsekwencje akceptujesz, to tak działaj ... młotek można wykorzystać nie tylko do robienia siniaków, ale także do łagodzenia ich skutków przykładając go do miejsca uderzenia :)

    Poza tym zamiast opóźnienia za pomocą _delay_ms() możesz :
    1 - w przerwaniu z INT wyłączyć przerwania z INT i uruchomić któryś timer, by odliczył wymagane opóźnienie i zgłosił swoje przerwanie.
    2 - w przerwaniu z timera ponownie włączyć przerwania z INT.

    Jak widzisz można zrobić to na wiele sposobów. Ty decydujesz znając zalety i wady każdego z nich.

    BTW: Przyciski to nie jedyny element, który można podłączyć do INT, tak jak nie tylko do aut koła się wykorzystuje.
REKLAMA