Hallo, folgendes Problem: Ansteuerung LCD 202A von Conrad mit einem ATMEGA 8 über das Pollin Evulationsboard. Datenblatt vom LCD siehe Anhang. Ich habe schon einige Funktionen programmiert Taster Abfragen, Eingang einlesen, LED blinken lassen, auch schon Timer und PWM mit guten Beispielen hier aus dem Forum. Was aber absolut nicht klappt und was ich aktuell auch nicht verstehe ist die Anwendung des LCD. Habe das LCD wie im Datenblatt und wie hier auf den Seiten angeschlossen: [[http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung]] oder wie hier [[http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte#LCD_ansteuern]] habe auch schon deren beiden Beispielcodes auf den µC übertragen. Jedoch zeigt mein LCD nur 16 schwarze Balken in der ersten Zeile an. Habe auch den Pin 3 VEE über einen 5kOhm Poti angeschlossen. Kann somit den Kontrast regeln. Was kann noch flasch sein? So wie ich die Beispiele verstanden habe, müssten alle Einstellungen FCPU usw, Pin Belegung stimmen. Was könnte man noch für Einstellzeiten prüfen? Denke der Aufbau ist soweit richtig. DB0-DB3 offen. Hat jemand noch gute Tipps?
Zeig doch mal aussagekräftige Fotos vom Aufbau (ggf. mit Schaltplänen) sowie den vollständigen(!) Quellcode.
Und bitte: Deinen! Verweise nicht auf irgendwelche anderen Seiten oder anderen Code. Die Schaltungen dort und er Code dort funktionieren. Bei dir funktioniert es nicht. Also muss bei dir irgendwas anders sein. Das kriegen wir aber nicht raus, wenn du auf andere Seiten verlinkst. Das die Schaltungen dort, der Code dort funktioniert, wissen wir. Aber wir wissen nicht, was du anders gemacht hast. (Und du weißt es auch nicht. Denn sonst müsstest du nicht fragen.) PS: Die Taktfrequenz deines µC hast du kontrolliert? Die stimmt auf jeden Fall? Wenn ein LCD nicht richtig initialisiert, dann ist oft das Timing das Problem. Man könnte zb einfach mal die ersten paar Timings im LCD-Init länger machen. Das Datenblatt sagt zb, nach dem Anlegen dr Versorgungsspannung dauert es 15ms, bis man das LCD das erste mal ansprechen kann. Das kann man auch verlängern. Du darfst nicht kürzer sein, aber du darfst ruhig auch 200ms warten, ehe dann versucht wird das LCD zu initialisieren. Und genauso ist es mit den anderen Timings. Laut Datenblatt dürfen von der ersten 0x30 bis zum nächsten nicht weniger als 4.5ms vergehen. Es dürfen aber problemlos mehr sein. zb auch 10ms. usw. usw.
So, habe das LCD nochmal neu verdrahtet. Anbei mein Code den ich verwenden möchte: LCD_Main:
1 | //
|
2 | // Anpassungen im makefile:
|
3 | // ATMega8 => MCU=atmega8 im makefile einstellen
|
4 | // lcd-routines.c in SRC = ... Zeile anhängen
|
5 | //
|
6 | #include <avr/io.h> |
7 | #include "lcd-routines.h" |
8 | |
9 | int main(void) |
10 | {
|
11 | // Initialisierung des LCD
|
12 | // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
|
13 | // verschwunden sein
|
14 | lcd_init(); |
15 | |
16 | // Text in einzelnen Zeichen ausgeben
|
17 | lcd_data( 'T' ); |
18 | lcd_data( 'e' ); |
19 | lcd_data( 's' ); |
20 | lcd_data( 't' ); |
21 | |
22 | // Die Ausgabemarke in die 2te Zeile setzen
|
23 | lcd_setcursor( 0, 2 ); |
24 | |
25 | // erneut Text ausgeben, aber diesmal komfortabler als String
|
26 | lcd_string("Hello World!"); |
27 | |
28 | while(1) |
29 | {
|
30 | }
|
31 | |
32 | return 0; |
33 | }
|
lcd_routines.c
1 | // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
|
2 | // http://www.mikrocontroller.net/articles/HD44780
|
3 | // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
|
4 | //
|
5 | // Die Pinbelegung ist über defines in lcd-routines.h einstellbar
|
6 | |
7 | #include <avr/io.h> |
8 | #include "lcd-routines.h" |
9 | #include <util/delay.h> |
10 | |
11 | ////////////////////////////////////////////////////////////////////////////////
|
12 | // Erzeugt einen Enable-Puls
|
13 | static void lcd_enable( void ) |
14 | {
|
15 | LCD_PORT |= (1<<LCD_EN); // Enable auf 1 setzen |
16 | _delay_us( LCD_ENABLE_US ); // kurze Pause |
17 | LCD_PORT &= ~(1<<LCD_EN); // Enable auf 0 setzen |
18 | }
|
19 | |
20 | ////////////////////////////////////////////////////////////////////////////////
|
21 | // Sendet eine 4-bit Ausgabeoperation an das LCD
|
22 | static void lcd_out( uint8_t data ) |
23 | {
|
24 | data &= 0xF0; // obere 4 Bit maskieren |
25 | |
26 | LCD_PORT &= ~(0xF0>>(4-LCD_DB)); // Maske löschen |
27 | LCD_PORT |= (data>>(4-LCD_DB)); // Bits setzen |
28 | lcd_enable(); |
29 | }
|
30 | |
31 | ////////////////////////////////////////////////////////////////////////////////
|
32 | // Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
|
33 | void lcd_init( void ) |
34 | {
|
35 | // verwendete Pins auf Ausgang schalten
|
36 | uint8_t pins = (0x0F << LCD_DB) | // 4 Datenleitungen |
37 | (1<<LCD_RS) | // R/S Leitung |
38 | (1<<LCD_EN); // Enable Leitung |
39 | LCD_DDR |= pins; |
40 | |
41 | // initial alle Ausgänge auf Null
|
42 | LCD_PORT &= ~pins; |
43 | |
44 | // warten auf die Bereitschaft des LCD
|
45 | _delay_ms( LCD_BOOTUP_MS ); |
46 | |
47 | // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
|
48 | lcd_out( LCD_SOFT_RESET ); |
49 | _delay_ms( LCD_SOFT_RESET_MS1 ); |
50 | |
51 | lcd_enable(); |
52 | _delay_ms( LCD_SOFT_RESET_MS2 ); |
53 | |
54 | lcd_enable(); |
55 | _delay_ms( LCD_SOFT_RESET_MS3 ); |
56 | |
57 | // 4-bit Modus aktivieren
|
58 | lcd_out( LCD_SET_FUNCTION | |
59 | LCD_FUNCTION_4BIT ); |
60 | _delay_ms( LCD_SET_4BITMODE_MS ); |
61 | |
62 | // 4-bit Modus / 2 Zeilen / 5x7
|
63 | lcd_command( LCD_SET_FUNCTION | |
64 | LCD_FUNCTION_4BIT | |
65 | LCD_FUNCTION_2LINE | |
66 | LCD_FUNCTION_5X7 ); |
67 | |
68 | // Display ein / Cursor aus / Blinken aus
|
69 | lcd_command( LCD_SET_DISPLAY | |
70 | LCD_DISPLAY_ON | |
71 | LCD_CURSOR_OFF | |
72 | LCD_BLINKING_OFF); |
73 | |
74 | // Cursor inkrement / kein Scrollen
|
75 | lcd_command( LCD_SET_ENTRY | |
76 | LCD_ENTRY_INCREASE | |
77 | LCD_ENTRY_NOSHIFT ); |
78 | |
79 | lcd_clear(); |
80 | }
|
81 | |
82 | ////////////////////////////////////////////////////////////////////////////////
|
83 | // Sendet ein Datenbyte an das LCD
|
84 | void lcd_data( uint8_t data ) |
85 | {
|
86 | LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen |
87 | |
88 | lcd_out( data ); // zuerst die oberen, |
89 | lcd_out( data<<4 ); // dann die unteren 4 Bit senden |
90 | |
91 | _delay_us( LCD_WRITEDATA_US ); |
92 | }
|
93 | |
94 | ////////////////////////////////////////////////////////////////////////////////
|
95 | // Sendet einen Befehl an das LCD
|
96 | void lcd_command( uint8_t data ) |
97 | {
|
98 | LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen |
99 | |
100 | lcd_out( data ); // zuerst die oberen, |
101 | lcd_out( data<<4 ); // dann die unteren 4 Bit senden |
102 | |
103 | _delay_us( LCD_COMMAND_US ); |
104 | }
|
105 | |
106 | ////////////////////////////////////////////////////////////////////////////////
|
107 | // Sendet den Befehl zur Löschung des Displays
|
108 | void lcd_clear( void ) |
109 | {
|
110 | lcd_command( LCD_CLEAR_DISPLAY ); |
111 | _delay_ms( LCD_CLEAR_DISPLAY_MS ); |
112 | }
|
113 | |
114 | ////////////////////////////////////////////////////////////////////////////////
|
115 | // Sendet den Befehl: Cursor Home
|
116 | void lcd_home( void ) |
117 | {
|
118 | lcd_command( LCD_CURSOR_HOME ); |
119 | _delay_ms( LCD_CURSOR_HOME_MS ); |
120 | }
|
121 | |
122 | ////////////////////////////////////////////////////////////////////////////////
|
123 | // Setzt den Cursor in Spalte x (0..15) Zeile y (1..4)
|
124 | |
125 | void lcd_setcursor( uint8_t x, uint8_t y ) |
126 | {
|
127 | uint8_t data; |
128 | |
129 | switch (y) |
130 | {
|
131 | case 1: // 1. Zeile |
132 | data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x; |
133 | break; |
134 | |
135 | case 2: // 2. Zeile |
136 | data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x; |
137 | break; |
138 | |
139 | case 3: // 3. Zeile |
140 | data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x; |
141 | break; |
142 | |
143 | case 4: // 4. Zeile |
144 | data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x; |
145 | break; |
146 | |
147 | default:
|
148 | return; // für den Fall einer falschen Zeile |
149 | }
|
150 | |
151 | lcd_command( data ); |
152 | }
|
153 | |
154 | ////////////////////////////////////////////////////////////////////////////////
|
155 | // Schreibt einen String auf das LCD
|
156 | |
157 | void lcd_string( const char *data ) |
158 | {
|
159 | while( *data != '\0' ) |
160 | lcd_data( *data++ ); |
161 | }
|
162 | |
163 | ////////////////////////////////////////////////////////////////////////////////
|
164 | // Schreibt ein Zeichen in den Character Generator RAM
|
165 | |
166 | void lcd_generatechar( uint8_t code, const uint8_t *data ) |
167 | {
|
168 | // Startposition des Zeichens einstellen
|
169 | lcd_command( LCD_SET_CGADR | (code<<3) ); |
170 | |
171 | // Bitmuster übertragen
|
172 | for ( uint8_t i=0; i<8; i++ ) |
173 | {
|
174 | lcd_data( data[i] ); |
175 | }
|
176 | }
|
lcd_routines.h
1 | // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
|
2 | // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
|
3 | //
|
4 | |
5 | #ifndef LCD_ROUTINES_H
|
6 | #define LCD_ROUTINES_H
|
7 | |
8 | ////////////////////////////////////////////////////////////////////////////////
|
9 | // Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
|
10 | |
11 | #ifndef F_CPU
|
12 | #define F_CPU 1000000
|
13 | #endif
|
14 | |
15 | ////////////////////////////////////////////////////////////////////////////////
|
16 | // Pinbelegung für das LCD, an verwendete Pins anpassen
|
17 | // Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
|
18 | // Datenleitungen müssen auf aufeinanderfolgenden Pins liegen
|
19 | |
20 | // LCD DB4-DB7 <--> PORTD Bit PD0-PD3
|
21 | #define LCD_PORT PORTD
|
22 | #define LCD_DDR DDRD
|
23 | #define LCD_DB PD0
|
24 | |
25 | // LCD RS <--> PORTD Bit PD4 (RS: 1=Data, 0=Command)
|
26 | #define LCD_RS PD4
|
27 | |
28 | // LCD EN <--> PORTD Bit PD5 (EN: 1-Impuls für Daten)
|
29 | #define LCD_EN PD5
|
30 | |
31 | ////////////////////////////////////////////////////////////////////////////////
|
32 | // LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)
|
33 | |
34 | #define LCD_BOOTUP_MS 30
|
35 | #define LCD_ENABLE_US 30
|
36 | #define LCD_WRITEDATA_US 60
|
37 | #define LCD_COMMAND_US 60
|
38 | |
39 | #define LCD_SOFT_RESET_MS1 25
|
40 | #define LCD_SOFT_RESET_MS2 21
|
41 | #define LCD_SOFT_RESET_MS3 21
|
42 | #define LCD_SET_4BITMODE_MS 25
|
43 | |
44 | #define LCD_CLEAR_DISPLAY_MS 22
|
45 | #define LCD_CURSOR_HOME_MS 22
|
46 | |
47 | ////////////////////////////////////////////////////////////////////////////////
|
48 | // Zeilendefinitionen des verwendeten LCD
|
49 | // Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
|
50 | // Bei anderen Zeilenlängen müssen diese Einträge angepasst werden
|
51 | |
52 | #define LCD_DDADR_LINE1 0x00
|
53 | #define LCD_DDADR_LINE2 0x40
|
54 | #define LCD_DDADR_LINE3 0x10
|
55 | #define LCD_DDADR_LINE4 0x50
|
56 | |
57 | ////////////////////////////////////////////////////////////////////////////////
|
58 | // Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
|
59 | void lcd_init( void ); |
60 | |
61 | ////////////////////////////////////////////////////////////////////////////////
|
62 | // LCD löschen
|
63 | void lcd_clear( void ); |
64 | |
65 | ////////////////////////////////////////////////////////////////////////////////
|
66 | // Cursor in die 1. Zeile, 0-te Spalte
|
67 | void lcd_home( void ); |
68 | |
69 | ////////////////////////////////////////////////////////////////////////////////
|
70 | // Cursor an eine beliebige Position
|
71 | void lcd_setcursor( uint8_t spalte, uint8_t zeile ); |
72 | |
73 | ////////////////////////////////////////////////////////////////////////////////
|
74 | // Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition
|
75 | void lcd_data( uint8_t data ); |
76 | |
77 | ////////////////////////////////////////////////////////////////////////////////
|
78 | // Ausgabe eines Strings an der aktuellen Cursorposition
|
79 | void lcd_string( const char *data ); |
80 | |
81 | ////////////////////////////////////////////////////////////////////////////////
|
82 | // Definition eines benutzerdefinierten Sonderzeichens.
|
83 | // data muss auf ein Array[8] mit den Zeilencodes des zu definierenden Zeichens
|
84 | // zeigen
|
85 | void lcd_generatechar( uint8_t code, const uint8_t *data ); |
86 | |
87 | ////////////////////////////////////////////////////////////////////////////////
|
88 | // Ausgabe eines Kommandos an das LCD.
|
89 | void lcd_command( uint8_t data ); |
90 | |
91 | |
92 | ////////////////////////////////////////////////////////////////////////////////
|
93 | // LCD Befehle und Argumente.
|
94 | // Zur Verwendung in lcd_command
|
95 | |
96 | // Clear Display -------------- 0b00000001
|
97 | #define LCD_CLEAR_DISPLAY 0x01
|
98 | |
99 | // Cursor Home ---------------- 0b0000001x
|
100 | #define LCD_CURSOR_HOME 0x02
|
101 | |
102 | // Set Entry Mode ------------- 0b000001xx
|
103 | #define LCD_SET_ENTRY 0x04
|
104 | |
105 | #define LCD_ENTRY_DECREASE 0x00
|
106 | #define LCD_ENTRY_INCREASE 0x02
|
107 | #define LCD_ENTRY_NOSHIFT 0x00
|
108 | #define LCD_ENTRY_SHIFT 0x01
|
109 | |
110 | // Set Display ---------------- 0b00001xxx
|
111 | #define LCD_SET_DISPLAY 0x08
|
112 | |
113 | #define LCD_DISPLAY_OFF 0x00
|
114 | #define LCD_DISPLAY_ON 0x04
|
115 | #define LCD_CURSOR_OFF 0x00
|
116 | #define LCD_CURSOR_ON 0x02
|
117 | #define LCD_BLINKING_OFF 0x00
|
118 | #define LCD_BLINKING_ON 0x01
|
119 | |
120 | // Set Shift ------------------ 0b0001xxxx
|
121 | #define LCD_SET_SHIFT 0x10
|
122 | |
123 | #define LCD_CURSOR_MOVE 0x00
|
124 | #define LCD_DISPLAY_SHIFT 0x08
|
125 | #define LCD_SHIFT_LEFT 0x00
|
126 | #define LCD_SHIFT_RIGHT 0x04
|
127 | |
128 | // Set Function --------------- 0b001xxxxx
|
129 | #define LCD_SET_FUNCTION 0x20
|
130 | |
131 | #define LCD_FUNCTION_4BIT 0x00
|
132 | #define LCD_FUNCTION_8BIT 0x10
|
133 | #define LCD_FUNCTION_1LINE 0x00
|
134 | #define LCD_FUNCTION_2LINE 0x08
|
135 | #define LCD_FUNCTION_5X7 0x00
|
136 | #define LCD_FUNCTION_5X10 0x04
|
137 | |
138 | #define LCD_SOFT_RESET 0x30
|
139 | |
140 | // Set CG RAM Address --------- 0b01xxxxxx (Character Generator RAM)
|
141 | #define LCD_SET_CGADR 0x40
|
142 | |
143 | #define LCD_GC_CHAR0 0
|
144 | #define LCD_GC_CHAR1 1
|
145 | #define LCD_GC_CHAR2 2
|
146 | #define LCD_GC_CHAR3 3
|
147 | #define LCD_GC_CHAR4 4
|
148 | #define LCD_GC_CHAR5 5
|
149 | #define LCD_GC_CHAR6 6
|
150 | #define LCD_GC_CHAR7 7
|
151 | |
152 | // Set DD RAM Address --------- 0b1xxxxxxx (Display Data RAM)
|
153 | #define LCD_SET_DDADR 0x80
|
154 | |
155 | #endif
|
FCPU = 1MHZ sollte auch soweit richtig sein. Siehe Fuses Bits Bild im Anhang. Port Zuordung auf D stimmt auch soweit. Wartezeiten um 20µs erweitert. Jedoch sehe ich immer noch 16 schwarze Balken im Display für die erste Zeit und dann nach ein paar Sekunden habe ich in beiden Zeilen scharze Balken. Warum? Ist das LCD denn auf 4 Bit Modus eingestellt? Was aktuell nicht mehr was ich prüfen soll. Kann wer helfen?
> Jedoch sehe ich immer noch 16 schwarze Balken im Display [..] '16 Balken' == erste Zeile? > [..] für die erste Zeit und dann nach ein paar Sekunden habe ich in beiden > Zeilen scharze Balken. Das klingt mehr nach Kontrast falsch eingestellt. Würd mich bei dem.. ähm.. verbesserungsfähigen Aufbau aber auch nicht wundern wenn Du die Pausen mal locker flockig um den Fakter 10 verlängern müsstest damit am Display noch halbwegs brauchbare Signale ankommen. Oder es ist ein Wackler oder Einstreuungen. Oder nicht unerhebliche Störungen auf der Stromversorgung. Achja, Dateien in den Anhang.
Puh, deine Verdrahtung ist nicht wirklich nachvollziehbar. Kannst du dir nicht ein Kabel machen, das vom LCD in einem Rutsch an den einen PortD Verbinder geht? Bei dem Drahtverhau da auf dem Steckbrett, ist nicht wirklich ersichtlich, ob deine Verdrahtung mit den Angaben im Programm übereinstimmen. Alternativ würde ich mir mal ein Programm schreiben, welches am PORTD jeden Pin einzeln anspricht und dann am LCD nachsehen ob das dort dann auch am richtigen Pin rauskommt. Edit: Ja ich weiß. Im Prinzip machts bis auf etwas verschliffene Signalflanken keinen Unterschied. In der Praxis machts aber einen Unterschied. Je unübersichtlicher und unnachvollziehbar eine Verkabelung ist, desto mehr schleichen sich Fehler ein, die man selbst (und auch andere) nicht sieht.
Karl Heinz Buchegger schrieb: > Anbei mein Code den ich verwenden möchte: Geht bei dir die Funktion für Dateianhänge nicht? So scrollt man sich die Finger wund.
Hallo vielen Dank für die Antwort. Ja der Aufbau könnte besser sein. Werde mir morgen Stecker- und Buchsenleisten besorgen, so das ich das LCD direkt auf die 40 polige Leiste beim Pollinboard stecken kann. Ist der Code und die Einstellung der Fusebits soweit ok? Hat jemand mal den Code auf seinen Aufbau aufgespielt? Funktioniert das? Wenn der Code in Ordnung ist, kann es ja nur noch am Aufbau liegen. Da kümmer ich mich drum. Für mich wäre gut zu Wissen, das ich den Code verwenden kann und dieser läuft. Ware schon mal eine Fehlerquelle weniger.
habe nun mal den Port D angesteuert und die Spannung gemessen. An PD1(TXD) liegt nur 3.9V an,müssten nicht 5 V anliegen? Des weiteren liegen an PD6 und PD7 nur 4.6V an. Ist das ausreichend?
Das mit den Spannung hat sich erledigt. Habe mal die Jumper gezogen :)
So habe mir heute Leisten usw gekauft und die Verkabelung neu aufgesetzt. Ist alles ok. Wie kann ich feststellen ob das LCD Modul funktioniert? Hat jemand nun noch Tipps für mich?
>Wie kann ich feststellen ob das LCD Modul funktioniert? Mit einem Programm das funktioniert. Richtig anschliessen muss man es natürlich auch. Immer noch alles schwarz? Dann stell die Kontrastspannung richtig ein. Wie hoch war die noch mal? >Ist alles ok. Das behaupten fast 100% von den Leuten wo das LCD nicht geht.
Ein kleiner Unterschied könnte noch sein, das in deinem Display ein KS0066 Kontroller ist. Es ist ein kleiner Unterschied in der Initialisierung. Ob das in deinem Code berücksichtigt ist kann ich nicht sagen. Mein Display ist ein HD44780, das funktioniert mit dem Code.
Danke für den Hinweis, habe danach mal das Forum durchstöbert. Habe die ganzen Zeiten um 100 vergrößert, aber sehe immer noch nur schwarze Balken in der ersten Reihe. Denke das das LCD nicht aus der Init Phase raus kommt. Wie kann man das sicher stellen? Wie kann ich herausfinden ob das LCD wirklich im 4 Bit Modus läuft?
>Denke das das LCD nicht aus der Init Phase raus kommt. Wie kann man das >sicher stellen? >Wie kann ich herausfinden ob das LCD wirklich im 4 Bit Modus läuft? Die HEX Datei im Anhang ausprobieren;)
Danke für den Code, habe ihn gerade mal ausprobiert, jedoch habe ich immer noch schwarze Balken. Was ist in deinem Hex programmiert?
>habe ihn gerade mal ausprobiert, >jedoch habe ich immer noch schwarze Balken. > >Was ist in deinem Hex programmiert? Meine eigenen LCD Routinen die ich schon sehr lange mit sehr vielen unterschiedlichen LCDs benutze. Ich habe sie dir für deinen ATmega mit deiner Pinbelegung und 16MHz Takt compiliert. Die Delays sollten also auf jeden Fall passen. So, wo stehen wir jetzt? Dein Programm funktioniert nicht, mein erprobtes Programm funktioniert nicht bei dir. >Ein kleiner Unterschied könnte noch sein, das in deinem Display ein >KS0066 Kontroller ist. Es ist ein kleiner Unterschied in der >Initialisierung. Ob das in deinem Code berücksichtigt ist kann ich nicht >sagen. Mein Display ist ein HD44780, das funktioniert mit dem Code. Da funktioniert dein Code auch noch. Ich konnte bisher noch keinen Unterschied zwischen HD44780 und KS0066 feststellen. Das wird es auch nicht sein. Die Wahrscheinlichkeit eines Softwarefehlers geht so langsam gegen Null. Du hast ein Hardwareproblem. Fang nochmal hier an: Beitrag "Re: LCD 202A Conrad und Atmega 8" Mach es wie Karl Heinz es vorschlägt. Schreib dir ein Programm was jeden Pin zum LCD einzeln setzt. Dann misst du nach ob der Pegel stimmt. Und du misst auch nach ob es einen Kurzschluss zu den anderen Pins gibt. Oder offene Leitungen.
Hallo, ich habe beim ATMEGA 1 MHZ CPU eingestellt, per Fusebits. Wenn ich die Spannung messe, muss ich dann die vollen 5V an den Pins messen? Oder welcher Spannungswert müsste sich einstellen?
>Wenn ich die Spannung messe, muss ich dann die vollen 5V an den Pins >messen? Das können auch 4.6V sein. Hauptsache nicht 0V. So, und nun leg los.
So habe mal alle Pegel am LCD gemessen und bin ein bißchen verwundert: Soll gemessen Pin1 VSS = GND = 0V --> Ok Pin2 VCC = 5V = 5V --> Ok Pin3 VEE = Poti = 1V --> Ok Pin4 RS = PD4 = 5V --> Ok Pin5 RW = GND = 0V --> OK Pin6 E = PD5 = 1.3V --> NOK Pin7 = offen(0V?) = 5V --> OK??? Pin8 = offen(0V?) = 5V --> OK??? Pin9 = offen(0V?) = 5V --> OK??? Pin10 = offen(0V?) = 5V --> OK??? Pin11 DB1 = 5V = 1.3V --> NOK? Pin12 DB2 = 5V = 5V --> OK Pin13 DB3 = 5V = 5V --> OK Pin14 DB4 = 5V = 5V --> OK Ist das richtig das ich an den "offen Pins" die für den 4 Bit Modus nicht benutzt werden 5V messe? Und das ich an PD4 und PD5 keine 5V messe ich doch auch komisch. Hatte heute morgen noch mal alles gelötet und durch geklingelt. Ist vielleicht das LCD defekt oder wirklich noch ein Verdrahtungfehler`? Werde mal weiter messen und überlegen.
Hi >Ist das richtig das ich an den "offen Pins" die für den 4 Bit Modus >nicht benutzt werden 5V messe? Ja. Die Datenleitungen des Displaycontrolers haben interne Pull-Up-Widerstände. MfG Spess
An PD5,6,7 liegen beim Pollinboard auch die LED und der Summer an. Jumper sind aber gezogen. Habe die Spannungen 1.2V auch direkt am µC Pin gegen Masse gemessen.
Snack schrieb: > Habe die Spannungen 1.2V auch direkt am µC Pin gegen Masse gemessen. Und wie hast Du gemessen? Wenn Du mit einem Multimeter bei laufendem Programm misst, kann es ja sein, dass die Leitungen "bewegt" werden und Du den Mittelwert siehst. Also brauchst Du einen Oszi, oder ein Testprogramm, dass nur die Ports fest einstellt oder im x Sekundenraster umschaltet. Gruß Dietrich
So habe mal den kompletten Port D angesteuert und messe dann 5V an jedem Ausgang. Das scheint ok zu sein
Ja habe mit dem Multimeter gemessen.Man konnte sehen das die Spannungspegel sich ständig ändern. Oszi habe ich leider nicht =)
@ Holger: bzgl deines Programmes: Steuerst du Port D an? Denn wenn ich da nachmesse, sind nahezu alle Pins 0V.
>@ Holger: > >bzgl deines Programmes: Steuerst du Port D an? Denn wenn ich da >nachmesse, sind nahezu alle Pins 0V. Ja, natürlich. Ich initialisiere das Display und schreibe Text in beide Zeilen. Danach mach das Programm nichts mehr. Es ist also gut möglich das die meisten Pins dann auf Null bleiben. >So habe mal den kompletten Port D angesteuert und messe dann 5V an jedem >Ausgang. Das scheint ok zu sein. Wenn du den kompletten Port ansteuerst findest du deinen Dreher aber nicht. Nimm immer nur einen Pin und setz ihn auf 1. Das ganze machst du dann sechs mal. Also sechs mal kompilieren und flashen. Dann misst du jedesmal wo die 5V anstehen. Die Nachbarpins dürfen keine 5V haben. Wenn doch hast du einen Kurzschluss. Nach dieser Methode wirst du den Fehler in höchstens 30Minuten finden.
Habe eine allgemeine Verständnisfrage: Woran kann das liegen, das ich teilweise auf beiden Reihen schwarze Balken sehe (Programm vom Holger) und teilweise nur in der 1.Reihe schwarze Balken sehe (Programm aus dem Tutorial)? OK, werde nun mal jeden Ausgang einzeln ansteuern und messen. Meld mich später wieder.
Also ich habe nun mal nur den 1.Port von D angesteuert DDRD = 0x01; PORTD = 0x01; Habe dann an meiner Steckerleiste gemessen und jeder Pin hat 5V gegen Masse. Habe dann direkt am µC gemessen. Pin2 gegen Pin8 und auch 5V. µC defekt?
"Pin2 gegen Pin8 und auch 5V." Meinte Pin3 Port2 gegen Pin 8 (GND) und auch 5V Pin4 usw analog
Wenn du im Display zwei Reihen schwarz hast, dann hat die Initialisierung soweit funktioniert das sie auf 2-Zeilen umgeschaltet hat. Also ein bisschen was geht. Hast du schon mal den Kontroller aus der Fassung genommen und jeden Pin des Sockel gegen GND und VCC gemessen? Dann die Verbindung vom Sockel zum Display, auch jede einzelne Leitung messen. Mit den Billigsockeln auf diesem Board hatte ich nach einiger Zeit Kontaktprobleme bekommen. Ich habe diesen Sockel mittlerweile gegen einen Nullkraft-Sockel getauscht.
snack schrieb: > Also ich habe nun mal nur den 1.Port von D angesteuert > > > DDRD = 0x01; > > PORTD = 0x01; > > > Habe dann an meiner Steckerleiste gemessen und jeder Pin hat 5V gegen > Masse. Irgendwie fehlt dir komplett das Verständnis darüber, wie man Tests macht. DDRD = 0xFF; alles auf Ausgang PORTB = 0x01; nur 1 Pin auf 1, alle anderen auf 0 Und jetzt wird gemessen! Ein Pin der auf Eingang gestellt ist, kann jeden denkbaren Pegel annehmen! So ein Test sagt also nichts über irgendwas aus. Und wenn Pin 0 klappt, dann probierst du Pin 1 PORTB = 0x02; und wenn der klappt PORTB = 0x04; etc. etc. Und dann hast du auch eine Aussage darüber, ob deine Pins in Ordnung sind oder ob es wo einen Kurzen gibt.
So, habe nun jeden einzelnen Port durchgemessen. Der Pin 2 von PortD hatte irgendwie kein Kontakt zum Sockel. Fehler behoben. Nun haben alle Pins 5V gegen Masse. Anschließend habe ich wieder das LCD Programm geflasht. Hier hat PD1 bis PD3 5V Aber PD0 und PD5 haben 1.12V(mit Multimeter gemessen) Was wird denn hier mit dem Code erwünscht #define LCD_DB PD0
Beide Zeilen zeigen nur schwarze Balken an. Jedoch kein Text wir im Absoulten Beginner Tutorial gewüschnt. Was könnte noch eine Fehlerquelle sein?
Würde das Programm auch funktionieren wenn man 2x20 Zeichen hätte? Anstatt 2x16Zeichen?
Grundsätzlich ja, könnte nur beim Schieben Probleme geben. Zum Testen spielt es keine Rolle.
Snack schrieb: > Pin11 DB1 = 5V = 1.3V --> NOK? > Pin12 DB2 = 5V = 5V --> OK > Pin13 DB3 = 5V = 5V --> OK > Pin14 DB4 = 5V = 5V --> OK Da ist was komisch: was ist hier DB1...DB4? Die LCD-Pins 11...14 sind die LCD-Datenbits DB4...DB7 Mit den Einstellungen (Auszug aus Deiner lcd_routines.h): // LCD DB4-DB7 <--> PORTD Bit PD0-PD3 #define LCD_PORT PORTD #define LCD_DDR DDRD #define LCD_DB PD0 sollten die LCD-Signale DB4...DB7 an den µC-Port PD0...PD3 angeschlossen werden. Gruß Dietrich
Ich kann mich nur wiederholen, du hast ein Hardwareproblem, außer: Hast du auch wieder mal am Kontrast gedreht? Nicht das der zu stark aufgedreht ist, dann siehst du auch nichts, oder nur schwarze Kästchen.
Hallo Dietrich, der Fehler liegt bei mir: Snack schrieb: > Pin11 DB1 = 5V = 1.3V --> NOK? > Pin12 DB2 = 5V = 5V --> OK > Pin13 DB3 = 5V = 5V --> OK > Pin14 DB4 = 5V = 5V --> OK eigentlich hätte ich das so schreiben müssen Pin11 DB4 = 5V = 1.3V --> NOK? Pin12 DB5 = 5V = 5V --> OK Pin13 DB6 = 5V = 5V --> OK Pin14 DB7 = 5V = 5V --> OK Deine Aussage ist absolut richtig. Mein LCD ist auch so angeschlossen. Hatte mich falsch ausgedrückt.
Hallo Hubert, aus dem Datenblatt vom LCD kann ich keine Kontrastspannung entnehmen. Ich varriere sie immer leicht.
Ich hatte vor einigen Jahren auch einmal ein Conrad-LCD, welches ich nicht zum Laufen gebracht und dann aus Frust entsorgt habe. Erst nachdem ich es weggeworfen hatte, habe ich im Datenblatt gelesen, daß vor Inbetriebnahme noch Lötverbindungen auf der LCD-Rückseite herzustellen sind. Vielleicht ist das dein Problem.
Kannst du den Kontrast so weit drehen das die schwarzen Kästchen nur mehr schwach sichtbar sind?
Hallo Visitor, danke für die Info. Aber im Datenblatt steht nichts drin und das LCD sieht auch nicht so aus, als ob noch was gelötet werden müsste.
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.