Forum: Mikrocontroller und Digitale Elektronik LCD HD44780 und PIC18F45k20


von R. S. (frederenke)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich bin hier am verzweifeln.
Habe den Code im Anhang geschrieben (Bis auf den Config Kram 
größtenteils zusammenkopiert) und das LCD (von Pollin HMC16223SG 2 
Zeilen 16 Zeichen) im 4 Bit Modus an den PIC angeschlossen.
Dazu habe ich PortD benutzt.
PD0-frei
PD1-E
PD2-RW
PD3-RS
PD4-D4
PD5-D5
PD6-D6
PD7-D7
Sonst liegt an dem PIC und dem LCD lediglich Betriebsspannung an. Das 
LCD zeigt auch zunächst eine Reihe schwarze Blöcke an, jedoch lässt es 
sich nicht initialisieren. Wenn die Init_Lcd() Routine ausgeführt wird 
sehe ich an allen Stellen (in beiden Zeilen) lediglich schwach 
leuchtende Blöcke.

Es ist mittlerweile der (gefühlt) tausendste Versuch das Ding zum Laufen 
zu bekommen. Ich habe viele Beispielskripte ausprobiert - aber keins 
konnte mir helfen. Im Prinzip haben auch alle Skripte das gleiche 
gemacht. Ich habe mit dem PICKit3 auch im debug-Modus geschaut ob alles 
planmäßig ausgeführt wird...
Was läuft schief und wo sollte ich noch nach Fehlern schauen? Und läuft 
der Code vielleicht bei jemandem anders hier?

von Ottmar K. (wil1)


Lesenswert?

Hallo R.S.
Mir fällt da im Moment nur ein - falls Du kein busyflag abfrägst, das 
timing zu überprüfen, ob die Abarbeitungszeiten der einzelnen 
HD44780-Befehle eingehalten sind.

mfG Ottmar

von Vincent H. (vinci)


Lesenswert?

R. S. schrieb:
> PD4-D4
> PD5-D5
> PD6-D6
> PD7-D7

Ich kenn die HD44780 Befehle nicht auswendig, aber bist du sicher, dass 
der von dir kopierte Code mit den ganzen Port-Schreibbefehlen auch die 
richtigen Pins anspricht?

Wer sagt, dass der Autor des Codes die High-Nibble und nicht PD0-PD3 
benutzt hat?

Ich benutz beinah 1:1 diese Lib hier 
http://www.piclist.com/techref/member/IMB-yahoo-J86/HD44780-tty.htm mit 
einem sehr ähnlichen Prozessor (45K22). Da dort quasi nur ein paar 
defines im .h Files abgeändert werden müssen, würde ich dir diese 
Vorlage ans Herz legen. Ist somit auch viel flexibler als der von dir 
gepostete Code.

von Jens (Gast)


Lesenswert?

Das Display benötigt 5V Betriebsspannung. Der Controller kann aber max. 
3,6V verdauen. Das funktioniert so schon mal nicht.  Ansonsten ist bei 
zweizeiligen Displays nach Power-On nur eine Zeile eingeschaltet. Das 
sieht man bei stark eingestellten Kontrast recht gut (schwarze Balken). 
Nach der erfolgreichen Initialsierung werden beide Zeilen schwarz.

Die Timings sind manchmal etwas doof. Ich füge da oftmals ein paar NOPs 
oder Delays ein damit es stabil läuft.

von R. S. (frederenke)


Lesenswert?

Hallo,
vielen Dank für die Antworten. ich habe mich für die Variante 
vorgeschlagen von Vincent entschieden. Dazu habe ich ein Projekt in 
MPlab erstellt.
Source Files: LCD.c
Header Files: LCDcfg.h, pic18f45k20.h
Linker Skript: 18f45k20_g.lkr
Im LCDcfg.h habe ich die Zeile
#include <pic.h> durch
#include <p18f45k20.h> ersetzt --> Das war doch so gedacht oder?
Beim compilieren bekomme ich immer die folgenden Fehler:


LCD.c:94:Error [1105] symbol 'RB6' has not been defined
LCD.c:94:Error [1101] lvalue required
LCD.c:96:Error [1105] symbol 'RB5' has not been defined
LCD.c:96:Error [1101] lvalue required
LCD.c:99:Error [1105] symbol 'RB7' has not been defined
LCD.c:99:Error [1101] lvalue required
LCD.c:101:Warning [2058] call of function without prototype
LCD.c:105:Error [1105] symbol 'RB7' has not been defined
LCD.c:105:Error [1101] lvalue required
LCD.c:107:Warning [2058] call of function without prototype
LCD.c:114:Error [1105] symbol 'RB7' has not been defined
LCD.c:114:Error [1101] lvalue required
LCD.c:116:Warning [2058] call of function without prototype
LCD.c:118:Error [1105] symbol 'RB7' has not been defined
LCD.c:118:Error [1101] lvalue required
LCD.c:120:Warning [2058] call of function without prototype
LCD.c:125:Error [1105] symbol 'RB6' has not been defined
LCD.c:125:Error [1101] lvalue required
LCD.c:155:Error [1105] symbol 'RB6' has not been defined
LCD.c:155:Error [1101] lvalue required
LCD.c:157:Error [1105] symbol 'RB5' has not been defined
LCD.c:157:Error [1101] lvalue required
LCD.c:162:Error [1105] symbol 'RB7' has not been defined
LCD.c:162:Error [1101] lvalue required
LCD.c:164:Warning [2058] call of function without prototype
LCD.c:166:Error [1105] symbol 'RB7' has not been defined
LCD.c:166:Error [1101] lvalue required
LCD.c:168:Warning [2058] call of function without prototype
LCD.c:174:Error [1105] symbol 'RB7' has not been defined
LCD.c:174:Error [1101] lvalue required
LCD.c:176:Warning [2058] call of function without prototype
LCD.c:178:Error [1105] symbol 'RB7' has not been defined

