PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] GLCD mit ST7920 ...es will nicht klappen



oderlachs
28.01.2019, 18:12
Hallo Freunde !

Nun ist es wieder an der Zeit bei mir etwas "Programmiertechnisches" zu machen, doch wieder komme ich nicht weiter.

Ich habe versucht an meinen "EasyPIC-40 v.2" Entwicklerboard ein GLCD 128x64 anzuschliessen. Die Buchenleiste ist dafür schon auf dem Board.
Wie auch bei dem mitgeliefertem Beispiel für das LCD 1602 funzt auch das Beispile für diese LCd nicht.
Nun habe ich mich im Web "belesen" recherchiert und Datenblätter durchstöbert. Auch einige Beispiele aus dem Web versucht, aber leider kein Ergebnis.
Vielleicht gehe ich auch total falsch an die Sache ran, aber vielleicht weis ja wer einen Rat ?
Ich merke das was passiert, wenn ich den MCU-Chip beschreibe, habe auch die entsprechende PortPins aus der Schaltung vom Board rausgesucht und das im Code entsprechend geändert.
Nur ein sichtbares Ergebnis , irgendwelche Zeichen auf dem Display erreiche ich nicht :(
Hier mal mein Code :

/*
* File: lcd_128x64_test1.c
* Author: gerhard
*
* Created on 28. Januar 2019, 17:23
*/


// Config für "Easy-PIC 40" mit PIC16F877A
#include <xc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 // aktuelle Oszillatorfrequenz(für delay )
//#define _XTAL_FREQ 3686400
//#define _XTAL_FREQ 8000000
#endif
// CONFIG
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#pragma config DEBUG = OFF
// End config

// Display :
// 128x64 GLCD
// Controller ST7920

// LCD Pin Connection in 8-bit mode
#define LCD_RS RA0
#define LCD_RW RA1
#define LCD_EN RA2
#define LCD_PSB RA3
#define LCD_RST RA4
#define LCD_DB PORTD //Datenbus/-port

// LCD Functions
void LCD_Init(void);
void LCD_TextDisplayString(unsigned char line, char* string);
void LCD_WriteData(unsigned char data);
void LCD_WriteCommand(unsigned char command);

/* ================================================== ================ */
/* */
/* I/O initalisieren */
/* */
/* ================================================== ================ */

void init()
{
ADCON1 = 0x07; // Port A digital I/O
TRISA = 0x00; // Port A Output
TRISD = 0x00; // PORT D Output
__delay_ms(200); // etwas warten

}

/* ================================================== ================ */
/* */
/* LCD initialisieren */
/* */
/* ================================================== ================ */

void LCD_Init(void)
{
__delay_ms(150);
LCD_RST= 0;
__delay_us(2);
LCD_RST= 1;
LCD_PSB = 1; // Parallelmodus Datenbus
__delay_ms(50);

LCD_WriteCommand(0x30); //
__delay_ms(5);

LCD_WriteCommand(0x30);
__delay_ms(1);

LCD_WriteCommand(0x30);
__delay_ms(10);

LCD_WriteCommand(0x38);
__delay_ms(1);

LCD_WriteCommand(0x0C);
__delay_ms(1);

LCD_WriteCommand(0x06);
__delay_ms(1);

LCD_WriteCommand(0x01); // clear display
__delay_ms(10);
}

/* ================================================== ================ */
/* */
/* ein Byte über den Datenbus schreiben */
/* */
/* ================================================== ================ */
// 8 Bit


void LCD_WriteByte(unsigned char command)
{
LCD_DB = command;
LCD_EN = 1; //Daten übernemen
__delay_us(2);
LCD_EN = 0;
__delay_us(20); //Wert variiert nach oben
}

/* ================================================== ================ */
/* */
/* ein Byte Daten schreiben */
/* */
/* ================================================== ================ */



void LCD_WriteData(unsigned char data) //write data
{
LCD_RS=1;
LCD_WriteByte(data);
}
/* ================================================== ================ */
/* */
/* ein Byte Commando schreiben */
/* */
/* ================================================== ================ */

void LCD_WriteCommand(unsigned char command) //write command
{
LCD_RS=0;
LCD_WriteByte(command);
}
/* ================================================== ================ */
/* */
/* eine Textzeile schreiben */
/* */
/* ================================================== ================ */

void LCD_TextDisplayString(unsigned char line, char* string)
{
unsigned char addr,i;
if(line==1)
addr=0x80; // Adresse 1.Zeile
else if(line==2)
addr=0x90; // Adresse 2.Zeile
else if(line==3)
addr=0x88; // Adresse 3.Zeile
else if(line==4)
addr=0x98; // Adresse 4.Zeile

LCD_WriteCommand(addr);

for(i=0;i<16;i++)
LCD_WriteData(*string++);
}

/* ================================================== ================ */
/* */
/* Main Routine */
/* */
/* ================================================== ================ */
void main(void)
{
init();
LCD_Init();
// Schreibe in die 1. Zeile
LCD_TextDisplayString( 1, "LCD-TEST");
while(1);
}





Über eine kleine Hilfestellung wäre ich sehr dankbar!!!

Gerhard

Siro
28.01.2019, 20:15
Hallo oderlachs,

hast Du das RW Bit vergessen ? das wird nirgends gesetzt bzw. gelöscht muss es ja sein zum Schreiben

LCD_RW = 0;

Siro

oderlachs
29.01.2019, 16:30
Hallo Siro !
Danke für den Hinweis muss beim reinkopieren hier verschwunden sein.


void main_init()
{

ADCON1 = 0x07; // Port A digital I/O
TRISA = 0; // Port A Output
TRISD = 0; // PORT D Output
LCD_RW = 0; // R/W auf LOW da nur schreiben
__delay_ms(200); // etwas warten

}


Hier mal das Datenblatt vom LCD. (https://www.exploreembedded.com/wiki/images/7/77/QC12864B.pdf)

Ich habe heute nochmals mehrere Bsp. aus dem Web auseinandergepflückt und vergleichen...Auch die Werte aus dem Datasheet kontrolliert , die delays etwas verändert..nix zu machen.
Ich will nicht hoffen das ich mir ein def. LCD da eingehandelt habe..liegt schon 1..2 Jahre im Kasten, weiss nicht.
Ich werde mal wenn mal mehr Zeit ist,mittels Arduino & GLCD-Lib per SPI versuchen.
Dabei hasse ich nur das ganze Drahtgefädel, da meine Augen auch nicht mehr die besten sind..
Vielleicht kann ich auch solch PIC MiniSystem Board verwenden, muss mal sehen...da ich keine Schaltung habe und nicht so weiss wie die LCD Pins da liegen, die Steckbuchsenleitung ist ja vorhanden.

Ich werde berichten.

Gerhard

oderlachs
31.01.2019, 12:13
Hallo,
so nun habe ich das GLCD mal am Arduino ausprobiert, und im SPI Modus geht es, zwar nicht so ganz wie ich es gern hätte aber es werden Text bzw. Grafik angezeigt(UG8-Lib).

Der Parrallelmodus geht gar nicht, vielleicht liegt da der "Hase im Pfeffer",auf dem PIC- Board habe ich nur erstmal, weil so Standart -Aufbau(Schaltung), den Parallelmodus getestet.
Habe ein neues GLCD geordert und werde mal damit versuchen.

Die Verdrahtung beim Arduino Test ist auch etwas verwirrend, musste mich da so "durchwurschteln".

Gruss

Ceos
31.01.2019, 12:38
Die Doku sagt du musst den Modus mit dem PSB Pin(Pin15) auswählen, wie ist der denn verdrahtet? Gibt es da einen Jumper, Lötbrücke, irgendwas offenes?

Siro
31.01.2019, 12:43
Ceos war schneller :)

hab grad den gleichen Gedanken:

Hast Du mal mit einem Voltmeter den Pin RA3 vom PIC16F877A gemessen ?
Der geht ja auf den Auswahlpin Seriell/Parallel

und geht auf das Display LCD_PSB
prüf mal bitte ob der Pin auch wirklich auf High geht für den Parallel Mode.

Zudem ist der PIN RA4 vom PIC ein Open Collector, hier benötigst Du einen Pullup.
Der geht bei Dir auf den Reset vom Display.

Siro

oderlachs
31.01.2019, 15:42
Hallo Ihr Beiden !
Danke für diese Info, da bin ich gerade selber am Suchen gewesen, denn wenn ich Am Arduino, dann PSB mit High verbunden habe, ist mir die Spannung zusammen gebrochen....und siehe da !!! PSB ist mit GND über einen 0-Ohm Widerderstand verbunden. in 2..3 Tagen ist ein neues LCD da, da sieht die Bestückung (R10) anders aus, diese ist garnicht verlötet. Es kann aber auch ein Herstellerfehler sein , denn nebenan von R10 wo R9 sitzt ist frei.
Diese LCDs werden wohl in irgendeinem 3D printer verwendet und wird dort seriell betrieben... Kann sein das es für diesen zweck gleich so verlötet wurde, eben PSB auf GND gesetzt.. dann war aber die Beschreibung des Verkäufers etwas falsch... Ist nun gut ein Jahr her, da kann ich nicht noch "Wind" machen...mich ärgert ja nur fast sinnlos vertane Zeit und die "letzten Haare" die ich mir ausgefrauft habe... ;)

