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!
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.
Auf allgemeine Lösungen kannst du hier nicht hoffen, d.h. du musst mit deinem Quellcode und dem Schaltplan rausrücken.
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 | }
|
#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);
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.
void schreibeZeichen(char Zeichen){ LCD_Port |=(1<<RegSelect); _delay_ms(5); LCD_Port = 0x00; // ab hier ist RS nicht mehr auf 1;)
Probier mal das hier: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296 Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.