WYświetlacz kolorowy 320x240 sterowanie

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!
Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

WYświetlacz kolorowy 320x240 sterowanie

Post autor: M@ciej » 11 wrz 2011, 11:23

Witam.

Zakupiłem w Artronicu wyświetlacz kolorowy TFT o symbolu: AVD-T320240C256-02-R.
Podłączyłem pod Atmega32 i nie działa tak,jak bym chciał. Jeśli powtarzam funkcję czyszczenia ekranu, to cały ekran czyści mi tylko pierwszy raz, każdy następny czyści tylko w pewnym stopniu, np. do połowy lub tylko 1/3 ekranu. Myślę, że jest tu problem, w autoinkrementacji i nie wiem jak ustawić "kursor adresowy" na początku. Procedura czyszczenia jest taka:

Kod: Zaznacz cały

Sub _cls(byval Kolor As Byte)
 Local J As Word
 Local K As Byte

 Cs = 0 : Rd = 0 : Rs = 0                                   'x-hi
 Portc = 0
 Wr = 0 : Wr = 1 :
 Cs = 1

 Cs = 0 : Rd = 0 : Rs = 0                                   'x-low
 Portc = 0
 Wr = 0 : Wr = 1 :
 Cs = 1

 Cs = 0 : Rd = 0 : Rs = 0                                   'y
 Portc = 0
 Wr = 0 : Wr = 1 :
 Cs = 1

 For K = 0 To 240
  For J = 0 To 320
   Cs = 0 : Rd = 1 : Rs = 1
   Portc = Kolor                                            'kolor
   Wr = 0 : Wr = 1 : Cs = 1
  Next J
 Next K
End Sub
Czy ktoś miał do czynienia z tym wyświetlaczem i mógłby podsunąć jakiś pomysł?

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

Post autor: matrix » 11 wrz 2011, 12:18

Sory za mały OT. Piszesz to w bascomie? Bo ten fragment kodu wygląda jak z bascoma.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 11 wrz 2011, 14:50

Tak, w Bascomie. W lakonicznym datasheecie do tego wyświetlacza znalazłem programik w C,przetłumaczyłem go na Bascoma, przerobiłem nieco i uruchomiłem. No i nie działa zgodnie z przewidywaniami. Przetłumaczona wersja zachowywała się identycznie. Myślałem, że to sprawy stosu, bo jedna procedura wywołuje drugą,dlatego zrobiłem to bardziej "na piechotę", ale działanie jest nadal takie samo.

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

Post autor: kayron » 11 wrz 2011, 15:40

A może byś tak podał link do tej lakonicznej instrukcji, byłoby fajnie, i trochę prościej.
Choć AVR i wyświetlacz 320x240, to trochę dziwny pomysł, bo braknie ci zasobów, w pewnym momencie, że o BASCOM nie wspomnę.

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

Post autor: matrix » 11 wrz 2011, 15:52

Właśnie dlatego napisałem to moje pytanie. Trzeba by w bascomie wszystko pisać na pieszo.

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

Post autor: kayron » 11 wrz 2011, 16:00

Znaczy się w BASCOM też się da, ale to będzie droga pątnicza, jakby z Warszawy iść na Jasną Góre na kolanach.
Ja natomiast nie polecam tłumaczenia kodu z C na BASCOM, sam kiedyś próbowałem, lepiej przeanalizować sobie notę katalogową, ewentualnie można sobie pomóc, analizując kod w C, ale nie tłumacząc go. Nie mówię że się nie da, ale wymaga to sporej wiedzy o programowaniu i przenoszeniu kodu, aby się w maliny nie wpuścić, szczególnie jeżeli w kodzie C użyto gdzieś rekurencji, co w BASCOMie może oznaczać nagła śmierć z krzykiem przerażenia w oczach :wink:

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 11 wrz 2011, 17:29

Nie mogę znaleźć linku, ale też nie mogę załączyć PDFa, gdyż nawet po spakowaniu ma ponad 600 kb, Nie pamiętam, skąd mam ten plik, ale przytoczę tu oryginalny program w C.

Kod: Zaznacz cały

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit CS = P3^2;
sbit RS = P3^3;
sbit WRR = P3^4;
sbit RDD = P3^5;
sbit RST = P3^6;
void wcomd(uchar ch)
 {
 CS=0;RDD=1;RS=0;
 P1=ch;
 WRR=0;
 WRR=1;
 CS=1;
}

void wdata(uchar ch)
 {
 CS=0;RDD=1;RS=1;
 P1=ch;
 WRR=0;
 WRR=1;
 CS=1;
}

unsigned char rdata(void)
 {
 uchar ch;
 CS=0;WRR=1;RS=1;
 P1=0xff;
 RDD=0;
 ch=P1;
 RDD=1;
 CS=1;
 return(ch);
}

void waddr(uint xdat,uint ydat)
 {
 uint xxh,xxl;
 xxh=xdat/256;
 xxl=xdat%256;
 wcomd(xxh);
 wcomd(xxl);
 wcomd(ydat);
}

void disp_all(uchar xsdata)
{
 uint j,k;
 waddr(0x00,0x00);
 for(k=0;k<240;k++)
 {
  for(j=0;j<320;j++)
   { wdata(xsdata);}
  }
 }

 void main(void)
{
 RST=0;delay(50);RST=1;delay(20);
 while(1)
{
 disp_all(0xff); delay(200); //white
 disp_all(0x00); delay(200); //black
 disp_all(0xe0); delay(200); //red
 disp_all(0x1c); delay(200); //green
 disp_all(0x03); delay(200); //blue
 disp_all(0xfc); delay(200); //yellow

 }
}
Nie ma tu żadnej filozofii w przetłumaczeniu tego na Bascom, jak głównie jest to odwołanie do pinów procesora. W procedurze WADDR jest dziwne dzielenie przez 256 i zamiast operatora dzielenia jest "%". Domyśliłem się, że chodzi o podział zmiennej WORD na 2x byte MSB i LSB,bo adres X jest dzielony na 2 8-bitowe.

