Forum: Mikrocontroller und Digitale Elektronik LCD bleibt dunkel


von _lcd_problem (Gast)


Lesenswert?

Hallo, ich versuche vergebens meinen kleinen LCD Display zum laufen zu 
bringen.
VCC -> +5V
GND -> 0V
VEE (Kontrast) -> über 1k Potentiometer (0.3V/1.2V laut Datenblatt).
RS -> PD2 (Atmega32 @16mhz)
R/W -> GND weil ich ja eh nur schreiben will
E -> PD3 (Atmega32 @16mhz)
D4-D7 -> PD4-PD7 (Atmega32 @16mhz)

Eigentlich sollten doch wenigstens schon bei Stromzufuhr und korrektem 
Kontrast die "Balken" zu sehen sein, ist aber nicht der Fall.
Softwaremäßig verwende ich folgendes Programm, entnommen aus einem Buch 
(AVR-Mikrocontroller in C programmieren):
1
#define LCD_CLEAR    0x01  // Clear display:     0b 0000 0001  
2
#define LCD_HOME    0x02  // Cursor home:       0b 0000 0010
3
#define LCD_ON      0x0C  // Cursor invisible:     0b 0000 1100
4
#define LCD_OFF      0x08  // Display off:       0b 0000 1000
5
#define POS_01      0x80  // Line 1 - Column 0    0b 1000 0000
6
#define POS_02      0xC0  // Line 2 - Column 0    0b 1100 0000
7
8
// definition of port pins - data 4-7 -> LCDPORT4-7
9
#define  LCDPORT      PORTD
10
#define  LCDDDR      DDRD
11
#define LCD_PIN_RS    2
12
#define LCD_PIN_E    3
13
#define LCD_PIN_D4    4
14
#define LCD_PIN_D5    5
15
#define  COMMAND      0
16
#define DATA      1
17
18
// Function: Toggle enable pin
19
void toggle_enable_pin(void)
20
{  sbi(LCDPORT, LCD_PIN_E); cbi(LCDPORT, LCD_PIN_E);  
21
}
22
23
// Send Byte to LCD Controller
24
void lcd_send(unsigned char type, unsigned char c)
25
{  unsigned char sic_c;          // Backup for c
26
  
27
  // send high nibble
28
  sic_c = c;                // save original c
29
  sic_c &= ~0x0f;              // set bit 0-3 == 0
30
  if (type==DATA) 
31
    sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
32
  LCDPORT = sic_c;            // send high nibble
33
  toggle_enable_pin();
34
35
  // send low nibble
36
  sic_c = c;                // save original c
37
  sic_c = sic_c<<4;            // exchange nibbles
38
  sic_c &= ~0x0f;              // set bit 0-3 == 0
39
  if (type==DATA)
40
    sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
41
  LCDPORT = sic_c;            // send low nibble
42
  toggle_enable_pin();
43
44
  _delay_ms(5);              // Wait for LCD controller
45
}
46
47
// set cursor to line x and column y
48
void lcd_set_cursor(uint8_t x, uint8_t y)
49
{  uint8_t i;
50
  switch (x) 
51
    {    case 1: i=0x80+0x00+y; break;    // 1. line
52
      case 2: i=0x80+0x40+y; break;    // 2. line
53
      default: return;                 // invalid line
54
    }
55
    lcd_send(COMMAND, i);
56
}
57
58
// write string to LCD
59
void lcd_write(char *data)
60
{   while(*data) {lcd_send(DATA, *data); data++;}
61
}
62
63
// initialize LCD Controller 
64
void lcd_init()
65
{  // Set Port to Output
66
  LCDPORT = 0x00;  LCDDDR  = 0xFF;
67
  _delay_ms(50); // Wait for LCD
68
69
  // 4-bit Modus config
70
  sbi(LCDPORT, LCD_PIN_D5); cbi(LCDPORT, LCD_PIN_D4);
71
  
72
  // 4-Bit Modus start 
73
  sbi(PORTD, LCD_PIN_E); cbi(PORTD, LCD_PIN_E);
74
  _delay_ms(5); 
75
76
  // 2 Lines, 4-Bit Mode
77
  lcd_send(COMMAND, 0x28);
78
  lcd_send(COMMAND, LCD_OFF); lcd_send(COMMAND, LCD_CLEAR);
79
  lcd_send(COMMAND, 0x06);    lcd_send(COMMAND, LCD_ON);
80
}
81
// ende vom header, anfang vom eigentliche programm
82
#define F_CPU 1600000UL
83
#include <avr/io.h>
84
#include <util/delay.h>
85
int main(void)
86
{
87
  lcd_init();
88
  char b[3] = "xx";
89
  
90
  while(1)
91
  {
92
    lcd_set_cursor(0, 0);
93
    lcd_write(b);
94
    _delay_ms(1000);
95
  }
96
}
Der LCD rührt sich nicht, egal was ich mache... :/

Gruß

von Karl H. (kbuchegg)


Lesenswert?

> VEE (Kontrast) -> über 1k Potentiometer (0.3V/1.2V laut Datenblatt).

Wie hast du das konkret gemacht?

> Eigentlich sollten doch wenigstens schon bei Stromzufuhr und
> korrektem Kontrast die "Balken" zu sehen sein

Exakt. Wenn Vcc und GND an den richtigen Pins liegen UND der Kontrast am 
Poti richtig eingestellt ist, DANN sollte man am LCD (ohne Ansteuerung) 
den/die Balken sehen können.

Bei Vcc bzw. GND kannst du nicht viel falsch machen. Ob +5V am richtigen 
Pin liegt, lässt sich mit einem Voltmeter leicht feststellen.
Aber was ist mit der Kontrastspannung? Die wird durch das Poti als 
Spannungsteiler festgelegt. Hast du das so gemacht?

von _lcd_problem (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wie hast du das konkret gemacht?
Danke für die schnelle Antwort!
Also hab am Poti einmal die +5V und einmal GND angeschlossen, am 
Schleifer hängt dann eben VEE... hab mit einem Voltmeter nachgemessen, 
Spannung passt...

von Karl H. (kbuchegg)


Lesenswert?

Hmm

Welches LCD ist das denn?
(Nicht das das eine negative Kontrastspannung braucht)

von _lcd_problem (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hmm
>
> Welches LCD ist das denn?
> (Nicht das das eine negative Kontrastspannung braucht)
Das ist 
http://www.reichelt.de/LCD-Module-DIP-Anschluss/LCD-082-DIP/3/index.html?;ACTION=3;LA=2;ARTICLE=53961;GROUPID=3009;artnr=LCD+082+DIP;SID=11UIQY8H8AAAIAAFWp3mw442e5895784dca81c3f0cb8435293cc5 
.
Von neg. Kontrastspannung steht da aber nichts soweit ich das sehe...

von Karl H. (kbuchegg)


Lesenswert?

_lcd_problem schrieb:

> Das ist
> 
http://www.reichelt.de/LCD-Module-DIP-Anschluss/LCD-082-DIP/3/index.html?;ACTION=3;LA=2;ARTICLE=53961;GROUPID=3009;artnr=LCD+082+DIP;SID=11UIQY8H8AAAIAAFWp3mw442e5895784dca81c3f0cb8435293cc5
> .
> Von neg. Kontrastspannung steht da aber nichts soweit ich das sehe...


Also ein EA DIPS082-HNLED
Passt schon. Das sollte eigentlich funktionieren.
Häng mal das LCD wirklich nur an VCC/GND Vee
Wenn da dann keine Balken kommen, bzw du mit dem Poti den Kontrast nicht 
so einstellen kannst, dass du den Balken auch siehst, dann .... weiß ich 
auch nicht mehr. Ich würde sagen, das LCD ist dann defekt.

von _lcd_problem (Gast)


Lesenswert?

Hab ich schon zigmal versucht... okay, dann wird er wohl defekt sein, 
danke.

von Karl H. (kbuchegg)


Lesenswert?

Weil ichs gerade in einem anderen Thread gelesen habe
+5V und GND ist sicher richtig rum angeschlossen?

von Jürgen S. (jurs)


Lesenswert?

> Hallo, ich versuche vergebens meinen kleinen LCD Display zum laufen zu
> bringen.
> VCC -> +5V
> GND -> 0V
> VEE (Kontrast)

VSS != VCC

Schau doch bitte bei Reichelt nochmal ins Datenblatt und vergleiche die 
Bezeichnungen auf der Platine bei Dir!

Im Datenblatt von Reichelt sehe ich eindeutig:
Pin1 VSS "Low"  0V GND
Pin2 VDD "High" Stromversorgung 5V
Pin3 VEE Kontrast
etc...

Meine 1602-LCDs vom China-Versender haben auch allesamt Pin1 and Ground.

VSS = Ground = 0 Volt!

Woher kommt Dein "VCC"? Steht das wirklich da?

von _lcd_problem (Gast)


Lesenswert?

Also genau genommen steht da
"Pin: 1, Symbol: VSS, Level: L, Funktion: Stromversorgung 0V (GND)"
und
"Pin: 2, Symbol: VDD, Level: H, Funktion: Stromversorgung +5V"

Also eigentlich alles korrekt, oder?

von _lcd_problem (Gast)


Lesenswert?

Edit:
Sorry, aber bevor Missverständnisse auftreten:
Habe dementsprechend Pin1 auf GND und Pin2 auf +5V.
Ach und falls es relevant ist, 3. Punkt im Datenblatt:
"Pin: 3, Symbol: VEE, Level: -, Funktion: Kontrastspg. (ca. 0,3V / 
1,2V)"
Also ebenfalls korrekt...

von Jürgen S. (jurs)


Lesenswert?

_lcd_problem schrieb:
> Funktion: Kontrastspg. (ca. 0,3V / 1,2V)"
> Also ebenfalls korrekt...

Schaltung wie am Poti angeschlossen?

Links und Rechts am Poti 0V und 5V, den Mittelabgriff an den 
Pin3/Kontrastpin?

von _lcd_problem (Gast)


Lesenswert?

_lcd_problem schrieb:
> Also hab am Poti einmal die +5V und einmal GND angeschlossen, am
> Schleifer hängt dann eben VEE... hab mit einem Voltmeter nachgemessen,
> Spannung passt...
Ja ;)

von Jürgen S. (jurs)


Lesenswert?

> Ja ;)

Hört sich alles korrekt an.

Wenn es ein Display mit schwarzer Schrift ist, wie bei Reichelt 
abgebildet, sollte es so laufen. Sehr merkwürdig, wenn nicht.

Wenn es eines mit weißer Schrift ist, würde ich unbedingt auch noch die 
Hintergrundbeleuchtung anschließen.

von _lcd_problem (Gast)


Lesenswert?

Hintergrundbeleuchtung habe ich nicht, also kaputt, na immerhin kann ich 
mir jetzt ganz sicher sein, danke :)

von Michael L. (eagle87)


Lesenswert?

_lcd_problem schrieb:
> VEE (Kontrast) -> über 1k Potentiometer (0.3V/1.2V laut Datenblatt).

hast du die Spannung nur nach dem Multimeter eingestellt oder auch 
einfach mal am Poti gedreht und geschaut ob / wann du den passenden 
Kontrast hast? Vll stimmen die Werte im Datenblatt nicht genau.

von Georg G. (df2au)


Lesenswert?

In einigen Datenblättern wird die Kontrastspannung auf PLUS bezogen. 
Warum das so gemacht wird, erschließt sich mir nicht.

von _lcd_problem (Gast)


Lesenswert?

Michael L. schrieb:
> hast du die Spannung nur nach dem Multimeter eingestellt oder auch
> einfach mal am Poti gedreht und geschaut ob / wann du den passenden
> Kontrast hast? Vll stimmen die Werte im Datenblatt nicht genau.
Auch das habe ich öfters versucht - ohne Erfolg...

Georg G. schrieb:
> In einigen Datenblättern wird die Kontrastspannung auf PLUS bezogen.
Was heißt das jetzt genau?


Gruß

von dolf (Gast)


Lesenswert?

_lcd_problem schrieb:
> Was heißt das jetzt genau?

deine beschaltung ist ok.
1 an gnd
2 an +5v
3 an den schleifer des potis.
e/a des potis* an gnd und +5v

so funzen alle gekauften und auch fast alle ausgebauten lcd´s bei mir.
fast weil ich n paar ausgebaut habe die wollen ! -5v an pin 3 haben.
die sind für den erweiterten temp. bereich geeignet ( waschmaschine, 
trockner z.b.)
allerdings werden nur wenige µa benötigt-->ladungspumpe...
der hd44780 kann am v_lcd pin max. +-11v ab...
mfg

von Jürgen S. (jurs)


Lesenswert?

_lcd_problem schrieb:
> Was heißt das jetzt genau?

Ich habe übrigens gerade die Spannung am Kontrast-Pin an einem hier bei 
mir offen liegenden LCD mit blauer Hintergrundbeleuchtung und weisser 
Schrift gerade mal ausgemessen. Bei korrekt eingestelltem Kontrast messe 
ich 1,05 Volt vom Kontrast-Pin gegen GND (und 3,78 Volt zwischen 
Kontrast-Pin und 5V).