Siro , Danke auch für die Info in Sachen "PullUp"....muss mal in die Easy-Boardbeschreibung schauen , da ist ja extra solch ein Steckplatz für ein GLCD vorhanden, mit der Bemerkung nur für ST7920 Chips. Von extra PullUps ist nichts erwähnt.
Ja das sind so die gleinen Fussangeln die mal beim ersten Versuch mit solchen Sachen immer mal wieder selber anlegt.


Gruss und Dank

Gerhard

Nachtrag :
Da muss mir wirklich gleich ein Anwender modifiertes Teil verkauft worden sein, ich wunderte mich das am Arduino, obwohl ich noch den Kontrastregler vergeessen hatte die Anzeige so gut war, das Teil ist schon gleich mit aufgelötet als Miniregler nur mit Lupe zu finden....

Vitis
01.02.2019, 12:50
dann löt doch die Brücke einfach aus

oderlachs
01.02.2019, 14:48
Wenn ich das 100% wüsste das es diese ist , wo der Null-Ohm Widerstand sitzt, würde ich es versuchen.
Obwohl das Leben lang mit Löten meine Brötchen verdienst habe, möchte ich Dank meiner jetzt schlechten Augen und Fingergelenke kein Risiko eingehen.
Das neue GLCD ist morgen oder kommende Woche da..so kann ich auch noch diese Zeit bis zum Erhalt warten.
Das alte GLCD werde ich dann eben als serielle Verwendbar anwenden


Gerhard

Edit:
Das GLCD kam sogar heute schon, gestern bestellt, muss aber noch die Stiftleiste einlöten, das möchte ich mal gern bei Tageslicht machen....
Ich werde berichten..

Gerhard

oderlachs
05.02.2019, 11:00
So, das neue Display kam ja schon vorige Woche. Heute nun Stiftleiste eingelötet und Test : Wunderprächtig !
Da denkt man Tage lang man ist zu doof einen Prog zu schreiben um ein GLCD zu verwenden und dann dieses Fallstrick. Na ja man lernt nie aus.
Nun muss ich nur noch ein Adapter basteln zur Verwendung an dem Entwicklerboard...denn Was eigentlich Oben links ist , ist nun Unten rechts.
Ich kann das Board wegen der Anschlüsse Ub,Serial nicht anders am AP legen. So muss ich mir den Kopf verrenken um bestimmte Anzeigen zu lesen.

Ich danke für Eure Mithilfe bei meinem Problem.

Gruss & Dank

Gerhard