Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 9 sty 2025, o 18:11


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 26 lut 2014, o 21:23 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 18
Pomógł: 0

Witam.
Mam zrobioną matrycę LED z sześciu wyświetlaczy 8x8.
Sterowanie poprzez PORTA (ULN2803) procesora dla kolumn i HC595 dla wierszy.
Męczę się już od jakiegoś czasu, ale nie mogę dać rady z jedną rzeczą.
Podczas przewijania tekstu widzę go rozmytego, tak jakby byłu dwa napisy na sobie, ale przesuniętę o jeden piksel w bok (pogdubione litery). Ogólonie ciężko na to spojrzeć, bo oczy się męczą. Podczas statycznego napisu nie ma widocznego przemiatania. Częstotliwość jaką ustawiłem to:
11059200 (kwarc) / 64 (preskaler timera) = 172800
172800 / 15 (255-240 przepełnienie timera) = 11520
11520 / 48 kolumn = 240 Hz
Chyba, że coś pomyliłem z tymi obliczeniami :|
Na razie chcę tylko poprawnie wysterować przesuwanie. Później dopiero zajmę się innymi rzeczami, np. tym że litera i zajmuje 5 kolumn itp.
Chodzi mi o te rozmyte litery. Co jest przyczyną?
Schemat różni się tylko tym, że ja mam 6 matryc 8x8, co daje 48 kolumn.

Obrazek

Składnia: [ Pobierz ] [ Ukryj ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Gdyby ktoś chciał odpowiedzieć, że to problem z tak zwanymi "duszkami" to raczej chyba nie. Duszki wyglądają inaczej.
Wyświetlanie wygląda tak:
1. Gaszę PORTA czyli kolumnę (tablica gaśnie)
2. Ustawiana sa wiersze HC595 (przy wyłączonej tablicy)
3. Zapalam PORTA (tablica świeci)
4. Czekam na kolejne przerwanie takie samo jak od 1-3

Dziwna rzecz jest taka, że jeżeli patrzę nie bezpośrednio na napis, ale na nieruchomy element, np. na obudowę tych wyświetlaczy 8x8 to nie widac żadnych nieprawidłowości. Napis jest taki jak ma być.
Dopiero jak się spojrzy bezpośrednio na napis (diody) to wtedy oczy świrują i widać napis podwójnie.
Więc to co innego, niż duszki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2014, o 07:30 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 517
Pomógł: 26

Kolego po co w głównej pętli masz włączanie globalne przerwań? Wystarczy to włączyć na początku programu i tyle. Następnie wywalił bym wszystko z obsługi przerwania i dał to do pętli głównej. W przerwaniu utworzył byś flagę która będzie zezwalać w pętli głównej na wykonywanie tego kodu który przeniesiesz z przerwania.

_________________
Przewodnik|Sterownik akwariowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2014, o 08:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 sty 2014
Posty: 447
Lokalizacja: DKL
Pomógł: 53

Ja jeszcze widzę, że główna pętla nie jest zakończona, z tego co pamiętam konstrukcja powinna być taka:
Składnia: [ Pobierz ] [ Ukryj ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Bez End na końcu, potrafią się dziać niezłe cuda ;)

_________________
Migracja z punktu B do punktu C
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2014, o 13:13 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 18
Pomógł: 0

No faktycznie gdzieś mi "End" uciekło :)
A co do przerwań to włączam je w pętli głównej, bo ten kod ma również (nie umieszczałem na forum) odsługę tej matrycy przez UART1 w Atmega128 pprzez przerwanie. Nie wiem z jakiego powodu, ale gdy włączałem przerwania globalne tylko na początku programu, to po odebraniu jeden raz w przerwaniu URXC1 danych z UART już więcej razy nie mogłem ich odebrać. Za nic nie chciało skoczyć do przerwania URXC1 po raz kolejny. Doszedłem, że wystarczy ponownie włączyć przerwania i działa.
A co do optymalizacji kodu o której pisze matekogon, to faktycznie lepiej byłoby w pętli głównej, ale takie rzeczy zrobię później.
Na razie chcę aby mi ta matryca działała, bo na razie nie działa jak trzeba.
Wydaje mi się, że to problem z częstotliwością wyświetlania, ale nie jestem pewien co mam zrobić, dlatego proszę o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2014, o 19:38 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 517
Pomógł: 26

Kolego mi tu nie chodziło o kosmetykę programu. Tylko o pytanie czy procesor wyrobi się w wykonaniu tego kodu umieszczonego w przerwaniu.

_________________
Przewodnik|Sterownik akwariowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2014, o 22:26 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 18
Pomógł: 0

No to spróbuję przenieść to do pętli głównej.
Ale czy to ma takie duże znaczenie, skoro i tak pętla główna jest pusta?
Może i to głupie pytanie, ale dla mnie ważne.
Czy przerwanie w takim przypadku gdy pętla główna nie zawiera kodu musi być krótkie?
Przecież czas wykonania tego kodu w pętli głównej, czy w przerwaniu będzie taki sam, chyba :?:
A jeżeli chodzi o częstotliwość wyświetlania, jaka powinna być? Jakaś określona, czy im większa tym lepsza?
Jakie minimum?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2014, o 10:18 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 517
Pomógł: 26

Może być tak że avr będzie w połowie realizacji kod w przerwaniu a tu już otrzyma informację o kolejnym przerwaniu i zacznie od nowa przerwanie nie dokończywszy kodu . No co do wyświetlania im wyższa tym lepsza.

_________________
Przewodnik|Sterownik akwariowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2014, o 12:48 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 18
Pomógł: 0

No ale popatrz, gdyby było tak jak piszesz to nie wyświetlałby mi się poprawnie napis. Byłyby jakieś krzaki. Tymczasem napis jest wyświetlany poprawnie.
Poza tym, czy nie jest tak, że jeżeli w przerwaniu nastąpi kolejne przerwanie to procesor najpierw dokończy to pierwsze, po czym wróci na jeden takt zegara do pętli głównej i skoczy po raz kolejny do przerwania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2014, o 12:02 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 517
Pomógł: 26

Tak masz rację co do wykonania całego kodu w przerwaniu. Ale co w tedy się stanie jeśli każde przerwanie będzie opóźnione o ten fragment kodu ,który będzie wykonany w chwili kiedy przyszła informacja o drugim przerwaniu? Co w tedy stanie się z twoją częstotliwością ?

_________________
Przewodnik|Sterownik akwariowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2014, o 15:35 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 18
Pomógł: 0

No ale jeżeli dam to w pętlę główną i będę zezwalał jakąś flagą w przerwaniu, to nadal mam tyle samo kodu i nadal może się nie wyrabiać. ;)
Zmieniłem kwarc na 20MHz. Wyłączyłem przerwania i timer0. Zawartość kodu przerwania przepisałem do pętli głównej i wywyołuje się ona bez opóźnień z częstotliwością kwarcu. Częstotliwość wyświetlania jest więc teraz bardzo wysoka, jedyne opóżnienie to wykonywanie poleceń przez procesor. I nadal jest to co było, a przecież nie ma teraz mowy, że coś się nie wyrabia w czasie, bo nie ma co się nie wyrabiać :)
Więc to nie to jest przyczyną.
Lecz zastanawiam się, czy to przypadkiem HC595 nie są za wolne?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 7 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO