Hi @ all Ich will mit einem Microchip 16F818 ein 16x2 LCd ansteuern. Ich bin ein super Neuling im bereich C. Habe einen passenden code gesucht, denn ich auch verstehe, aber leider nix passendes gefunden. Meine Variante ist ziemlich arm, aber bis jetzt verstehe ich was ich da mache. LCD: http://www.reichelt.de/?ACTION=3;ARTICLE=31653;GROUPID=;SID=26UdltsKwQARoAAGBRH3M2ea74ad3aed975aa737531eaf9583acd Wer viel Zeit hat kann mir ja gerne eine schönere Variante erklären. Wer weniger Zeit hat einfach nur mein programm korrigieren damit es läuft. Wenn ich was angezeigt komme, sei es auch nur ein Buchstabe/Zeichen, dann wäre das erstmal ein großer erfolg. Zur Zeit leuchtet nur die Zweite Zeile komplett auf. Ich bedanke mich im vorraus für eure Antworten.
Gast
#1570645
Hallo! Was mir sofort bei deinem Code aufgefallen ist ist folgendes:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
In deiner Endlosschleife wird das LCD dauern initialisiert und mit Daten gefüttert. Da das LCD ein sehr langsames Bauteil ist, wirst Du nie was sehen, da die Initialisation mit dem Befehl (display clear) die Zeilen immer wieder löscht. Das Display muss man ja nur einmal initialisieren. Um zumindest zu sehen, ob das LCD mit deinem Code irgendwas ausgibt musst Du Deine Befehle aus der Endlosschleife nehmen. Denn das LCD zeigt ja solange das gleiche an, bis Du wieder was neues sendest. Nimm also Deine Befehle aus der Schleife.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Was ich noch auf die schnelle gesehen hab. Die LCD Leitungen definierst Du nirgends als Output, oder? Oder sind die bei einem Reset schon vom PIC so geschaltet? Versuch das mal und berichte, was das LCD dann macht. Für das durchsehen der Initialisation hab ich momentan keine Zeit ;) MfG Darkleon
hi, erstmal Danke für die Antwort. leider war das nicht das Problem. Komischerweise wird die komplette 2. Zeile schwarz, aber mehr tut sich nicht.
Gast
#1570681
Mit welchem takt läuft Dein PIC? Wie hast Du den Pin am LCD für den Kontrast (glaub der heißt Vo) beschalten? In Deiner Init hast Du irgendwie nie delays drinnen. Glaub mich zu erinnern, dass nach dem Function Set usw.. im Datenblatt jeweils eine Mindestwartezeit drinnsteht. Muss ich später mal nachschauen. Wegen der genauen Init kann ich auch erst etwas später nachschauen, aber kontrollier mal das, dann hast diese Fehlerquellen auch ausgeschlossen ;) MfG Darkleon
Also der Pic läuft mit 8MHZ. Kontrast ist über einen 10 K Poti an 5V. Also da wo im Datenblatt wartezeiten sind müssten welche drin sein. Ich werde nochmal nach allen Befehlen so 100µs wartezeit einbauen. Mal gucken was sich dann ergibt. Ich denke aber nicht, dass das der Fehler ist. Melde mich gleich nochmal.
Gast
#1570703
Die eine "schwarze" Zeile, die andere leer kommt eigentlich dann, wenn nicht mal die Initialisierung klappt. Ist das Display auch richtig angeschlossen? Beim 4 Bit Interface werden D4-D7 verdrahtet, D0 - D3 sollten ... hmmm .... ja was denn ... pull up oder down ... weiß ich im moment nicht auswendig.
Also an den Delays lag es nicht. Als D4 bis D7 ist angeschlossen. D0-D3 ist einfach frei. Oder sollte das lieber an GND, aber auch im Tutorial hier auf der Seite steht, dass die einfach nicht angeschlossen werden sollen. Daran sollte es nicht liegen. Wenn dann wohl eher an einem Fehler beim Initialisieren. Ich habe schon mehr mals drüber geguckt, aber finde den Fehler leider nicht.
Gast
#1570726
Was ist mit dem R/W pin? Seh da keinen Code für.
Den R/W PIN habe ich auf GND gelötet. Da ich nur schreibe und nicht lese brauche ich den nicht. Ich habe mal meine Funktion "LCD_SCHREIBEN" auskommentiert und dann entshet keine "schwarze" zeile. Jetzt ist die Frage ob der Fehler beim Schreiben oder beim Initialisieren liegt.
Gast
#1570832
Im Tutorial steht aber auch, dass es mit dem Timing bei Takten >= 8MHz Probleme geben kann. Deshalb solltest Du beim Schreiben E im Auge behalten, damit es nicht zu kurz wird. Und nach dem schreiben - da du ja nicht liest kann dir das Display auch nicht sagen, ob es mit einer Operation fertig ist - musst Du auch ca 50us warten ... Clear screen z.B. dauert noch länger und man sollte ca. 5ms warten. Das ist wohl in der Init noch nicht so.
habe leider alles versucht. Da stimmt irgendwas nicht. Ich werde jetzt erstmal pause machen. Morgen werde ich alles nochmal durchklingeln um zu gucken ob alles richtig dran ist und dann versuche ich nochmal mein Glück.
Gast
#1571070
Hallo! Hab mir jetzt das Datenblatt angesehen. Bei der Init wird eine Pause von mindestens 30ms nach erreichen von VDD empfohlen. In Deinem Code aus dem ersten Post wartest Du nur 15ms. Das Function Set hast Du richtig initialisiert. Danach kommt eine Mindestwartezeit von 39us. Die sehe ich in deinem Code nicht. Dann initialisierst Du "Display ON/OFF Control". In dieser Initialisation schaltest Du das Display aber aus. Ist doch nicht so gewollt, oder?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Richtig müsste es laut Datenblatt so sein:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Mindestwartezeit von 39us. Dann kommt richtigerweise "Display clear". Mindestwartezeit von 1,53ms. Dann kommt "Entry Mode Set" Du sendest DB7 UND DB6 Low, im Datenblatt ist aber DB7 auf Low und DB6 jeden Fall High. Danach initialisierst du mit "increment mode"(DB5) und "entire shift off"(DB5). Also Dein Code
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
So sollte es aussehen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Danach ist die Initialisation zu Ende. Da würd ich auch nochmal ein paar ms warten. Die letzte Init mit dem "Display an..." würd ich weglassen, da das Display wahrscheinlich nicht weiß wohin damit. Ich würd das Display gleich an richtiger Stelle (wie oben beschrieben) einschalten. Und warte nach jeder Pegeländerung von E und RS mind. eine us, da du laut Datenblatt mit deinen 8Mhz Takt viel zu schnell bist und das Display die Pegeländerung nicht korrekt mitbekommt.(Wurde aber schon vor diesem Post beschrieben. Änder mal Deinen Code und Füg die ganzen Wartezeiten hinzu. (Zwischen den Initblöcken, bei RS und E und erhöhe die 15ms Wartezeit am Anfang). Viel kann dann nicht mehr falsch sein. So long. Darkleon
Gast
#1571115
Du musst den ersten Initialisierungsbefehl 3x (!) rüberschicken, danach erst auf 4 bit umschalten (siehe http://www.sprut.de/electronic/lcd/), bei manchen Displays muss man auch länger warten, also:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
hi, Danke für deine Zeit und Mühe. Also ich habe jetzt alles geändert was du sagtest: hier nochmal falls sich doch fehler reingeschlichen haben:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
Leider kein Erfolg. Die untere Zeile leuchtet komplett schwarz auf. Ich werde morgen nochmal alles durchklingeln und schauen. Ich hoffe dass nur da der Fehler ist und es nicht am Programm liegt.
Gast
#1571123
>Die untere Zeile leuchtet komplett schwarz auf.
Das ist die OBERE Zeile ;)
@ Stephan : mit meiner for-schleife schicke ich das ganze 3 mal rüber.
@ holger, wenn das die Obere zeile ist, dann weiß ich wo der Fehler liegt ... :P THX
Gast
#1571453
;o))) die kleine 1 übersehen
Gast
#1571960
Wie ist der momentane Status? Funktioniert es jetzt? Deinem Code entnehme ich folgende Pinbelegung: RS -- RA2 E -- RA3 DB4 -- RA6 DB5 -- RA7 DB6 -- RA0 DB7 -- RA1 Im Datenblatt des PICs steht unter "5.0 I/O Ports", dass bei einem Reset die Pins RA0 - RA4 als digitale Inputs konfiguiert sind. Da du diese Pins für dein LCD als digitale Outputpins benötigst, musst du dies natürlich dem Controller in das ADCON1 Register schreiben. Sonst bleiben diese Pins analoge Inputs. Ich weiß ja nicht, welchen Compiler du verwendest?! Macht der das automatisch? Denke nicht. Daher musst Du das ADCON1 Register mit dem Wert 0x06 beschreiben. So werden die Pins RA0 - RA4 als digitale Pins definiert! Denke an dem wirds liegen (sofern Du nichts falsch vedrahtet hast), denn die Initialisierung stimmt soweit. Auch das Senden der Daten (In Deinem Fall die Zahl eins!) Melde Dich, sobald Du das überprüft hast. Würd mich interessieren. So long, Darkleon
Gast
#1573478
Update: Meinte natürlich, dass RA0 - RA4 ANALOGE und nicht digitale Inputs bei einem Reset (und auch standarmäßig) Pins sind. Die Hand war wieder schneller als das Hirn ;) Gibts schon Neuigkeiten? MfG Darkleon
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.