graficzny lcd a umieszczanie grafiki

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
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

graficzny lcd a umieszczanie grafiki

Post autor: matrix » 11 paź 2010, 17:01

jeszcze nie mam graficznego wyświetlacza, ale powoli przygotowuję pliki .BGF do swojego projektu. w związku z tym mam małe pytanko (moze głupie, ale nie dziwcie się, dopiero zaczynam z graficznymi lcd):

czy jeśli mam wyświetlacz 192x64 to żeby umieścić powiedzmy po prawej jakąś grafikę muszę stworzyć grafikę na cały lcd czyli po lewej pusto a po prawej grafika czy tylko wielkości umieszczanego elementu?

raczej logiczne jest by był to element tylko o wielkości wstawianej grafiki.

czy można wstawić grafikę niejako w grafikę? czyli pewien obszar zajmuje jakaś grafika a ja chcę dodać w jej środek kolejną. w takim przypadku jedna zamaże mi drugą jak ma to miejsce w zwykłym lcd czyli nadpisanie miejsca?

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 11 paź 2010, 19:26

Oczywiście że element może mieć dowolny rozmiar, nawet większy od samego ekranu, bo wyświetlisz sobie tylko tyle ile potrzebujesz.
Jak już wcześniej ci napisałem twój wyświetlacz to tak naprawdę 3 niezależne wyświetlacze 64x64, a sterownik KS0108 obsługuje max rozmiar 128x64, czyli wykorzystane jest tylko 50% jego RAMu.
Niestety taka konstrukcja me swoje wady, otóż nie da się liniowo przesyłać danych o obrazie.
Dane trzeba przesłać w 3 osobnych paczkach, dla każdej 1/3 ekranu, co gorsza trzeba pamiętać aby co 64 pixele ustawić na nowo licznik wierszy i wyzerować licznik kolumn, bo inaczej połowa danych wyląduje ci w niewidocznej części pamięci ekranu.
Ogólnie spora część wyświetlaczy graficznych jest upierdliwa w obsłudze, bo producenci często stosują przekombinowane rozwiązania. Równie dobrze zamiast 3 sterowników KS0108 producent mógł włożyć 2, dzieląc ekran na połówki 98x64 pixele, wyświetlacz był by tańszy, bardziej standardowy, i miał by mniej linii sterujących, a wyświetlał by dokładnie to samo.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 11 paź 2010, 19:57

na szczęście to co chce wyświetlać jako grafikę będzie się mieścić w jednej części takiego wyświetlacza więc chyba nie będzie takich kombinacji?

grafika ma 25x62px i wygląda jak w załączniku.
Załączniki
pozamykane drzwi.JPG
pozamykane drzwi.JPG (1.24 KiB) Przejrzano 5927 razy

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 12 paź 2010, 14:49

kayron pisze:Niestety taka konstrukcja me swoje wady, otóż nie da się liniowo przesyłać danych o obrazie.
Dlaczego się nie da? Za liniowe przesyłanie obrazu rozumiem w tym przypadku możliwość włączenia/wyłączenia jednego, wybranego piksela bez naruszania stanów pozostałych. Są co najmniej dwie metody, aby to zrobić:
1. Przechowywać w wewnętrznej pamięci RAM uK obraz, ustawić wybrany piksel i blokami przesłać dane do LCD. Rozmiar tablicy to 192 x 64 = 1.5kB.
2. Aktywować wybraną część LCD (linia CS0, CS1 lub CS2), ustawić adres kolumny i wiersza, odczytać linie danych (8 bitów), zmodyfikować wybrany piksel i zapisać go w to samo miejsce.
Tak więc da się, chyba, że przez pojęcie "liniowe przesyłanie danych" rozumiemy różne rzeczy.
kayron pisze:Równie dobrze zamiast 3 sterowników KS0108 producent mógł włożyć 2, dzieląc ekran na połówki 98x64 pixele, wyświetlacz był by tańszy, bardziej standardowy, i miał by mniej linii sterujących, a wyświetlał by dokładnie to samo.
Jednakże szybkość wyznaczania adresu byłaby moim zdaniem mniejsza. Tak dzieląc współrzędną X przez 3 wiesz, którą linię CS aktywować. W przypadku dwóch kontrolerów konieczne byłoby porównanie współrzędnej X z wartością 98, co moim zdaniem będzie bardziej czasochłonne i zaciemniłoby program. Sterowanie trzech kontrolerów jest czytelniejsze.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 paź 2010, 15:11

Jednakże szybkość wyznaczania adresu byłaby moim zdaniem mniejsza. Tak dzieląc współrzędną X przez 3 wiesz, którą linię CS aktywować.
Nic bardziej mylnego bo jak byś miał 2x98 pixeli to byś dzielił przez 2 a nie porównywał z 98 jak to sugerujesz. A dzielnie przez 2 to nic innego jak przesunięcie zawartości rejestru w lewo, czyli jedna instrukcja asemblera i to bardzo szybka, szybsza niż dzielenie przez 3.
Oczywiście tak wyliczysz tylko adres, a nie sygnał CS, tutaj porównania nie unikniesz w obu przypadkach. Choć w przypadku liczby 64 też można stosować sztuczki, ale dla 98 też się da sprytnie to zrobić.
Po drugie mając tylko 2 linie CS potrzebujesz do sterowania tylko 1 pinu procesora i prostego inwertera na tranzystorze, korzyść podwójna, zaoszczędzony pin procesora a i procedura wyboru połówki ekranu jest szybsza i prostsza niż w przypadku 3 ćwiartek.
Oczywiście takie optymalizacje nie mają większego znaczenia w prostych aplikacjach, ale gdybyś już chciał pisać grę, lub szybką animacje, to każdy dodatkowy cykl maszynowy w programie przekłada ci się już na FPSy. A te wiadomo jak są cenne.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 12 paź 2010, 15:27

głupie pytanie zadam. (ale przypominam że dopiero zaczynam)
czyli chcąc coś wyświetlić na takim lcd muszę aktywować najpierw którąś część wyświetlacza i dopiero wysyłać dane?

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 paź 2010, 18:14

Tak. Oczywiście po procedurze inicjacji. Ale jeżeli będziesz używał bibliotek BASCOMa to nie musisz kombinować, same powinny zrobić to co trzeba.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 12 paź 2010, 19:57

kayron pisze:ic bardziej mylnego bo jak byś miał 2x98 pixeli to byś dzielił przez 2 a nie porównywał z 98 jak to sugerujesz.
Masz rację, mam wyświetlacz o organizacji 128 x 64, myślałem o nim i stąd moja wypowiedź :)
Po drugie mając tylko 2 linie CS potrzebujesz do sterowania tylko 1 pinu procesora
Zajrzałem do noty aplikacyjnej sterownika KS0108. Ma on pamięć 512B, czyli 4096 punktów. Pozwala to obsłużyć matrycę o rozmiarze 64 x 64, stąd trzy takie scalaki. Gdyby było tak jak Ty chcesz, to nie byłby juz KS0108 :wink:

ODPOWIEDZ