Hallo zusammen, ICh habe mir letztens das YL-162-90 LCD bei Pollin bestellt da ich bei meinem alten die Versorgungsspannung falsch angeschlossen habe, da ich das bei dem noch auf einem Steckbrett gemacht habe... das hat dem aber leider nicht so gut gefallen. Naja es geht ja um das neue Display. Als ich das zum ersten mal angeschlossen habe hat es nicht angezeigt nicht einmal schwarze Balken. Gestern kam ich dann auf die Idee mal im Internet danach zu suchen, wo ich irgendwo erfuhr, dass mehrere Leute mti dem Display Probleme haben, und dass dieses DIsplay eine Negative Kontrastspannung benötigt. Das habe ich über 2 in Reihe geschaltete Akkus die mit + an Masse und mit - an der Kontrastspannung liegen. Das funktioniert auch wunderbar, allerdings zeigt das Diplay nun nur 2 schwarze Balken an (siehe Foto). Angeschlossen habe ich das display wie folgt: 1= Gnd 2= +5V 3= ca. -2,6V 4= PA4 5= Gnd 6= PA5 7= NC 8= NC 9= NC 10= NC 11= PA0 12= PA1 13= PA2 14= PA3 15= +5V für Beleuchtung Dass der Mikrocontroller auch was sendet kann man an den leuchten Leds sehen, an denen ich testeshalber das Signal ausgeben lasse, was auch das LCD bekommt. Hat von euch vielleicht einer eine Idee warum das LCD nur die Balken anzeigt? Mfg Nils
.... und woraus schliesst du, dass -2,6V die richtige Kontrastspannung ist ? .. was passiert bei zuviel Kontrast ? gruss k
Im Datenblatt stand Kontrastspannung -2,5V, da dürften -2,6 doch auch noch in Ordnung sein oder?
Ich verzweifel gerade bei der Überlegung wie das Poti dann angeschlossen werden muss... Ich habe schon öfter gelesen dass das als Spannungsteiler mit dem Schleifer am eingang für die Kontrastspannung angeschlossen wird. Aber wie kommt die Batterie dann da dran?
Ich wusste es ! +Bat an Masse und an Poti. -Bat an Poti poti schleifer = kontrast Poti ca. 10KOhm oder so
Da kommen jetzt sehr interessante Sachen heraus: wenn ich das Poti ganz zur einen Seite drehe dann ist der Kontrast da genauso zur anderen Seite und in Mittelstellung, wenn ich aber ein wenig zu r Seite gehe vond er Mittelstellung, dann sind nur ein paar Teile des Displays schwarz oder leicht schwarz, es handelt sich dabbei immer um 8 Blöcke sowohl oben als auch unten aber uunterschiedlich dunkel.
Nun, ich hatte so das Gefühl, dass eine Frage bezüglich "wie schliesse ich das Poti an" folgen würde. .. und hatte recht. Nun hast du ja eine regelbare Kontrastspannung zwischen 0 und -2,6V. das ist schonmal gut. Wenn trotzdem nicht geht stimmt wohl was anderes nicht. Also bitte weitersuchen . Gruss K
Hm ich werde mal wenn ich zuhause bin die Spannung am Kontrasteingang messen. Vielleicht stimmt da ja etwas nicht. Würde mcih aber wundern aber wer weiß. Jetzt bin ich erstmal in der schule xD. Wenn sonst noch jemand eine andere idee hat, immer her damit...
Also im Datenblatt bei Pollin (http://www.pollin.de/shop/downloads/D120060D.PDF) sehe ich nix von -2.5V Kontrastspannung. Versuch mal folgendes: Schliess Deinen Poti mal zwischen - vom Akku (-2.5V) und Deinen +5V an. Dann versuch nochmal den Kontrast einzuregeln und wenn Du die optimale Einstellung gefunden hast misst Du nochmal die Spannung am Schleifer gegen die Masse Deiner Schaltung (0V). Ich vermute, Du wirst auf Deine Akkus verzichten können... (Die meisten LCDs brauchen ne Kontrastspannung von etwas über 0V, normalerweise reicht also ein Poti zwischen Masse und der Versorgungsspannung.)
Das ist das Datenblatt das ich mir noch runtergeladen habe, weil in dem von pollin nihcts zu kontrastspannung stand. Das hier kann man aber auch nicht als Datenblatt bezeichnen, ist ja nur die eine Seite, aber alles was man zu dem Display bekommt. Im LCD Tutorial von dieser Seite stant doch das bei den meisten Displays eigentlich die Kontrastdpannung auf 0V (Gnd) gelegt werden sollte, was bei meinem anderen Display auch gut funktioniert hat. Die Idee mit Poti zwischen -2,5 und +5V werde ich zuhause sofort ausprobieren :) danke Mfg Nils
Aber das Poti nicht die ganze Zeit dranlassen, sonst saugt's Dir irgendwann auch die Batterien aus... ^^ Wie gesagt: Ich vermute stark, dass Du das Poti einfach zwischen 0V und +5V hängen kannst und es dann passt.
Ich habe an dem Akkupack extra für den Fall noch einen Schalter angebracht :D Ansonsten: sind halt akkus ne?
Als ich vorhin nach Hause kam hab ichrstmal das Poti durchgemessen und gemerkt, dass das iwie kaputt ist, am Widerstand direkt ist garnichts zu messen und zwischen Beinchen und Schleifer immer 12kOhm. Also noch ein anderes Poti rausegsucht udn das ganze mal auf ner Platine versucht. Erst hab ichs nochmal mit der Methode ohne die +5V versucht, aber da konnte ich schön zzwischen -2,7V und 0 regeln aber das Display tat nix. Dann hab ichs nochmal mit den 5V versucht und da kam dann das raus was auf den Bildern zu sehen ist. bei -2,7 tat sich nix, oberhalb von 0V kamen die schon erwähnten verscheidenen Graustufen die immer in 8 Blöcken sind. Wenn ich auf 5V gedreht habe war das Display richtig schwarz aber angezeigt hat es nix... hast du vielleicht noch eine Idee? ich bin kurz davor das teil an die Wand zu schmeißen und drauf rumzutrampeln ;( Mfg Nils
>Hat keiner eine "gute" Idee???? ^^ Und NEIN die Antwort ist nicht 42 xD
Also entweder deine Software ist faul oder das Display hinüber.
Juhuu... Kann es denn sein dass die Softwar für das eine Display nicht mit einem anderen Display funktioniert auch wenn sie kompatible Kontroller haben?
... oder das Kabel zu lang ... oder was falsch angeschlossen ... oder oder ich glaube, man will dir sagen, dass du vielleicht mehr Infos rausrücken solltest, damit man die Zeile 42 besser nachvollziehen kann. es ist nämlich so, dass wenn z.B die Initialisierung nich korrekt ist, ein ähnliches Fehlerbild auftauchen kann gruss K.
Die LCD-Routinen hab ich eigentlich fast komplett von denen aus dem Forum abgetippt aber vielleicht stimmt ja trotzdem etwas nicht:
1 | .equ lcd_port = PORTA |
2 | .equ lcd_ddr = DDRA |
3 | .equ lcd_port2 = PORTD |
4 | .equ lcd_ddr2 = DDRD |
5 | .equ XTAL = 1000000 |
6 | ; |
7 | ;sendet ein datenbyte an das LCD |
8 | lcd_data: |
9 | push temp1 |
10 | push temp2 |
11 | mov temp2,temp1 |
12 | ; |
13 | swap temp1 |
14 | andi temp1,0b00001111 |
15 | sbr temp1,1<<4 |
16 | out lcd_port,temp1 |
17 | out lcd_port2,temp1 |
18 | rcall lcd_enable |
19 | ; |
20 | andi temp2,0b00001111 |
21 | sbr temp2,1<<4 |
22 | out lcd_port,temp2 |
23 | out lcd_port2,temp2 |
24 | rcall lcd_enable |
25 | pop temp2 |
26 | pop temp1 |
27 | ret |
28 | ;sendet einen Befehl an das LCD |
29 | lcd_command: |
30 | push temp1 |
31 | push temp2 |
32 | mov temp2,temp1 ; wie lcd_data, nur RS=0 |
33 | swap temp1 |
34 | andi temp1,0b00001111 |
35 | out lcd_port,temp1 |
36 | out lcd_port2,temp1 |
37 | rcall lcd_enable |
38 | andi temp2,0b00001111 |
39 | out lcd_port,temp2 |
40 | out lcd_port2,temp2 |
41 | rcall lcd_enable |
42 | rcall delay50us |
43 | pop temp2 |
44 | pop temp1 |
45 | ret |
46 | ; erzeugt den Enable-Puls |
47 | ; |
48 | ; Bei höherem Takt (>= 8 MHz) kann es notwendig sein, |
49 | ; vor dem Enable High 1-2 Wartetakte (nop) einzufügen. |
50 | lcd_enable: |
51 | nop |
52 | nop |
53 | sbi lcd_port,5 |
54 | sbi lcd_port2,5 |
55 | nop |
56 | nop |
57 | nop |
58 | cbi lcd_port,5 |
59 | cbi lcd_port2,5 |
60 | ret |
61 | ;Pause nach jeder Uebertragune |
62 | delay50us: |
63 | push temp1 |
64 | ldi temp1,(XTAL*50/3)/1000000 |
65 | ; |
66 | delay50us_: |
67 | dec temp1 |
68 | brne delay50us_ |
69 | pop temp1 |
70 | ret |
71 | ;Längere Pause für manche Befehle |
72 | delay5ms: |
73 | push temp1 |
74 | push temp2 |
75 | ldi temp1,(XTAL*5/607)/1000 |
76 | WGLOOP0:ldi temp2,$C9 |
77 | WGLOOP1:dec temp2 |
78 | brne WGLOOP1 |
79 | dec temp1 |
80 | brne WGLOOP0 |
81 | pop temp2 |
82 | pop temp1 |
83 | ret |
84 | delay1s: |
85 | push temp1 |
86 | push temp2 |
87 | ldi temp1,(XTAL*10)/100000000 |
88 | WGLOOP2:ldi temp2,$C9 |
89 | WGLOOP3:dec temp2 |
90 | brne WGLOOP3 |
91 | dec temp1 |
92 | brne WGLOOP2 |
93 | pop temp2 |
94 | pop temp1 |
95 | ret |
96 | ; Initialisierung: muss ganz am Anfang vom programm aufgerufen werden |
97 | lcd_init: |
98 | push temp1 |
99 | push temp3 |
100 | ldi temp3,255 |
101 | powerupwait: |
102 | rcall delay5ms |
103 | dec temp3 |
104 | brne powerupwait |
105 | ldi temp1,0b00000011 |
106 | rcall delay50us |
107 | out lcd_port,temp1 |
108 | out lcd_port2,temp1 |
109 | rcall lcd_enable |
110 | rcall lcd_enable |
111 | rcall lcd_enable |
112 | ldi temp1,0b00000010 ; 4-Bit-Modus |
113 | out lcd_port,temp1 |
114 | out lcd_port2,temp1 |
115 | rcall lcd_enable |
116 | rcall delay5ms |
117 | ldi temp1,0b00101000 ;4bit,2zeilen,5x8 |
118 | rcall lcd_command |
119 | ldi temp1,0b00001100 ;Display ein,Cursor aus,kein blinken |
120 | rcall lcd_command |
121 | ldi temp1,0b00000100 |
122 | rcall lcd_command |
123 | pop temp3 |
124 | pop temp1 |
125 | ret |
126 | ;sendet den Befehl zur Löschung des Displays |
127 | lcd_clear: |
128 | push temp1 |
129 | ldi temp1,0b0000001 ;Display löschen |
130 | rcall lcd_command |
131 | rcall delay5ms |
132 | pop temp1 |
133 | ret |
134 | ;sendet den Befehl: Cursor Home |
135 | lcd_home: |
136 | push temp1 |
137 | ldi temp1,0b00000010 |
138 | rcall lcd_command |
139 | rcall delay5ms |
140 | pop temp1 |
141 | ret |
142 | lcd_flash_string: |
143 | push temp1 |
144 | push ZH |
145 | push ZL |
146 | ; |
147 | lcd_flash_string_1: |
148 | lpm temp1,Z+ |
149 | cpi temp1,0 |
150 | breq lcd_flash_string_2 |
151 | rcall lcd_data |
152 | rjmp lcd_flash_string_1 |
153 | |
154 | lcd_flash_string_2: |
155 | pop ZL |
156 | pop ZH |
157 | pop temp1 |
158 | ret |
159 | ; Dezimalzahlen ausgeben |
160 | lcd_number: |
161 | push temp1 ; die Funktion verändert temp1 und temp2, |
162 | push temp2 ; also sichern wir den Inhalt, um ihn am Ende |
163 | ; wieder herstellen zu können |
164 | ; |
165 | mov temp2,temp1 ; das Register temp1 frei machen |
166 | ; abzählen wieviele Hunderter |
167 | ; in der Zahl enthalten sind |
168 | ;** Hunderter ** |
169 | ldi temp1,'0'-1 ; temp1 mit ASCII '0'-1 vorladen |
170 | lcd_number_1: |
171 | inc temp1 ; ASCII erhöhen (somit ist nach dem ersten |
172 | ; Durchlauf eine '0' in temp1) |
173 | subi temp2,100 ; 100 abziehen |
174 | brcc lcd_number_1 ; ist dadurch kein Unterlauf entstanden? |
175 | ; nein, dann zurück zu lcd_number_1 |
176 | subi temp2,-100 ; 100 wieder dazuzählen, da die |
177 | ; vorherhgehende Schleife 100 zuviel |
178 | ; abgezogen hat |
179 | rcall lcd_data ; die Hunderterstelle ausgeben |
180 | ; |
181 | ;** Zehner ** |
182 | ldi temp1,'0'-1 ; temp1 mit ASCII '0'-1 vorladen |
183 | lcd_number_2: |
184 | inc temp1 ; ASCII erhöhen (somit ist nach dem ersten |
185 | ; Durchlauf eine '0' in temp1) |
186 | subi temp2,10 ; 10 abziehen |
187 | brcc lcd_number_2 ; ist dadurch kein Unterlauf enstanden? |
188 | ; nein, dann zurück zu lcd_number_2 |
189 | subi temp2,-10 ; 10 wieder dazuzählen, da die |
190 | ; vorherhgehende Schleife 10 zuviel |
191 | ; abgezogen hat |
192 | rcall lcd_data ; die Zehnerstelle ausgeben |
193 | ; |
194 | ;** Einer ** |
195 | ldi temp1,'0' ; die Zahl in temp2 ist jetzt im Bereich |
196 | add temp1,temp2 ; 0 bis 9. Einfach nur den ASCII Code für |
197 | rcall lcd_data ; '0' dazu addieren und wir erhalten dierekt |
198 | ; den ASCII Code für die Ziffer |
199 | ; |
200 | ; |
201 | pop temp2 ; den gesicherten Inhalt von temp2 und temp1 |
202 | pop temp1 ; wieder herstellen |
203 | ret ; und zurück |
204 | lcd_laufschrift: ; noch nicht fertig |
205 | push temp1 |
206 | push temp2 |
207 | mov temp2,temp1 |
208 | ; |
209 | swap temp1 |
210 | andi temp1,0b00001111 |
211 | sbr temp1,1<<4 |
212 | out lcd_port,temp1 |
213 | out lcd_port2,temp1 |
214 | rcall lcd_enable |
215 | ; |
216 | andi temp2,0b00001111 |
217 | sbr temp2,1<<4 |
218 | out lcd_port,temp2 |
219 | out lcd_port2,temp1 |
220 | rcall lcd_enable |
221 | rcall delay50us |
222 | pop temp2 |
223 | pop temp1 |
224 | ret |
und das ist das Hauptprogramm:
1 | .include "m32def.inc" |
2 | ; |
3 | .def temp1 = R16 |
4 | .def temp2 = R17 |
5 | .def temp3 = R18 |
6 | ldi temp1,HIGH(RAMEND) |
7 | out SPH,temp1 |
8 | ldi temp1,LOW(RAMEND) |
9 | out SPL,temp1 |
10 | ldi temp1,0xFF |
11 | out lcd_ddr,temp1 |
12 | out lcd_ddr2,temp1 |
13 | ; |
14 | ; |
15 | ; |
16 | rcall lcd_init |
17 | rcall lcd_clear |
18 | Textausgabe: |
19 | rcall lcd_clear |
20 | ldi ZL,LOW(text*2) |
21 | ldi ZH,HIGH(text*2) |
22 | |
23 | rcall lcd_flash_string |
24 | rcall delay1s |
25 | rcall delay1s |
26 | rcall delay1s |
27 | rcall delay1s |
28 | |
29 | rcall lcd_clear |
30 | ldi ZL,LOW(text2*2) |
31 | ldi ZH,HIGH(text2*2) |
32 | |
33 | rcall lcd_flash_string |
34 | rcall delay1s |
35 | rcall delay1s |
36 | rcall delay1s |
37 | rcall delay1s |
38 | loop: |
39 | rjmp Textausgabe |
40 | ; |
41 | text: |
42 | .db"V&M Deutschland",0 |
43 | text2: |
44 | .db"Azubis Elektro",0 |
45 | .include "Lcd_Routinen.asm" |
könnt ihr damit etwas anfangen?
.. und was hast du für einen Prozessor ? .. und auf wieviel Mhz ? .. ich sehe in deinem Anschlussplan die Verwendung von PORT A nicht jedoch Port D. In dem Programm wird aber meines Erachtens auch Port D verwendet Gruss K p.S. da es ja so scheint, als wüsstest du nicht wirklich, was du tust, könnte ich es mir als vorteilhaft vorstellen. wenn du z.B. mit der kostenlosen Bscom Testversion erstmal deine Schaltung prüfst um dann am ASM weiter zu arbeiten
Ich habe das LCD an PortA, an PORTD sind Leds, damit ich sehen kann ob auch was ans LCD gesendet wird, denn so ist ja an PortA das gleiche wie an PortD oder? Ich habe einen Atmega32 der mit den interen 1 mhz läuft Gruss Nils
Mit dem alten Lcd hat das alles doch funktioniert, es funktioniert nichtmehr seitdem ich das neue Lcd dranhabe.
... ja , und wenn ich so resumiere: Das alte Display ist kaputt wegen Verpolung ? Ist denn der Prozessor noch in Ordnung ? Mal die massgeblichen Portpins per Testprogramm ausprobiert ? Gruss K.
1. Die negative Kontrastspannung ist OK, das Display ist nämlich eines mit erweitertem Temperaturbereich. 2. >Die LCD-Routinen hab ich eigentlich fast komplett von denen aus dem >Forum abgetippt aber vielleicht stimmt ja trotzdem etwas nicht: Da liegt der Hund begraben. Abschreiben bringt nix. Du mußt auch VERSTEHEN, was du da in den µc hineinhackst. Fang erstmal mit einem ganz einfachen Programm an, das nur das LCD initialisiert und ein einzelnes Zeichen ausgibt (z.B. A wie Anfänger). Das Tutorial ist dabei sehr hilfreich.
@ Klaus ja das alte Display hatte ich falsch angeschlossen dann wurde es irgendwann warm und hat nur noch sehr komische Sachen angezeigt. Der Prozessor funktioniert,ich habe auch an den Leitungen die am LCD sind einen TTL-Tester ebnutz um zu gucken ob auch was ankommt, die Antwort war ja. Ich könnte mir noch eine Platine mit nem STecker drauf basteln der an die Steckerleiste passt wo das LCD dran ist udn mir das dann mal angucken. danke für den Tipp. @icke Ich habe mir natürlich auch angesehen was die Routinen machen, allerdings deswegen nicht einfach die aus dem Tutorial genommen, weil ich mir das so besser bei bringen kann. Ich kann aber nochmal für dieses Display eine neue Routine schreiben vllt bringt das ja was, weil ich irgendwo aus Versehen etwas geändert habe. Auch werde ich wenn ich wieder zuhause bin mal ausprobieren ein kleines Mini-Programm zu schreiben was nur einen Buchstaben auf dem Display ausgibt. danke für eure Hilfe ich melde mich nachher nocheinmal Grüße Nils
Möglicherweise bist Du einfach zu schnell:
1 | lcd_enable: |
2 | nop |
3 | nop |
4 | sbi lcd_port,5 |
5 | sbi lcd_port2,5 |
6 | nop |
7 | nop |
8 | nop |
9 | cbi lcd_port,5 |
10 | cbi lcd_port2,5 |
11 | ret |
12 | |
13 | [..] |
14 | |
15 | lcd_init: |
16 | push temp1 |
17 | push temp3 |
18 | ldi temp3,255 |
19 | powerupwait: |
20 | rcall delay5ms |
21 | dec temp3 |
22 | brne powerupwait |
23 | ldi temp1,0b00000011 |
24 | rcall delay50us |
25 | out lcd_port,temp1 |
26 | out lcd_port2,temp1 |
27 | rcall lcd_enable |
28 | <- hier Pause |
29 | rcall lcd_enable |
30 | <- hier Pause |
31 | rcall lcd_enable |
32 | <- hier Pause |
33 | ldi temp1,0b00000010 ; 4-Bit-Modus |
34 | [..] |
Wie lange die Pausen dauern müssen steht im Datenblatt. HTH
Hm dann werde ich das nochmal versuchen. Obwohl bei temp3 im Tut nur 50 drinsteht habe ich da schon 255 weil ich mal gelesen hatte das die Pause nach dem einschalten manchmal länger sein muss und dachte die wäre damit gemeint. Leider findet man über dieses Display keine gescheites Datenblatt mit Angaben zu den Initialisierungszeiten... ;-( wie genau müssen diese Pausen sein? Kann man da evtl. auch ein bisschen rumprobieren? Grüße Nils
Es gibt ein hervorragendes Datenblatt [1]. Auf Seite 47/213 ist die Initialisierung im 4Bit-Modus grafisch dargestellt. Bei der Gelegenheit kannst auch gleich den Rest vom Datenblatt studieren ;-) Behelfsweise gibts da [2] fertigen Code. HTH [1] http://www.datasheetarchive.com/pdf-datasheets/Datasheets-13/DSA-247674.html [2] http://www.mikrocontroller.net/articles/HD44780
Oh, falscher Link, ich meinte [2] http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung und [2] http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD </ingrid>
Habe es jetzt mit den Routines aus dem Tutorial versucht
1 | .include "m32def.inc" |
2 | .def temp1 = R16 |
3 | |
4 | ldi temp1,LOW(RAMEND) |
5 | out SPL,temp1 |
6 | ldi temp1,HIGH(RAMEND) |
7 | out SPH,temp1 |
8 | |
9 | ldi temp1,0xFF |
10 | out lcd_ddr,temp1 |
11 | rcall lcd_init |
12 | rcall lcd_clear |
13 | |
14 | ldi temp1,'T' |
15 | rcall lcd_data |
16 | .include "lcd-routines.asm" |
das ist mein Hauptcode, die Ports in den Routines hab ich verstellt. Aber das Display will kein T anzeigen :/ Ist das Programm denn richtig?
>das ist mein Hauptcode, die Ports in den Routines hab ich verstellt. >Aber das Display will kein T anzeigen :/ Was zeigt es denn an? >Ist das Programm denn richtig? Keine Ahnung. Funktioniert die HEX Datei im Anhang?
nein das Programm will auch nicht ;( Langsam glaub ich das Dsplay ist hinüber ;-( traurige Grüße Nils
>Es zeigt weiterhin nur die schwarzen Balken an...
Letzte Chance: Dreh mal am Kontrast.
Schon probiert, ich lad gleich mal die akus nochmal auf glaub zwar niht dass das was bringt aber man kan ja hoffen ^^ Wenn das nix bringt kauf ich mir bei Pollin ein neues aber nicht nochmal das Schrottteil... Danke für eure Hilfe Grüße Nils
>Schon probiert, ich lad gleich mal die akus nochmal auf glaub zwar niht >dass das was bringt aber man kan ja hoffen ^^ Nee, nich aufladen. Spannung runterdrehen. Wenn bei -2.6V alles schwarz ist dann mal mit -1.5V oder weniger versuchen. Ändert sich der Kontrast dann? Könnte aber auch immer noch ein Verdrahtungsfehler sein.
ne wenn ich runtergehe dann kommen wieder die tollen verschiedenen Dunkelheitsstufen.
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.