Forum: Mikrocontroller und Digitale Elektronik LCD Display Bug


von Holger (Gast)


Lesenswert?

Hi,

ich habe ein 2 zeilen (5x8 Pixel) LCD Display

http://www.mikrocontroller.net/attachment/17786/TC1602E_Backlit_LCD.pdf

an einen Atmega 48 gehängt. Folgendes Problem tritt dabei auf:



Einschalten:  beide Zeilen sind "leicht" schwarz, d.h nicht mit vollem 
Kontrast schwarz.

Reset drücken: ändert nichts.

Display abstecken (d.h. Trennen der 4 Datenbits, sowie RS, RW und 
Enable):
obere Zeile mit vollem Kontrast komplett schwarz.

jetzt Reset drücken: Display funktioniert ( Zeichen werden angezeigt).


Sitze schon den ganzen Tag dran und komm nicht weiter, vielleicht kann 
mir einer helfen.. Danke!

von Uwe (de0508)


Lesenswert?

Holger,

man müsste wissen wie du das LCD-Display ansprechen willst und auch den 
Code sehen.

Auch ein Schaltplan oder ein Bild vom Aufbau kann uns helfen.

Im Forum findest Du :

- Beitrag "Display TC1602E.01"
- http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1295045532
- 
http://www.df0fkw.datenoase.de/index.php?option=com_content&view=article&id=100:ecm2

Sind vielleicht +5V und GND vertauscht ?

Evtl. das Display zu langsam und benötigt mehr Zeit beim (be-)Schreiben, 
wenn das Busy-Flag nicht abgefragt wird.

von Nudel (Gast)


Lesenswert?

Auf allgemeine Lösungen kannst du hier nicht hoffen, d.h. du musst mit 
deinem Quellcode und dem Schaltplan rausrücken.

von Holger (Gast)


Lesenswert?

Sorry, hier ist der Code.
Es soll im 4Bit Modus angesprochen werden. Ich habe alle Wartezeiten 
viel größer gemacht, als sie sein müssten. Der Controller sitzt auf 
einem STK500, das Display habe ich über Flachbandkabel an die 
Stiftleiste angeschlossen (PORT D), die Verdrahtung ist korrekt, wie 
gesagt kommen ja auch Buchstaben an. Die Stromversorgung läuft auch über 
das STK, Laut Datenblatt braucht das Display nur 3mA max. (Backlight 
wird nicht verwendet).

Grüße und Danke

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
#define F_CPU 1000000
6
#define  DB4     PD0 
7
#define  DB5     PD1  
8
#define  DB6     PD2  
9
#define  DB7     PD3 
10
#define RegSelect   PD4
11
#define RW    PD5
12
#define Enable     PD6 
13
#define LCD_Port   PORTD 
14
15
//Prototypen der Funktionen------------------
16
void lcdInit(void);
17
void enable(void);
18
void lcdClear(void);
19
void schreibeZeichen(char Zeichen);
20
21
int main (void) {
22
23
DDRD=0xff;      //Ausgang
24
25
lcdInit();
26
_delay_ms(50);
27
lcdClear();
28
29
while(1){
30
schreibeZeichen('W');
31
}
32
33
}
34
35
//Funktionen------------------------------------
36
37
void lcdInit(void){
38
  LCD_Port  =  0x00;
39
  _delay_ms(20);    //Boot Zeit
40
41
  LCD_Port  |=  ((1<<DB4)|(1<<DB5));
42
  _delay_ms(5);
43
  enable();
44
  enable();
45
  enable();
46
  //--------------------------------------------------------
47
  LCD_Port  = 0x00;
48
  LCD_Port  |=  (1<<DB5); //4 Bit Ansteuerung
49
  enable();
50
  //--------------------------------------------------------
51
  LCD_Port  |=  (1<<DB5); //2-zeilig, 5x8
52
  enable();
53
  LCD_Port  |=  (1<<DB7); 
54
  enable();
55
  //--------------------------------------------------------
56
  //Display einschalten, blinkender Cursor ein
57
  LCD_Port  = 0x00;
58
  enable();
59
  LCD_Port  |=0b11110000;
60
  enable();
61
}
62
63
void enable(void) {            
64
  LCD_Port    |= (1<<Enable);
65
  _delay_us(20);
66
  LCD_Port    &= ~(1<<Enable);
67
  _delay_us(20);
68
}
69
70
71
void lcdClear(void){
72
  LCD_Port &=~(1<<RegSelect);      
73
  _delay_ms(4);
74
  LCD_Port  =  0x00;  //Display löschen
75
  enable();
76
  LCD_Port  |=  (1<<DB4); 
77
  enable();
78
}
79
80
81
void schreibeZeichen(char Zeichen){
82
LCD_Port |=(1<<RegSelect);
83
_delay_ms(5);
84
LCD_Port = 0x00;
85
86
  switch(Zeichen){
87
88
//als Beispiel ein W  
89
90
  case 'W':
91
    {  LCD_Port |=((1<<DB4)|(1<<DB6));  //bit 0-3 
92
      enable();
93
      LCD_Port |=((1<<DB4)|(1<<DB6)|(1<<DB5));  //bit 4-7
94
      enable();
95
      break;
96
      }
97
  }
98
}

von holger (Gast)


Lesenswert?

#define F_CPU 1000000
#include <util/delay.h>

So rum gehört das. Sonst stimmen die Zeiten nicht.
Und lass dir bei der Init ruhig ein bißchen mehr Zeit.

  _delay_ms(20);    //Boot Zeit

  LCD_Port  |=  ((1<<DB4)|(1<<DB5));
  enable();
  _delay_ms(5);
  enable();
  _delay_ms(5);
  enable();
  _delay_ms(5);

von Holger (Gast)


Lesenswert?

Danke, aber hat nichts bewirkt.
Im Gegenteil, jetzt geht gar nichts mehr..
Nach kurzen Ab- und wieder Anklemmen ist die erste Zeile satt schwarz, 
bei Reset sind beide "grau" und es kommt kein Zeichen mehr an.

von holger (Gast)


Lesenswert?

void schreibeZeichen(char Zeichen){
LCD_Port |=(1<<RegSelect);
_delay_ms(5);
LCD_Port = 0x00;   // ab hier ist RS nicht mehr auf 1;)

von Peter D. (peda)


Lesenswert?


von Holger (Gast)


Lesenswert?

Habs gelöst.
Es lag an einem popligen Zeichen bei der Veroderung. Besser ist es dann 
so (so läuft es auch):
1
  //Display einschalten, blinkender Cursor ein
2
  LCD_Port  = 0x00;
3
  enable();
4
  LCD_Port  |= ((1<<DB7)|(1<<DB6)|(1<<DB5)|(1<<DB4));;
5
  enable();
6
}

Danke und schönes Wochenende!

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.