- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: GLCD mit ST7920 ...es will nicht klappen

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1

    GLCD mit ST7920 ...es will nicht klappen

    Anzeige

    Praxistest und DIY Projekte
    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 :
    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
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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)

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo Siro !
    Danke für den Hinweis muss beim reinkopieren hier verschwunden sein.
    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
        
    }
    Hier mal das Datenblatt vom LCD.

    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

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    dann löt doch die Brücke einfach aus
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    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

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    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

Ähnliche Themen

  1. Befehl Input und Output klappen nicht
    Von datatom im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 13.08.2011, 21:35
  2. Bascom und Sinus will nicht klappen
    Von JollyJumper8 im Forum Software, Algorithmen und KI
    Antworten: 7
    Letzter Beitrag: 10.10.2009, 21:33
  3. Antworten: 2
    Letzter Beitrag: 26.06.2008, 13:32
  4. GLCD läuft nicht :-(
    Von Philipp83 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 24.12.2007, 11:37
  5. PWM mit Timer 1 will nicht klappen
    Von Speedking im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 29.07.2006, 03:02

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen