forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Ovládání ST7920
Jdi na stránku 1, 2, 3  Další
 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 06 prosinec 2015, 23:26    Předmět: Ovládání ST7920 Citovat

Dobrý den,
Potřeboval bych poradit s ovládáním GLCD 128x64 ST7920 od firmy Digole (model 12864ZW).
Na tomto webu http://www.microchip.com/forums/m830183.aspx jsem našel potřebný kód k ovládání řadiče ST7920 - je to fórum Microchip, kde nakonec problém vyřeší a zveřejní funkční kód.
Ten jsem upravil pro potřeby PIC16F877A - tzn. LATB → PORTB.

Dále jsem musel v kódu "převrátit" bitové hodnoty posílané na data port, neboť mám GLCD k mikrokontroléru zapojený takto: RD0 (MC) = DB0, RD1 = DB1 atd.
Příklad: v kódu bylo (funkce Initialize):
Send_Command(0b00110000); (to má být podle autora nastavení 8-bitového módu)
Podle datasheetu má být na data portu toto
DB0 = 1
DB1 = 0
DB2 = 0
DB3 = 0
DB4 = 0
DB5 = 0
DB6 = 0
DB7 = 0

tzn. že když mám dataporty GLCD připojené s portem D na MCU přímo, tak musím na PORTD poslat hodnotu 0b10000000, uvažuji doufám správně Smile

Zde je tedy kód:

kód:
#include <xc.h>

#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 20000000 //20 MHz oscilator

#define DATA_OUT PORTD
#define RW RA4
#define RS RA5
#define EN RA3
#define RST RA0
#define PSB RA2
#define NC RA1

/*
 * Funkce pinu GLCD podle datasheetu:
 * RST = kdyz je low, tak se GLCD resetuje
 * PSB = kdyz 0, tak seriova komunikace, kdyz 1, tak paralelni 8/4 bitova
 * RS =
 *  Kdyz je paralelni mod (PSB = 1):
 *      0 - "select instruction register (write) or busy flag, address counter (read)"
 *      1 - "Select data register (write/read)"
 *  Kdyz je seriovy mod (PSB = 0):
 *      0 - "Chip disabled - SID and SCLK should be set as 'H' or 'L'. Transcient of SID and SCLK is not allowed"
 *      1 - "chip enabled"
 * RW =
 *  Paralelni mod: Read-Write control
 *      0 - Write
 *      1 - Read
 *  Seriovy mod: Serial data input
 * E =
 *  Paralelni mod:
 *      1 - Enable trigger
 *  Seriovy mod: Serial clock
 * D4 - D7 = "Higher nibble data bus of 8-bit interface and data bus for 4-bit interface"
 * D0 - D3 = "Lower nibble data bus of 8-bit interface   
*/

void Send_Data(unsigned char data);
void Send_Command(unsigned char command);
void Set_GraphicMode();
void Initialize();
void Clear_Graphics();
void Write_String( unsigned Y ,char * string );

char message[4] = "Ahoj";

void main(void)
{
    __delay_ms(1000);       // Allow time for Vdc to settle on GLCD
    TRISA = 0x00;              //Set data port  B as output
    TRISD = 0x00;             // Set control port D as output
    PORTA = 0x00;                     // port B =0x00
    PORTD = 0x00;                     // port D=0x00
   
    RST = 0;                      // Set reset line to low
    Initialize();                  //Initialise GLCD
    Send_Command(0x00);    // Setting location to write characters. In this case 0,0 - Top Left Corner
    Send_Data(0x03);             // Sending a PREDEFINED character as described in ST7920 Datasheet.
    Send_Data(0x04);             // another one
    Send_Data(0x05);             // another one
    Send_Data(0x06);             // and another one.

    Write_String(0x00, message);  // Calling a function to send a String of characters, as defined in 'message' string.
                                  // In Extended mode there are four line to print your text. Each line is 16 characters long.                                                   // Line 1 starts at 0x80 , line 2 starts at 0x90, line 3 starts at 0x88, line 4 starts at 0x99.
    Set_GraphicMode();                 // Set the display in Extended mode
    Clear_Graphics();                     // Must send a Clear command otherwise display could be corrupt.
 
    while(1) {}
    return ;
}

//======================== All the command codes below can be found on the ST7920 datasheet ======================
void Initialize()
{
    __delay_ms(100);
    PSB = 1; //toto jsem pridal - v datasheetu se pise, ze tady musi byt 1 pro paralelni komunikaci
    RS=0;
    RW=0;
    __delay_us(400);
    RST = 1;
    __delay_ms(10);                           // Short delay after resetting.
    Send_Command(0b00001100);    // 8-bit mode. OK
    __delay_us(200);
    Send_Command(0b00001100);     // 8-bit mode again. OK
    __delay_us(100);
    Send_Command(0b00110000);     // display on
    __delay_us(200);
    Send_Command(0b10000000);  // Clears screen. OK
    __delay_ms(20);
    Send_Command(0b01100000);  // Cursor moves right, no display shift.
    __delay_us(200);
    Send_Command(0b01000000);  // Returns to home. Cursor moves to starting point.
}

//========= Setting the control lines to send a Command to the data bus ================
void Send_Command(unsigned char command)
{
    RS = 0;
    __delay_us(50);
    EN = 1;
    DATA_OUT = command;
    __delay_us(80);
    EN = 0;
}

//============= Setting the control lines to send Data to the data bus =====================
void Send_Data(unsigned char data)
{
    RS = 1;
    __delay_us(60);
    DATA_OUT = data;
    __delay_us(30);
    EN = 1;
    __delay_us(20);
    EN = 0;
    __delay_us(20);
}

//======================= Sent Command to set Extanded mode ====================
void Set_GraphicMode()
{
    Send_Command(0b00110100); // Extended instuction set, 8bit
    __delay_us(100);
    Send_Command(0b00110110);   // Repeat instrution with bit1 set
    __delay_us(100);
}

//=========== This function set all the pixels to off in the graphic controller =================
void Clear_Graphics()
{
    unsigned char x, y;
    for(y = 0; y < 64; y++)
    {
        if(y < 32)
        {
            Send_Command(0x80 | y);
            Send_Command(0x80);
        }
        else
        {
            Send_Command(0x80 | (y-32));
            Send_Command(0x88);
        }
        for(x = 0; x < 16; x++)
        {
            Send_Data(0x00);
        }
    }
}

//==== Send one character at the time from the 'message' string ===========
void Write_String ( unsigned Y ,char * string )
{
    Send_Command(Y);
    while(*string!= '\0')      // Looking for code signigying 'end of line' .
    {
        Send_Data  (*string++);
    }
}


Displej však stále nepracuje. Zkrátka se na něm nic nezobrazuje.

Dlouho jsem také pročítal datasheet (který posílám v příloze), avšak bezvýsledně.

Nerad bych vedl polemiku o tom, že jsem kód zkopíroval. Myslím, že mu z 90% rozumím Smile

Velice by mi pomohlo, kdyby jste mi někdo s tímto problémem pomohl, neboť je to poslední záležitost, na které stojí můj projekt seismografu.

Mám na mysli např. funkci Write_String - v jakém intervalu se má dosazovat souřadnice Y - nejsem si jist, jestli se text nevykresluje někam jinam, než má.

PS.: Předem bych ale chtěl upozornit, že možnost rozbitého GLCD nechávám opravdu jako poslední možnou - GLCD je nový a nikdy nebyl použit.

Děkuji všem za konstruktivní názory!



Display 12864ZW.pdf
 Komentář:
Datasheet GLCD 12864ZW

Stáhnout
 Soubor:  Display 12864ZW.pdf
 Velikost:  1010.86 kB
 Staženo:  107 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
rob.brno
Profesionál
Profesionál


Založen: 26.8.2013
Příspěvky: 53

PříspěvekZaslal: 07 prosinec 2015, 9:54    Předmět: Re: Ovládání ST7920 Citovat

Co takhle zkusit nějakou knihovnu na ovládání toho displaye, člověk se pak nemusí prokousávat registry a řídícími sekvencemi. Já pro tento LCD používám knihovnu u8glib a display s ní funguje. Ovšem tedy komunikuji s LCD seriově, 1xdata, 1xhodiny a 2 dráty napájení.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 07 prosinec 2015, 15:27    Předmět: Citovat

