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
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 :Über eine kleine Hilfestellung wäre ich sehr dankbar!!!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); }
Gerhard
Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint
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
Geändert von Siro (28.01.2019 um 21:19 Uhr)
Hallo Siro !
Danke für den Hinweis muss beim reinkopieren hier verschwunden sein.
Hier mal das Datenblatt vom LCD.Code: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 }
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
Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint
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
Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint
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?
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
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
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....
Geändert von oderlachs (31.01.2019 um 15:57 Uhr) Grund: Nachtrag :
Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint
dann löt doch die Brücke einfach aus
Vor den Erfolg haben die Götter den Schweiß gesetzt
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
Geändert von oderlachs (01.02.2019 um 19:59 Uhr) Grund: Nachtrag
Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint
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
Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint
Lesezeichen