Guten Tag zusammen, ich spiele seit einigen Wochen mit dem Explorer 16 Development Board rum. Die vorhandenen LED's sowie das fest verkabelte Display (von TRULY) bekomme ich auch ohne weiteres angesteuert. Nun möchte ich gerne ein weiteres Display dort anschließen um zu testen ob das Display funktioniert. Das neue Display ist ein PDC1602M03 und ist genau wie das Display von TRULY HD44780 kompatibel. Die Verdrahtung des TRULY sieht wie folgt aus: RS -> RB15 E -> RD4 RW -> RD5 DATA -> RE0 - RE7 Die Pinbelegung ist, bis auf DATA, fest vorgegeben. Das zweite Display habe ich über ein zusätzliches Testmodul mit dem Explorer 16 Board wie folgt verdrahtet: RS -> RB15 E -> RC4 RW -> RD5 DATA -> RE0 - RE7 Bis auf den Enable-Pin sind die restlichen Pins also genau gleich. Laut Datenblatt brauch das neue Display 5V am Eingang und eine Kontrastspannung von ca. 3V. Die Kontrastspannung habe ich fest verdrahtet mit 3,3V. Hierfür benutze ich kein Poti da ich mich laut Datenblatt schon in einem, für die Kontrastspannung, guten Bereich befinde. Naja jedenfalls ist auf dem Display nichts zu sehen..weder Balken noch sonst irgendwas. Die Spannung an den den Pins für Versorgung und Kontrastspannung habe ich nachgemessen..es kommt auch wirklich 5V bzw. bi der Kontrastspannung 3,3V an daher würde ich ein Fehler der Verkabelung ausschließen. Das Display wird laut Datenblatt auch nicht mit einer negativen Spannung versorgt. Rein theoretisch müsste es doch aber klappen wenn ich das zweite LCD genau wie das erste LCD anschliesse (mit der Ausnahme des Enable PIN natürlich)? Folgend noch der Code den ich verwende. Wobei der Code für LCD1 funktioniert und für LCD2 habe ich quasi den Code kopiert und die Enable-Pins angepasst: #define FCY 16000000UL // Instruction cycle frequency, Hz - required for __delayXXX() to work #include <libpic30.h> // __delayXXX() functions macros defined here #include <p24FJ256GB110.h> #include "xc.h" #include <stdio.h> #include <stdlib.h> /* * PORTS für das EXPLORER 16 Test-Board For Explorer 16 board, here are the data and control signal definitions RS -> RB15 E -> RD4 RW -> RD5 DATA -> RE0 - RE7 */ // Control signal data pins #define RS LATBbits.LATB15 // Vorgegebener RS PIN (fest verdrahtet) #define RW LATDbits.LATD5 // Vorgegebener RW PIN (fest verdrahtet) #define LCD_EN_PORT DATAPORT //Vorgegebener Enable_Pin #define LCD_EN1_PIN LATDbits.LATD4 //PORTD_4 (fest verdrahtet) //#define LCD_EN2_PORT DATAPORT2 //Eigener, weiterer Enable_Pin #define LCD_EN2_PIN LATCbits.LATC4 //PORTC_4 (selbst verdrahtet) // Control signal pin direction #define RW_TRIS TRISDbits.TRISD5 // define RW as output #define RS_TRIS TRISBbits.TRISB15 // define RS as output #define E_TRIS TRISDbits.TRISD4 // define E as output #define E2_TRIS TRISCbits.TRISC4 //define E2 as output // Data signals and pin direction #define DATA LATE // Port for LCD data #define DATAPORT PORTE #define TRISDATA TRISE // I/O setup for data Port void lcd_init(void){ /* set initial states for the data and control pins */ LATE &= 0xFF00; RW = 0; // RW state set low RS = 0; // RS state set low LCD_EN1_PIN = 0; // E state set low /* set data and control pins to outputs */ TRISE &= 0xFF00; RW_TRIS = 0; // RW pin set as output RS_TRIS = 0; // RS pin set as output E_TRIS = 0; // E pin set as output // LCD wird mehrfach initialisiert /* 1st LCD initialization sequence */ DATA &= 0xFF00; // prepare RE0-RE7 DATA |= 0x0038; // set european Dataset LCD_EN1_PIN = 1; //Enable Pin on (receive commands) Nop(); Nop(); Nop(); LCD_EN1_PIN = 0; // toggle Enable Pin __delay_ms(5); // 5ms delay /* 2nd LCD initialization sequence */ DATA &= 0xFF00; DATA |= 0x0038; LCD_EN1_PIN = 1; Nop(); Nop(); Nop(); LCD_EN1_PIN = 0; // toggle E signal __delay_us(200); // 200uS delay /* 3rd LCD initialization sequence */ DATA &= 0xFF00; DATA |= 0x0038; LCD_EN1_PIN = 1; Nop(); Nop(); Nop(); LCD_EN1_PIN = 0; // toggle E signal __delay_us(200); // 200uS delay lcd_cmd( 0x38 ); // function set lcd_cmd( 0x0C ); // Display on/off control lcd_cmd( 0x06 ); // entry mode set (0x06) } /*--------------------------------LCD_INIT_2---------------------------- --------*/ void lcd_init_2(void){ /* set initial states for the data and control pins */ LATE &= 0xFF00; RW = 0; // RW state set low RS = 0; // RS state set low LCD_EN2_PIN = 0; // E state set low /* set data and control pins to outputs */ TRISE &= 0xFF00; RW_TRIS = 0; // RW pin set as output RS_TRIS = 0; // RS pin set as output E2_TRIS = 0; // E pin set as output // LCD wird mehrfach initialisiert um sicherzustellen dass das Display //Ordnungsgemäß vom µC angesprochen wird /* 1st LCD initialization sequence */ DATA &= 0xFF00; // prepare RE0-RE7 DATA |= 0x0038; // set european Dataset LCD_EN2_PIN = 1; //Enable Pin on (receive commands) Nop(); Nop(); Nop(); LCD_EN2_PIN = 0; // toggle Enable Pin __delay_ms(200); // 5ms delay /* 2nd LCD initialization sequence */ DATA &= 0xFF00; DATA |= 0x0038; LCD_EN2_PIN = 1; Nop(); Nop(); Nop(); LCD_EN2_PIN = 0; // toggle E signal __delay_us(200); // 200uS delay /* 3rd LCD initialization sequence */ DATA &= 0xFF00; DATA |= 0x0038; LCD_EN2_PIN = 1; Nop(); Nop(); Nop(); LCD_EN2_PIN = 0; // toggle E signal __delay_us(200); // 200uS delay lcd_cmd( 0x38 ); // function set lcd_cmd( 0x0C ); // Display on/off control lcd_cmd( 0x06 ); // entry mode set (0x06) } /*---------------------------------------------------------------------- --------*/ void lcd_cmd( char cmd ) // subroutiune for lcd commands { DATA &= 0xFF00; // prepare RE0 - RE7 DATA |= cmd; // command byte to lcd RW = 0; // ensure RW is 0 RS = 0; LCD_EN1_PIN = 1; // toggle E line Nop(); Nop(); Nop(); LCD_EN1_PIN = 0; __delay_ms(5); // 5ms delay } void lcd_cmd2( char cmd ) // subroutiune for lcd commands { DATA &= 0xFF00; // prepare RE0 - RE7 DATA |= cmd; // command byte to lcd RW = 0; // ensure RW is 0 RS = 0; LCD_EN2_PIN = 1; // toggle E line Nop(); Nop(); Nop(); LCD_EN2_PIN = 0; __delay_ms(5); // 5ms delay } void lcd_data( char data ) // subroutine for lcd data { RW = 0; // ensure RW is 0 RS = 1; // assert register select to 1 DATA &= 0xFF00; // prepare RE0 - RE7 DATA |= data; // data byte to lcd LCD_EN1_PIN = 1; // toggle Enable Pin Nop(); Nop(); Nop(); LCD_EN1_PIN = 0; // toggle E signal RS = 0; // negate register select to 0 __delay_us(200); // 200uS delay __delay_us(200); // 200uS delay } void lcd_data2( char data ) // subroutine for lcd data { RW = 0; // ensure RW is 0 RS = 1; // assert register select to 1 DATA &= 0xFF00; // prepare RE0 - RE7 DATA |= data; // data byte to lcd LCD_EN2_PIN = 1; //toggle Enable Pin Nop(); Nop(); Nop(); LCD_EN2_PIN = 0; // toggle E signal RS = 0; // negate register select to 0 __delay_us(200); // 200uS delay __delay_us(200); // 200uS delay } void puts_lcd( unsigned char *data, unsigned char count ) { while(count){ lcd_data( *data++ ); count--; } } void puts_lcd2( unsigned char *data, unsigned char count ) { while(count){ lcd_data2( *data++ ); count--; } } void lcd_clr(void){ lcd_cmd(0x01); } _CONFIG1(JTAGEN_OFF) //If this Config is not disabled: // 4/8 LED's are "offline" void main(void) { /******************LED anssteuerung***********************************/ TRISA = 0; //PortA 8 LED's (Explorer Board) LATA = 0xFF; //All output-PINS set // PORTA = 0XFF /***********************erstes Display********************************* __delay_ms(200); lcd_init(); //init Display_1 lcd_clr(); __delay_ms(200); lcd_data('X'); puts_lcd("Test 1",6); lcd_cmd(0xc0); puts_lcd("Test 2",6); __delay_ms(200); */ /*************************zweites Display******************/ __delay_ms(200); lcd_init_2(); //init Display_2 lcd_cmd2(0x02); __delay_ms(500); //lcd_clr(); //Display_1: Clear Screen lcd_data2('T'); puts_lcd2("first row",9); lcd_cmd2(0xc0); puts_lcd2("second row",10); __delay_ms(200); while(1){} }
Hallo Thion Thion schrieb: > Die Kontrastspannung habe ich fest verdrahtet mit 3,3V. > ...auf dem Display nichts zu sehen..weder Balken noch sonst irgendwas. Alle LCD Module dieser Art von verschiedensten Herstellern, die ich bis jetzt in Betrieb genommen hatte, hatten immer die folgende Eigenschaft: Wenn der Kontrast für den Betrieb richtig eingestellt war, und das LCD noch nicht initialisiert war, dann waren immer die schwarzen "Klötzchen" (die Dotmatrix der Zeichen) zu sehen. Will sagen: Die Konstrastspannung ist mit an Sicherheit grenzender Wahrscheinlichkeit nicht korrekt. Bitte schließe sie über ein Poti an, 10k oder so, wie in der App Note im Datenblatt, und versuche darüber die "Klötzchen" sichtbar zu machen. Das spart jede Menge vergebliche Kopfschmerzen über die 350(!) Zeilen Source Code, die Du gepostet hast, der vielleicht sogar funktioniert. Viel Erfolg. Gruß Matz
Du hast also den ganzen init code zweimal geschrieben? Warum übergibst du nicht die Nummer des gewünschten LCD an die Init und wählst dann in dieser Funktion nur noch abhängig vom Parameter den Enable Pin? Naja, Copy Paste ist vllt. einfacher, aber hier wirklich Unsinn. Thion schrieb: > __delay_ms(200); // 5ms delay Mehr unnötiger Quak. Erstens stimmt der Kommentar hier nicht mal und zweitens muss man _delay_ms() nicht mehr kommentieren, das tut sie selber. Schreib lieber, worauf da gewartet wird, nicht, wie lange. Umso besser verstehst du hinterher, wie so ein LCD nun gestartet wird. Ein wirkliche Herausforderung wäre übrigens die Umstellung auf 4-bit Betrieb mit dem handfesten Vorteil, 4 Pins mehr zur freien Verfügung zu haben.
Hallo nochmal, entschuldigt bitte den unnötig aufgeblähten Code und die teilweise verrutschten Kommentare..welche dann natürlich falsch sind. Also wir haben hier leider weder geeignete Potis noch Widerstände verfügbar..ich hatte allerdings die Möglichkeit das Display zu wechseln. Das neue Display braucht keine Kontrastspannung und dennoch habe ich schwierigkeiten hier irgendetwas darzustellen. Grundsätzlich besteht aber schon die Möglichkeit das LCD2, bis auf das Enable Pin, genau wie das LCD1 zu verdrahten oder? Den Code habe ich auch soweit reduziert sodass lediglich das Enable-Pin von Hand umgeändert werden muss: #define FCY 16000000UL // Instruction cycle frequency, Hz - required for __delayXXX() to work #include <libpic30.h> #include <p24FJ256GB110.h> #include "xc.h" #include <stdio.h> #include <stdlib.h> /* * PORTS für das EXPLORER 16 Test-Board For Explorer 16 board, here are the data and control signal definitions RS -> RB15 E -> RD4 RW -> RD5 DATA -> RE0 - RE7 */ // Control signal data pins // Control signal pin direction #define RS LATBbits.LATB15 // Vorgegebener RS PIN #define RS_TRIS TRISBbits.TRISB15 // define RS as output #define RW LATDbits.LATD5 // Vorgegebener RW PIN #define RW_TRIS TRISDbits.TRISD5 // define RW as output /*******************Explorer 16 Display**********************/ //#define E LATDbits.LATD4 // Enable PIN //#define E_TRIS TRISDbits.TRISD4 // define E as output /********************Eigenes Display*************************/ #define E LATCbits.LATC4 // Enable PIN #define E_TRIS TRISCbits.TRISC4 // define E as output // Data signals and pin direction #define DATA LATE // Port for LCD data #define DATAPORT PORTE #define TRIS_DATAPORT TRISE // I/O setup for data Port void lcd_init(void){ /* set initial states for the data and control pins */ LATE &= 0xFF00; RW = 0; // RW state set low RS = 0; // RS state set low E = 0; // E state set low /* set data and control pins to outputs */ TRISE &= 0xFF00; RW_TRIS = 0; // RW pin set as output RS_TRIS = 0; // RS pin set as output E_TRIS = 0; // E pin set as output /* LCD initialization sequence */ DATA &= 0xFF00; // prepare RE0-RE7 DATA |= 0x0038; // set european Dataset E = 1; //Enable Pin on (receive commands) Nop(); Nop(); Nop(); E = 0; __delay_ms(5); } void lcd_cmd( char cmd ) // subroutiune for lcd commands { DATA &= 0xFF00; // prepare RE0 - RE7 DATA |= cmd; // command byte to lcd RW = 0; // ensure RW is 0 RS = 0; E = 1; Nop(); Nop(); Nop(); E = 0; __delay_ms(5); } void lcd_data( char data ) // subroutine for lcd data { RW = 0; // ensure RW is 0 RS = 1; // assert register select to 1 DATA &= 0xFF00; // prepare RE0 - RE7 DATA |= data; // data byte to lcd E = 1; Nop(); Nop(); Nop(); E = 0; RS = 0; // negate register select to 0 __delay_us(200); __delay_us(200); } void puts_lcd( unsigned char *data, unsigned char count ) { while(count){ lcd_data( *data++ ); count--; } } void lcd_clr(void){ lcd_cmd(0x01); //ClearScreen 0x01 } _CONFIG1(JTAGEN_OFF); void main(void) { lcd_init(); lcd_init(); lcd_init(); __delay_us(200); lcd_cmd( 0x38 ); // function set, european lcd_cmd( 0x0C ); // Display on (control) lcd_cmd( 0x06 ); // entry mode set __delay_ms(100); lcd_clr(); puts_lcd("first row sample",16); while(1){} }
Habe für mich endlich die Lösung gefunden..verstehe nur nicht wieso es so ist: Ich hatte die beiden Displays wie folgt verkablet: Explorer 16 Display: RS -> RB15 E -> RD4 RW -> RD5 DATA -> RE0 - RE7 Neues Display: RS -> RB15 E -> RC4 //hier lag der Fehler RW -> RD5 DATA -> RE0 - RE7 Statt PORTC und PIN4 habe ich spasseshalber PORTD und PIN3 genommen.. Siehe da alles klapt auf anhieb. PORTC benutze ich für nichts anderes. Muss zufällig RW und ENABLE auf dem gleichen PORT liegen? Hierzu habe ich jedoch nie irgendwas gelesen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.