LCD Dotmatrix kaputt

OP #815889
Lesenswert?

Ich habe folgendes Problem. Ich hab das Tutorial AVR in C 
durchgearbeitet und bin gerade bei der LCD ansteuerung. Ich habe leider 
das Problem, dass nichts funktioniert. In der Forensuche hatte einer ein 
Ähnliches Problem und ihm wurde ein LCD Simulator empfohlen, den hab ich 
ausprobiert, so funktioniert das, am Programm sollte es nun also nicht 
liegen. woran den dann? kann man irgendwie einwandfrei feststellen, ob 
das display denn kaputt ist? weil es leuchtet und zeigt einen von allen 
sSiten gut sichtbaren weißen Balken in der ersten Zeile an (Kuntrast 
sollte also stimmen) und in der zweite Zeile einen undefinirbaren 
(Frontale Sicht dunkel von den seiten Schwarz) balken an. Eigentlich ist 
das vor dem Initialisieren doch richtig so oder? nur halt  das 
Initialisieren funktioniert nicht. Das Display zeigt nie was anderes an.
#816052
Lesenswert?

Hallo Sönke,

Natürlich KANN ein Display auch kaputt sein, ABER...
in 99% aller Fälle wo als erstes mal ein kaputtes Display vermutet wird, 
ist es am Ende eine dieser Ursachen:

-falsche Beschaltung
-falsche Kontrastspannung (die scheint bei DIR aber richtig zu sein)
-falsche Initialisierung
-völliges Unverständnis was CE,RD,WR etc. überhaupt bedeuten.
-falsches Timing (am häufigsten), da sind viele Display absolut 
kritisch, und erwarten an vielen Stellen -besonders beim Init- "lange" 
Wartezeiten, auf die Anfänger GRUNDSÄTZLICH NIE Rücksicht nehmen.

Fazit:
Timingdiagramme und Logikdiagramme zu lesen ist aus der Mode, ich weiss.
Man nimmt halt einfach eine fertige Routine, die irgendjemand gebastelt 
hat, ohne das man selbst versteht was da eigentlich passiert und wie gut 
die Routinen sind.

Zitat von A.Einstein:
Ich bin dafür, die Dinge so weit wie möglich zu vereinfachen.
Aber nicht weiter.

Gruss
Jochen Müller
OP #816100
Lesenswert?

Kontrastspannung ist eingestellt erst wird die obere Zeile heller, dann 
die untere.

Ich hatte mal den R/W in der luft hängen, ist das Display dadurch 
vielleicht kaputt?? verkabelung muss stimmen und die Software hab ich 
auch getestet. ich check das nochmal mit den Zeiten beim Initialisieren
#816110
Lesenswert?

> verkabelung muss stimmen

da hatte wir erst neulich einen, der das hoch und heilig versprochen 
hat, und am Schluss stellte sich heraus, dass die falschen vier der acht 
Datenleitungen angeschlossen waren...

Vom nicht-Anschliessen von R/W gehts auf jedenfall nicht kaputt.
#816126
Lesenswert?

Sönke Paschko wrote:
> Auch nicht, wenn ich Daten auf den Bus gebe?
>
> Angeschlossen habe ich die oberen 4 Bit Pin 4,5,6,7 das ist doch richtig
> oder?
wenn du DB4-DB7 meinst: jep, so wirds gemacht...

(sonst guck noch mal ins Datenblatt...)

schau dir mal die Timings an. In den Datenblättern heißt es ja 
"mindestens xx ms warten" also kannst ruhig etwas großzugiger mit den 
Wartezeiten sein ;)
OP #816436
Lesenswert?

laut Datenblatt am lcd pin 1-6 Steuer und Versorgungspins Pins 7 bis 14 
datenleitung, ich habe Pin 11-14 angeschlossen. Versorgungsspannung hab 
ich auch angeschlossen. R/W liegt nun Standartmäßig auf Low (will ja nur 
schreiben) E und RS werden vom Controller geschaltet. Kontrastspannung 
über Spannungsteiler (62k festwiderstand und 10k Poti) eingestellt, das 
kommt so ganz gut hin. Kontrast lässt sich auch verstellen.

So nun nochmal zum Programm, kann man vor der Initialisierung schon 
irgendwas ´sichtbares mit dem Display machen wie es z.B. ein oder aus zu 
schalten??

Ich mach morgen mal nen kleines Programm, welches ich Online stelle, 
vielleicht findet ihr da ja ein Fehler, ich habe das wie ich finde sehr 
umfangreiche Programm aus dem Tutorial übernommen und es unktioniert im 
Simulator, nur halt nicht in der Realität.
OP #817279
Lesenswert?

So bin mal auf 8 Bit modus umgestiegen, ist erstmal übersichtlicher, so 
kann man keine Nibbels vertauschen usw. Hier mein Programm:

1
#include <avr/io.h> 
2
#include <stdint.h>
3

4

5
#define __OPTIMIZE__ // Code Optimieren für richtige verzögerungszeit
6

7

8
#define F_CPU  8000000  // Geschwindigkeit für verzögerug (8mhz)
9

10
#include <util/delay.h>     /* bei alter avr-libc: #include <avr/delay.h> */   
11

12
void delay();  //Funktionen
13
void enable();
14

15
int main(){
16

17
  DDRB = 0xff; // Daten Ports initialisieren
18
  DDRC = 0xff; // Steuer
19

20
  _delay_ms(100); 
21

22

23

24
///////////////////////////
25

26
//schreiben
27

28

29
  PORTC = 0b00000000; // Steuerbefehle
30

31
  PORTB = 0b00110000; // Daten (8 Bit Modus)
32

33
   enable(); 
34
  
35
  PORTB = 0b00001111; 
36

37
   enable(); 
38

39
  PORTB = 0b00000001; 
40

41
   enable(); 
42

43
  PORTB = 0b00000110; 
44

45
   enable(); 
46
        
47
  
48

49

50
  while(1){
51
 
52

53
  }
54

55
return 0;
56
}
57

58

59

60

61

62
void enable(){
63

64
//ennableimpuls
65

66
PORTC |= (1 << 2);    /* setzt Bit 2 an PortC auf 1 */
67

68
 _delay_ms(1); 
69

70
PORTC &= ~(1 << 2);   /* loescht Bit 2 an PortC */
71

72

73
//Portumstellung für Datenempfang
74

75
DDRB = 0x00; // Daten Ports initialisieren
76

77

78
PORTC |= (1 << 1);    /* setzt Bit 1 an PortB auf 1  (R/W auf High für Busyflag)*/ 
79

80

81
 while((PINB & (1 << 7))){  // bit 7 wird abgefragt gesetzt Busyflag
82

83
  }
84
 
85

86
PORTC &= ~(1 << 1);   /* loescht Bit 1 an PortC (R/W wieder auf low)*/
87

88

89
DDRB = 0xff; // Port wieder auf Eingang
90

91
}

Die Initialisierungsdaten stimmen, nur beim Ennabe und dem 
anschließenden Abfragen des Busyflags bin ich mir nicht sicher. 
Wartezeiten muss man doch nicht berüksichtigen, wenn man das Busyflag 
abfragt oder?

Mein Display ist ein HD44780 also mit Standartcontroller.
Als uC benutze ich den Atmega 8515L

Soll ich zur Sicherheit zwischen den Befehlen warten, aber an welcher 
Stelle und wie lange?

PS:
Mit diesem Programm verschwindet nach dem Reset der obere Balken und 
eine punktzeile leuchtet statdessen kurz auf, anschließend erschein aber 
wieder der Balken in der ersten Zeile
#817295
Lesenswert?

Hallo,

irgendwie langweilig...

Die 0x30 am Anfang müssen fpr den HD44780 3x geschickt werden, also 3x 
E-Clock (Datenblatt des HD44780, 100000 Initroutinen im Netz...).

Dazwischen müssen die im Datenblatt angegeben Mindestwartezeiten liegen.

Für H-Zeit von E reichen 50µS (Datenblatt!), 1ms schadet dort aber auch 
nicht, wenn man zuviel Zeit hat.

Gruß aus Berlin
Michael
OP #817362
Lesenswert?

den hab ich jezt angeschlossen an pin 2 von port c jetzt auch den r/W 
angeschlossen.

das dreimalige senden (welches in meinem mitgeliefertem Datenblatt nicht 
stand) verursacht das verschwinden des striches, jezt ist dauerhaft der 
Balken zu sehen.

so habe jezt jeweils 15 ms wartezeit eingebaut beim initialisieren, 
nochmal verbindungen gecheckt usw.

hier der code:
1
#include <avr/io.h> 
2
#include <stdint.h>
3

4

5
#define __OPTIMIZE__ // Code Optimieren für richtige verzögerungszeit
6

7

8
#define F_CPU  8000000  // Geschwindigkeit für verzögerug (8mhz)
9

10
#include <util/delay.h>     /* bei alter avr-libc: #include <avr/delay.h> */   
11

12
void delay();  //Funktionen
13
void enable();
14

15
int main(){
16

17
  DDRB = 0xff; // Daten Ports initialisieren
18
  DDRC = 0xff; // Steuer
19

20
  DDRD = 0x00;
21

22
  _delay_ms(100); 
23

24

25

26
///////////////////////////
27

28
//schreiben
29

30

31
  PORTC = 0b00000000; // Steuerbefehle
32

33
  PORTB = 0b00110000; // Daten (8 Bit Modus)
34

35
   enable(); 
36

37
   _delay_ms(15);
38

39
   enable();  // 3x senden zur Initialisierung
40

41
   _delay_ms(15);
42

43
   enable(); 
44

45
  _delay_ms(15);
46

47
  PORTB = 0b00001111; //Display ein Cursor ein Cursor Blinkend
48

49
   enable(); 
50

51
  PORTB = 0b00000001; // Display löschen
52

53
   enable(); 
54

55
  PORTB = 0b00000110; // DDRam adresse increment  und Cursor bewegen nach schreiben
56

57
   enable(); 
58
        
59

60
  PORTB = 0b00001010; // Display aus
61

62
   enable();   
63

64

65
  while(1){
66
 
67

68
  }
69

70
return 0;
71
}
72

73

74

75

76

77
void enable(){
78

79
//ennableimpuls
80

81
PORTC |= (1 << 2);    /* setzt Bit 2 an PortC auf 1 */
82

83
 _delay_ms(1); 
84

85
PORTC &= ~(1 << 2);   /* loescht Bit 2 an PortC */
86

87

88
//Portumstellung für Datenempfang
89

90
DDRB = 0x00; // Daten Ports initialisieren
91

92

93
PORTC |= (1 << 1);    /* setzt Bit 1 an PortB auf 1  (R/W auf High für Busyflag)*/ 
94

95

96
 while((PINB & (1 << 7))){  // bit 7 wird abgefragt gesetzt Busyflag
97

98
  }
99
 
100

101
PORTC &= ~(1 << 1);   /* loescht Bit 1 an PortC (R/W wieder auf low)*/
102

103

104
DDRB = 0xff; // Port wieder auf Eingang
105

106
}
107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123
void delay(){
124

125

126
  while(!(PIND & (1 << 0))){  // bit 1 wird abgefragt gesezt
127

128
  }
129

130

131
  while((PIND & (1 << 0))){  // bit 1 wird abgefragt gelößt
132

133
  }
134

135
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren