Forum: Compiler & IDEs LCD Problem ATMEGA32


von Horst (Gast)


Lesenswert?

Hallo,

ich habe mir gestern ein LCD-Display vom Typ Displaytech 162 gekauft. 
(Datenblatt als Anlage). Wenn ich das Display nun wie in etlichen 
Tutorials beschriben anschliesse, dann geht das Display und die 
Hintergrundbeleuchtung an, aber das Display zeigt in der oberen Reihe 
nur schwarze Felder an und unten gar nichts. Nun habe ich zwei fragen:

1. Ist das normal?

2. Und warum gibt es nicht das aus, was es eigentlich sollte?

Quelltext ist aus dem LCD Tutorial hier auf der Seite.


Gruß,

der Horst.

von Michael (Gast)


Lesenswert?

Datenblatt fehlt

1. Ja
2. Initialisierung nicht erfolgreich

von Horst (Gast)


Angehängte Dateien:

Lesenswert?

Sorry hier das Datenblatt und meine Pinnbelegung.

1 VSS -> +5V
2 VDD -> GND
3 VO -> GND
4 RS -> PD4
5 R/W -> GND
6 E -> PD5
7-10 not connected
11 DB4 -> PD0
12 DB5 -> PD1
13 DB6 -> PD2
14 DB7 -> PD3

von holger (Gast)


Lesenswert?

>1 VSS -> +5V
>2 VDD -> GND

Die sind vertauscht !
1 VSS -> GND
2 VDD -> +5V

Wahrscheinlich nur Tippfehler. Tu uns allen
einen Gefallen und überprüfe deine Schaltung
noch mal Leitung für Leitung. Häufig sind Leitungen
einfach nicht richtig angeschlossen gewesen, oder
es waren Kurzschlüsse vorhanden. Ein Kontrastregler
an VO könnte auch nicht schaden.

von Horst (Gast)


Lesenswert?

Wenn ich VSS und VDD Tausche erhalte ich einen Kurzschluss.

Daran kanns schonmal nicht liegen und ausserdem steht es ja auch so in 
dem Tutorial:

Anschluss an den Controller
Jetzt da wir wissen, welche Anschlüsse das LCDs benötigt, können wir das 
LCD mit dem Mikrocontroller verbinden:

Pin #-LCD Bezeichnung-LCD Pin-µC
1 Vss GND
2 Vcc 5V
3 Vee GND oder Poti (siehe oben)
4 RS PD4 am AVR
5 RW GND
6 E PD5 am AVR
7 DB0 offen
8 DB1 offen
9 DB2 offen
10 DB3 offen
11 DB4 PD0 am AVR
12 DB5 PD1 am AVR
13 DB6 PD2 am AVR
14 DB7 PD3 am AVR

von Horst (Gast)


Lesenswert?

Jupp hatte micht vertiptt, und nun nochmal falsch geschrieben ;)

von Michael U. (amiga)


Lesenswert?

Hallo,

Kontrast gehört an ein Poti. Einfach deshalb, weil die tatsächlich 
nötige Vee recht stark vom Displayhersteller abhängt und man bei zu 
hohem Kontrast durchaus auch ausgegebene Zeichen übersehen kann, die in 
der ersten Zeile sein sollen.

Wenn es keine Verdrahtungsfehler gibt, eben das übliche: Wartezeiten 
lang genug (wie schnell ist der AVR getaktet?) Display hat wirklich 
einen HD44780 drauf und nicht einen kompatiblen? Den Begriff 
"kompatibel" definieren Display-Hersteller gern so: hat etwa genausoviel 
Anschlüsse wie ein Standard-Display, die sind auch so etwa wie dort 
belegt und der Chip kann, wenn man ihn richtig ansteuert, auch etwa das, 
was ein HD44780 kann.
Ist zumindest meine Erfahrung...

Anschlüsse: Original-Datenblatt des Displays, dort sollte auch der 
Controllertyp drinstehen.
Init-Sequence mit dem Original-Datenblatt vergleichen, speziell nötige 
Mindestzeit für E H-Zeit und die maximale Zeit für Befehlsausführung.
Beim Init sind meist Mindestwartezeiten gefordert.
Vor Beginn der Init-Sequence lange genug warten, bis das Display mit 
seiner PowerOn-Sequence fertig ist.

Alle Zeiten können durchaus länger sein.
Nach dem AVR-Reset: warte ich meist 150ms, bis Init aufgerufen wird.
5ms reichen sicher eigentlich für Befehle außer Clear.

E-Clock setze ich nach anlegen aller gültigen Signale und Daten mit 
einem NOP zwischen L/H und H/L, bei 8MHz sind 2, bei 16MHz meist schon 4 
nötig.
Das hängt auch stark vom Aufbau und den Leitungslängehn zum Display ab.
Auf dem Steckbrett und mit 20cm Flachbandkabel zum Display bin ich da 
eher großzügig...

Gruß aus Berlin
Michael

von Horst (Gast)


Lesenswert?

Hallo,

Kontrast hängt mittlkerweile an nem Poti und Funktioniert auch, dahinter 
versteckt sich kein Text. ;)

Auszug aus dem GCC-Tutorial von hier:

Das LCD und sein Controller
Die meisten Text-LCDs verwenden den Controller HD44780 oder einen 
kompatiblen (z.B. KS0070) und haben 14 oder 16 Pins. Die Pinbelegung an 
der LCD-Controller-Platine ist praktisch immer gleich.

Und genau einen solchen KS0070 ist bei dem Display verbaut.

Meine Flachbandkabellänge ist ungefähr 5cm.

So und das ist mein Quelltext:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
 
5
// sendet ein Datenbyte an das LCD
6
 
7
void lcd_data(unsigned char temp1)
8
{
9
   unsigned char temp2 = temp1;
10
 
11
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
12
 
13
   temp1 = temp1 >> 4;
14
   temp1 = temp1 & 0x0F;
15
   LCD_PORT &= 0xF0;
16
   LCD_PORT |= temp1;               // setzen
17
   lcd_enable();
18
 
19
   temp2 = temp2 & 0x0F;
20
   LCD_PORT &= 0xF0;
21
   LCD_PORT |= temp2;               // setzen
22
   lcd_enable();
23
   
24
   _delay_us(45);
25
}
26
 
27
// sendet einen Befehl an das LCD
28
 
29
void lcd_command(unsigned char temp1)
30
{
31
   unsigned char temp2 = temp1;
32
 
33
   LCD_PORT &= ~(1<<LCD_RS);        // RS auf 0 setzen
34
 
35
   temp1 = temp1 >> 4;              // oberes Nibble holen
36
   temp1 = temp1 & 0x0F;            // maskieren
37
   LCD_PORT &= 0xF0;
38
   LCD_PORT |= temp1;               // setzen
39
   lcd_enable();
40
 
41
   temp2 = temp2 & 0x0F;            // unteres Nibble holen und maskieren
42
   LCD_PORT &= 0xF0;
43
   LCD_PORT |= temp2;               // setzen
44
   lcd_enable();
45
   
46
   _delay_us(45);
47
}
48
 
49
// erzeugt den Enable-Puls
50
void lcd_enable(void)
51
{
52
   LCD_PORT |= (1<<LCD_EN);
53
    _delay_us(10);                   // kurze Pause
54
   LCD_PORT &= ~(1<<LCD_EN);
55
}
56
 
57
// Initialisierung: 
58
// Muss ganz am Anfang des Programms aufgerufen werden.
59
 
60
void lcd_init(void)
61
{
62
   LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN);   // Port auf Ausgang schalten
63
 
64
   // muss 3mal hintereinander gesendet werden zur Initialisierung
65
 
66
   _delay_ms(150);
67
   LCD_PORT &= 0xF0;
68
   LCD_PORT |= 0x03;            
69
   LCD_PORT &= ~(1<<LCD_RS);      // RS auf 0
70
   lcd_enable();
71
 
72
   _delay_ms(150);
73
   lcd_enable();
74
 
75
   _delay_ms(150);
76
   lcd_enable();
77
   _delay_ms(150);
78
 
79
   // 4 Bit Modus aktivieren 
80
   LCD_PORT &= 0xF0;
81
   LCD_PORT |= 0x02;
82
   lcd_enable();
83
   _delay_ms(150);
84
 
85
   // 4Bit / 2 Zeilen / 5x7
86
   lcd_command(0x28);
87
    
88
   // Display ein / Cursor aus / kein Blinken
89
   lcd_command(0x0C); 
90
 
91
   // inkrement / kein Scrollen
92
   lcd_command(0x06);
93
 
94
   lcd_clear();
95
}
96
 
97
// Sendet den Befehl zur Löschung des Displays
98
 
99
void lcd_clear(void)
100
{
101
   lcd_command(CLEAR_DISPLAY);
102
   _delay_ms(50);
103
}
104
 
105
// Sendet den Befehl: Cursor Home
106
 
107
void lcd_home(void)
108
{
109
   lcd_command(CURSOR_HOME);
110
   _delay_ms(50);
111
}
112
 
113
// setzt den Cursor in Zeile y (1..4) Spalte x (0..15)
114
 
115
void set_cursor(uint8_t x, uint8_t y)
116
{
117
  uint8_t tmp;
118
 
119
  switch (y) {
120
    case 1: tmp=0x80+0x00+x; break;    // 1. Zeile
121
    case 2: tmp=0x80+0x40+x; break;    // 2. Zeile
122
  }
123
  lcd_command(tmp);
124
}
125
 
126
// Schreibt einen String auf das LCD
127
 
128
void lcd_string(char *data)
129
{
130
    while(*data) {
131
        lcd_data(*data);
132
        data++;
133
    }
134
} 
135
int main(void)
136
{
137
  _delay_ms(250);
138
    lcd_init();
139
 
140
    lcd_data('T');
141
    lcd_data('e');
142
 
143
    set_cursor(0,2);
144
 
145
    lcd_string("Hello World!");
146
 
147
    while(1)
148
    {
149
    }
150
 
151
    return 0;
152
}

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.