von _lcd_problem (Gast)


Lesenswert?

Jop, sollte ja auch so stimmen... bei mir ist es nur egal, wie viel 
Spannung der Kontrastpin hat :)

von _lcd_problem (Gast)


Lesenswert?

So, ´tschuldigung, dass ich einen alten Thread wiederbelebe aaaber:
ich habe nun das selbe Modell, dieses mal sogar mit Beleuchtung.
Und es funktioniert wieder nicht, ich weiß langsam nicht mehr weiter!
Das Produkt:
"ELECTRONIC ASSEMBLY": "EA DIPS082-HNLED"

Schaltung:
Pin1, VSS = 0V
Pin2, VDD = +5V
Pin3, VEE = 0,6V
RS = PD2
R/W = 0V, weil ich ja eh nur schreiben will
E = PD3
D4-D7 = PD4-PD7

So, nach wie vor tut sich, wie gesagt, nichts. Noch nicht einmal die 
LCD-Beleuchtung geht an, obwohl die dauerhaft an sein sollte.
Nebenbei wird das Teil aber doch nach kurzer Zeit, recht ordentlich 
warm, ist das normal?

Gruß!

von holger (Gast)


Lesenswert?

>Nebenbei wird das Teil aber doch nach kurzer Zeit, recht ordentlich
>warm, ist das normal?

Nein, da wird nix warm wenn es RICHTIG angeschlossen ist.
Falsch rum angeschlossen wird warm!

>Noch nicht einmal die
>LCD-Beleuchtung geht an

Auch falsch rum angeschlossen. Dann leuchtet da nix.

von _lcd_problem (Gast)


Lesenswert?

Ist aber alles korrekt so, laut Datenblatt... :/

von holger (Gast)


Lesenswert?

>Ist aber alles korrekt so, laut Datenblatt... :/

Träum weiter. Mach mal ein Foto.
Entweder du hast VDD und VSS vertauscht oder das Ding
komplett verdreht eingelötet.

von _lcd_problem (Gast)


Angehängte Dateien:

Lesenswert?

holger schrieb:
> Entweder du hast VDD und VSS vertauscht
Definitiv nicht.

holger schrieb:
> oder das Ding
> komplett verdreht eingelötet.
Alles auf einem Steckboard.

Im Anhang auch noch einmal das Datenblatt.
Foto kann ich schlecht machen, da man wohl nicht viel erkennen würde. 
Allerdings ist alles so wie beschrieben aufgebaut...

Gruß

von Dietrich L. (dietrichl)


Lesenswert?

_lcd_problem schrieb:
> Alles auf einem Steckboard.

Kontaktproblem? Sind die Pins vom Display lang genug?
Hast Du mal die Spannungen direkt am Display gemessen? Dann brauchst Du 
allerdings einen Adapter, um an die Pins zu kommen.

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

_lcd_problem schrieb:
> holger schrieb:
>> Entweder du hast VDD und VSS vertauscht
> Definitiv nicht.

Versteif dich nicht darauf.
Wenn da etwas warm wird, dann ist das definitiv falsch rum eingelötet. 
LCD werden nicht warm.

von Karl H. (kbuchegg)


Lesenswert?

_lcd_problem schrieb:

> Foto kann ich schlecht machen,

Probiers trotzdem.
In den meisten Schaltungen kann man anhand der Leiterbahnführung ganz 
gut auch so erkennen, welcher Anschluss die Masse ist.

von Karl H. (kbuchegg)


Lesenswert?

Was mich in deinem Datenblatt zb stutzig machen würde ist, dass die 
Pinbeschriftung darin auf dem Kopf stehend abgedruckt ist.
D.h. orientier dich an der eingezeichneten Brücke, um rauszufinden, wo 1 
ist (wenn es nicht auf der Platine draufsteht). Nimm einen Edding und 
markier dir diesen Pin auf dem Gehäuse, so dass du die 1 auch sicher 
wiederfindest, wenn das LCD dann im Steckbrett steckt.

von Dietrich L. (dietrichl)


Lesenswert?

Noch eine Fehlermöglichkeit:
Im Datenblatt ist die Nummerierung der Pins mit Blick auf die 
Anschlussstifte gezeichnet. Hast Du das berücksichtigt?

