Hallo liebe uC - Gemeinde. Seit ein paar Tagen bin ich bei einem Problem. Ich komme einfach nicht mehr weiter. Das Umfeld: - LCD 2*16 - PIC 18F4520 - MPLABX mit XC8 Codec (neuste Version) - Pickit3 Alles ist programmiert und sollte auch funktionieren, aber das tut's nicht :) Ich arbeite mit den __delay_us() und __delay_ms() für die Pausen. Aber genau da vermute ich das Problem. Wenn ich alle Delays auskommentiere und mit dem Debugger die Schritte selber weiter schalte, dann wird der LCD initialisiert und funktioniert. Von da an kann ich Code ändern und laden. Sobald ich aber den Controller vom Netz trenne und wieder starte geht nichts mehr, bis ich wieder das obige anwende. Was kann das sein, ich bin am Ende meines Lateins :) :(
Hallo Hans! Hältst Du denn die Timings deines Displays ein (die stehen im Datenblatt)? Wenn Du deinen Quellcode posten kannst, können wir dir besser helfen! Die genaue Bezeichnung des Displays ist auch wichtig!
Die Pausen sind sogar etwas grösser als im Datenblatt, die Init - Sequenz hat auf dem alten MPLAB funktioniert. Aber da gab es das #use delay, was meiner Meinung besser ist, da man dort auch Sekunden eingeben konnte und keine Grenze hatte ( mit __delay_ms kann ich nicht mal 100ms eingeben, schon motzt er. Hier der Code:
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 | |
Gast
#3921075
Mach mal das
1 | |
vor
1 | |
Der braucht das ja schon da drin.
Gast
#3921079
und vielleicht solltest du die Funktion "enableLCD1" in der INIT benutzen wie in dein Komentar beschrieben :-)
Gast
#3921098
Hans Wiederkehr schrieb: > // langer Strobe für die 2ms Pause in der INIT > void enableLCD1() > { > LCD_E=1; > __delay_ms(2); > LCD_E=0; > __delay_us(40); > } Seit wann muß das E-Signal 2 ms lang high sein? Das ist doch irgendwie quatsch. Wahrscheinlich fängt die Zeit für das Display erst an zu zählen, wenn E auf low geht. Die lange Pause gehört ans Ende, und die Länge des Enable Pulses ist so rund eine µs, höchstens zwei MfG Klaus
Hans Wiederkehr schrieb: > // langer Strobe für die 2ms Pause in der INIT > void enableLCD1() > { > LCD_E=1; > __delay_ms(2); > LCD_E=0; > __delay_us(40); > } Das ist falsch. Die Wartezeit bis zum nächsten Befehl beginnt nach dem Enable-Puls. Für den Enable-Puls selber sind 1µs dicke ausreichend:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Gast
#3921111
_XTAL_FREQ/8000000.0 sollte sein: _XTAL_FREQ/4000000.0 dasselbe bei _ms delay.
So, ich hab jetzt alle Ratschläge befolgt und geändert: - XTAL_FREQ kommt als aller erstes - Die Enable Funktion hat jetzt : E = 1, 1uS delay, E=0, 40 us delay. Klappt immer nich nicht. Wieder das selbe wie bisher :( Mir fallen gleich die Haare aus :) :) Hat noch wer ne Idee? Hier der neue code:
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 | |
Hö, hö, ho Hier
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
sind jeweils Wartezeiten einzuhalten! Bitte lass diesen Quatsch
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
wenn du etwas beim hochfahren des Programms nur einmalig ausführen willst, dann zieh es vor die while Schleife. Aber mach da keine Kunstprojekte draus. Das ist alles Code, den man erneut überprüfen muss, ob du dir da nicht wieder irgendwo einen Fehler eingebaut hast. Sinnlos überprüfen muss
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
feddich. Das ist simpel, überschaubar und mann muss nicht überlegen ob das so stimmt. Dein Problem ist jetzt das Timing für das LCD richtig hinzukriegen. Beschäftige dich damit und nicht mit irgendwelchen anderen zusätzlichen Komplikationen. Die lösen dein Problem ganz sicher nicht. Wenn das LCD erst mal läuft, dann kannst du dich nach Herzenslust austoben. Aber bitte nicht vorher. Das sind alles Dinge, die selbst wieder potentielle Fehler enthalten können. Und genau das kannst du jetzt überhaupt nicht brauchen.
Du sagst, du kannst das Programm durchsteppen und wenn du das tust, dann initialisiert es richtig. Kannst du auch Breakpoints setzen? Wenn ja, dann setz halt erst mal einen Breakpoint hier hin
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
wenn du dann weiterlaufen lässt, initialisiert das LCD wenn du weitersteppst? Wenn du den Breakpoint tiefer setzt
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
initialisiert es dann, wenn du weitersteppst? Sinn der Sache ist es, rauszufinden, wo die du dem LCD eine zu kurze Pause gibst. Indem du einen Breakpoint setzt, läuft das Programm bis dort hin mit voller Geschwindigkeit und danach langsamer. D.h. durch das versetzen des Breakpoints unterteilst du die Initialisierung in einen Teil, der volle Kanne abläuft und einen der langsamer abläuft. AN der Stelle, an der sich das Verhalten ändert (von funktioniert auf funktioniert nicht), würde ich mal ansetzem, dass du da dem LCD etwas zu wenig Zeit lässt.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.