Witam,
Przymierzam się do zrobienia wyświetlacza widmowego.
Póki co mam prototyp, który działa, ale nie bardzo dobrze.
Wydaje mi się, że wiem w czym tkwi problem, ale nie wiem do końca jak go rozwiązać..
Założyłem sobie, że wyświetlacz będzie podzielony na 20 części, czyli mogę wyświetlić obraz co 18stopni(360/20).
Czytając informacje znalezione w Internecie zasada takiego wyświetlacza powinna być następująca.
1.Odpalamy Timer0(jako licznik), który zlicza czas potrzeby do zrobienia jednego okrążenia wiatraka
2.Konfigurujemy Timer2 tak, aby przerwanie było 20 razy(bo taką założyłem rozdzielczość) częściej niż obrót pełnego obrotu wentylatora.
W przerwaniu Timera2 wystawiamy na port, do którego podpięte są diody nasz obraz.
Czy taka zasada jest poprawna?
#############################################
Bo w rzeczywistości nie działa to najlepiej..
Tzn.
Mój wentylator potrzebuje ok 25ms na wykonanie obrotu (2400 obr/min)
Mam uC napędzany kwarcem 8Mhz.
Konfiguruję prescaler licznika(timera0) na podział przez 1024, co daje mi jeden 'impuls' co 128us.
Więc maksymalną wartość do jakiej może doliczyć licznik (aby się nie przekręcić to ) 128us*255= 32640us=32,6ms.
Czyli wszystko OK.
Teraz ustawiam timer2 jako CTC i wpisuję do niego wartość 20 razy mniejszą niż tą do której doliczył Timer0.
I wszystko niby działa, ale na końcu obrotu widać, że obraz się przesuwa/drga/jest niewyraźny.
Dzieje się to z pewnością dlatego, że te przerwania nie są DOKŁADNIE wykonywane 20 razy w ciągu pełnego obrotu wentylatora.
No bo załóżmy, że licznik(timer0) doliczył do 176 (czyli wentylator obraca się co 176*128us=22,5ms)
i teraz dzielimy 176/20=8.8 niestety nie można wpisać wartości ułamkowej do TIMERA2, aby wyzwolić przerwania więc zostanie ta wpisana wartość 8, i tym samym przerwania nie będą wykonywane 20 razy w ciągu obrotu wentylatora a OKOŁO 20 razy (pewnie coś koło 19 albo)...
Chciałbym się dowiedzieć, czy coś źle robię, czy ta koncepcja jest zła...
Albo jak to rozwiązać?? Mogę użyć timera 16bit, ale mało prockow ma 2 timery 16 bit..
Jak inne osoby to rozwiązaly?
Przymierzam się do zrobienia wyświetlacza widmowego.
Póki co mam prototyp, który działa, ale nie bardzo dobrze.
Wydaje mi się, że wiem w czym tkwi problem, ale nie wiem do końca jak go rozwiązać..
Założyłem sobie, że wyświetlacz będzie podzielony na 20 części, czyli mogę wyświetlić obraz co 18stopni(360/20).
Czytając informacje znalezione w Internecie zasada takiego wyświetlacza powinna być następująca.
1.Odpalamy Timer0(jako licznik), który zlicza czas potrzeby do zrobienia jednego okrążenia wiatraka
2.Konfigurujemy Timer2 tak, aby przerwanie było 20 razy(bo taką założyłem rozdzielczość) częściej niż obrót pełnego obrotu wentylatora.
W przerwaniu Timera2 wystawiamy na port, do którego podpięte są diody nasz obraz.
Czy taka zasada jest poprawna?
#############################################
Bo w rzeczywistości nie działa to najlepiej..
Tzn.
Mój wentylator potrzebuje ok 25ms na wykonanie obrotu (2400 obr/min)
Mam uC napędzany kwarcem 8Mhz.
Konfiguruję prescaler licznika(timera0) na podział przez 1024, co daje mi jeden 'impuls' co 128us.
Więc maksymalną wartość do jakiej może doliczyć licznik (aby się nie przekręcić to ) 128us*255= 32640us=32,6ms.
Czyli wszystko OK.
Teraz ustawiam timer2 jako CTC i wpisuję do niego wartość 20 razy mniejszą niż tą do której doliczył Timer0.
I wszystko niby działa, ale na końcu obrotu widać, że obraz się przesuwa/drga/jest niewyraźny.
Dzieje się to z pewnością dlatego, że te przerwania nie są DOKŁADNIE wykonywane 20 razy w ciągu pełnego obrotu wentylatora.
No bo załóżmy, że licznik(timer0) doliczył do 176 (czyli wentylator obraca się co 176*128us=22,5ms)
i teraz dzielimy 176/20=8.8 niestety nie można wpisać wartości ułamkowej do TIMERA2, aby wyzwolić przerwania więc zostanie ta wpisana wartość 8, i tym samym przerwania nie będą wykonywane 20 razy w ciągu obrotu wentylatora a OKOŁO 20 razy (pewnie coś koło 19 albo)...
Chciałbym się dowiedzieć, czy coś źle robię, czy ta koncepcja jest zła...
Albo jak to rozwiązać?? Mogę użyć timera 16bit, ale mało prockow ma 2 timery 16 bit..
Jak inne osoby to rozwiązaly?