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)
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.
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.