Es gibt da dummerweise 4 Möglichkeiten: gespiegelt und/oder um 180° 
gedreht. Nur eine Variante ist richtig :-((

Gruß Dietrich

Edit: Karl-Heinz hatte auch schon die Idee...

von Electronics'nStuff (Gast)


Lesenswert?

Übrigens.. meine Displays von EA waren bis jetzt immer beschriftet.. 
also von daher..

Mach' doch einfach ein Foto - danach kann dir ganz bestimmt jemand 
helfen.

von _lcd_problem (Gast)


Angehängte Dateien:

Lesenswert?

Na wenn ihr meint, Bild im Anhang, hoffe ihr erkennt etwas ;)
Nur noch einmal, damit keine Missverständnisse auftreten: der zweite Pin 
auf Masse ist der R/W Pin, den ich immer auf Low liegen habe, da ich nur 
schreibe.
Ach ja, es ist ein "experimentier"-Board, also nicht meckern wegen 
meiner perfekten Ordnung ;)

Dietrich L. schrieb:
> Kontaktproblem? Sind die Pins vom Display lang genug?
> Hast Du mal die Spannungen direkt am Display gemessen?
Habe ich mir auch gedacht und deshalb direkt am +5V Pin die Spannung 
gemessen, ist jedoch korrekt.

Karl Heinz Buchegger schrieb:
> Versteif dich nicht darauf.
Also das traue ich mir so eben noch zu, aber okay, kann ja immer mal was 
sein ;)

Zum Thema Beschriftung der Pins.
Jep, habe ich beachtet...

Gruß

von holger (Gast)


Lesenswert?

Tja, falsch angeschlossen. Pin1 ist auf deinem Foto
links unten und nicht links oben.

von _lcd_problem (Gast)


Lesenswert?

Wenn das so ist, sorry mein Fehler!!!
Hab´s gerade alles "so mal eben schnell" zusammengesteckt für das Foto, 
war vorher definitiv alles korrekt, hab´s mir sogar bestätigen lassen.
Werde es aber nochmals prüfen.

von _lcd_problem (Gast)


Lesenswert?

Edit:
Nein, du hast völlig recht! Hab´s zwar noch nicht ausprobiert, aber ich 
sehe, wo mein (Denk-)Fehler liegt.

Bei dem Pinout sieht es so aus, als wären Pin1 und Pin8(mein 
ReferenzPin) parallel zueinander.
Ist jedoch nicht der Fall, verdammt da habe ich mir jetzt ein 
wunderschönes Eigentor geschossen!

