Sari la conținut
ELFORUM - Forumul electronistilor

Probleme cu ecrane grafice


MifTy

Postări Recomandate

... domnilor, azi mi-a venit, în fine, nenea Arduino Mega! :)

logic şi firesc, până mă apuc de ce-am promis cândva, am zis să mă familiarizez cu modul în care e controlat GLCD-ul meu.

dacă despre Mega în sine nu e nimic de spus, o clonă banală cu un CH340G pe partea de USB, cu ecranul e cam... jale!...

 

ecranul e ăsta (cu tot cu un shield pentru Mega, tot de acolo, dar asta nu cred că e important): http://www.inhaos.com/product_info.php?products_id=77
dacă daţi clic pe tabul "Download" de pe pagina aia, şi descărcaţi documentaţia, o să ştiţi tot atât de multe despre ecranul ăla ca şi mine...

 

problema e că... nu reuşesc să fac ecranul să treacă în mod "landscape", stă doar în mod "portrait".
în plus, am năucit google cu întrebări, nu găseşte altă librărie care să funcţioneze din simplul şi purul motiv că cei de la inhaos au făcut shieldul să meargă pe paralel, nu pe SPI!
iar librăria de la Adafruit e pentru ST7775 controlat în mod SPI NUMAI! logic, nu se potriveşte nimic la modul de adresare, şi ecranul rămâne alb, presupunând că nu mă pup cu erori de compilare!

 

am decis să modific direct în .h parametrii width şi height, nimic.
adică de data asta nu se mai compila nimic, şi erorile semnalate de gcc-ul din Arduino n-aveau nici în clin, nici în mânecă cu modificările făcute de mine...

 

librăriile clasice, u8glib, uclib, TFT, etcetera, nu au habar de controllerul ăsta decât în mod SPI, şi ele...

 

 

după ce am scotocit prin toate alea, şi am citit tot ce am avut (din ce în ce mai puţină) răbdare să citesc, am impresia că chinezii de la inhaos au modificat pe sfert sau pe jumate librăria de la Adafruit, cu unica modificare importantă că au mutat modul de adresare din SPI în paralel... şi mai mult de jumătate dintre comenzile disponibile în librăria "Floricicii" nu mai există în librăria lor, pentru că pur şi simplu nu le-au modificat, iar cele existente sunt de-ajuns doar dacă nu ai chef să schimbi orientarea ecranului!

mai am eu şi alte probleme, de pildă cum controlez rata de refresh, dar deocamdată, trecerea asta e ce mă doare mai tare acum!

mulţumesc pentru răbdare! :d

Link spre comentariu

Avand in vedere experienta ta in programare ar trebui sa fie simplu sa modifici libraria ST7775 astfel incat sa incluzi asta:

void Adafruit_GFX::setRotation(uint8_t x) 
{
  rotation = (x & 3);
  switch (x) {
  case 0:
  case 2:
    _width = WIDTH;
    _height = HEIGHT;
    break;
  case 1:
  case 3:
    _width = HEIGHT;
    _height = WIDTH;
    break;
  }
}



// return the size of the display (per current rotation)
int16_t Adafruit_GFX::width(void) 
{ 
  return _width; 
}
 
int16_t Adafruit_GFX::height(void) 
{ 
  return _height; 
}

si sa obtii rotirea imaginii pe display. (sursa: Adafruit GFX.cpp, diponibila in arhiva pe care ai descarcat-o).

Poti incerca si cu libraria asta: https://github.com/Pazaz/TFT_2_ST7775

 

P.S. Am modificat titlul deoarece consider ca ca nu sunt "probleme tampite" cu ecranele grafice, probleme sunt atunci cand cumperi TFT LCD si nu verifici daca exista librarii pentru chip-urile acelor ecrane grafice (am patit-o si eu, stai linistit!)

Link spre comentariu

să răspund pe rând:
- ecranul e cel cu ST7775, iar "driverul" luat de mine e cel corect. ecranul nu e alb decât dacă nu e nici un sketch care să comande în vre-un fel ecranul grafic conectat la plăcuţă. de pildă, prima oară când l-am pus pe Mega, avea în el doar clasicul blink sketch, care evident, n-avea nici o treabă cu nici un fel de ecran, fie el TFT sau LCD. în plus, dacă era alt driver, nu mai puteam modifica nimic... există 3 exemple de utilizare incluse în librării, şi am putut modifica culorile uşor. să trasez linii "de capul meu" n-am încercat, pentru că mă rodea că voiam să-l pun "landscape", şi asta ar trebui să fie simplu...

