Forum: Mikrocontroller und Digitale Elektronik LCD Modul Problem


von Christian F. (fisi)


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

von Klaus W. (mfgkw)


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.

von Christian F. (fisi)


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.

von Karl H. (kbuchegg)


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.

von Christian F. (fisi)


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!!

von holger (Gast)


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.

von Christian F. (fisi)


Lesenswert?

Hier der Beweis:
1
#define INPUT     0
2
#define OUTPUT    1
3
4
// IN / OUT definitions
5
6
#define    DDR_PORTA_PIN1  OUTPUT      /* Extension 2: datapin 5 - bit 2 for display              */
7
#define    DDR_PORTA_PIN2  OUTPUT      /* Extension 2: datapin 8 - bit 5 for display old:Drum digital input (frequency measurement)   */
8
#define    DDR_PORTA_PIN5  OUTPUT      /* Extension 2: datapin 9 - bit 6 for display               */
9
#define    DDR_PORTA_PIN6  OUTPUT      /* Extension 2: datapin 10 - bit 7 for display               */
10
#define    DDR_PORTA_PIN7  OUTPUT      /* Extension 2: datapin 7 - bit 4 for display              */
11
#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)
12
13
#define    DDR_PORTB_PIN2  OUTPUT      /* Extension 2: datapin 4 - bit 1 for display               */
14
#define    DDR_PORTB_PIN3  OUTPUT      /* Extension 2: datapin 6 - bit 3 for display            */
15
#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)
16
17
#define   DDR_PORTC_PIN0  OUTPUT      /* Extension 1: datapin 8 - Enable for display               */
18
19
#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)
20
21
22
#define    DDR_PORTD_PIN4  OUTPUT      /* Extension 1: datapin 4 - R/W for display             */
23
#define    DDR_PORTD_PIN6  OUTPUT      /* Extension 1: datapin 3 - RS for display   old:Trigger    digital in - Tigger right    */
24
#define    DDR_PORTD_PIN7  OUTPUT      /* Extension 1: datapin 6 - bit 0 for display old: Trigger    digital in - Tigger left    */
25
#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)

von holger (Gast)


Lesenswert?

>Hier der Beweis:

Ich sehe Definitionen, aber kein Zeile Programm.

von Christian F. (fisi)


Lesenswert?

Das ist für die defines die dazugehörige iopins.c
Alle Funktionen benutzen nun nur noch die Funktionen IOPINS_PinHigh und 
PinLow!
1
void IOPINS_initIOs(void)
2
{
3
  //set the data-direction-registers
4
  DDRA = DDR_PORTA_MASK;
5
  DDRB = DDR_PORTB_MASK;
6
  DDRC = DDR_PORTC_MASK;
7
  DDRD = DDR_PORTD_MASK;
8
9
  PORTA = 0x00;
10
  PORTB = 0x00;
11
  PORTC = 0x00;
12
  PORTD = 0x00;
13
  
14
}
15
16
uint8 IOPINS_PinHigh(enum IoPorts Port, uint8 Pin)
17
{
18
  uint8 ret_code = IL_OK;
19
  
20
  //Pins are from 0 to 7
21
  if (Pin >= 8)
22
  {
23
    return (RET_ERROR);
24
  }
25
  
26
  //write to appropriate Port
27
  switch (Port)
28
  {
29
    case A:
30
      SB(PORTA,Pin);
31
      break;
32
    case B:
33
      SB(PORTB,Pin);
34
      break;
35
    case C:
36
      SB(PORTC,Pin);
37
      break;
38
    case D:
39
      SB(PORTD,Pin);
40
      break;
41
    default:
42
      ret_code = RET_ERROR;
43
  }
44
  
45
  return (ret_code);  
46
}
47
uint8 IOPINS_PinLow(enum IoPorts Port, uint8 Pin)
48
{
49
  uint8 ret_code = IL_OK;
50
  
51
  //Pins are from 0 to 7
52
  if (Pin >= 8)
53
  {
54
    return (RET_ERROR);
55
  }
56
  
57
  //write to appropriate port
58
  switch (Port)
59
  {
60
    case A:
61
      CB(PORTA,Pin);
62
      break;
63
    case B:
64
      CB(PORTB,Pin);
65
      break;
66
    case C:
67
      CB(PORTC,Pin);
68
      break;
69
    case D:
70
      CB(PORTD,Pin);
71
      break;
72
    default:
73
      ret_code = RET_ERROR;
74
  }
75
  
76
  return (ret_code);  
77
}

von holger (Gast)


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;)

von Christian F. (fisi)


Lesenswert?

Kleiner Auszug aus der Display INIT.

Das Enum ist einfach dazu da, dass man die Ports als Buchstabe hat und 
nicht als Zahl!
1
enum IoPorts
2
{
3
  A = 0,
4
  B = 1,
5
  C = 2,
6
  D = 3
7
};
8
9
void displayInit() {
10
   
11
  
12
   /*Function Set 8-Bit, 2 zeiliges Display,*/
13
  IOPINS_PinHigh(C, 0); /* Enable - PC0 - 1*/
14
  
15
   IOPINS_PinLow(D, 6); /*RS  - PD5  - 0*/
16
   IOPINS_PinLow(D, 4); /*R/W - PD4  - 0*/
17
   IOPINS_PinLow(A, 6); /*DB7 - PA6  - 0*/
18
   IOPINS_PinLow(A, 5); /*DB6 - PA5  - 0*/
19
   IOPINS_PinHigh(A, 2); /*DB5 - PA2 - 1*/
20
   IOPINS_PinHigh(A, 7); /*DB4 - PA7 - 1*/
21
   IOPINS_PinLow(B, 3); /*DB3 - PB3  - 0*/
22
   IOPINS_PinLow(A, 1); /*DB2 - PA1  - 0*/
23
   IOPINS_PinLow(B, 2); /*DB1 - PB2  - 0*/
24
   IOPINS_PinLow(D, 7); /*DB0 - PD7 - 0*/
25
   
26
  IOPINS_PinLow(C, 0); /* Enable - PC0 - 0*/

von Christian F. (fisi)


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

von holger (Gast)


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.

von holger (Gast)


Lesenswert?

Ach, nochwas:

Wo in deinem Programm werden die DDRx gesetzt?

>Kleiner Auszug aus der Display INIT.

Mach mal nen großen Auszug.

von avr (Gast)


Lesenswert?

P3 ist die Kontrastspannung !

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

avr

von Karl H. (kbuchegg)


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?

von Klaus (Gast)


Angehängte Dateien:

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.

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.