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

obsługa przerwań w C: cli() a reti()

dreidel 19 Maj 2009 22:40 1659 3
  • #1 6551030
    dreidel
    Poziom 2  
    Witam wszystkich, to mój pierwszy post na forum :)

    Od niedawna bawię się w programowanie AVRów. Zaprogramawałam na Atmedze16 coś w rodzaju programowanego termometru, tzn. aktualna temperatura jest mierzona przez czujnik DS18B20, porównywana z zaprogramowaną wartością, i jeśli zajdzie odpowiednia zależność (większa/mniejsza z dokładnością co do szerokości histerezy), to uaktywni się jedno z wyjść uP.

    Procedurę programowania temperatury progowej realizuję poprzez wywołanie zewnętrznego przerwania po naciśnięciu przycisku. Zaprogramowana wartość zmienia zmienną globalną "alarm".
    Początkowo do opuszczenia przerwania używałam funkcji reti, ale za każdym razem po wyjściu do programu głównego zmienna alarm się resetowała. Zmieniłam więc reti na cli i ... wszystko działa.

    Trochę tego nie rozumiem, przecież cli to globalne wyłączenie przerwań?

    Dziękuję z góry za odpowiedzi i pozdrawiam.
    Ania
  • #2 6551121
    dawid512
    Poziom 32  
    Tylko po co celowo opuszczasz przerwanie? CLI wyłącza przerwanie co jest równoznaczne z wyjściem z niego.
  • Pomocny post
    #3 6551131
    BoskiDialer
    Poziom 34  
    dawid512: ?. "CLI" blokuje wywoływanie przerwań, ale nijak nie przekłada sie na równoważność z wyjściem z funkcji.
    dreidel: Funkcji obsługi przerwania napisanej w C nie opuszcza się przez reti - wtedy tylko możesz spowodować przepełnienie stosu (na stosie zawsze są odkładane co najmniej 2 rejestry), zresztą powracasz nie do miejsca, w którym nastąpiło przerwanie tylko do losowego miejsca zdeterminowanego wartością dwóch ostatnich odłożonych rejestrów - co najprawdopodobniej przekłada się na reset układu a więc i wyzerowanie zmiennej. Z funkcji wraca się za pomocą return; żadne reti();!
  • #4 6551160
    dreidel
    Poziom 2  
    Dzięki wielkie!
REKLAMA