Forum: Mikrocontroller und Digitale Elektronik Explorer 16 board, zwei Displays


von Thion (Gast)


Angehängte Dateien:

Lesenswert?

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){}



   }

von Matz K. (xt-matz)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Thion (Gast)


Angehängte Dateien:

Lesenswert?

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){}



}

von code (Gast)


Lesenswert?

nimm code tags...das ist ja unleserlich!

von Thion (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.