Ich verstehe aber überhaupt nicht warum. RB7 ist doch in dem 
pic18f45k20.h definiert.

von micha (Gast)


Lesenswert?

Ich kann dir mal ein Beispiel Code schicken
Dann siehste ob die Hardware ok ist

von micha (Gast)


Lesenswert?

Brauche aber deine Hardware
Quartz usw

von R. S. (frederenke)


Lesenswert?

Hallo,
vielen Dank für das Angebot. Aber ich habe es nun hinbekommen. War echt 
ein dämlicher Fehler. das nop war in Großbuchstaben und anstatt RB7 
musste DDRBbits.RB7 sein. Das hat den ganzen Kram verursacht
Danke an alle die geholfen haben.
PS das Skript konnte ich zwar kompilieren aber noch nicht testen - ich 
bin gespannt

von R. S. (frederenke)


Lesenswert?

Hallo zusammen,
ich konnte den Quelltext nun testen. Es läuft leider nicht.
Micha - steht dein Angebot noch?
Ich benutz den 45k20 mit internem Oszillator auf 64 MHz.
Die LCD Pins kann ich aber auch an jeden erdenklichen Port anlöten. Im 
Moment stecken die Datenleitungen 4-7 an den Ports RB0-RB3. RS,RW und E 
stecken an PORTD 1-3.
Danke!

von micha (Gast)


Angehängte Dateien:

Lesenswert?

Versuch es mal damit.
RS = B4
EN = B5
Daten D4-D7 an: B0-B3

von R. S. (frederenke)


Lesenswert?

Super - vielen Dank erst Mal!
ich habe mein Board entsprechend umgelötet und das Hex-File getestet.
Leider bleibt mein Display hier blank. Aber dann habe ich während des 
Betriebes die Daten-Leitungen abgezogen und siehe da - ich konnte etwas 
wie "das ist" oder "das hier" lesen. Der Text war aber extrem schwach, 
weshalb ich auf eine falsche Kontrastspannung geschlossen habe. Die kann 
es aber nicht sein, da das Display an einer Schaltung mit einem 16f886 
in asm funktioniert.
Vielleicht hat der PIC ja einen weg!?
Ich habe hier noch einen 18f26k22 liegen. Ich werde mal eine Schaltung 
für diesen zusammenlöten und daran weiter testen. Der hat ja auch einen 
internen Oszillator...

von micha (Gast)


Angehängte Dateien:

Lesenswert?

Hier ein Testfile für den Pic 18f26K22.
Poste mal einen Schaltplan, wie
das Display angeschloßen ist.
Also alle Pins, wie angeschloßen sind.

von R. S. (frederenke)


Lesenswert?

Danke! bekomme jetzt den Text klar und deutlich angezeigt. "das ist" in 
der ersten Zeile - die zweite bleibt blank.
Da habe ich wohl den 45k20 zerstört..... Ärgerlich....

Ich bedanke mich nochmals! Hat mir viel Zeit gespart. Dann werde ich 
jetzt mal den Code von der Beispielseite auf meinen 26k22 ummünzen.
Danke!

von Spess53 (Gast)


Lesenswert?

Hi

>Da habe ich wohl den 45k20 zerstört..... Ärgerlich....

Wenn eine Zeile angezeigt wird, kann dein Controller nicht defekt sein.

MfG Spess

von micha (Gast)


Lesenswert?

Da sollte eigemntlich " das ist ein test", stehen.
Scheint nicht ganz zu dem HD44780 kompatible zu sein.

von Bernd (Gast)


Lesenswert?

R. S. schrieb:
> Was läuft schief und wo sollte ich noch nach Fehlern schauen?

Wo ist die Definition von NOP() aus LCD.h hin?

von R. S. (frederenke)


Lesenswert?

Bernd schrieb:
> Wo ist die Definition von NOP() aus LCD.h hin?

Eine gute Frage. Soweit ich mich erinnern kann, hat der Compiler hier 
gemeckert. Wie ich nun in den letzten Tagen herausgefunden habe, hätte 
ich hier einfach _asm und _endasm verwenden müssen.
Aber offensichtlich habe ich das Ausgeklammert und stattdessen "Nop()" 
verwendet. Hier spuckt der Compiler keine Fehler aus und ich dachte das 
"Nop()" ist dem asm NOP ähnlich bzw. gleich. Ist dem nicht so?

Habe jetzt versucht den empfohlenen Code auf den 18f26k22 zu portieren. 
Hat leider nicht geklappt. Hier ist also auch noch was falsch. Ich weiß 
aber auch nicht wo

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
Noch kein Account? Hier anmelden.