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

[AVR][asm] Niepoprawny powrót z obsługi przerwania

anathor 09 Kwi 2011 16:50 2188 13
REKLAMA
  • #1 9379562
    anathor
    Poziom 10  
    Witam,
    napisałem obsługę zewnętrznego przerwania, które się wykonuje bezproblemowo, jednak po obsłużeniu przerwania program nie wraca od razu w miejsce z którego przerwanie zostało wywołane. Oto kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Po skończeniu obsługi przerwania (mignięciu diody PD5) diody przestają świecić i dopiero po kilkunastu sekundach dioda na PD6 zaczyna migać, co oznacza że program wrócił do swojej pętli głównej. Co jest nie tak?
  • REKLAMA
  • #2 9380212
    Andrzej__S
    Poziom 28  
    Procedura obsługi przerwania używa tych samych rejestrów co pętla główna (mam na myśli makro delay1sek - rejestry r17, r18, r19), więc powinieneś odłożyć je na stos na czas wykonywania procedury obsługi przerwania.
  • REKLAMA
  • #3 9380405
    anathor
    Poziom 10  
    Odłożyłem, jednak nadal pojawiały się momenty, w którym powrót następował po nieco dłuższym okresie czasu, niż powinien. W tym celu zrobiłem bliźniacze makro, wykorzystujące jednak trzy następne rejestry (r20-r22). Jedno makro stosuję wewnątrz pętli głównej, drugie w obsłudze przerwania i wtedy wszystko działa poprawnie. Jeśli istnieje bardziej eleganckie rozwiązanie problemu, to chętnie je poznam.
  • #4 9380552
    Andrzej__S
    Poziom 28  
    anathor napisał:

    Odłożyłem, jednak nadal pojawiały się momenty, w którym powrót następował po nieco dłuższym okresie czasu, niż powinien.

    Nie powinno tak być, jeśli odłożyłeś na stos prawidłowo. Z taką procedurą obsługi przerwania Twój kod powinien działać prawidłowo:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 9380729
    anathor
    Poziom 10  
    Andrzej__S, napisałem dokładnie tak jak podałeś, jednak jak wspominałem, zdarzały się sytuacje, kiedy program nie wrócił od razu, tylko po pewnej chwili.

    100% pewny i działający kod jaki zastosowałem:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #6 9381561
    Konto nie istnieje
    Konto nie istnieje  
  • #7 9381645
    anathor
    Poziom 10  
    Albercie, dobrze wiem, że przerwanie ma być krótkie. Powyższy program jest czysto akademicki, służący poznaniu podstaw assemblera pod avr. Bez migania diodą przerwanie też działało poprawnie, zastanawiało mnie tylko dlaczego dzieje się tak a nie inaczej.

    Pozdrawiam.
  • REKLAMA
  • #8 9381683
    asembler
    Poziom 32  
    Toz albert podal ci podstawy nie tylko asemblera.
    Jeżeli uważasz że przechodząc nad tym problemem akademicki do porzadku dziennego to sie grubo mylisz.
  • #9 9381734
    anathor
    Poziom 10  
    Nie do końca rozumiem ostatnie zdanie, bo chyba czegoś w nim brakuje...

    Poza tym, tak jak napisałem - mam świadomość, że powyższy kod _jest niewłaściwy_ i nie należy obsługiwać przerwań w ten sposób! Jedynym problemem do rozwiązania było zagadkowe powracanie z obsługi przerwania, to wszystko.
  • Pomocny post
    #10 9381767
    asembler
    Poziom 32  
    Nie wiem czy to celowe czy sobie ktoś jaj nie robi na Wielkanoc ale jezeli sobie zdajesz sprawe że kod jest niewłasciwy to dlaczego sie dziwisz że ci niewłasciwie działa?
    Mnie sie wydaje że poprostu ten program ci sie wiesza jak nadpisze stos i dlatego co jakis czas jest tak jak opisujesz.

    Na czerwone własnie te pisanki.
    Pierwsze przykazanie asemblerowca licz puszki i popki ma byc tyle samo.


    anathor napisał:

    przerwanie_int0:
    push acc // zrzuca stan diody
    in acc, SREG // odczyt status register
    push acc // i wrzucenie na stos

    push r17
    push r18
    push r19



    ldi acc, 0b00100100 // zapala diodę PD5
    out PORTD, acc

    delay1sek

    ldi acc, 0b00000100 // gasi diodę PD5
    out PORTD, acc

    delay1sek

    push r19
    push r18
    push r17

    pop acc // zdjecie SREG ze stosu
    out SREG, acc // ustawia SREG na zdjety ze stosu
    pop acc // zdjecie akumulatora ze stosu
    reti



    [/syntax]

    Dawniej stosowłem taką sztuczkę ze w pogramie głownym porównywałem wskaznik stosu i w przypadku różnicy zapalała sie dioda, więc natychmist miałem informacje o pominieciu jakiegos pop,push ret.
  • #11 9382570
    anathor
    Poziom 10  
    Muszę zwrócić honor w takim razie, to moje ewidentne przeoczenie, oczywiste, że ilość push i pop musi się zgadzać. Zastanawia mnie w takim razie jak to możliwe, że przy takiej implementacji wszystko dzieje się prawidłowo?
    Pisząc o tym że wiem, że kod jest niewłaściwy miałem na myśli, że przerwanie trwa za długo, a nie to, że pomyliłem instrukcje.
  • #12 9382631
    mirekk36
    Poziom 42  
    anathor napisał:
    Muszę zwrócić honor w takim razie, to moje ewidentne przeoczenie, oczywiste, że ilość push i pop musi się zgadzać.


    To przydałoby się przynajmniej koledze asembler kliknąć klawisz pomógł


    anathor napisał:
    Zastanawia mnie w takim razie jak to możliwe, że przy takiej implementacji wszystko dzieje się prawidłowo?


    No jeśli ty nadal utrzymujesz że wszystko dzieje się prawidłowo przy takiej implementacji jak to nazwałeś to na prawdę trzeba mieć samozaparcie ;) .... toż już wyżej koledzy nie dość że tłumaczyli o tych delayach w przerwaniu, odkładaniu używanych rejestrów itd - a ty pomimo to nadal katujesz się "niby akademickim" przykładem, który nie jest żadnym akademickim przykładem - tylko sposobem na to jak sobie utudnić życie. Napisać coś co ma nie działać z założenia i próbować to naprawiać - na etapie podstwowej nauki programowania.

    Tylko przez to że masz tak długie delaye i że jest "troszkę" tej pamięci RAM, to też tylko dlatego wydaje ci się że to działa - bo po prostu stos się wywala co dłuższy okres czasu na własne twoje życzenie.

    anathor napisał:
    Pisząc o tym że wiem, że kod jest niewłaściwy miałem na myśli, że przerwanie trwa za długo, a nie to, że pomyliłem instrukcje.


    Zamiast więc wyrażać się półsłówkami a potem opisywać co się miało na myśli - proponuję napisać rzeczywiście jakiś akademicki i prawidłowy przykład, na którym będzie się można czegoś nauczyć. Chociaż .... może i przy tej okazji wyszła dla ciebie jedna pozytywna rzecz - że trzeba liczyć pusch i pop ;)
  • REKLAMA
  • #13 9382718
    asembler
    Poziom 32  
    Oczywiście jest kilka przypadków w których liczba push i pop nie musi sie zgadzać ale do tego wrócimy za kilka lat akademickich oczywiście:-)
  • #14 9382854
    anathor
    Poziom 10  
    Dziękuję wszystkim za pomoc, problem rozwiązany ;)
REKLAMA