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

[A32][C]Timer0 zakłóca odczyt klawiatury PS2 w przerwaniu INT0

hessuss 04 Cze 2012 13:40 672 2
  • #1 04 Cze 2012 13:40
    hessuss
    Poziom 13  

    Witam.
    Mam drobny problem i nie wiem jak go ugryźć.
    Atmega32 kwarc 16mhz
    W przerwaniu odczytuję klawiaturę ps2
    i w między czasie robię wyświetlanie na matrycy w Timerze z preskalerem 64.
    I jeszcze mam uruchomione PWM.
    Jesli wyświetlanie zrobie w pętli głównej i wyłaczę timer to klawiatura czyta się prawidłowo ale jeśli uruchomię timer to wówczas czyta mi różne krzeki, wygląda to tak jakby przerwanie zewnętrzne int0 nie wywowyławo się prawidłowo za kazdym razem i gubiło kilka bitów bo w tym czasie pracuje timer0,

    Jak ustawić priorytet na przerwanie zewnętrzne żeby timer nie przerywał jeśli właśnie wykonuje się przerwanie zewnętrzne ?

    Procedura w której czytam PS2 jest wywoływana za każdym razem gdy klawiatura wyśle sygnał clk. oto kod :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 2
  • Pomocny post
    #2 04 Cze 2012 13:56
    dondu
    Moderator Mikrokontrolery Projektowanie

    To zapewne nie przechodzi przez kompilację:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    zapewne chciałeś pisać tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ale to także błąd ponieważ, takim zapisem wpadłeś w pułapkę: Pułapka 1: Zerowanie bitu przez wpisanie jedynki
    Czyli zamiast zgasić flagę ustawiłeś ją ponownie :)

    Inna sprawa że robisz to niepotrzebnie, ponieważ flaga ta jest gaszona sprzętowo zaraz po wejściu do funkcji obsługi przerwania:

    Cytat:
    Bit 6 – INTF0: External Interrupt Flag 0
    ... The flag is cleared when the interrupt routine is executed. ...

    Zatem usuń tę linijkę kodu.

    PS.
    Popraw ten bug w tytule tematu :)

    0
  • #3 04 Cze 2012 14:08
    hessuss
    Poziom 13  

    Dondu -> dzięki za sugestie.

    Problem rozwiązany, pół dnia szukałem czegoś o priorytetach przerwań ( by nie narazić się na docinki w stylu zajrzyj w google) po wstawieniu tego posta szukałem dalej i oczywiście , bo jak by inaczej, znalazłem rozwiązanie w 5 minut, wystarczyło w timerze dopisać ISR_NOBLOCK :)

    0