într-un singur caz sunt de acord că nu se iniţializează corect: când am încercat cu librăria lui Pazaz! :)
da, am găsit-o aseară, am luat-o şi am încercat-o: şi aia e pentru un controller comandat pe SPI, aşa că nu mă mir că după încărcarea sketch-ului ecranul rămâne alb

- am să încerc codul ăla, mai ales că văd că de fiecare dată când fac greşeli de sintaxă, gcc-ul îmi indică erorile în librăriile de la Adafruit, nu în librăria de la inhaos, cum ar fi normal!
asta mă face să cred că "librăria" celor de la inhaos e, de fapt, un fel de wrapper, sau "bootloader", care accesează şi comandă ecranul în modul de 16 biţi, apoi toate instrucţiunile grafice sunt trimise librăriilor de la Adafruit...
am studiat şi ce scria prin ele, şi am găsit liniile alea... n-a mers.
ori am greşit eu la sintaxă, din motive de oboseală şi draci cu carul, pentru că ceva simplu îmi punea atâtea probleme, ori nu m-am prins care e sintaxa corectă, pentru că dacă bag controalele alea în sketch, ori nu are efect, ori nu se compilează nimic, şi gcc se opreşte cu "exit 1"...
unul din motive e că toate comenzile care "merg" au "TFTscreen.comanda(parametru, parametru)", dar dacă le înlocuiesc cu apeluri directe spre Adafruit, gen "Adafruit_GFX.comanda(parametru, parametru)", primesc erorile clasice de "wrong syntax", chit că gcc nu spune exact că asta e, doar că "this wasn't declared in this scope", sau că nu găseşte comanda aia...

am să mai încerc iar mai pe seară...

cât priveşte schimbatul ecranului... ar fi o idee :))))))))
doar că am aşteptat să vină minunea asta aproape 4 luni (din care 3 a stat în ţară în depozitul vămii sau poştei, nu-mi dau seama), şi ar trebui să vină zilele astea şi pachetul cu un alt ecran grafic, tot ST7775, dar comandat SPI...
dacă mai comand alt ecran grafic, cred că am să comand ceva deja cunoscut în librăriile glcd "standard" ale lui Arduino... ceva cu un ILI, cred...

în altă ordine de idei, dacă vreau acces la pinii Mega-ului cu shieldul ecranului pus... va trebui să fac io nişte pini custom... alţi dolari, altă aşteptare, pentru că îmi trebuie pini cu lungime mai mare ca cea standard... nu ştiu câţi aţi lucrat cu Mega până acum, aşa că n-am idee dacă aveţi idee :P cum se rezolvă asta... şiruri de pini cu lungime mai mare, sau lipesc şiruri de sloturi mamă la 90 de grade pe shieldul pe care stă ecranul? :)

în sfârşit... mi se pare cam (foarte) puţine proiectele cu Mega pe net, comparativ cu numărul de proiecte disponibile pentru Uno, Nano sau Mini... culmea, există proiecte cu Nano şi Mini care folosesc un ecran GLCD accesat în mod 16 biţi, ceea ce mai lasă doar 2 sau 3 pini pentru intrare şi un control sau două... :)))))))
o fi preţul mai mare la Mega, dar mi se pare cam ciudat să te chinui cu un Mini doar pentru că are plăcuţa un sfert din mărimea unei plăcuţe Mega... :)

Link spre comentariu

spre edificare, adaug câteva poze:

2m64w47.jpg
asta e la prima conectare. în Mega era doar "blink sketch", prin urmare, din punct de vedere pur hardware ecranul e ok, dar nu e comandat de nici un fel şi nici o culoare.

2hxbynt.jpg
aici am încărcat un sketch din exemplele date de inhaos.
"TFTDisplayText_Mega2560"... ăsta era exemplul, se găseşte în arhiva cu librăria de la inhaos. valoarea aia e "dummy", în afara ecranului n-aveam nimic conectat la A0...

