Bascom, przerwanie od Timer i OCR

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
wiktor
-
Posty: 5
Rejestracja: 16 paź 2006, 23:24

Bascom, przerwanie od Timer i OCR

Post autor: wiktor » 07 sty 2007, 18:12

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?

ZbeeGin

Post autor: ZbeeGin » 07 sty 2007, 20:08

wiktor pisze:Przerwanie przy przepełnieniu timera to nie problem, ale od porównania jeszcze nie robiłem i nie wiem co i jak.
Trochę mało danych - jaki procesor, który licznik chcesz wykorzystać... Ale bazując na TIMER1:

Kod: Zaznacz cały

Config Timer1 = Timer, Prescale = 8, Compare A = Disconnect, Clear Timer = 0
Pierwszy składnik: Timer1 = Timer - tym ustawiasz co zlicza licznik, w tym przypadku jest to sygnał zegarowy przez prescaler;
Drugi 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 Interrupts
I to wszystko w gestii deklaracji i włączenia przerwań. Teraz tylko musisz napisać dwie procedury obsługi Licznik_przepelniony i Porownianie_zgodne. Obie zakończone oczywiście przez Return.

Aby 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
Przy takiej deklaracji przerwanie OCR1A będzie zgłaszane jeśli licznik zliczy 1346 impulsów wejściowych od jego wyzerowania/przepełnienia. Przypisanie to wypadałoby wykonać przed instrukcjami On a po konfiguracji, aby nie było niespodzianek z "przypadkowym" zgłoszeniem przerwania.

[ 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
W oknie symulatora w zakładce Variables wpisz kolejno Timer1, Over, Comp i zaznacz opcję Sim Timers oraz włącz Refresh Variables. Potem uruchom symulację. Będziesz widział co się dzieje z licznikiem i ze zmiennymi, które mają zmieniać stan po każdym powiązanym z nimi przerwaniu.

wiktor
-
Posty: 5
Rejestracja: 16 paź 2006, 23:24

Post autor: wiktor » 08 sty 2007, 0:01

Dzięki o to mi chodziło :mrgreen: . Zrozumiałe 100%towo :).
OCR1A będzie zmienną wiec muszę pomyśleć jak uniknąć niespodzianki typu rozminięcia się/przeskoczenia. Z tym już sobie jakoś poradzę. Najważniejsze, że jestem tego świadomy :smile:
Procesor ATmega48.

ZbeeGin

Post autor: ZbeeGin » 08 sty 2007, 8:02

wiktor pisze:OCR1A będzie zmienną wiec muszę pomyśleć jak uniknąć niespodzianki typu rozminięcia się/przeskoczenia.
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.

ODPOWIEDZ