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

[atmega16][C/Eclipse] Przerwanie od INT1

sevotharte 25 Maj 2011 09:58 1928 7
REKLAMA
  • #1 9541867
    sevotharte
    Poziom 10  
    Witam.

    Próbuję zrobić zwykłe zliczanie osób w pomieszczeniu. Mam dwie bariery świetlne, które są podłączone do pinów PD2 i PD3 czyli INT0 i INT1.

    Problem w tym, że przerwanie od INT1 nie chce mi zaskoczyć, natomiast INT0 działa. Dodam, że bariera działa dobrze: przerwanie bariery skutkuje podciągnięciem Portów PD2 czy PD3 do 0. Czyli przerwanie powinno nastąpić, gdy na tych nóżkach jest logiczne 0. Co robię źle?

    Oto kod jak ustawiam przerwania i one same:

    Deklaracja pinów jako wejścia z podciągnięciem do VCC
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Funkcja inicjująca zewnętrzne przerwania
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A tutaj jak używam przerwań w programie.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    [/code]
  • REKLAMA
  • REKLAMA
  • #3 9541896
    sevotharte
    Poziom 10  
    Zmienne globalne używane w przerwaniach jak i w pętli głównej deklaruję tak :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przerwania działają, program mam dosyć obszerny, więc nie daję całego, tylko to co nie działa.
    Jak już mówiłem wszystko działa na przerwaniu INT0, natomiast INT1 deklarowane tak samo już nie działa. Przerwania zostały włączone poprzez sei()

    P.S.
    Dodam, że test na INT0 oraz INT2 przebiegł pomyślnie i wszystko działa. Wolałbym jednak do tego celu wykorzystać INT1 zamiast INT2, bo przydadzą mi się Porty B w innym celu.
  • REKLAMA
  • #4 9543175
    sevotharte
    Poziom 10  
    Napisałem również program krótki w celu sprawdzenia zewnetrznych przerwań. Oto kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jednak i w tym przypadku nie działa przerwanie INT1.. Natomiast jak po prostu zewrę PD3 do masy, to następuje przerwanie.. I tego troszkę nie rozumiem jeszcze.. Sprzętowo jestem pewien, że wszystko jest ok, bo sprawdzałem urządzenia na pinie od INT0 i działały tak samo. Więc problem leży jakoś sprzętowo - jeszcze, aż tak się nie znam, może to jakiś fuse?
  • #5 9544053
    janbernat
    Poziom 38  
    Pierwsze- zeruje bity w rejestrze- ustawia na reakcję na poziom.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Drugie- ustawia bity w rejestrze- reaguje na zmianę stanu.
  • REKLAMA
  • #6 9544490
    sevotharte
    Poziom 10  
    to nic niestety nie zmienia. Dalej nie odpala się przerwanie INT1. nie jest problemem złe ustawienie rejestru MCUCR, tak myślę.
  • #8 9544552
    sevotharte
    Poziom 10  
    Już problem został rozwiązany. Nie wiem jakim sposobem na płyce stykowej styki dalej od pinu PD3 nie chciały działać. Gdy podłączyłem urządzenie przerywające praktycznie wprost do pinu atmegi, przerwanie działa. Może coś zostało uszkodzone wewnątrz płytki stykowej.

    Dzięki za odpowiedzi.

    Pozdrawiam
REKLAMA