oh8pdz.jpg
ăsta e un alt sketch exemplu modificat de mine ca să mă obişnuiesc cu cele câteva comenzi care-mi mergeau... "TFTnumber_Mega2560" mai exact.
una din probleme secundare de aici e că valoarea aia (tot dummy) "blinkuie" de nebună, şi n-am reuşit încă să-mi dau seama cum o fac să nu mai clipească, şi doar să se "rescrie" valorile...
şi aşa, ca idee, până se face "fillRectangle" ăla trec nişte secunde bune... mi-a adus aminte de "viteza" fill-ului de pe Z80! :))))))

apropo, cică modul ăsta de conectare a ecranului e "standard 8080", aşa că în principiu, poţi conecta shieldul ăsta şi la 8080, 6800 şi Z80... ar fi o idee să-mi "hackuiesc" HC-ul, şi să-i adaug un ecran d-ăsta :))))))))))

în fine, mai există şi un folder cu surse pentru STM32... mă întreb dacă s-ar mişca mai vioi comandat de ăsta... dar pot băga mâna în foc că treaba cu rotirea ecranului o să se menţină...
până la urmă, e destul de clar, dacă ţin musai să nu mă rup în 14 cu comenzi criptice, tip "scarpină-te cu dreapta la urechea stângă ducând obligatoriu mâna printre picioare" în sketch, ar trebui să văd cum se scrie corect o librărie Arduino, inspirându-mă din ce-a scris Adafruit şi consultând datasheetul LCD-ului, pe care cei de la inhaos au fost drăguţi să-l includă în arhivă... :)
chit că asta ar fi fost, de fapt, treaba mintoşilor de la inhaos, nu a mea!

Link spre comentariu

Salut. Cred ca problema ta legata de orientare se afla in registrul R03h. Ai incercat sa modifici acest registru din fisierul LCD_2000_7775.cpp ?

 

Editare ulterioara: gasesti informatii in fisierul ST7775.pdf la pagina 89.

Editat de valentin marcarian
Link spre comentariu

Salut. Cred ca problema ta legata de orientare se afla in registrul R03h. Ai incercat sa modifici acest registru din fisierul LCD_2000_7775.cpp ?

 

Editare ulterioara: gasesti informatii in fisierul ST7775.pdf la pagina 89.

 

mulţumesc, Valentin, am să încerc seara asta.. dacă iese promit că pun "driverul" aici... şi de data asta cu numele meu băgat acolo... că acum maintainerul e "willy wonka", la "[email protected]" :P

 

Nico, am deja documentaţia pentru Mega.

atunci când mi-am dat seama că ecranul e special conceput pentru utilizarea pe Mega (au şi variante făcute pentru Uno, dar ăsta, atunci era la promoţie, puţin sub 4 dolari, normal, costa cam dublu, cu tot cu shieldul de pus pe Mega, dar fără soclul de SD card :( ) a fost clar că dacă vreau să-l folosesc la modul serios îmi trebuie un Mega... am deja un Nano, iar Uno e trivial de făcut, atâta timp cât nu te interesează shieldurile care se pun peste el. dar dacă e neapărat necesar, un Uno cu CH340 costă şi el circa 3-4 dolari, fără cablu. (de-aia n-am avut probleme cu driverul şi recunoaşterea de către Arduino a Mega-ului... ambele, şi Nano, şi Mega folosesc CH340, deci aveam deja driverul instalat)...

Link spre comentariu

"driverul" facut de inhaos e foarte sumar. Lipsesc destul de multe functii ale ecranului. Poate de aceea si pretul redus.

Am si eu aceeasi problema de refresh cu un TFT. Rezolvarea gasita de mine a fost sa fac fill doar pe zona care vroiam sa o rescriu pe ecran. De restul nu ma atingeam. In felul asta am castigat destula viteza si puteam sa afisez cu viteze destul de mari informatii. E o solutie de compromis dar macar am rezolvat treaba. Data viitoare am sa fiu mai atent ce tip(model) de TFT o sa cumpar, sa aiba suport pentru "drivere" bine facute. Nici UTFT nu ar fi cel mai bun, aici ma refer chiar la acel refresh al ecranului. Sunt altele derivate din UTFT care sunt mult mai rapide.

Link spre comentariu

io acum aştept să-mi vină obiectul ăsta: http://www.ebay.com/itm/252360514212?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT împreună cu ADC-ul cu care am decis să înlocuiesc ADC-ul intern din 328/STM32, în ideea că am să obţin astfel un osciloscop home-made mai cu capul pe umeri decât celebrul kit DSO138... :)

 

ecranul e un TFT de 1.8 inci cu ST7735S, pe SPI, iar ăsta e cunoscut bine-mersi de toate bibliotecile grafice "standard" din Arduino...

ADC-ul e o plăcuţă cu ADS1115... am considerat că mă scutesc de mai multe probleme, dar sunt curios cum o să fie treaba, dat fiind că şi el, şi ecranul împart o conexiune SPI... asta pe Arduino Uno, pe STM32 sau pe Mega nu e o problemă, din câte ţin minte, au două porturi SPI hardware, 328 are doar unul, şi posibilitatea să faci un SPI software, asta dacă mai ai pini liberi...

Link spre comentariu

... ca să fac ce-a zis Valentin, trebuie să accesez registrul ăla din C... şi dacă ştiu să accesez un registru din mcu, la accesatul ST-ului sunt praf... cum fac pop şi push, dar nu în regiştrii din Mega, ci în cei din ST?

asta pentru că s-ar putea să revin la "portrait", şi ar trebui să setez la loc cei doi biţi... şi oricum, e mai elegant aşa: să poţi seta modul landscape sau portrait după necesităţi.
(am încercat eu aseară să editez .cpp şi .h, inversând H cu V, dar n-a mers... deh, speram şi eu să fie aşa simplu! :rade: )

Link spre comentariu

pentru că m-am enervat copios încercând să-mi dau seama cum accesez direct registrul ăla din ST prin intermediul C-ului (parcă vă aud că "nu aşa trebuia să faci!" :) ), am lăsat-o baltă deocamdată, şi m-am mai uitat odată prin librăria lui Pazaz.
aia e şi mai simplistă ca cea de la inhaos, şi e pentru SPI, cum am mai spus... deci am făcut nişte modificări:

