Przerwanie od Compare0 timer0

Pytania, kody i porady dotyczące nie tylko Bascom.
JanJJW
Posty: 25
Rejestracja: 17 sty 2018, 0:17

Przerwanie od Compare0 timer0

Post autor: JanJJW » 01 mar 2018, 17:07

Czy ktoś ma pomysł jak zmusić Timer0 do generowania przerwania w takiej sytuacji:
  1. $regfile = "m88adef.dat"
  2. $crystal = 8000000
  3. $hwstack = 64
  4. $swstack = 100
  5. $framesize = 100
  6. Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
  7. Config Timer0 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
  8. Enable Interrupts
  9. Enable Compare1a
  10. Compare1a = 62497
  11. On Compare1a Cos_tam
  12. Enable Compare0a
  13. Compare0a = 250
  14. On Compare0a Drugie_cos_tam
  15. Config Submode = New
  16.  
  17. Do : Loop : End
  18.  
  19. Cos_tam:
  20. Return
  21.  
  22. Drugie_cos_tam:
  23. Return
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przerwanie od Compare0 timer0

Post autor: niveasoft » 01 mar 2018, 17:25

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.
JanJJW
Posty: 25
Rejestracja: 17 sty 2018, 0:17

Re: Przerwanie od Compare0 timer0

Post autor: JanJJW » 01 mar 2018, 17:41

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
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przerwanie od Compare0 timer0

Post autor: niveasoft » 01 mar 2018, 19:09

Wszystko działa bez problemu. Obydwie diody mrygają ;)
  1. $regfile = "m328pdef.dat"
  2. $crystal = 1000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7.  Config Portc.5 = Output : Led5 Alias Portc.5
  8.  Config Portc.4 = Output : Led4 Alias Portc.4
  9.  
  10.  Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  11.  
  12.  Compare0b = 250
  13.  Compare0a = 255
  14.  
  15.  On Compare0a A_isr
  16.  On Compare0b B_isr
  17.  
  18.  Enable Compare0a
  19.  Enable Compare0b
  20.  
  21.   Enable Interrupts
  22.  
  23.  Do
  24.   !nop
  25.  Loop
  26.  
  27.  A_isr:
  28.   Toggle Led5
  29.  Return
  30.  
  31.  B_isr:
  32.   Toggle Led4
  33.  Return
JanJJW
Posty: 25
Rejestracja: 17 sty 2018, 0:17

Re: Przerwanie od Compare0 timer0

Post autor: JanJJW » 01 mar 2018, 19:53

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
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przerwanie od Compare0 timer0

Post autor: niveasoft » 01 mar 2018, 20:11

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ą.
  1. $regfile = "m328pdef.dat"
  2. $crystal = 1000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7.  Config Portc.5 = Output : Led5 Alias Portc.5
  8.  Config Portc.4 = Output : Led4 Alias Portc.4
  9.  
  10. Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
  11. Config Timer0 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect
  12.  
  13.  Wait 3
  14.  
  15. Enable Interrupts
  16. Enable Compare1a
  17. Compare1a = 62497
  18. On Compare1a Cos_tam
  19. Enable Compare0a
  20. Compare0a = 250
  21. On Compare0a Drugie_cos_tam
  22. Config Submode = New
  23.  
  24. Do : Loop : End
  25.  
  26. Cos_tam:
  27.  Set Led5
  28. Return
  29.  
  30. Drugie_cos_tam:
  31.  Set Led4
  32. Return
Może masz jakiś stary Bascom z bugiem którego nie ma w nowszych wersjach.
Wtedy trzeba Timer ustawić na rejestrach.
JanJJW
Posty: 25
Rejestracja: 17 sty 2018, 0:17

Re: Przerwanie od Compare0 timer0

Post autor: JanJJW » 01 mar 2018, 20:36

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.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przerwanie od Compare0 timer0

Post autor: niveasoft » 01 mar 2018, 20:58

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 ;)
  1. $regfile = "m328pdef.dat"
  2. $crystal = 1000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7.  Config Portc.5 = Output : Led5 Alias Portc.5
  8.  Config Portc.4 = Output : Led4 Alias Portc.4
  9.  
  10.  'Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  11.  'Enable Compare0a
  12.  'Enable Compare0b
  13.  
  14. Tccr0a = Bits(wgm01)                                        'tryb CTC
  15. Tccr0b = Bits(cs00 , Cs02)                                  'prescaler 1024
  16. Timsk0 = Bits(ocie0a , Ocie0b)                              'przerwania od CompareA i CompareB
  17.  
  18.  
  19.  Compare0b = 250
  20.  Compare0a = 255
  21.  
  22.  On Compare0a A_isr
  23.  On Compare0b B_isr
  24.  
  25.  
  26.  
  27.   Enable Interrupts
  28.  
  29.  Do
  30.   !nop
  31.  Loop
  32.  
  33.  A_isr:
  34.   Toggle Led5
  35.  Return
  36.  
  37.  B_isr:
  38.   Toggle Led4
  39.  Return
JanJJW
Posty: 25
Rejestracja: 17 sty 2018, 0:17

Re: Przerwanie od Compare0 timer0

Post autor: JanJJW » 01 mar 2018, 22:11

Wersję mam najnowszą: 2.0.8.1. Zaraz spróbuję Twoich ustawień. Dam znać jak poszło. Dziękuję za pomoc.
JanJJW
Pozdrowienia
JanJJW
Posty: 25
Rejestracja: 17 sty 2018, 0:17

Re: Przerwanie od Compare0 timer0

Post autor: JanJJW » 02 mar 2018, 23:54

Wyszło na to, że to błąd kompilatora. W przypadku AtMega88 nie przewidziano przerwań od "OCR0x".
JanJJW
Pozdrowienia
ODPOWIEDZ