- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 10

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  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

    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

Ä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