Děkuji za odpověď,
Souhlasím, taky bych rád použil nějakou knihovnu, jenže se mi nepodařilo sehnat nějakou jinou pro XC8.
Díval jsem se na u8glib, jenže na webu je k dispozici pouze pro AVR, ARM a Arduino, ale já používám Microchip.
Nejsem si jist, jestli sériová komunikace není na začátek složitější než paralelní.
Co je lepší do budoucna používat; sériovou, nebo paralelní komunikaci?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
rob.brno
Profesionál
Profesionál


Založen: 26.8.2013
Příspěvky: 53

PříspěvekZaslal: 08 prosinec 2015, 10:49    Předmět: Citovat

Že u8g neumí Microchip jsem si neuvědomil, to bohužel neporadím. Seriová kom. je složitější, ale pokud to udělá knihovna, tak je to jedno. Každopádně je pomalejší,tedy záleží zda pro danou aplikaci rychlost vyhovuje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Sender
Profesionál
Profesionál


Založen: 16.8.2014
Příspěvky: 56

PříspěvekZaslal: 08 prosinec 2015, 23:19    Předmět: Citovat

Řešil jsem podobný problém s displejem koupeným na ebay.Po odzkoušení x kihoven z netu jsem došel k závěru,že je potřeba knihovnu napsat svoji.V současnou dobu mám funkční knihovnu(v Pascalu) pro zapojení ST7920 v paralel módu.Inspirací pro mě byli příklady k desce PIC-EK prodávaný na eBay.
Příklady ke stažení zde.Doporučuju prozkoumat i další.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 09 prosinec 2015, 21:02    Předmět: Citovat

Děkuji za odpověď,
Díval jsem se na příklady PIC-EK, jenže konkrétně program pro ST7920 je podle mně mnohem složitější než tento. Navíc je napsaný v Hi-Tech compileru, ale já používám XC8. Překlad by znamenal další možnosti, kde může být chyba. Tento kód mi připadá jednoduchý, vcelku srozumitelný, avšak nefunkční. Myslím si, že je problém už v inicializaci, nebo ve funkci Send_Command()
Teď se snažím vytvořit nějaký program, který rozsvítí nějaké pixely, abych ověřil, zda GLCD vůbec funguje. Nevíte, jak to jednoduše poznat.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
honza3
Profesionál
Profesionál


Založen: 21.1.2008
Příspěvky: 1160
Bydliště: Přerov

PříspěvekZaslal: 10 prosinec 2015, 15:07    Předmět: Citovat

Strana 34. Mám doma kus, který potřebuje pauzu ne 72us, ale 186us. Jestli není chyba i v tom.


ST7920V40_E.pdf
 Komentář:

Stáhnout
 Soubor:  ST7920V40_E.pdf
 Velikost:  696.88 kB
 Staženo:  93 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 10 prosinec 2015, 15:43    Předmět: Citovat

Děkuji za poznámku. Radši prodloužím intervaly.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Sender
Profesionál
Profesionál


Založen: 16.8.2014
Příspěvky: 56

PříspěvekZaslal: 10 prosinec 2015, 17:47    Předmět: Citovat

Připadají mi v tom výše uvedeným kódu chyby.bylo by možný dát sem schéma zapojení MCU k displeji a pro jistotu foto displeje (poud jsou na něm popsaný piny jako je na tonto obrázku.Nekdy to bývá na spodní straně )?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 11 prosinec 2015, 23:44    Předmět: Citovat

Děkuji za reakci. Přikládám foto, kde je displej položen vedle konektoru na vývojové desce, kde je připojen. Jsou tam jak popisky pinů GLCD a MCU (na vývojové desce). Propojení jsem kontroloval. Tam problém není.
Přikládám také (pro případ potřeby) schéma vývojové desky.



schematic.pdf
 Komentář:
Schéma vývojové desky

Stáhnout
 Soubor:  schematic.pdf
 Velikost:  51.85 kB
 Staženo:  236 krát


zapojeni.JPG
 Komentář:
Zapojení GLCD a vývojové desky

Stáhnout
 Soubor:  zapojeni.JPG
 Velikost:  365.32 kB
 Staženo:  153 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
honza3
Profesionál
Profesionál


Založen: 21.1.2008
Příspěvky: 1160
Bydliště: Přerov

PříspěvekZaslal: 12 prosinec 2015, 8:17    Předmět: Citovat

citace:
Dále jsem musel v kódu "převrátit" bitové hodnoty posílané na data port, neboť mám GLCD k mikrokontroléru zapojený takto: RD0 (MC) = DB0, RD1 = DB1 atd.


Není chyba právě v tom?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 13 prosinec 2015, 9:56    Předmět: Citovat

Reaguji na honza3:
V tom by chyba být neměla;
V datasheetu (str. 10, 13) je uvdeno toto:
Pro funkci clear screen:
RS = 0
RW = 0
DB0 = 1
DB1 = 0
DB2 = 0
DB3 = 0
DB4 = 0
DB5 = 0
DB6 = 0
DB7 = 0
Tudíž toto:
kód:
Send_Command(0b00000001);  // Clears screen.
...
void Send_Command(unsigned char command)
{
    RW=0;
    RS = 0;
    __delay_us(20);
    EN = 1;
    DATA_OUT = command;
    __delay_us(50);
    EN = 0;
}

Je špatně, neboť to posílá 1 na port RD7, ale já mám pin GLCD DB0 připojen na RD0. Nemýlím-li se. Rolling Eyes
Stejně jako toto:
kód:
Send_Command(0b00000110);  // Cursor moves right, no display shift.

by podle datasheetu (str. 14) mělo vypadat takto:
RS = 0
RW = 0
DB0 = X
DB1 = X
DB2 = 1
DB3 = 0
DB4 = 1
DB5 = 0
DB6 = 0
DB7 = 0
To znamená
kód:
Send_Command(0b00101000);

Chápu to dobře, že když jsou datasheetu písmena X, tak na daném pinu nezáleží?
V datasheetu jsem ještě narazil na Basic instruction mode a Extended instruction mode. Myslím, že pro mě stačí basic, že? (potřebuji jen ověřit funkčnost zapínáním pixelů GLCD)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 728

PříspěvekZaslal: 13 prosinec 2015, 11:04    Předmět: Citovat

Matyáš napsal:

Tudíž toto:
kód:
Send_Command(0b00000001);  // Clears screen.
...
void Send_Command(unsigned char command)
{
    RW=0;
    RS = 0;
    __delay_us(20);
    EN = 1;
    DATA_OUT = command;
    __delay_us(50);
    EN = 0;
}

Je špatně, neboť to posílá 1 na port RD7, ale já mám pin GLCD DB0 připojen na RD0. Nemýlím-li se. Rolling Eyes


Myslím, že právě toto je důvod, proč Ti to nefunguje. Čísluješ si bity obráceně : 0b00000001 posílá 1 na bit 0 a ne 7. Bity se totiž číslují takto : 0b76543210.

Jinak na první test displej nemusíš přepínat do grafického režimu a můžeš s ním komunikovat stejně, jako se znakovým.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 13 prosinec 2015, 14:13    Předmět: Citovat

Děkuji za reakci.
Omlouvám se, hned to opravím. Ani už teď nevím, kde jsem nabral chybnou informaci o adresování portů. Embarassed
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Sender
Profesionál
Profesionál


Založen: 16.8.2014
Příspěvky: 56

PříspěvekZaslal: 13 prosinec 2015, 18:22    Předmět: Citovat

Na odzkoušení funkčnosti displeje můžeš případně odzkoušet tohhle.Je to pro 16F877A /4MHz
Nastavené dle schématu co jsi poslal:
Rs RA5
RW RA4
E RA3
Psb RA2
Rst RA0
Dataport:
DB7 RD7
DB6 RD6
DB5 RD5
DB4 RD4
DB3 RD3
DB2 RD2
DB1 RD1
DB0 RD0



ST7920-12864-ENGLISH.hex
 Komentář:

Stáhnout
 Soubor:  ST7920-12864-ENGLISH.hex
 Velikost:  1.73 kB
 Staženo:  96 krát



Naposledy upravil Sender dne 13 prosinec 2015, 20:33, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
Jdi na stránku 1, 2, 3  Další
 
Strana 1 z 3
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)