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

[Bascom][Atmega8] Problem z przerwaniami.

denwer 01 Paź 2011 13:14 1495 3
  • #1 9981712
    denwer
    Poziom 14  
    Witam.
    Mam problem z przerwaniami w atmega8.
    Wcześniej nie potrzebowałem przerwań więc to zagadnienie mnie nie interesowało.
    Potrzebuję wywołać przerwanie zewnętrzne int0 które uruchomi timer1, a ten zacznie odmierzać czas.

    Napisałem coś takiego (oczywiście to część z większego projektu)
    '$sim
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
           'dyrektyw mikrokontrolera
    $crystal = 8000000
    Config Timer1 = Timer , Prescale = 256
    On Timer1 Mierz_czas
    
    Config Lcd = 16 * 2                                         'konfiguracja typu LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
             'konfiguracja linii
             'mikrokontrolera, do których
             'dołączono LCD
    Dim Sekundy As Byte                                         'zmienne do odmierzania czasu
    Dim Minuty As Byte
    
    
    Enable Interrupts                                           'uruchom przerwania
    Counter1 = 34286
    'disable Timer1
    Enable Int0
    On Int0 Zalaczenie
    Set PortD.2
    Do
    
    Loop
    
    '-------------------------------------------
    'przerwanie do odmierzania czasu
    Mierz_czas:
    Counter1 = Counter1 + 34286
    Incr Sekundy
    If Sekundy = 60 Then
       Sekundy = 0
       Incr Minuty
          If Minuty = 60 Then
          Minuty = 0
          End If
    End If
    Cls
    Lcd "sekundy:" ; Sekundy
    Lowerline
    Lcd "minuty: " ; Minuty
    Return
    
    Return
    
    '--------------------------------
    'Przerwanie do wywoływania alarmu
    Zalaczenie:
    Enable Timer1
    return
    End
    

    Niestety nie działa to tak jak oczekiwałem.
    Jak na int0 jest masa to timer1 nie załącza się i jest ok. Jak na int0 daję + to timer1 wzbudza się i zaczyna odmierzać czas. Niestety jak na int0 znowu podaję masę to timer1 przestaje odliczać (a ja potrzebuję żeby po impulsie dodatnim na int0 timer1 zaczął zliczać i już nie przestawać niezależnie od zmian na int0)

    Niestety w pętlę do loop nie mogę wsadzić "enable timer1" po jakimś tam zdarzeniu na int0 ponieważ w tej pętli będzie się dużo działo i zmierzony czas timerem byłby błędny (muszę to załatwić w przerwaniu int0)

    Wedle mojego rozumowania jak w przerwaniu int0 aktywuję timer1 to już się nie wyłącza dopóki nie dam "disable timer1" (niestety tu jest inaczej)

    Może coś pokiełbasiłem z ustawieniami albo może nie takie priorytety ?

    Proszę o pomoc.
  • Pomocny post
    #2 9982234
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #3 9982257
    piotrva
    VIP Zasłużony dla elektroda
    Tak po pierwsze to przerwanie masz domyślnie wzbudzane stanem niskim, czyli przerwanie wywołuje się W KÓŁKO dopóki na pinie panuje stan niski.
    Musisz je ustawić tak, by reagowało na zbocze (w Twoim przypadku opadające).
    Poza tym jak pisał @emarcus - cały program jest pisany bez zastosowania się do jakichkolwiek dobrych nawyków, a i jak widzę wiedza o tym jak działa timer i jak się go stosuje w praktyce wymaga u Ciebie uzupełnienia...
  • #4 9982529
    denwer
    Poziom 14  
    Piotrva -> masz rację. jak dodałem do przerwania int0 linijkę wyświetlającą napis "przerwanie" to po podaniu na int0 masy wyświetlił się ten napis i zapętlił, więc wychodzi na to że int0 ma wyższe uprawnienia od timera.
    Co do instrukcji LCD to oczywiście jej nie będzie w projekcie docelowym. Po prostu w takich testowych programikach dokładam te instrukcje żeby zobrazować sobie co się aktualnie dzieje.

    Jeżeli chodzi o uwagi to się do nich postaram dostosować. Programowałem hobbystycznie jakieś 4 lata temu a teraz przyszło mi wrócić do tego i odkopuję stare knigi aby odświeżyć pamięć.
REKLAMA