- LiFePO4 Speicher Test         
Ergebnis 1 bis 9 von 9

Thema: LCD Modul deaktiviert ....geht das ????

  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

    LCD Modul deaktiviert ....geht das ????

    Anzeige

    E-Bike
    Hallo Freunde !

    Ich muss mal einen ganz dumme Frage stellen. Kann man durch einen falschen Kommandobefehl sich beim LCD aussperren ??

    Ich hatte ein LCD-8Bit Beispiel auf dem PIC Board versucht. Nach vielen drum umher bekam ich mit das es nicht mit einen HD44780 Chip sondern mit dem ST7066 Chip versehen war.
    Jedenfalls habe ich mehrere LCD versucht auch mit HD44780.
    Wenn auch zu Anfangs wirre Zeichen (ST7066) und auf einem HD4470 Modul es lesbar war ging nach 2..3maligen Versuchen gar nix mehr. bei beiden Varianten.

    Hier mal die LCD-Init :

    Code:
    //LCD init
    void lcd_init()
     {
        PORTD=0x01;                 //clr screen 
        lcd_enable();
        PORTD=0x38;                //8 bits 2 lines 5*7 mode.  
        lcd_enable();
        PORTD=0x0C;                //display on,cursor on,blink on.
        lcd_enable();
        PORTD=0x06;                //character not move,cursor rotate right.
        lcd_enable();
        PORTD=0x80;                //??WWW.PIC16.COM"
        lcd_enable();
        return;
     }
    PORT D ist der Datenport

    Code:
    void lcd_enable()
     {
       RS=0;                     //is command not data
       RW=0;                     //is write not read. 
       E=0;                      //pull low enable signal.           
       delay();  //for a while.                      
       E=1;                      //pull high to build the rising edge
          
        return;
    }
    Das wäre so der Code der das LCD "bearbeitet"....

    Das Tutut stammt von HIER ich habe es für das MPLAB X und XC Compiler etwas geändert

    Weil nun gar nichts mehr ging habe ich die LCD mal im 4 Bit Modus am Arduino probieren wollen....geht gar nix mehr, keine Anzeige....


    Ich bin schon wegen der kommandos die Chip Datasheets HD44780 u. ST7066 durchgegangen ich kann nix finden was ich falsch gemacht habe.

    Arbeiten tue ich mit dem EasyPIC-40 Board

    Weis jemand etwas darüber, hat ähnliches erlebt ??

    Gruss und Danke
    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    05.11.2009
    Ort
    Gerblingerode
    Alter
    58
    Beiträge
    207
    Wenn auch zu Anfangs wirre Zeichen (ST7066) und auf einem HD4470 Modul es lesbar war ging nach 2..3maligen Versuchen gar nix mehr.
    auch alles richtig angeschlossen ?

    siehe : https://de.wikipedia.org/wiki/HD44780
    Gruß Ralf ... Projekt-Beschreibungen www.greinert-dud.de ... "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Zitat Zitat von oderlachs Beitrag anzeigen
    Code:
                 
       delay();  //for a while.
    Probiere doch mal aus in dem Delay(10) zu warten. Wenn das immer noch nicht hinhaut, kopiere es auch in die Ini mit rein.
    Hoffe es hilft.

    Viele Grüße
    Jörg

  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
    Ja richtige angeschlossen ist es...jetzt kann ich wenigsten schon in die erste Zeile schreiben, nur die 2 zeile lässt sich durch das PIC Bord nicht benutzen. Hat auch komischen Reset, PIC Board RST hift gar nicht ..muss erst Spannung wegschalten vom Bord, ehe dasdisplay nach Neuprogrammierung des PICs einigermassen geht. Benutze PICKit 3.
    Habe nun die LCD am Arduino versucht , da geht alles wunderbar alle beide Zeilen.
    Hier nun der gesamt Code, es ist eine Demo um das Datum und Zeit von einem am Board befindlichem DS1302 auszugeben:
    Code:
    // Source Code : http://pastebin.com/febf0f69
    // DS1302 Zeitausgabe an LCD 16x2
    // CONFIG
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
    #pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
    #pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
    #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
    
    // #pragma config statements should precede project file includes.
    // Use project enums instead of #define for ON and OFF.
    #define _XTAL_FREQ 4000000  //EasyPIC-40 FQ= 4.0MHz
    
    #include <xc.h>
    
    
    #include <stdlib.h>
    
    
    
    void lcd_line1(void);                //function prototypes
    void lcd_line2(void);
    
    void init();                   //I/O init
    void lcd_init();               //LCD init
    void write(char x);            //display one byte
    void lcd_enable();             //LCD display setting.
    void set_time();               //set time subroutine.
    void delay(void);
    void clk_write(unsigned char);
    unsigned char clk_read(void);
    void clkburst(void);
    void datafix(void);
    
    
    #define RS RA1
    #define RW RA2
    #define E  RA3
    
    #define    RST            RB5
    #define    DATA        RB4
    #define    SCLK        RB0
    #define DATA_Tris TRISB4
    
    char number[16] = "  :  :          ";
    char daydate[16] = "  :  :20        ";
    char sec[] = "           ";
    
    //define the time: sec,min,hour,day,month,weekday,year,control word.
    //zum Zeit setzen : einzelne Werte in table[] demendsprechend aendern
    const char table[]={0x00,0x47,0x17,0x18,0x3,0x06,0x17,0x00};
    
    
    void main(void)
    {
        char x;
        unsigned char a,b;
        a=0;
        
        number[2] = number[5] = 0x3a;
        daydate[2] = daydate[5] = 0x3a;
        daydate[6] = 0x32;
        daydate[7] = 0x30;
        TRISB = 0;
        TRISD = 0;
        
        RST = 0;                        //1302 reset low
        SCLK = 0;                        //1302 clock low
        RW = 0;                            //set lcd R/W low
        E = 0;                            //set lcd E low
    
        delay();
    
    
    
            init();                //I/O init
            lcd_init();            //LCD init
         //   set_time();           // zum Zeit setzen Zeile aktivieren !!!
        while(1)
        {
            RST = 1;                    //read hours
            clk_write(0xbf);            //burst read
            sec[0] = clk_read();        //sec
            sec[1] = clk_read();        //min        
            sec[2] = clk_read();        //hour
            sec[3] = clk_read();        //date
            sec[4] = clk_read();        //month
            sec[5] = clk_read();        //day
            sec[6] = clk_read();        //year
            sec[7] = clk_read();        //control
            RST = 0;
            datafix();                    //convert for display
    
           
            lcd_line1();               //display time and date 
            // Zeile 2 Pos.0
          /*  PORTD=0xC0;          //set the 2nd line display address Pos.0
            lcd_enable();          //LCD display setting command.       
            lcd_line2();           //display date  
             */ 
    
        }
    }
    
    void datafix(void)
    {
        char temp,x;
        char *foo = sec;
        char bleh[] = "                ";
        for(x=0;x<14;x+=2)
        {
            temp = *foo;
            temp &+ 0xf0;
            temp >>= 4;
            bleh[x] = temp + 0x30;
            temp = *foo;
            temp &= 0x0f;
            bleh[x+1] = temp + 0x30;
            foo++;
        }
        number[6]=bleh[0];            //sec
        number[7]=bleh[1];
        number[3]=bleh[2];            //min
        number[4]=bleh[3];
        number[0]=bleh[4];            //hour
        number[1]=bleh[5];
        daydate[0]=bleh[6];            //day 
        daydate[1]=bleh[7];         
        daydate[3]=bleh[8];            //month  
        daydate[4]=bleh[9];         
        daydate[8]=bleh[12];        //year
        daydate[9]=bleh[13];
    }
    
    void clk_write(unsigned char dat)
    {
        char x;
        for(x=0;x<8;x++)
        {
            if(dat & 0x01)                    //put bit on data pin
            {
                DATA = 1;
            }
            else DATA = 0;
            SCLK = 1;                        //toggle clock to latch bit
            SCLK = 0;
            dat >>= 1;                        //move next bit into place
        }
    }
    
    unsigned char clk_read(void)
    {
        char x;
        unsigned char dat,tmpdat;
        dat = 0;
        DATA_Tris = 1;                        //make DATA input
        for(x=0;x<8;x++)
        {
            if(DATA)                        //read a bit
            {
                tmpdat |= 1;
            } else {
                 tmpdat |= 0;
            }
            tmpdat <<= 7;
            dat >>= 1;
            dat |= tmpdat;
            SCLK = 1;                        //toggle clock to latch bit
            SCLK = 0;
        }
        DATA_Tris = 0;
        return(dat);
    }
    
    
    
        
    void lcd_16number(int num)
    {
        number[0]=(char)(abs(num/10000)+0x30);
        num=num-abs(num/10000)*10000;
        number[1]=(char)(abs(num/1000)+0x30);
        num=num-abs(num/1000)*1000;
        number[2]=(char)(abs(num/100)+0x30);
        num=num-abs(num/100)*100;
        number[3]=(char)(abs(num/10)+0x30);
        num=num-abs(num/10)*10;
        number[4]=(char)(num+0x30);
    }
    
    
    
    
    //---------------------------------------
    //I/O init
    void init()
     {
        ADCON1=0x07;               //a port as ordinary i/o.
        TRISA=0x00;                //a port as output.
        TRISD=0x00;                //d port as output.
        return;
     }
    
    //---------------------------------------
    
    //LCD init
    void lcd_init()
     {
        PORTD=0x01;                 //clr screen 
        lcd_enable();
        PORTD=0x38;                //8 bits 2 lines 5*7 mode.  
        lcd_enable();
        PORTD=0x0C;                //display on,cursor on,blink on.
        lcd_enable();
        PORTD=0x06;                //character not move,cursor rotate right.
        lcd_enable();
        PORTD=0x80;                //??WWW.PIC16.COM"
        lcd_enable();
        return;
     }
     
     
    
    
    //--------------------------------------
    //write a byte to lcd.
    void write(char x)
     {
      PORTD=x;                   //data send to PORTD
      RS = 1;                      //is data not command
      RW = 0;                      //is write not read
      E  = 0;                       //pull low enable signal 
      delay();//for a while
      E  = 1;                       //pull high to build the rising edge.
    
        return;    
    }
    
    //--------------------------------------
    //lcd display setting 
    void lcd_enable()
     {
       RS=0;                     //is command not data
       RW=0;                     //is write not read. 
       E=0;                      //pull low enable signal.           
       delay();  //for a while.                      
       E=1;                      //pull high to build the rising edge
          
        return;
    }
    
    
    
     void lcd_line1()
     {
        int i;
        for(i=0;i<16;++i)       //total 16 bytes to display.
           {
             write(number[i]);       //search table to display
           }
        return;
     }
    
     void lcd_line2()
     {
        int i;
        for(i=0;i<16;++i)       //total 16 bytes to display.
           {
             write(daydate[i]);       //search table to display
           }
        return;
     }
    
    
    void delay(void)
    {
        long int y;
            for(y=0;y<100;y++){}  // 100 Orginal
    }
    
    //set time.
    void set_time()
      {
      
       int i;                             //define the loop counter.
       RST=1;                             //enable DS1302
       clk_write(0xbe);                //
       for(i=0;i<8;i++)                   //continue to write 8 bytes.
         {
           clk_write(table[i]);        //write one byte
         }
       RST=0;                             //reset
      
       }
    - - - Aktualisiert - - -

    Zitat Zitat von HeXPloreR Beitrag anzeigen
    Probiere doch mal aus in dem Delay(10) zu warten. Wenn das immer noch nicht hinhaut, kopiere es auch in die Ini mit rein.
    Hoffe es hilft.

    Viele Grüße
    Jörg
    Hallo Jörg,
    Das delay() ist im prog eine eigenständige Prozedur...siehe Code oben..habe ich schon experimentiert von vorn bis hinten
    ja vileicht sollte ich mal _delay_ms(xx) oder delay_us(xx) probieren..bin noch Neuling bei den PICs.

    Hier kam es mir nur auf das NICHT Funtionieren der LCDs an....

    Vielen Dank..
    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Geht, geht halb, geht nicht - das könnte auch ein "Wackler" auf einer der Portleitungen sein oder ein Lotrest/Drahtfitzelchen von der Fertigung oder von Basteltisch.
    Oder der C-Compiler optimiert die nichtsnützige Warteschleife einfach weg. Mach den Schleifenzähler y lieber static volatile (bin noch nicht fit in C; irgendwas in der Richtung, was die Wegoptimierung verbietet.)
    Allerdings:
    1) Meine LCDs haben wohl ein High-aktives Enable (anders als das oft in der diskreten Logik war), hab's jetzt nicht im Code nachgeprüft. Stammt deine LOW-Aktivität aus dem Datenblatt des LCD? Mir scheint das der kritische Punkt zu sein (bei meinem ersten LCD-Code hatte ich jedenfalls genau diesen Polaritätsfehler gemacht)
    2) Ich sehe in deiner lcd_init() keine Wartezeiten. Die LCD-Controller wollen besonders bei der Initialisierung Pausen, z.T. bis zu 15 ms oder mehr. Ok, das enable() macht etwas Wartezeit. Mach diese Zeit ruhig mal 100ms lang, dann bist du fürs Erste zwar langsam, solltest aber auf der sicheren Seite sein. Danach kannst du die Initialisierungsphase noch anhand des Datenblattes tunen.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Hallo Gerhard.

    Klappt es jetzt mit dem LCD? Ich bin neugierig, weil da mein Weltbild etwas schwankt.

    Ich hab nämlich das Datenblatt des ST7066 überflogen. Auch dieser Chip hat High-aktives Enable, ganz HD44780-kompatibel.
    Ich bin mir jetzt sicher (vorbehaltlich irriger Lesart der Source), dass in deinem Code mindestens dieser Polaritätsfehler steckt. Das kann mit überlappenden Flanken zufällig mal so auf Kante klappen.

    Das andere sind die einzuhaltenden Delays nach jedem Befehl (sofern man nicht das Busy-Flag prüft)l:
    - nach Power Up >40ms
    - Display Clear und Cursor Home je >1,52ms
    - alles andere >37µs
    (alle Angaben bei Standard-Betriebsfrequenz des LCD)

    Gruß
    Christian.
    Geändert von RoboHolIC (27.03.2017 um 19:11 Uhr) Grund: Cource --> Source

  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 Christian !
    Also am PIC Board, wo es mir ja aufgefallen ist, ist es immer noch nur eine Zeile(mit Fehlern) und nicht mehr, am Arduino wie gesagt so wie es sein soll, auch zweizeilig funktionierend. Ich warte auf eine anderes LCD und werde dann dieses mit dem 44780 Controller probieren.
    Bin zZt auch gesundheitlich nicht auf dem Posten, so das ich jetzt nicht all zuviel experimentiere.

    Gruss und Dank
    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Als ich mich mit LCDs beschäftigt habe, habe ich einmal gelesen das der Unterschied zwischen HD44780 und einem STxxxx Controller (genauen Typ weiß ich jetzt nicht) die Zeilenaddressierung war. Was bei dem einen Zeile 2 war, war bei dem anderen Zeile 3. Vielleicht kontrollierst du das einmal.

    MfG Hannes

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Hallo Gerhard.
    Zunächst meine besten Wünsche zur Genesung und Wiedererlangung der Schaffenskraft.
    Zitat Zitat von oderlachs Beitrag anzeigen
    ... am PIC Board ... immer noch nur eine Zeile(mit Fehlern) ... am Arduino ... so wie es sein soll, auch zweizeilig funktionierend.
    Das heißt doch, dass das LCD okay ist. Auch am EasyPIC ist nichts grundsätzlich 'faul', sonst käme ja nie was richtiges auf die Anzeige. An diesen Fronten brauchst du den Fehler meines Erachtens nicht suchen. Eher in der Software, ich sag nur "Enable-Polarität", auch wenn's nervt.

Ähnliche Themen

  1. problem mit K6 (geht, geht nicht...)
    Von ijjiij im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 17.12.2010, 18:19
  2. Antworten: 15
    Letzter Beitrag: 11.07.2009, 15:03
  3. rf-Modul und IR Modul an C-Control
    Von redbull im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 3
    Letzter Beitrag: 04.12.2008, 15:58
  4. Layer deaktiviert???
    Von Spongebob85 im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 9
    Letzter Beitrag: 15.09.2007, 15:22
  5. Tiny2313 Fusebit deaktiviert - nicht mehr auslesbar :(
    Von E-Fan im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 11.04.2006, 17:48

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress