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

Bascom i przerwanie z INT1

21 Paź 2006 00:26 1526 9
  • Poziom 11  
    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
  • Poziom 34  
    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).
  • Poziom 11  
    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.
  • Poziom 11  
    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
  • Poziom 11  
    Próbowałem i dalej nie działa. Chodzi o to, że program wogóle nie wchodzi w miejsce podprogramu przerwania "obr"
  • Poziom 39  
    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
  • Poziom 11  
    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.
  • Poziom 11  
    [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
  • Poziom 11  
    juz dziala cos nagle mu sie odmienilo i zadzialalo na procesorze a w bascomie symulator i tak nie dziala na atmega16.
  • Poziom 39  
    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