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.
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
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
> 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.
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?
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 ;)
Sönke Paschko wrote: > Angeschlossen habe ich die oberen 4 Bit Pin 4,5,6,7 das ist doch richtig > oder? Pin 4-7 am LCD ? Das sind aber nicht D4-7, sondern etwas ganz anderes, wenn dein LCD die Standardanschlussbelegung hat.
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.
Ob du R/W auf GND legen kannst hängt von deinem Programm ab. Mit dem Read wird abgefragt ob die Register wieder empfangsbereit sind. Ohne Read müssen entsprechende wait eingebaut sein. Ohne Initialisierung ist ausser dem Balken nichts sichtbar oder möglich.
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
Nein, die Wartezeit ist bei Abfrage des Busy-Flag nicht notwendig, allerdings brauchst du dann den R/W-Pin, wie willst du denn sonst das Flag lesen.
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
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 | }
|
Hallo, Busy kann erst NACH dem Setzen des 8Bit-Mode abgefragt werden, während der 3x Init gibt es kein gültiges Busy-Signal. Ich häng mal mein Datenblatt ran, Seite 45. Gruß aus Berlin Michael
so hab die Abfrage rausgenommen und frage nur noch danach ab. Der Rest stimmt aber und die Wartezeiten sind mit 15 ms doch gut bemessen . (beim ersten mal warten setze ich auchnoch mal auf 16 ms) Hab den Quelltext mal angehängt, das macht den Post kürzer.
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.