www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Modul Problem


Autor: Christian F. (fisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich habe ein Problem mit einem LCD DOTMATRIXDISPLAY (EA E162-BNLW). 
Angeschlossen habe ich es nach Datenblatt P1:GND P2:5V P3:GND P5: GND 
(R/W) und die Datenleitungen, Enable und RS sind mit dem Mikrokontroller 
verbunden.
Als ich beim ersten Versuch das LCD Modul anzusteuern gesehen habe das 
nur die unterste Zeile des Displays leuchten (Alle Dots sind zu sehen), 
habe ich mal die Pins nachgemessen. Dabei habe ich festgestellt das die 
LCD Datenpins auf Dauer 1 sind. Wenn ich an das Display nur die 
Spannungsverorgung anlege und an R/W GND, sind alle Display Datenpins 
high.
Meine Frage nun ist das LCD kaputt oder sind die LCD Datenpins auf 
Output geschalten!?

Danke für eure Hilfe

fisi

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch ein Eingang hat irgendeine Spannung, wenn nichts von außen
angelegt wird.
Liegt an diesem Eingang ein interner Pullup, ist die Spannung
ohne Beschaltung sowieso 5 V.

Autor: Christian F. (fisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, klingt logisch!
Wenn ich das LCD komplett an den Mikrocontroller beschaltet habe (davor 
die Mikrcontoller Pins nachgemessen ob sie richtig geschaltet sind) und 
dann zwischen LOW und High den jeweiligen Pin umschalte, habe ich am LCD 
Eingang immer ein high Signal.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian F. schrieb:
> OK, klingt logisch!
> Wenn ich das LCD komplett an den Mikrocontroller beschaltet habe (davor
> die Mikrcontoller Pins nachgemessen ob sie richtig geschaltet sind) und
> dann zwischen LOW und High den jeweiligen Pin umschalte, habe ich am LCD
> Eingang immer ein high Signal.

Dann hast du wahrscheinlich den µC-Ausgang nicht als Ausgang geschaltet.

Autor: Christian F. (fisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Christian F. schrieb:
>> OK, klingt logisch!
>> Wenn ich das LCD komplett an den Mikrocontroller beschaltet habe (davor
>> die Mikrcontoller Pins nachgemessen ob sie richtig geschaltet sind) und
>> dann zwischen LOW und High den jeweiligen Pin umschalte, habe ich am LCD
>> Eingang immer ein high Signal.
>
> Dann hast du wahrscheinlich den µC-Ausgang nicht als Ausgang geschaltet.

Die µC-Ausgänge für das LCD sind alle auf OUTPUT!!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die µC-Ausgänge für das LCD sind alle auf OUTPUT!!

Behaupten kann man viel;) Kannst du es auch beweisen?
Ein falscher Befehl im Programm und es sind alles
wieder Eingänge.

Autor: Christian F. (fisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Beweis:
#define INPUT     0
#define OUTPUT    1

// IN / OUT definitions

#define    DDR_PORTA_PIN1  OUTPUT      /* Extension 2: datapin 5 - bit 2 for display              */
#define    DDR_PORTA_PIN2  OUTPUT      /* Extension 2: datapin 8 - bit 5 for display old:Drum digital input (frequency measurement)   */
#define    DDR_PORTA_PIN5  OUTPUT      /* Extension 2: datapin 9 - bit 6 for display               */
#define    DDR_PORTA_PIN6  OUTPUT      /* Extension 2: datapin 10 - bit 7 for display               */
#define    DDR_PORTA_PIN7  OUTPUT      /* Extension 2: datapin 7 - bit 4 for display              */
#define    DDR_PORTA_MASK  (DDR_PORTA_PIN0) | (DDR_PORTA_PIN1 << 1) | (DDR_PORTA_PIN2 << 2) | (DDR_PORTA_PIN3 << 3) | (DDR_PORTA_PIN4 << 4) | (DDR_PORTA_PIN5 << 5) | (DDR_PORTA_PIN6 << 6) | (DDR_PORTA_PIN7 << 7)

#define    DDR_PORTB_PIN2  OUTPUT      /* Extension 2: datapin 4 - bit 1 for display               */
#define    DDR_PORTB_PIN3  OUTPUT      /* Extension 2: datapin 6 - bit 3 for display            */
#define    DDR_PORTB_MASK  (DDR_PORTB_PIN0) | (DDR_PORTB_PIN1 << 1) | (DDR_PORTB_PIN2 << 2) | (DDR_PORTB_PIN3 << 3) | (DDR_PORTB_PIN4 << 4) | (DDR_PORTB_PIN5 << 5) | (DDR_PORTB_PIN6 << 6) | (DDR_PORTB_PIN7 << 7)

#define   DDR_PORTC_PIN0  OUTPUT      /* Extension 1: datapin 8 - Enable for display               */

#define    DDR_PORTC_MASK  (DDR_PORTC_PIN0) | (DDR_PORTC_PIN1 << 1) | (DDR_PORTC_PIN2 << 2) | (DDR_PORTC_PIN3 << 3) | (DDR_PORTC_PIN4 << 4) | (DDR_PORTC_PIN5 << 5) | (DDR_PORTC_PIN6 << 6) | (DDR_PORTC_PIN7 << 7)


#define    DDR_PORTD_PIN4  OUTPUT      /* Extension 1: datapin 4 - R/W for display             */
#define    DDR_PORTD_PIN6  OUTPUT      /* Extension 1: datapin 3 - RS for display   old:Trigger    digital in - Tigger right    */
#define    DDR_PORTD_PIN7  OUTPUT      /* Extension 1: datapin 6 - bit 0 for display old: Trigger    digital in - Tigger left    */
#define    DDR_PORTD_MASK  (DDR_PORTD_PIN0) | (DDR_PORTD_PIN1 << 1) | (DDR_PORTD_PIN2 << 2) | (DDR_PORTD_PIN3 << 3) | (DDR_PORTD_PIN4 << 4) | (DDR_PORTD_PIN5 << 5) | (DDR_PORTD_PIN6 << 6) | (DDR_PORTD_PIN7 << 7)


Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hier der Beweis:

Ich sehe Definitionen, aber kein Zeile Programm.

Autor: Christian F. (fisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist für die defines die dazugehörige iopins.c
Alle Funktionen benutzen nun nur noch die Funktionen IOPINS_PinHigh und 
PinLow!

void IOPINS_initIOs(void)
{
  //set the data-direction-registers
  DDRA = DDR_PORTA_MASK;
  DDRB = DDR_PORTB_MASK;
  DDRC = DDR_PORTC_MASK;
  DDRD = DDR_PORTD_MASK;

  PORTA = 0x00;
  PORTB = 0x00;
  PORTC = 0x00;
  PORTD = 0x00;
  
}

uint8 IOPINS_PinHigh(enum IoPorts Port, uint8 Pin)
{
  uint8 ret_code = IL_OK;
  
  //Pins are from 0 to 7
  if (Pin >= 8)
  {
    return (RET_ERROR);
  }
  
  //write to appropriate Port
  switch (Port)
  {
    case A:
      SB(PORTA,Pin);
      break;
    case B:
      SB(PORTB,Pin);
      break;
    case C:
      SB(PORTC,Pin);
      break;
    case D:
      SB(PORTD,Pin);
      break;
    default:
      ret_code = RET_ERROR;
  }
  
  return (ret_code);  
}
uint8 IOPINS_PinLow(enum IoPorts Port, uint8 Pin)
{
  uint8 ret_code = IL_OK;
  
  //Pins are from 0 to 7
  if (Pin >= 8)
  {
    return (RET_ERROR);
  }
  
  //write to appropriate port
  switch (Port)
  {
    case A:
      CB(PORTA,Pin);
      break;
    case B:
      CB(PORTB,Pin);
      break;
    case C:
      CB(PORTC,Pin);
      break;
    case D:
      CB(PORTD,Pin);
      break;
    default:
      ret_code = RET_ERROR;
  }
  
  return (ret_code);  
}


Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt sehe ich Code, aber nicht wie der aufgerufen wird.

>uint8 IOPINS_PinLow(enum IoPorts Port, uint8 Pin)

Was ist denn das für ein Unsinn mit enum?
Naja, vieleicht erklärt einer der C-Profis hier
das ja mal;)

Autor: Christian F. (fisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Auszug aus der Display INIT.

Das Enum ist einfach dazu da, dass man die Ports als Buchstabe hat und 
nicht als Zahl!
enum IoPorts
{
  A = 0,
  B = 1,
  C = 2,
  D = 3
};

void displayInit() {
   
  
   /*Function Set 8-Bit, 2 zeiliges Display,*/
  IOPINS_PinHigh(C, 0); /* Enable - PC0 - 1*/
  
   IOPINS_PinLow(D, 6); /*RS  - PD5  - 0*/
   IOPINS_PinLow(D, 4); /*R/W - PD4  - 0*/
   IOPINS_PinLow(A, 6); /*DB7 - PA6  - 0*/
   IOPINS_PinLow(A, 5); /*DB6 - PA5  - 0*/
   IOPINS_PinHigh(A, 2); /*DB5 - PA2 - 1*/
   IOPINS_PinHigh(A, 7); /*DB4 - PA7 - 1*/
   IOPINS_PinLow(B, 3); /*DB3 - PB3  - 0*/
   IOPINS_PinLow(A, 1); /*DB2 - PA1  - 0*/
   IOPINS_PinLow(B, 2); /*DB1 - PB2  - 0*/
   IOPINS_PinLow(D, 7); /*DB0 - PD7 - 0*/
   
  IOPINS_PinLow(C, 0); /* Enable - PC0 - 0*/

Autor: Christian F. (fisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich die Init und das schreiben ohne LCD im Debug modenachmesse kann 
ich die richtigen Pegel messen. Sobald ich das Display angeschlossen 
habe, ist alles nur noch auf High

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   IOPINS_PinLow(A, 6); /*DB7 - PA6  - 0*/
>   IOPINS_PinLow(A, 5); /*DB6 - PA5  - 0*/
>   IOPINS_PinHigh(A, 2); /*DB5 - PA2 - 1*/
>   IOPINS_PinHigh(A, 7); /*DB4 - PA7 - 1*/
>   IOPINS_PinLow(B, 3); /*DB3 - PB3  - 0*/
>   IOPINS_PinLow(A, 1); /*DB2 - PA1  - 0*/
>   IOPINS_PinLow(B, 2); /*DB1 - PB2  - 0*/
>   IOPINS_PinLow(D, 7); /*DB0 - PD7 - 0*/

8 Bit Modus auf drei Ports verteilt!
Sag mal gehts noch? Noch nie was vom 4Bit Modus gehört?

>Wenn ich die Init und das schreiben ohne LCD im Debug modenachmesse kann
>ich die richtigen Pegel messen. Sobald ich das Display angeschlossen
>habe, ist alles nur noch auf High

Dann check deine Schaltung.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, nochwas:

Wo in deinem Programm werden die DDRx gesetzt?

>Kleiner Auszug aus der Display INIT.

Mach mal nen großen Auszug.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P3 ist die Kontrastspannung !

P3 auf GND (s.o.) ist falsch ! Poti lt. Datenblatt
einsetzen.

avr

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn ich bis jetzt immer noch nicht daran glaube, dass das LCD 
defekt ist, könntest du folgendes probieren.

Nimm einen Widerstand, ich würde mal 1k vorschlagen, und schalte den von 
deinem LCD-Pin nach Masse. Wenn mit dem LCD alles in Ordnung ist, dann 
schafft es der Widerstand leicht den Pin nach Masse zu ziehen. OK, exakt 
0V werdens wahrscheinlich nicht werden, aber nahe genug.

Damit kannst du dich davon überzeugen, ob dir das LCD oder der µC die 
Pegel versaut.

Weiters:
Du verwendest den Port A. Aus der Porgrammierung sieht man, dass es sich 
offenbar um einen AVR handelt. Welcher µC ist das. Bei einigen liegt am 
Port A der ADC und es gibt dann einen Pin AVcc. Hast du an AVcc 
Versorgungsspannung angeschlossen?

> Das Enum ist einfach dazu da, dass man die Ports als Buchstabe
> hat und nicht als Zahl!

Wieso Zahl.
Was ist falsch daran gleich direkt PORTA, PORTB etc zu verwenden?

Autor: Klaus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> void displayInit()

Wenn das alles ist was zur Initialisierung deines LCD nötig ist dann ist 
es völlig daneben würde ich sagen.

Hast Du das Datenblatt nicht richtig gelesen?

Solltest vllt. mal das Toturial durchlesen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.