Mal gucken, ob das gute Teil mir verzeiht oder kaputt ist :(

Danke euch jedenfalls, so etwas blödes passiert mir nicht wider.

von _lcd_problem (Gast)


Lesenswert?

Falls es jemanden interessiert:
Display funktioniert soweit, dass die Beleuchtung an geht.
Bekomme nur noch keine Reaktion, wenn ich programmiertechnisch darauf 
zugreife um Zeichen zu senden. Da weiß ich aber noch nicht, ob der 
Display durch meine wunderbare Aktion kaputt ist, oder ob es am Programm 
liegt.

Schöne Grüße

von Klaus (Gast)


Lesenswert?

@_lcd_problem

Bist Du sicher,dass das hier geht.

> / Send Byte to LCD Controller
> void lcd_send(unsigned char type, unsigned char c)
> {  unsigned char sic_c;          // Backup for c
>
>   // send high nibble
>   sic_c = c;                // save original c
>   sic_c &= ~0x0f;              // set bit 0-3 == 0
>   if (type==DATA)
>     sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
>   LCDPORT = sic_c;            // send high nibble
>   toggle_enable_pin();
>
>   // send low nibble
>   sic_c = c;                // save original c
>   sic_c = sic_c<<4;            // exchange nibbles
>   sic_c &= ~0x0f;              // set bit 0-3 == 0
>   if (type==DATA)
>     sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
>   LCDPORT = sic_c;            // send low nibble
>   toggle_enable_pin();
>
>   _delay_ms(5);              // Wait for LCD controller
> }

Du willst das High-nibble zuerst senden aber löscht den inhalt weg.
>sic_c &= ~0x0f;              // set bit 0-3 == 0
Was soll der quatsch?


Versuch es doch mal so!
Zuerst das übegebene Zeichen sichern   sic_c = c;
Dann Hihbyte isolieren also (Bits 4-7)  c &= 0xF0;
Dann folgt setzen von RS und Enable
Danach Lowbyte isolieren:
c = sic_c;
c = (c << 4);
c &= 0xF0;
Dann folgt setzen von RS und Enable.

An deiner INIT-Routine hätte ich auch noch was zum rum Mäkeln aber dazu 
später vielleicht.

von Electronics'nStuff (Gast)


Lesenswert?

Hm.. darf man da jetzt sagen "Wir haben's doch gewusst?"

von Dietrich L. (dietrichl)


Lesenswert?

_lcd_problem schrieb:
> holger schrieb:
>> Entweder du hast VDD und VSS vertauscht
> Definitiv nicht.

Und was lernst Du daraus?
Wenn man nach einem Fehler sucht, darf man in der ersten Phase durchaus 
solche Annahmen treffen und in Bereichen suchen, in denen man eher den 
Fehler vermutet. Wenn man dann aber nicht weiterkommt, muss man alles 
in Frage stellen und darf an nichts mehr glauben, besonders nicht an 
sich selbst.
Auch wenn es weh tut....

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

Dietrich L. schrieb:

> Fehler vermutet. Wenn man dann aber nicht weiterkommt, muss man /alles/
> in Frage stellen und darf an nichts mehr glauben,

und nichts bedeutet auch wirklich NICHTS!
Das fängt auch damit an, dass man seine eigene Ablesung im Datenblatt 
kontrolliert.
Ideal wäre es, wenn du den kompletten Vorgang, von vorne bis hinten, 
jemandem erklärst. Der muss davon nichts verstehen .. es kommt nur 
darauf an, dass du deine Gedanken laut aussprichst und die auf diese Art 
so ordnen musst, dass sie jemand prinzipiell verstehen könnte. Dieser 
jemand kann auch ein Teddybär sein ... spielt so gesehen keine Rolle. 
Der Zuhörer ist nicht wichtig - das Aussprechen und Formulieren in 
verständlichen Sätzen ist das Wichtige. Es hilft DIR!

(Und wenn mal niemand zur Hand ist, dann erkläre ich mir die Dinge eben 
selber. Das bringt mir in einem neuen Job immer ein paar seltsame Blicke 
ein, aber die Leute gewöhnen sich daran. Manchmal hat es auch Vorteile 
wenn man schizophren ist :-)

von Dietrich L. (dietrichl)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ideal wäre es, wenn du den kompletten Vorgang, von vorne bis hinten,
> jemandem erklärst.

Wie wahr!
Das habe ich auch schon mehrfach erlebt, und das faszinierende ist: 
manchmal reicht schon der erste Satz, in dem man nur die Aufgabe und das 
Problem schildert, um selber das Ei zu finden.

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

Dietrich L. schrieb:
> Karl Heinz Buchegger schrieb:
>> Ideal wäre es, wenn du den kompletten Vorgang, von vorne bis hinten,
>> jemandem erklärst.
>
> Wie wahr!
> Das habe ich auch schon mehrfach erlebt, und das faszinierende ist:

Was auch faszinierend ist:
Du kannst im Editor stundenlang auf einen Code starren und siehst den 
Fehler nicht. In dem Moment, in dem du im Debugger auf den ersten 
Breakpoint in diesem Code aufläufst, ist der Fehler aber sowas von klar.

von _lcd_problem (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was auch faszinierend ist:
> Du kannst im Editor stundenlang auf einen Code starren und siehst den
> Fehler nicht. In dem Moment, in dem du im Debugger auf den ersten
> Breakpoint in diesem Code aufläufst, ist der Fehler aber sowas von klar.
Irgendwie bringt es das ziemlich genau auf den Punkt. Die eigenen Fehler 
übersieht man immer... dafür findet man die der anderen umso besser ;)
Problem ist auch öfters, dass man manche Dinge im Unterbewusstsein schon 
als "gegeben" ansieht, und diese dann als Fehlerquelle unbemerkt 
ausschließt :/

Zum Thema:

Klaus schrieb:
> Bist Du sicher,dass das hier geht.
Der Quellcode stammt aus einem Buch, von daher bin ich davon 
ausgegangen, dass er korrekt ist.
Hier noch einmal der Code, etwas anders.
1
// LCD Output for HD44780 compatible displays
2
// target: ATmega32
3
// for LCD control commands see LCD data sheet
4
5
#define LCD_CLEAR    0x01  // clear display     0b 0000 0001
6
#define LCD_HOME    0x02  // cursor home      0b 0000 0010
7
#define LCD_ON      0x0C  // cursor invisible    0b 0000 1100
8
#define LCD_OFF      0x08  // display off      0b 0000 1000
9
#define POS_01      0x80  // line 1 - column 0  0b 1000 0000
10
#define POS_02      0xC0  // line 2 - column 0  0b 1100 0000
11
12
#define  LCDPORT      PORTD  // define port with LCD attached
13
#define  LCDDDR      DDRD  // and its data direction
14
15
// define pins of LCD port
16
#define LCD_PIN_RS    2    
17
#define LCD_PIN_E    3
18
#define LCD_PIN_D4    4
19
#define LCD_PIN_D5    5
20
#define LCD_PIN_D6    6
21
#define LCD_PIN_D7    7
22
23
// DEFINITIONS
24
#define sbi(PORT, bit)     (PORT|=(1<<bit))  // set bit        
25
#define cbi(PORT, bit)     (PORT&=~(1<<bit))  // clear bit
26
#define tbi(PORT, bit)     (PORT^=(1<<bit))  // toggle bit
27
28
#define  COMMAND      0
29
#define DATA      1
30
31
// Function: Toggle enable pin 
32
void toggle_enable_pin(void)
33
{
34
  sbi(LCDPORT, LCD_PIN_E);
35
  cbi(LCDPORT, LCD_PIN_E);  
36
}
37
// Send Byte to LCD Controller
38
void lcd_send(unsigned char type, unsigned char c)
39
{
40
  unsigned char sic_c;          // Backup for c
41
  // send high nibble
42
  sic_c = c;                // save original c
43
  sic_c &= ~0x0f;              // set bit 0-3 == 0
44
  if (type==DATA)
45
    sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
46
  LCDPORT = sic_c;            // send high nibble
47
  toggle_enable_pin();
48
  // send low nibble
49
  sic_c = c;                // save original c
50
  sic_c = sic_c<<4;            // exchange nibbles
51
  sic_c &= ~0x0f;              // set bit 0-3 == 0
52
  if (type==DATA)
53
    sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
54
  LCDPORT = sic_c;            // send low nibble
55
  toggle_enable_pin();
56
  _delay_ms(5);              // Wait for LCD controller
57
}
58
// set cursor to line x and column y
59
void lcd_set_cursor(uint8_t x, uint8_t y)
60
{
61
  uint8_t i;
62
 
63
  switch (x) 
64
  {
65
    case 1: i=0x80+0x00+y; break;    // 1. line
66
    case 2: i=0x80+0x40+y; break;    // 2. line
67
    default: return;                   // invalid line
68
  }
69
  lcd_send(COMMAND, i);
70
}
71
// Display String on LCD
72
void lcd_write(char *t)
73
{
74
  unsigned char i;
75
  for (i=0;i<255;i++)
76
  {
77
    if (t[i]==0) // End of String -> EXIT
78
      return;
79
    else 
80
      lcd_send(DATA, t[i]);
81
  }
82
}
83
// initializing LCD Controller see data sheet for details
84
void lcd_init()
85
{
86
  // Set LCD port to Output
87
  LCDPORT = 0x00;
88
  LCDDDR  = 0xFF;
89
90
  _delay_ms(50); // wait for LCD
91
92
  // 4-bit Modus config
93
  sbi(LCDPORT, LCD_PIN_D5);
94
  cbi(LCDPORT, LCD_PIN_D4);
95
96
  // 4-Bit mode start 
97
  sbi(LCDPORT, LCD_PIN_E);
98
  cbi(LCDPORT, LCD_PIN_E);
99
  _delay_ms(5); 
100
101
  // 2 Lines, 4-Bit Mode
102
  lcd_send(COMMAND, 0x28);
103
104
  lcd_send(COMMAND, LCD_OFF);
105
  lcd_send(COMMAND, LCD_CLEAR);
106
107
  lcd_send(COMMAND, 0x06);
108
  lcd_send(COMMAND, LCD_ON);
109
}
110
111
// MAIN
112
lcd_init();
113
//delay
114
lcd_send(COMMAND, LCD_CLEAR);
115
//delay
116
lcd_set_cursor(1, 1);
117
//delay
118
lcd_write ("test");
119
//delay
120
// ...

von Karl H. (kbuchegg)


Lesenswert?

_lcd_problem schrieb:

> Klaus schrieb:
>> Bist Du sicher,dass das hier geht.
> Der Quellcode stammt aus einem Buch, von daher bin ich davon
> ausgegangen, dass er korrekt ist.

Du kennst das elfte Gebot?

> Hier noch einmal der Code, etwas anders.


> // define pins of LCD port
> #define LCD_PIN_RS    2
> #define LCD_PIN_E    3
> #define LCD_PIN_D4    4
> #define LCD_PIN_D5    5
> #define LCD_PIN_D6    6
> #define LCD_PIN_D7    7

wunderschön.
Nur leider werden LCD_PIN_D6 bzw LCD_PIN_D7 im Code gar nicht verwendet.


> // Send Byte to LCD Controller
> void lcd_send(unsigned char type, unsigned char c)
> {
>   unsigned char sic_c;          // Backup for c
>   // send high nibble
>   sic_c = c;                // save original c
>   sic_c &= ~0x0f;              // set bit 0-3 == 0
>   if (type==DATA)
>     sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
>   LCDPORT = sic_c;            // send high nibble
>   toggle_enable_pin();
>   // send low nibble
>   sic_c = c;                // save original c
>   sic_c = sic_c<<4;            // exchange nibbles
>   sic_c &= ~0x0f;              // set bit 0-3 == 0
>   if (type==DATA)
>     sic_c |= (1<<LCD_PIN_RS);      // Data: RS = 1
>   LCDPORT = sic_c;            // send low nibble
>   toggle_enable_pin();
>   _delay_ms(5);              // Wait for LCD controller
> }

Hier steckt eine Pinbelegungsannahme drinnen.


Wenn du Code brauchst, den du tatsächlich auf jeden Pin einzelen 
konfigurieren kannst, dann nimm die LCD Routinen vom Peter Fleury. Die 
sind getestet und funktionieren.

von _lcd_problem (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Nur leider werden LCD_PIN_D6 bzw LCD_PIN_D7 im Code gar nicht verwendet.

Werden doch nur für den 8bit Modus verwendet, der allerdings nicht 
implementiert ist ;)

Okay, hab mir die lib mal heruntergeladen, danke für den Hinweis, mal 
sehen, ob es jetzt funktioniert.
Melde mich bald ;)

von _lcd_problem (Gast)


Angehängte Dateien:

Lesenswert?

So, hat sich leider nichts ergeben, aber schaut euch mal das Bild im 
Anhang an, ist das normal (hab den Kontrast etwas erhöht, damit man das 
gut sehen kann)?

Sobald der Display Strom bekommt, erscheint dieses Bild und egal was ich 
mache, es ändert sich nie.

Habe die o.g. Library verwendet, mit folgenden Modifikationen:
1
#define XTAL             1000000UL
2
#define LCD_PORT         PORTD
3
#define LCD_DATA0_PIN    4
4
#define LCD_DATA1_PIN    5
5
#define LCD_DATA2_PIN    6
6
#define LCD_DATA3_PIN    7
7
#define LCD_RS_PIN       2
8
#define LCD_RW_PIN       0 // brauch ich ja sowieso nicht, weil RW auf 0V
9
#define LCD_E_PIN        3
10
11
//...
12
int main()
13
{
14
        lcd_init(LCD_DISP_ON);
15
  lcd_clrscr();
16
  lcd_puts("LCD Test Line 1\n");
17
        while(1){};
18
}

Gruß

von Spess53 (Gast)


Lesenswert?

Hi

>Sobald der Display Strom bekommt, erscheint dieses Bild und egal was ich
>mache, es ändert sich nie.

Wenn das die übliche 'schwarze' Zeile eines nicht initialisierten 
Displays ist, dann dürfte es hinüber sein.

MfG spess

von _lcd_problem (Gast)


Lesenswert?

Spess53 schrieb:
> Wenn das die übliche 'schwarze' Zeile eines nicht initialisierten
> Displays ist, dann dürfte es hinüber sein.
Das bestätigt meine Vermutung, weil genau das ist es ;)

von Karl H. (kbuchegg)


Lesenswert?

kauf dir halt mal ein LCD mit dem üblichen Standard-Anschluss - alle 16 
Pins in einer Reihe anstatt immer wieder denselben Typ eins nach dem 
anderen zu verschrotten.

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Brutzel mal die HEX Datei rein. Mal sehen wie das aussieht.

von _lcd_problem (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> anstatt immer wieder denselben Typ eins nach dem
> anderen zu verschrotten.
Fängt aber gerade Spaß zu machen :(
Nein, aber jetzt sollte es ja nicht mehr vorkommen... hab sowieso noch 3 
7-Segmentanzeigen da, die sollten erstmal als Alternative reichen :)

holger schrieb:
> Brutzel mal die HEX Datei rein. Mal sehen wie das aussieht.
LCD ist kaputt :)

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.