#include <Adafruit_GFX.h>
#include <TFT_2_ST7775.h>

// ST7775::Display display(11, 10, 12);
// pin definition for the Mega2560 
#define cs   40
#define wr   39
#define rs   38 
#define rst  41

#define D0   37
#define D1   36
#define D2   35
#define D3   34
#define D4   33
#define D5   32
#define D6   31
#define D7   30

// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define HOTPINK 0xF81F

ST7775::Display display(cs,wr,rs);

void setup() {
	Serial.begin(9600);
	randomSeed(analogRead(0));
	display.setPins(D0,D1,D2,D3,D4,D5,D6,D7);
	display.begin();
}

void loop() {
	static int currentTime = millis(), lastTime = 0;
	display.fillRect(0, 0, ST7775::WIDTH, ST7775::HEIGHT, ST7775::Utility::RGB_565(random(), random(), random()));
	lastTime = currentTime;
	currentTime = millis();
	Serial.print(F("Took ")); Serial.print(currentTime - lastTime); Serial.println(F("ms to render 176x220 pixels"));
}


acum merge... aproximativ!
în versiunea originală se compila fără probleme, se încărca, ecranul se ştergea, şi aşa rămânea! adică nu mai făcea nimic după ce se ştergea ecranul.
acum începe şi nu se mai opreşte din fill cu random color... ceea ce înseamnă că măcar îl "strig" acum pe limba lui... mai rămâne să modific modul de afişare al lu' textu'...

P.S. după aia, fac cu capu'n pungă copy/paste din postul lui nico, la #4 ...să vedem dacă-mi rezolvă problema cu landscape/portrait.
dacă o ia razna, atâta pagubă: şterg folderul librăriei şi o reinstalez... şi aşa e a 4-a oară când aş face asta în ultimele 2 zile! :rade:
P.S. 2 ia să încerc io să-i bag în setup un "display.setRotation(1)" până atunci! nu cred c-o să meargă, dar mai ştii! :rade:
P.S. 3 înainte să dau "add reply" m-am uitat pe serial monitor... plin de texte gen "Took 1741ms to render 176x220 pixels

"... numărul de ms variază cu culoarea, cred... habar n-am, nu mai am chef de studiat chestii ivite pe parcurs acum, fac treaba de mai sus şi la culcare cu mine... :)

Link spre comentariu

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.
Notă: Postarea ta va necesita aprobare moderator înainte de a fi vizibilă.

Vizitator
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Răspunde la acest subiect...

×   Alipit ca text avansat.   Restituie formatare

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări