Forum: Mikrocontroller und Digitale Elektronik C0802-Display ansteuern - auch nach Init nur schwarzer Balkan.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Manf. (Gast)


Lesenswert?

Hallo,
ich versuche, das C0802-Display von Pollin anzusteuern. Gibt leider kein 
vernünftiges Datenblatt, deshalb habe ich mich nach 
http://wiki.atrox.at/images/3/3e/Text-LCDs.pdf gerichtet. Der Controller 
ist ja HD47780-kompatibel.

Mein Problem ist, dass auch nach der Initialisierung ein schwarzer 
Balken auf dem Display bleibt. Die Zeiten sind recht großzügig und 
sollten deshalb recht großzügig sein.

Der Code lautet:
1
#define F_CPU   1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#define LCD_PORT  PORTB
7
#define LCD_DDR    DDRB
8
#define LCD_RS    PB0
9
#define LCD_E    PB1
10
#define LCD_D4    PB2
11
#define LCD_D5    PB3
12
#define LCD_D6    PB4
13
#define LCD_D7    PB5
14
15
16
void lcd_enable(void) {
17
  _delay_ms(40);
18
  LCD_PORT |= (1 << LCD_E);
19
  _delay_ms(40);
20
  LCD_PORT &= ~(1 << LCD_E);
21
  _delay_ms(40);
22
}
23
24
void set_d7(int i) {
25
  if(i) {
26
    LCD_PORT |= (1 << LCD_D7);
27
  } else {
28
    LCD_PORT &= ~(1 << LCD_D7);
29
  }
30
}
31
 
32
/* ... äquivalente Funktionen für d6 - d4. ... */
33
34
void main(void) {
35
  LCD_DDR |= (1 << LCD_E) | (1 << LCD_RS);
36
  LCD_DDR |= (1 << LCD_D4) | (1 << LCD_D5) | (1 << LCD_D6) | (1 << LCD_D7);
37
38
  _delay_ms(1000);
39
40
  // Initialisierung.
41
  // Drei mal das ganze ...
42
  set_d7(0);
43
  set_d6(0);
44
  set_d5(1);
45
  set_d4(1);
46
  lcd_enable();
47
  lcd_enable();
48
  lcd_enable();
49
50
  // 4-bit-Modus.
51
  set_d7(0);
52
  set_d6(0);
53
  set_d5(1);
54
  set_d4(0);
55
  lcd_enable();
56
57
  // System-set.    
58
  set_d7(0);
59
  set_d6(0);
60
  set_d5(1);
61
  set_d4(0);
62
  lcd_enable();
63
  set_d7(1);
64
  set_d6(0);
65
  set_d5(0);
66
  set_d4(0);
67
  lcd_enable();
68
69
70
  // Display on.  
71
  set_d7(0);
72
  set_d6(0);
73
  set_d5(0);
74
  set_d4(0);
75
  lcd_enable();
76
  set_d7(1);
77
  set_d6(1);    // Display ein
78
  set_d5(1);    // Unterstrich-Cursor ein
79
  set_d4(0);    // Blinkender Cursor aus
80
  lcd_enable();
81
82
  // Clear display.
83
  set_d7(0);
84
  set_d6(0);
85
  set_d5(0);
86
  set_d4(0);
87
  lcd_enable();
88
  set_d7(0);
89
  set_d6(0);
90
  set_d5(0);
91
  set_d4(1);
92
  lcd_enable();
93
94
  // Cursor home
95
  set_d7(0);
96
  set_d6(0);
97
  set_d5(0);
98
  set_d4(0);
99
  lcd_enable();
100
  set_d7(0);
101
  set_d6(0);
102
  set_d5(1);
103
  set_d4(0);
104
  lcd_enable();
105
106
107
  // Entry mode set.
108
  set_d7(0);
109
  set_d6(0);
110
  set_d5(0);
111
  set_d4(0);
112
  lcd_enable();
113
  set_d7(0);
114
  set_d6(1);
115
  set_d5(1);    // Schreibrichtung rechts.
116
  set_d4(0);    // Cursor verschieben.
117
  lcd_enable();
118
}

Fällt jemandem da spontan 'n Fehler auf? :S
Vielen Dank schonmal.

von hp-freund (Gast)


Lesenswert?

Ist F_CPU wirklich 1MHz?

von Ralf (Gast)


Lesenswert?

Wie ist R/W angeschlossen?

von hp-freund (Gast)


Lesenswert?

RS muss anfangs 0 sein.

von Manf. (Gast)


Lesenswert?

R/W ist mit GND verbunden. RS ist doch 0, oder nicht?
Ob F_CPU wirklich 1000000Hz ist, muss ich nachher mal gucken.

Danke schonmal!

von Manf. (Gast)


Lesenswert?

F_CPU war richtig. Interner Takt von 8MHz, aber Teilung durch 8. Die 
Teilung durch 8 hab' ich mal probehalber ausprobiert - hat nichts 
gebracht. Das Display - bzw. die obere Hälfe - bleibt schwarz.

von Alexander V. (avogra)


Lesenswert?

Mit dem hab ich mich auch mehrere Tage rumgeschlagen. Am Ende lags dann 
natürlich doch an schlechten Lötkontakten, wie schon bei vielen anderen 
vor mir. ich hatte den folienleiter vorsichtig abgemacht und dann ein 
flachbandkabel mit 1mm pitch drangelötet (pollin hatte mir das falsche 
geliefert, mein glück :)). verwendest du den folienleiter mit der 
buchse, die man dazu kaufen kann? wenn du auch ein kabel angelötet hast, 
miss nochmal durch, und zwar von kabelende bis direkt auf die platine. 
ich hatte von lötstelle zu platine gemessen, und durch den druck die 
kalten lötstellen während der messung leitend gemacht.
Irgendwo nach der Initialisierung musste ich noch ne relativ lange 
zusätzliche pause einbauen, damit es funktioniert. kann dir im moment 
leider nicht mehr sagen, wo.

viel glück!

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.