- $regfile = "m88adef.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 100
- $framesize = 100
- Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
- Config Timer0 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
- Enable Interrupts
- Enable Compare1a
- Compare1a = 62497
- On Compare1a Cos_tam
- Enable Compare0a
- Compare0a = 250
- On Compare0a Drugie_cos_tam
- Config Submode = New
- Do : Loop : End
- Cos_tam:
- Return
- Drugie_cos_tam:
- Return
Przerwanie od Compare0 timer0
-
- Posty: 25
- Rejestracja: 17 sty 2018, 0:17
Przerwanie od Compare0 timer0
Czy ktoś ma pomysł jak zmusić Timer0 do generowania przerwania w takiej sytuacji:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Przerwanie od Compare0 timer0
Chodzi o przerwanie od przepełnienia przy 255?
To co chcesz zrobić w Compare0a ustaw i zrób w przerwaniu od Compare0b a Compare0a ustaw na końcu. Potem włącz obydwa przerwania A i B i masz jedno tam pod 250 a drugie na końcu.
Jak CompareB jest mniejsze od CompareA to może generować przerwanie.
To co chcesz zrobić w Compare0a ustaw i zrób w przerwaniu od Compare0b a Compare0a ustaw na końcu. Potem włącz obydwa przerwania A i B i masz jedno tam pod 250 a drugie na końcu.
Jak CompareB jest mniejsze od CompareA to może generować przerwanie.
-
- Posty: 25
- Rejestracja: 17 sty 2018, 0:17
Re: Przerwanie od Compare0 timer0
Tak się nie da. W podanej sytuacji przerwanie od Compare0A (B) niestety nie wykonuje się. Bascom'owe komendy tu zawodzą. Juz kombinowałem na wszystkie strony. Nie działa i już. Z reszą sprawdź sam.
Jan J. Wołosiuk
pozdrowienia
Jan J. Wołosiuk
pozdrowienia
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Przerwanie od Compare0 timer0
Wszystko działa bez problemu. Obydwie diody mrygają
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m328pdef.dat"
- $crystal = 1000000
- $hwstack = 64
- $swstack = 32
- $framesize = 128
- Config Portc.5 = Output : Led5 Alias Portc.5
- Config Portc.4 = Output : Led4 Alias Portc.4
- Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
- Compare0b = 250
- Compare0a = 255
- On Compare0a A_isr
- On Compare0b B_isr
- Enable Compare0a
- Enable Compare0b
- Enable Interrupts
- Do
- !nop
- Loop
- A_isr:
- Toggle Led5
- Return
- B_isr:
- Toggle Led4
- Return
-
- Posty: 25
- Rejestracja: 17 sty 2018, 0:17
Re: Przerwanie od Compare0 timer0
Owszem działa ale spróbuj w takiej konfiguracji jaką podałem. Wtedy niestety działa tylko przerwanie od przepełnienia. Porównania nie działają.
JanJJW
pozdrowienia
JanJJW
pozdrowienia
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Przerwanie od Compare0 timer0
Nie rozumiem. Szukasz dziury w całym czy rozwiązania?
Jak może działać przerwanie od przepełnienia jak przy CompareA licznik się zeruje i nigdy do przepełnienia nie dochodzi?
Nie rozumiem Cię.
Napisz wyraźniej o co chodzi bo z tego Twojego kodu nic nie wynika. Piszesz o przepełnieniu a w kodzie tego nie widać.
Chcesz powiedzieć że te dwa przerwania w Twoim kodzie się nie wykonują? A po czym wnosisz?
Przerobiłem Twój kod tylko tak, że dodałem diody i te diody mają się zapalić.
Oczywiście się zapaliły obie, co znaczy, że przerwania działają.
Może masz jakiś stary Bascom z bugiem którego nie ma w nowszych wersjach.
Wtedy trzeba Timer ustawić na rejestrach.
Jak może działać przerwanie od przepełnienia jak przy CompareA licznik się zeruje i nigdy do przepełnienia nie dochodzi?
Nie rozumiem Cię.
Napisz wyraźniej o co chodzi bo z tego Twojego kodu nic nie wynika. Piszesz o przepełnieniu a w kodzie tego nie widać.
Chcesz powiedzieć że te dwa przerwania w Twoim kodzie się nie wykonują? A po czym wnosisz?
Przerobiłem Twój kod tylko tak, że dodałem diody i te diody mają się zapalić.
Oczywiście się zapaliły obie, co znaczy, że przerwania działają.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m328pdef.dat"
- $crystal = 1000000
- $hwstack = 64
- $swstack = 32
- $framesize = 128
- Config Portc.5 = Output : Led5 Alias Portc.5
- Config Portc.4 = Output : Led4 Alias Portc.4
- Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
- Config Timer0 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
- Wait 3
- Enable Interrupts
- Enable Compare1a
- Compare1a = 62497
- On Compare1a Cos_tam
- Enable Compare0a
- Compare0a = 250
- On Compare0a Drugie_cos_tam
- Config Submode = New
- Do : Loop : End
- Cos_tam:
- Set Led5
- Return
- Drugie_cos_tam:
- Set Led4
- Return
Wtedy trzeba Timer ustawić na rejestrach.
-
- Posty: 25
- Rejestracja: 17 sty 2018, 0:17
Re: Przerwanie od Compare0 timer0
I działa??? U mnie na Atmega88 przerwanie od porównania nie działa. Jeśli ustawię przerwanie od przepełnienia to jest ok. Ale w tej konfiguracji, którą podałem timer0 jest w praktyce martwy. Owszem, liczy ale do pełnej wartości a nie do compare0a. Czytałem w nocie katalogowej, ze w przypadku ustawienia przerwań od timera1 wyłączone są przerwania od OC0x. Ponoć da się zmusić Timer0 do obsługi przerwań OC0x tyle, nie mogę doczytać jak to zrobić. Stąd moje pytanie.
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Przerwanie od Compare0 timer0
Napisz jaką masz wersję Bascoma to będzie szybciej.
Jeszcze niedawno, w wersji 2078 miałem podobny przypadek i po sprawdzeniu rejestrów okazało się, że Bascom je źle ustawiał.
Napisałem o tym do Supportu i odpisali, ze faktycznie część Timerów w połączeniu z Clear Timer była błędnie zaliczona do innej grupy.
Poprawili to w następnej wersji.
Podejrzewam więc, że masz taka poprzednią wersję.
Zmuszenie Timera0 Zobacz, zakomentowałem konfig Bascoma a zrobiłem to na rejestrach i diody migają tak samo.
Jak będziesz potrzebował pomocy w innej konfiguracji to pisz
Jeszcze niedawno, w wersji 2078 miałem podobny przypadek i po sprawdzeniu rejestrów okazało się, że Bascom je źle ustawiał.
Napisałem o tym do Supportu i odpisali, ze faktycznie część Timerów w połączeniu z Clear Timer była błędnie zaliczona do innej grupy.
Poprawili to w następnej wersji.
Podejrzewam więc, że masz taka poprzednią wersję.
Zmuszenie Timera0 Zobacz, zakomentowałem konfig Bascoma a zrobiłem to na rejestrach i diody migają tak samo.
Jak będziesz potrzebował pomocy w innej konfiguracji to pisz
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m328pdef.dat"
- $crystal = 1000000
- $hwstack = 64
- $swstack = 32
- $framesize = 128
- Config Portc.5 = Output : Led5 Alias Portc.5
- Config Portc.4 = Output : Led4 Alias Portc.4
- 'Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
- 'Enable Compare0a
- 'Enable Compare0b
- Tccr0a = Bits(wgm01) 'tryb CTC
- Tccr0b = Bits(cs00 , Cs02) 'prescaler 1024
- Timsk0 = Bits(ocie0a , Ocie0b) 'przerwania od CompareA i CompareB
- Compare0b = 250
- Compare0a = 255
- On Compare0a A_isr
- On Compare0b B_isr
- Enable Interrupts
- Do
- !nop
- Loop
- A_isr:
- Toggle Led5
- Return
- B_isr:
- Toggle Led4
- Return
-
- Posty: 25
- Rejestracja: 17 sty 2018, 0:17
Re: Przerwanie od Compare0 timer0
Wersję mam najnowszą: 2.0.8.1. Zaraz spróbuję Twoich ustawień. Dam znać jak poszło. Dziękuję za pomoc.
JanJJW
Pozdrowienia
JanJJW
Pozdrowienia
-
- Posty: 25
- Rejestracja: 17 sty 2018, 0:17
Re: Przerwanie od Compare0 timer0
Wyszło na to, że to błąd kompilatora. W przypadku AtMega88 nie przewidziano przerwań od "OCR0x".
JanJJW
Pozdrowienia
JanJJW
Pozdrowienia