Nie wiedzieć czemu program po zapełnieniu całego ekranu na biało, na czarno dochodzi tylko do 1/3 ekranu, potem od tego miejsca rysuje pozostałe 2/3 na czerwono, jakby za każdym razem nie pamiętał,żeby zacząć od 0,0, tylko kontynuuje gdzie poprzednio skończył.

A tu link do strony Artronic z pozostałymi opisami, w sumie przedruk ze wspominanego PDFa
Link

PS. Wiem, że C jest pod wieloma względami lepszy od Bascoma, ale ten ostatni wcale nie jest taki beznadziejny. Udało mi się np. ustanowić transmisję po CANie z poziomu "Baska", więc nie jest aż tak źle.

keruseykaryu

Post autor: keruseykaryu » 11 wrz 2011, 19:59

Kod: Zaznacz cały

 Cs = 0 : Rd = 0 : Rs = 0                                   'x-hi 
  Portc = 0 
  Wr = 0 : Wr = 1 : 
  Cs = 1 

  Cs = 0 : Rd = 0 : Rs = 0                                   'x-low 
  Portc = 0 
  Wr = 0 : Wr = 1 : 
  Cs = 1 

  Cs = 0 : Rd = 0 : Rs = 0                                   'y 
  Portc = 0 
  Wr = 0 : Wr = 1 : 
  Cs = 1
A czemusz to RD=0 skoro w obu

Kod: Zaznacz cały

void wcomd(uchar ch) 
  { 
  CS=0;RDD=1;RS=0; 
  P1=ch; 
  WRR=0; 
  WRR=1; 
  CS=1; 
 } 

 void wdata(uchar ch) 
  { 
  CS=0;RDD=1;RS=1; 
  P1=ch; 
  WRR=0; 
  WRR=1; 
  CS=1; 
 }
jest RD=1 a tylko RS ustala czy command czy data.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 11 wrz 2011, 20:26

W sumie nie wiem, w oryginalnym przykładzie w C tak było. Jak się to wyłączy (zaremuje),to nic się w sumie nie zmienia. Mogłoby chyba tego nie być, chociaż nie wiem czemu ma służyć to WR=0 i WR=1 jedno po drugim.

keruseykaryu

Post autor: keruseykaryu » 11 wrz 2011, 21:12

Nie oto mi chodzi. Czytaj uważnie! W twoim kodzie masz zmiany RD przy wysyłaniu command a w C ich nie ma!!!

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 12 wrz 2011, 11:08

Faktycznie, zrobiłem tam błąd. Zmienię to i napiszę jak wyszło. Kolega podpowiedział jeszcze, że X z Y mogą być zamienione w pętlach, jeśli poprawa RD nie pomoże, to spróbuję je zamienić.
Dzięki za podpowiedź z tym błędem.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 12 wrz 2011, 17:04

Voala!! (czy jak się to pisze), poprawiłem jakmi zwrócił uwagę Kolega Keruseykaryu i działa, teraz czyści ekran do końca każdym kolorem. Dzięki :)

Rzutem na taśmę dopisałem procedurę rysującą punkt o współrzędnych X,y, i kolorze kolor

Kod: Zaznacz cały

Sub Punkt(byval X As Word , Byval Y As Byte , Byval Kolor As Byte)
 Local Xh As Byte
 Local Xl As Byte
 Xh = High(x)
 Xl = Low(x)

 Cs = 0 : Rd = 1 : Rs = 0                                   'x-hi
 Portc = Xh
 Wr = 0 : Wr = 1 :
 Cs = 1

 Cs = 0 : Rd = 1 : Rs = 0                                   'x-low
 Portc = Xl
 Wr = 0 : Wr = 1 :
 Cs = 1

 Cs = 0 : Rd = 1 : Rs = 0                                   'y
 Portc = Y
 Wr = 0 : Wr = 1 :
 Cs = 1

 Cs = 0 : Rd = 1 : Rs = 1
 Portc = Kolor                                              'kolor
 Wr = 0 : Wr = 1 : Cs = 1
End Sub
Może się komuś przyda :)

keruseykaryu

Post autor: keruseykaryu » 12 wrz 2011, 17:47

M@ciej pisze:Voala!! (czy jak się to pisze)
Lepiej brzmi Bingo!

Twój subik mi się nie podoba, korzystasz z lokali a one lubią zjadać pamięć. No i taki jakiś nieoptymalny jest bo powtarzasz operacje bitowe a niektóre wcale nie muszą być powtarzane. To też kodożerca.
Nie pamiętam ale by przecież szło zapisać Portc=High(x) i minąć te zmienne.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 12 wrz 2011, 21:17

Masz rację, już uprościłem. Wywaliłem Locale. Nie wiem nadal, dlaczego pisze się te WR=0 i WR=1 jedna po drugiej,coś to daje? bo aż prosi się o wywalenie.

No dobra, sprawdziłem, muszą być, bez tego program nie rusza.

keruseykaryu

Post autor: keruseykaryu » 13 wrz 2011, 5:12

M@ciej pisze:Nie wiem nadal, dlaczego pisze się te WR=0 i WR=1 jedna po drugiej,coś to daje? bo aż prosi się o wywalenie.
Robisz impuls. Pewnie jak popatrzyłbyś na przebiegi to by się wyjaśniło.

http://www.kamami.pl/dl/lcd-ag-tft320240c256.pdf

ODPOWIEDZ