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 88p - Niestabilne działanie przerwania INT1 przy zboczu opadającym

guuciek 04 Maj 2014 15:10 1278 6
REKLAMA
  • #1 13569015
    guuciek
    Poziom 14  
    Witam.
    Borykam się z problemem przerwania INT1 w procesorze Atmega88p.
    Otóż przerwanie raz działa poprawnie , wykrywa odpowiednie zbocze , a innym razem załącza się praktycznie losowo .
    Napisałem specjalnie prosty programik aby zobrazować problem .
    Program jest pisany w bascomie jednak ze sporą ilością wstawek z assemblera .
    (Na czystym bascomie zachowuje się tak samo )

    
    Config Portd.3 = Input
    Config Portd.4 = Input
    Portd.3 = 1
    Portd.4 = 1
    
    Config Portd.1 = Output
    Config Portd.2 = Output
    Eicra = 8
    On Int1 Aa
    sei
    Eimsk = 2
    
    Osccal = 244
    Deb Alias Portd.1
    Led Alias Portd.2
    
    clr r16
    clr r20
    
    
    Do
    Loop
    
    
    Aa:
    Set Led
    nop nop
    Reset Led
    Set Deb
    nop nop
    Reset Deb
    reti
    
    



    Ma on wysłać szpilkę na 2 wyjściach w momencie załączenie się przerwania ( zbocze opadające pewnej transmisji) .


    A tutaj zamieszczam wynik działania tego programu zarejestrowany analizatorem stanów logicznych . Kolor żółty i niebieski to transmisja . Przerwanie ma być wyzwalane sygnałem niebieskim (zbocze opadające ) Sygnały czerwony i zielony to wyzwolenie przerwania .


    Atmega 88p - Niestabilne działanie przerwania INT1 przy zboczu opadającym


    Jak widać po lewej stronie wszystko jest OK .
    Natomiast po prawej zaczynają dziać się dziwne rzeczy .
    Dodam jeszcze że jest to sprawa losowa , raz potrafi być dobrze przez 10 pojedynczych sygnałów a czasem co drugi raz przerwanie głupieje .

    Oczywiście szpilki są przesunięte względem zbocza opadającego z powodu dosyć szybkiej transmisji , ale nie jest to w tym momencie istotne
  • REKLAMA
  • #2 13569197
    zumek
    Poziom 39  
    Po pierwsze, usuń błąd z procedury przerwania, a po wtóre, podaj częstotliwość taktowania rdzenia oraz częstotliwość przebiegu na wejściu INT1.
  • REKLAMA
  • #3 13569240
    guuciek
    Poziom 14  
    Taktowane wewnętrznym zegarem 8Mhz przy oryginalnie ustawionym osccall
    lub około 12 MHz przy osccall = 244
    Częstotliwość przebiegu to około 120 kHz

    Błąd z procedury przerwania ?
  • #4 13569299
    zumek
    Poziom 39  
    guuciek napisał:
    ...Błąd z procedury przerwania ?


    Masz ...
    Kod: text
    Zaloguj się, aby zobaczyć kod

    ... zamiast return, a to zdecydowanie dwie różne instrukcje, szczególnie w procedurze przerwania.
  • REKLAMA
  • #5 13569305
    guuciek
    Poziom 14  
    Nie wydaje mi się .
    reti - return interrupt z assamblera ,
    Zasadniczo chodzi o to aby załączyć globalne zezwolenie przerwań przy powrocie , a dokładnie to robi reti , tak samo zresztą jak return w bascomie .
    ale sprawdziłem też return i jest to samo .

    Bascom jest dosyć elastyczny w tej materii jeśli chodzi o mieszanie różnych składni ,
  • #6 13569382
    zumek
    Poziom 39  
    guuciek napisał:
    ...Bascom jest dosyć elastyczny w tej materii jeśli chodzi o mieszanie różnych składni ,


    To dlaczego mój(v2.0.7.5) nie jest :?:
    Atmega 88p - Niestabilne działanie przerwania INT1 przy zboczu opadającym

    Poza tym, bascom przy generowaniu procedury przerwania, dodaje prolog(kilkanaście ważnych rejestrów na stos) i epilog(opróżnienie stosu), więc wstawienie RETI przed epilog, rozwala po prostu program.
    Zerknij poniżej.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 13569948
    guuciek
    Poziom 14  
    Rzeczywiście .
    Ale w dalszym ciągu nie jest to rozwiązanie problemu
REKLAMA