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: Brak reakcji na przerwanie INT1, wyświetlanie licznika Timer1

pepin0 21 Paź 2006 00:26 1808 9
REKLAMA
  • #1 3137436
    pepin0
    Poziom 11  
    Posty: 71
    Pomógł: 1
    Ocena: 3
    Witam. Prosze o pomoc poniewaz napisalem prosty program z wykorzystaniem przerwania z INT1 ale niestety procesor nie reaguje na zmiane stanu na wyjsciu PD3. Mam atmege16 na plytce testowej. W programie chodzi o to zeby po odebraniu przerwania na wyswietlaczu pojawila sie wartosc licznika Timer1. Timer1 ma pokazywac czas pomiedzy dwoma impulsami. To jest program.Prosze o pomoc poniewaz nie wiem juz co moglem opuscic.

    $crystal = 16000000 'zastosuj kwarc 16 MHz.

    Config Lcd = 16 * 2 'konfiguruj wyświetlacz Lcd.

    Config Pind.3 = Input ' ustawienie pd3 jako wejscie

    Reset Portd.3


    Dim W As Word 'zmienna do odczytu stanu timer1

    Dim A As Bit 'zmienna sluzace do okreslenia czy timer1 byl wczesniej wyzerowany

    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2

    Cls 'czyść wyświetlacz.

    Cursor Off ' wyłącz kursor.

    Config Int1 = Falling ' przerwanie bedzie reagowalo na zbcoze opadajace

    Config Timer1 = Timer , Prescale = 64 ' timer1 jako czasomierz z preskalerem 64




    Lcd "witam"


    Enable Interrupts 'Zgoda na wszystkie odblokowania.

    Enable Int1 ' zgoda na przerwanie pochodzace od pd.3 (int1)

    On Int1 Obr ' przy przerwaniu idz do


    A = 0 ' na pcozatku musi wyzerowac timer1

    Do 'nieskończona pętla

    Loop

    End




    Obr:

    If A = 0 Then

    Timer1 = 0 'ustawia timer1 na 0

    A = 1

    Home

    Lcd "1"

    Else
    ' laduje wartosc timer1 do W
    W = Timer1

    A = 0

    Home

    Lcd W ; "imp"

    End If

    Return
  • REKLAMA
  • #2 3137611
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Reset Portd.3 ustawia wejście d.3 w stan wysokiej impedancji. Z tego powodu być może wejście to nigdy nie osiąga stanu wysokiego np. zwierane przez wysoką rezystancję układu sterującego (o którym nic nie wiem). Może należy włączyć podciągane (Set Portd.3).
  • REKLAMA
  • #3 3137756
    pepin0
    Poziom 11  
    Posty: 71
    Pomógł: 1
    Ocena: 3
    probowalem tez w taki sposob i dalej nie dziala.robilem nawet symulacje i gdy program dochodzi do wykonywania petli i wlaczam przerwanie od int1 program wraca na poczatek programu do lini 1 a nastepnie od razu przeskakuje do wykonywania petli.
  • REKLAMA
  • #4 3137796
    Dosmajster
    Poziom 12  
    Posty: 6
    Pomógł: 1
    Witam.
    Pierwszą instrukcją w podprogramie "Obr" powinno być zablokowanie przerwania od Timer1.
    A ostatnim poleceniem przed wyjściem z podprogramu to włączenie tego przerwania.
    Pozdrawiam
  • REKLAMA
  • #5 3137812
    pepin0
    Poziom 11  
    Posty: 71
    Pomógł: 1
    Ocena: 3
    Próbowałem i dalej nie działa. Chodzi o to, że program wogóle nie wchodzi w miejsce podprogramu przerwania "obr"
  • #6 3137878
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Dosmajster napisał:
    Witam.
    Pierwszą instrukcją w podprogramie "Obr" powinno być zablokowanie przerwania od Timer1.

    Ciekawym , po co :?:
    Dosmajster napisał:

    A ostatnim poleceniem przed wyjściem z podprogramu to włączenie tego przerwania.
    Pozdrawiam

    To dopiero byłby bajzel :D
    Może nowy kolega najpierw pomyśli lub poczyta dokumentację , a potem "doradza" :?: ;)

    A teraz całkiem poważnie.
    Jeśli "postodawca" symuluje ten kod na Bascomowym symulatorze , to niech sobie da z tym spokój , bo on czasami "oszukuje" :(
    Po drugie , to jaka wartość jest w Hw Stack itp. :?:
    A po ostatnie , to wywalić wyświetlania z przerwania i dać do pętli głównej , której praktycznie nie ma :D

    Piotrek


    Piotrek
  • #7 3137932
    pepin0
    Poziom 11  
    Posty: 71
    Pomógł: 1
    Ocena: 3
    wgrywalem ten program do procesrora i wlasnie tez nie dziala a przerwanie zaczyna dzialac jak zmienie chip w bascomie na jakis inny(ale to tylko w symulatorze), obojetne w tym momencie jaki.
  • #8 3138010
    Dosmajster
    Poziom 12  
    Posty: 6
    Pomógł: 1
    [To dopiero byłby bajzel :D
    Może nowy kolega najpierw pomyśli lub poczyta dokumentację , a potem "doradza" :?: ;)

    A dlaczego bajzel?
    Co się stanie w podanym programie gdy w czasie obsługi przerwania wystąpi następne przerwanie ?
    Nie wiem ile RAM-u w AVR można przeznaczyć na stos, ale w 8051 (bo tego znam) to szybko go zabraknie.
    Zgodzę się natomiast, że obsługa LCD powinna być przeniesiona do programu głównego, natomiast w przerwaniu zostanie tylko przepisywanie timera do zmiennej W i zerowanie timera.
    Obiecuję przestudiować dokumentację AVR w zakresie przerwań, liczę też na krótkie wskazówki kolegi fachowca.

    pozdrawiam
  • #9 3138059
    pepin0
    Poziom 11  
    Posty: 71
    Pomógł: 1
    Ocena: 3
    juz dziala cos nagle mu sie odmienilo i zadzialalo na procesorze a w bascomie symulator i tak nie dziala na atmega16.
  • #10 3138132
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Dosmajster napisał:
    ...A dlaczego bajzel?

    Ano dlatego , że w kodzie nie ma procedury przerwania dla Timer1 , więc procek chcąc obsłużyć przerwanie T1 , poszed by w przysłowiowe maliny.
    Dosmajster napisał:

    Co się stanie w podanym programie gdy w czasie obsługi przerwania wystąpi następne przerwanie ?

    Nic się nie stanie. W AVR-ach , w czasie obsługi dowolnego przerwania , zerowana jest globalna flaga przerwań(odpowiednik bitu EA rejestru IE w MCS-51) , która jest ponownie ustawiana przez rozkaz RETI.Zeby przerwać przerwanie , należy tę flagę ustawic programowo.Czyli jak widzisz , system przerwań w AVR-ach , różni się znacznie od tego w MCS-51.Po szczegóły odsyłam do ... wiadomo gdzie :D
    Dosmajster napisał:

    Nie wiem ile RAM-u w AVR można przeznaczyć na stos, ale w 8051 (bo tego znam) to szybko go zabraknie.

    W AVR-ach , wskaźnik stosu potrafi zaadresować cały wewnętrzny RAM.

    Piotrek

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu z obsługą przerwania INT1 w mikrokontrolerze Atmega16, gdzie przerwanie nie reaguje na zmianę stanu na pinie PD3. Użytkownik próbuje wyświetlić na LCD wartość licznika Timer1, który ma mierzyć czas między impulsami. Wskazano, że ustawienie „Reset Portd.3” powoduje stan wysokiej impedancji na wejściu, co może uniemożliwiać wykrycie stanu wysokiego, sugerując włączenie podciągania (Set Portd.3). Zwrócono uwagę, że obsługa wyświetlacza LCD nie powinna być wykonywana w procedurze przerwania, a jedynie odczyt i zerowanie licznika Timer1. Podkreślono różnice w obsłudze przerwań między AVR a 8051, m.in. automatyczne blokowanie przerwań podczas obsługi i brak konieczności ręcznego zarządzania flagą globalną. Wskazano również, że brak procedury przerwania dla Timer1 może powodować nieprawidłowe działanie. Problemy z symulatorem Bascom, który nieprawidłowo emuluje przerwania dla Atmegi16, zostały zauważone. Ostatecznie problem został rozwiązany na rzeczywistym procesorze, mimo że symulator nadal nie działał poprawnie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA