Grafický LCD 128x64 MG12864A-SBC/H - komunikační rutina

Zdravím. Mám tu tento LCD: gme.cz/cz/mg12864a-sbc-h-p513-119.html
Snažím se na něm rozsvítit aspoň pár pixelů, ale ten diplej an mě prostě kašle.
Displej si myslím mám dobře zapojený (dvojí kontrola). Kontrastem to nebude, ten pořád zkouším kroutit od kraje ke kraji.
Už fakt nevim, co můžu dělat blbě. Dokonce jsem logickou sondou kontroloval stavy na jednotlivých vývodech LCD, postupně po provedení každého příkazu zvlášť. Zdá se, že to sedí. Ale stejně mi to nefunguje.
Běží to na mega32.
díky za pomoc


#include <avr/io.h>
#define F_CPU 16000000U
#include <util/delay.h>

/*

DB7:0 = PA7:0

RST = PC7
CS2 = PC6
CS1 = PC5
RS  = PC4
E   = PC3


*/


#define CS1 0b00100000
#define CS2 0b01000000

void LCD_Reset(void)
{
  PORTC = 0b00000000;
  _delay_us(5.00);
  PORTC = 0b10000000;
  _delay_us(0.45);
}

void LCD_WrCMD(char c)
{
  PORTC &= 0b11101111;
  PORTC |= 0b00001000;
  PORTA = c;
  _delay_us(0.45);
  PORTC &= 0b11110111;
  _delay_us(0.45);
}


void LCD_WrDATA(char d, char cs)
{
  PORTC |= 0b00010000;
  PORTC = (PORTC & 0b10011111) | cs;
  PORTC |= 0b00001000;
  PORTA = d;
  _delay_us(0.45);
  PORTC &= 0b11110111;
  _delay_us(0.45);
}


void LCD_SetYADDR(char y)
{
  LCD_WrCMD(0b01000000 | y);
}

void LCD_SetXPage(char x)
{
  LCD_WrCMD(0b10111000 | x);
}


//*************************** MAIN **************************
int main (void)
{
  PORTA = 0;
  PORTC = 0;
  DDRA = 0xFF;
  DDRC = 0b11111000;

  LCD_Reset();

  LCD_WrCMD(0b00111111); //zapne LCD
  //LCD_WrCMD(0b11000000); //Startovaci radek 0

  LCD_SetXPage(0);
  LCD_SetYADDR(0);
  LCD_WrDATA(0xF0, CS1);


  while (1) ;
  
}

:arrow_right: administrator: přejmenováno z "Grafický LCD 128x64 - nekomunikuje"

Zdravím. Tak tenhle problém jsem řešil asi před rokem než jsem se uchýlil k nehorší variantě a to naprogramovat to příkaz po příkazu podle datasheetu a to se mi povedlo pak už stačilo najít jen vhodnou knihovnu. Tu se mi podařilo najít ale nefungovala. Po dvou měsících jsem zjistil že je tam strasně malé časové spoždění mezi jednotlivými příkazy :unamused: (‘nop’ nahrazeno _delay_us(x)) a funguje to skvěle . Tady máš celý projekt i s knihovnama pro ten samý LCD akorat používám AtMegu 16 ale to by vadit nemělo :wink: tak snad ti to pomůže 8)
GLCD-avr.rar (65.2 KB)

No jo čéče…
Já to dělám podle knížky od Davida Matouška (Práce s inteligentními displeji LCD) - super pomocník - a tam bylo řečeno, že perioda signálu E má být větší než 1us… a to ten můj program poněkud nesplňuje.
Zkusim to upravit, a pak když to nepoběží, tak se podívám na tu knihovnu.

NO právě. Podle mě ten kdo navrhoval tu knihovnu měl nižší frekvenci kontroleru takže mu stačil assemblerovský příkaz nop ale jakmile jsem to pustil na 16Mhz tak nic ani ťuka. Takže podle mě je problém právě tady takže je lepší se řídit heslem radši víc než míň. Dokonce když jsem to zkoušel poprve tak jsem tam měl spoždění 1ms až to jelo tak jsem ji snížil. Jinak v knihovně je i práce s obrázky, grafickými obrazci a textem což si myslím že se hodí.

Tu knihovnu hlavně psalo nějaké prasátko, kterému nějaké formátování zdrojáku nic moc neříká - je to nepřehledné.
Zpožděním to není, já tam měl taky milisekundy, a prdělo to na mě.
Spíš jsem si teď všiml, že i při zápisu příkazu do LCD se volí, na který kontrolér (CS1 nebo CS2) se příkaz pošle. To mi ale David Matoušků neřekl. Hlavně že tam má 10 mizerně komentovaných zdrojáků jako příklady.
No tak tedy zkusím to takhle poupravit, třeba to začne spolupracovat (i když pochybuju…)

Podle mě když v projektu změníš typ procesoru a upravíš porty podle svého tak by to mělo běžet. taky jsem tomu nechtel věřit že to pojede ale zatím jsem s ní neměl žádný problém. Jinak toho v mainu si nevšímej to jsem zkoušel co všechno ta knihovna dokáže takže jsem načítal různé obrazce obrázky a tak . . .

Pochop prosím, jednu věc. JÁ NESHÁNÍM KNIHOVNU PRO GRAFICKÉ LCD. Tedy mě příliš nezajímá, že nějaká knihovna funguje. Mě zajímá proč můj program nefunguje. Co tam dělám špatně. Díky.

Jak tak koukám na ten tvůj zdroják tak se mi tam nezda ten enable signal. možná zkusit první poslat data na port a pak to potvrdit E a následne ho vypnout. A nejsem si jistý jestli to bylo u tohoto dispaye ale další problém je uroven Resetovacího signalu ktery by měl být tuším natvrdo na 1

Displej bere data na spádové hraně, tedy při změně E z 1 do 0. Tuhle konstrukci používám i pro HD44780 textové LCD, a chodí to. Můžu to zkusit upravit, ale nic si od toho neslibuju. Na vstupu RST# displeje mám log 1. Dokonce mám na některých řídících signálech nastrkané LEDky, tak vidím, co tam je. Ještě zkusím třeba přidat nějaký timeout po zapnutí napájení displeje.

Jo jo už to tam vidím že je rst v 1. Nevím přes to & a | do toho az tak dobře nevidím ale taky tam nevidím to jednotlivé nastavení pro CS1 a CS1 pokud se nemýlím. Jestli vidím dobře tak v zapisování zapisuješ příkaz ale nemáš zvolený CS. Když už jsem fakt nevěděl co s tím tak jsem po každém příkazu nuloval vše co šlo

[/code]

Já už možná tuěím, kde mám zradu.
ta mrcha potřebuje přestih volby řadiče (CS1 nebo CS2) minimálně 200ns před aktivací E (E=1). A to jaksi nesplňuju, jelikož mi to běží na 16MIPS,a E aktivuju pár desítek ns po tom, co zvolím CS. Zkusím tam uměle vrazit nějaký delay, třeba se to umoudří.
Asi půl hodiny jsem studoval časování průběhů na sběrnici z datasheetu.

EDIT: Už mě to vážně nebaví. Zase jsem multimetrem prověřil, zda je to správně zapojené. Napájecí napětí jsem došteloval na 4,97V (z původních 4,22V). Zdroj Vee dává nyní -4,8V. Neumí to zobrazit nic lepšího, než to na obrázku. Dokonce jsem zápisové rutiny upravil přesně podle knihovny, kterou mi zaslal Dr.Xtreme. Stejně to nefunguje. Mám podezření na vadný LCD.

EDIT2: Už jsem říkal, že ten LCD je z GMe, a že zadní strana kde jsou osazené SMD součástky, je pájená RUČNĚ? Je to osrané od tavidla, a ledabyle zapájené. S klidem můžu říct, že bych to zaletoval lépe.
Psal jsem známému, zda nemá doma nějaký jiný grafičkák, který by mi mohl půjčit. Tohle chování LCD mi nepřipadá normální. Když se na ten obrázek podíváte, všimněte si prosím, že ta pravá část LCD je viditelně rozdělená na část s větším a menším šumem. (u levé části je to podobně znát, ale ne tolik).

No tak tohleto to opravdu dělat nemá! Taky bych to typoval na nějakou závadu . . .

Ahoj
Z obrazku nelze definovat, v jakem stavu je display.
Pokud se zapne display a potom uC, tak to dela tyhlety body, rozmisteni je vicemene nahodne.

Doporucuji zkusit nejakou fungujici rutinu, aby mel clovek jistotu ze to funguje a potom si hrat s nejakou vlastni rutinou…

Signál E displeje je zabitý přes odpor do země. V momentě kdy startuje MCU, jsou výstupy ve vysoké impedanci. Do displeje se ale nemá co jak dostat, protože E má definovanou úroveň hned po připnutí napájení. Ale dobrá poznámka. Podobné problémy se vyskytují i u textových displejů. Ten odpro to vždy vyřešil.
Ale dobrá poznámka.
Již dříve jsem na to nebral moc ohledů, ale když jsem tak různě testoval, zda to mám zapojené dobře, všiml jsem si, že při odpojení Ečka od kontroléru, a ponechá odporu na zem (tedy E v log.0, ne ve vzduchu), tak se na displeji bordel neobjeví. Tedy tam ten bordel musí lézt z MCU. Ale to nechápu jak. Kdybych měl nějakou inteligentnější logickou sondu, nehcal bych si napočítat impulzy na Ečkovém vývodu. Podle toho by se dalo určit co tam asi nechodí.
Můžu tam zkusit napasovat tu knihovnu od Dr.Xtreme. Ale vzhledem k tomu, že jsem už dá se říct opsal z ní funkce do té mojí, a stejně prd, tak myslím, že tudy cesta nevede, tak ale uvidíme. Zkusím to.

Když displej špatně inicializuješ, tak může dělat i tohle, rozhodně to neznamená, že by měl být vadný.

Tak jsem to asi vyřešil. Ten displej je totiž otřesně pomalý. Mám k němu datasheet (co k němu dodává gme), ovšem ty úžasné rychlosti o kterých se tam píše, to fakt nedává. Tedy perioda signálu E 1us ani náhodou. Chytá se mi to až při periodě cca 10us. Možná to je tím, že nečekám nijak na provádění příkazů. V té knihovně GLCD je totiž použitý i vývod R/W, a čeká se pokaždé na BUSY flag. Já v rámci šetření vývodů nedělám. Ale mohl bych. Vývodů mám momentálně ještě dost volných. Však je to jen testovací konstrukce…
Zanedlouho mám v plánu s tím něco slušnějšího urobit. Tak snad se zadaří.

Mimochodem, co mi doporučíte ohledně psaní textů na to LCD? Přepdokládám, že si mám uložit sadu písma do FLASH procesoru, a odtud to pak sypat do LCD…

Ale on byl celou dobu dobře incicializovaný. Kdyby nebyl, tak by se na něm nic neukázalo, jelikžo defaultně jsou budiče vypnuté. Veškerá inicializace tedy spočívá v tom, že se na oba budiče pošle ON příkaz.

A nemate nahodou aktivni JTAG? Jestli ano, tak E nema tvrdou log.1 a tudiz to bude mit dobu nabehu jako prase …

Jinak kdysi jsem na svuj web napsal tohle (a asi jsem to i myslel vazne, ale to jen tak pro info):