Witam
Chciałbym w moim programie wykorzystać przerwanie od timera po przepełnieniu i przerwanie od OCR tego timera czyli od rejestru porównania.
Przerwanie przy przepełnieniu timera to nie problem, ale od porównania jeszcze nie robiłem i nie wiem co i jak. Czy da sie to zrobić w Bascomie, żeby przerwanie od porównania nie kasowało timera?
Bascom, przerwanie od Timer i OCR
-
ZbeeGin
Trochę mało danych - jaki procesor, który licznik chcesz wykorzystać... Ale bazując na TIMER1:wiktor pisze:Przerwanie przy przepełnieniu timera to nie problem, ale od porównania jeszcze nie robiłem i nie wiem co i jak.
Kod: Zaznacz cały
Config Timer1 = Timer, Prescale = 8, Compare A = Disconnect, Clear Timer = 0Drugi składnik: Prescale = 8 - tutaj ustawiasz dzielnik przez jaki ma być przepuszczony sygnał zegarowy;
Trzeci składnik: CompareA = Disconnect - ustala reakcję końcówki OC1A na wynik porównania, w tym przypadku stan jej się nie zmienia;
Czwarty składnik: Clear Timer = 0 - włącza/wyłącza opcję zerowania licznika po wystąpieniu porównania, tutaj wyłączone.
Jeśli chcesz wykorzystać przerwania to oczywiście musisz użyć instrukcj On:
Kod: Zaznacz cały
On Timer1 Licznik_przepelniony
On Compare1A Porownanie_zgodne
Enable Timer1
Enable Compare1A
Enable InterruptsAby porównanie miało miejsce przy określonej wartości musisz użyć jeszcze specjalnej zmiennej: Compare1A której po prostu nadajesz wartość:
Kod: Zaznacz cały
Compare1A = 1346[ Dodano: 2007-01-07, 20:22 ]
Mój przykładowy program testowy:
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 1000000
Dim Over As Bit , Comp As Bit
Config Timer1 = Timer , Prescale = 8 , Compare A = Disconnect , Clear Timer = 0
Compare1a = 1024
On Timer1 Licznik_przepelniony
On Compare1A Porownanie_zgodne
Enable Timer1
Enable Compare1A
Enable Interrupts
Do
Nop
Loop
Licznik_przepelniony:
Over = Not Over
Return
Porownanie_zgodne:
Comp = Not Comp
Return
End-
ZbeeGin
Chcesz powiedzieć, że wartość porównywana będzie zmienna. OK. Nic prostszego, zmieniaj zawartość Compare1A tylko jak licznik się przepełni - w jego przerwaniu. Ale uwaga! Procedura obsługi przerwania posiada prolog (i epilog), którego nie widać w programie - około 20 instrukcji maszynowych, zanim więc dojdzie do instrukcji przypisania wartości zmiennej, to licznik zliczy już parę impulsów. Zatem wpisywanie jednostkowych wartości (1-15) może spowodować, że porównanie wystąpi po dwóch przebiegach licznika.wiktor pisze:OCR1A będzie zmienną wiec muszę pomyśleć jak uniknąć niespodzianki typu rozminięcia się/przeskoczenia.