Forum: Mikrocontroller und Digitale Elektronik erledigt -> LCD Ansteuerung mit Pic u. Assembler - Problem


von Michael R. (elektr-hobbyist)



Lesenswert?

Hallo alle zusammen,

ich bräuchte mal bitte Hilfe.
Ich möchte testweise auf einem 2x16 LCD (HD 44780 Contr.) den Buchstaben 
„H“ anzeigen lassen.
Das funktioniert aber leider nicht.
Ich bin nun mein Programm im Debug- Modus Schritt für Schritt durch 
gegangen, und konnte feststellen, dass alles wunschgemäß abläuft.
Bei der Initialisierung habe ich mich an die Tabelle von sprut gehalten.

http://www.sprut.de/electronic/lcd/index.htm#init

Die hardwaremäßigen Verbindungen habe ich überprüft. Es gibt keine 
Unterbrechungen, und das Display ist korrekt angeschlossen.
Auch das Verwenden eines anderen Displays brachte keinen Erfolg.
Bei überhöhtem Kontrast, ist die obere und untere Zeile durchgängig mit 
Kästchen gefüllt.
Sehe ich das richtig, dass man daraus entnehmen kann, dass zumindest die 
Einstellung auf 5x8 Matrix, 2 zeilig  und somit auch die Umstellung von 
8 auf 4 Bit- Interface erfolgreich ist?
Wo kann der Fehler liegen?

Den Programmcode habe ich angehängt.

Vielen Dank schon mal.

L.G.

Micha

Edit: Das untere asm-File ist das richtige!
@ Moderator: Wenn möglich bitte das obere asm-File löschen. Danke.

: Bearbeitet durch User
von Michael R. (elektr-hobbyist)


Lesenswert?

Hat wirklich niemand einen Tipp für mich?

L.G.

Micha

von Ottmar K. (wil1)


Lesenswert?

Hallo Michael,

überprüfe bitte mal die Initialisierung von PORTD. Ich würde das so 
machen:
init_pic:
;---PORTD
    banksel PORTD        ;select bank with PORTD (bank0)
    clrf    PORTD        ;clear output latches
    banksel TRISD        ;select bank 1 with datadirection register 
TRISD
    clrw    TRISD        ;set RD7:0 = 0 pins are now outputs
    bcf     OPTION_REG,7 ;weak pullups on
    banksel 0            ;back to bank 0

banksel PORTD ist eigentlich nicht nötig, weil der PIC mit bank 0 nach 
Reset startet, hilft aber die Übersicht zu behalten. Probleme mit dem 
Speicherplatz hast Du ja nicht.

Für die Variablendefinitionen empfehle ich dieses Vorgehen:
   CBLOCK 0x7E
     ....      ;allen Variablen zwischen CBLOCK und ENDC
     loop1     :wird die Adresse ab 7E aufsteigend zugewiesen.
     loop2     ;damit erspart man sich loop2 EQU 71 ....
     ..usw
   ENDC

Evtl. schaue ich mir sobald ich Zeit habe, auch mal den restlichen Code 
an...

mfG Ottmar

von Michael R. (elektr-hobbyist)


Lesenswert?

Hallo Ottmar,

erst einmal vielen lieben Dank für deine Bemühungen.

Ottmar K. schrieb im Beitrag #3593347:
> Wenn Du jetzt aber obige Definitionen anschaust, siehst Du dass Deine
> Steuerleiungen E, bl_cont ebenfalls im oberen Nibble (d7,d6) liegen und
> Dein Datenport ins untere Nibble überlappt.

Deshalb die zweimalige Rotation nach rechts.

>  bcf     OPTION_REG,7 ;weak pullups on

Habe ich eingefügt -> keine Veränderung

L.G.

Micha

: Bearbeitet durch User
von Michael R. (elektr-hobbyist)


Lesenswert?

PS: Ich werde morgen mal ein Display anschließen (falls ich Zeit finde) 
von dem ich sicher weiß, dass es 100%-tig funktioniert.

L.G.

Micha

von Kein Name (Gast)


Lesenswert?

Der 877 unterstützt ja In-Circuit-Debugger. Wenn du bei den Pics bleiben 
willst, der Tip: Kauf dir einen Pickit3. Bei solchen Problemen einfach 
durchsteppen und mit dem Multimeter direkt am LCD überprüfen, ob die 
richtigen Signale ankommen. Geht schneller, als im Forum fragen.
(Hatte mal ein Display spiegelbildlich angeschlossen - so einen Fehler 
findet man nicht im Programmcode).

von Michael R. (elektr-hobbyist)


Lesenswert?

Hallo Unbekannter, :-)

Kein Name schrieb:
> Tip: Kauf dir einen Pickit3

Habe ich bereits.

> Bei solchen Problemen einfach
> durchsteppen

Wie oben geschrieben, habe ich das schon gemacht, und mir dabei die 
Werte in den Registern angeschaut (watches im MPLABX).
Es geschieht alles so wie ich es beabsichtigt habe.
Nur scheinen in meinen Absichten ein oder mehrere Fehler zu liegen. :-/

Danke trotzdem für deine Tipps.

L.G.

Micha

von Chris B. (dekatz)


Lesenswert?

"#define     RW          PORTD, 1"

Es wird wohl ein RW Pin definiert und nehme an das er angeschlossen ist 
- nur WO im Programm wird dieser auch bedient?
Ist der beim Schreiben sicher IMMER auf LOW?

(auch wenn durch die Maskiererei und Verschieberei mit anschliessenden 
Schreiben auf PORTD zufällig RW auf Low wäre - sauber ist das nicht.)

von Michael R. (elektr-hobbyist)


Lesenswert?

Hallo Chris,

Chris B. schrieb:
> Ist der beim Schreiben sicher IMMER auf LOW?

ja, das RW Pin am LCD hebe ich auf Masse gelegt.

L.G.

Micha

: Bearbeitet durch User
von Michael R. (elektr-hobbyist)


Lesenswert?

Hallo alle zusammen,

so, ich habe jetzt mal ein Display angeschlossen von dem ich weiß, dass 
es auf jeden Fall funktioniert. Und siehe da, es läuft!
Also sind BEIDE vorherigen LCDs (beides verschiedene) unglücklicher 
Weise defekt. :-(
Ich danke allen, die sich Gedanken über mein Problem gemacht haben, und 
im besonderen Ottmar.

Eine schöne Woche noch.

L.G.

Micha

: Bearbeitet durch User
von Sebastian Hepp (Gast)


Lesenswert?

Es könnte noch an den Controllern der Displays liegen. Der KS0070 z.B. 
braucht Wartetakte, die der HD44780 nicht brauchte.

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.