Forum: Mikrocontroller und Digitale Elektronik LCD KS0076B Ansterung mit MSP430 im 4-Bit Modus


von Jens S. (scribbler)


Angehängte Dateien:

Lesenswert?

Hi,

ich probiere gerade ein LCD mit dem KS0076B controller anzusteuern. 
Angeblich soll er HD44780 kompatibel sein. Dementsprechend habe ich mir 
hier diese tolle ausführliche Seite angeschaut: 
http://www.sprut.de/electronic/lcd/index.htm#4x20

das ganze würde ich dann gern im 4-Bit Modus betreiben. Ich nutze das 
Evaluationsboard MSP430P169 von Olimex mit dem entsprechenden MSP430F169 
Mikrocontroller.

Meine Pinbelegung ist wie folgt:
an P1.4-P1.7 liegt TD4-TD7 und an P2.0 liegt RS, P2.1 liegt R/W und an 
P2.2 liegt Enable.

Meines erachtens scheint die Initialisierung auch zu funktionieren. Aber 
wenn ich probiere ein H auszugeben klappt das leider nicht.

Das Binärwort für "H" hab ich von http://mathar.com/msp_lcd1.html und 
laut der ersten Seite muss ich nur erst den oberen Teil des Datenworts 
schicken und dann den unteren. Aber leider funktioniert das nicht! :(

Vielleicht habt ihr ja eine Idee!! Achso und das LCD ist ein 2*40 
Display!

Danke schonmal für eure Hilfe! Und anbei natürlich der Sourcecode ;)

: Verschoben durch User
von Klaus W. (mfgkw)


Lesenswert?

nicht, daß ich dir helfen könnte, aber von deinem Quelltext fehlt 
zumindest noch die LCD_Driver.h.

von Jens S. (scribbler)


Angehängte Dateien:

Lesenswert?

ja hatte sie weggelassen, das sie letztliche irrelevant ist, stehen ja 
nur die Prototypen der Funktionen drin! aber dennoch hier ist sie =)

von Klaus W. (mfgkw)


Lesenswert?

ich habe jetzt von deinem MSP430F169 keine Ahnung, will mich
nicht unnötig einmischen und bin auch gleich still, aber bei
deiner wait-Methode habe ich die Befürchtung, daß man nicht weiß,
ob die lange genug wartet.
So ein paar Schleifendurchläufe dauern ja nicht lange, wenn
nicht gleich die ganze Schleife wegoptimiert wird.

von Jens S. (scribbler)


Lesenswert?

ich hab gerade nochmal nachgelesen, wenn man die int Variable im wait 
als volatile deklariert sollte es funktionieren! aber danke für den 
hinweis =)

von Hc Z. (mizch)


Lesenswert?

> P2OUT |=  0x04; // clock-bit erst mal sicherheitshalber auf high

Solche Zuweisungen sind einfach unleserlich.  Die Bitzuordnung ist 
nirgends aufgeführt (hurra, ein Textadventure), und selbst wenn sie es 
wäre, müsste man die Bits aus den Zahlen rückwärts aufdröseln.
1
#define LCD_E 2  //P2, Bit 2: Enable
2
[...]
3
  P2OUT |= 1<<LCD_E;
sollte da statt des Statements ganz oben stehen.  Das wäre nicht nur für 
Deine Mitleser eine Erleichterung (und würde Dir mehr Antworten 
bringen), sondern auch für Dich selbst.  Wetten, Du weißt in 2 Monaten 
nicht mehr, dass 0x04 den Enable-Ausgang betrifft (oder Clock, falls das 
beim KS-Controller so heißt)?

Da ist zwar kein MSP430-spezifischer Code (bis auf die Initialisierung) 
drin, aber so wie der Code geschrieben ist, werden die meisten, die mit 
dem KS-Controller schon gearbeitet haben, nichts wiedererkennen, 
jedenfalls nicht ohne viel Mühe.

0x04 statt direkter Nennung von Enable -- so etwas kann nur von der 
Tarnen-und-Täuschen-Fraktion kommen, und die will gemeinhin nicht, dass 
jemand durchsteigt.

von Jens S. (scribbler)


Angehängte Dateien:

Lesenswert?

also erstmal ich hab nichts zu verbergen, will ja schließlich das mein 
Problem gelölst wird =)
hab den Quellcode nochmal überarbeitet und hoffe das er so leserlich 
ist! hoffe ihr könnt was entdecken, würde mich sehr freuen =)

von Jens S. (scribbler)


Angehängte Dateien:

Lesenswert?

hat jemand noch eine idee? laut 
http://www.sprut.de/electronic/lcd/index.htm#4x20 müsste die abfolge 
beim schreiben an das lcd eigentlich richtig sein wenn ich mich nicht 
irre. aber was mir noch nicht ganz klar ist wie ich dem lcd sage an 
welcher stelle er das character schreiben soll bzw wie ich ihm sage das 
er in die nächste zeile gehen soll, da ich ja ein 2x40 display habe!!! 
wäre froh um jede hilfe!

hab nochmal eine neuere version drangehangen, in der ich schonmal eine 
funktion für das schreiben von strings geschrieben habe. ich hab es 
gerade auch nochmal alles durchgedebuggt, von meinem verständnis her 
macht er es richtig! ich denke irgendetwas von der abfolge der befehle 
und setzen der bits ist falsch, weiss aber leider nicht was.

von Spess53 (Gast)


Lesenswert?

Hi

>P2OUT &= 0 << LCD_E;

Meinst du, das das funktioniert?

MfG Spess

von Jens S. (scribbler)


Lesenswert?

ne funktioniert nicht! habs in ein
>P2OUT &= 011 << LCD_E; abgeändert. funktinoert leider trotzdem nicht :(
danke für deine antwort!

von Spess53 (Gast)


Lesenswert?

HI

Mit meinen rudimentären C-Kenntnisse würde ich sagen, nimm

P2OUT &= ~(1 << LCD_E);

MfG Spess

von Jens S. (scribbler)


Lesenswert?

okay hab ich gemcaht, macht aber keinen unterschied!

von Spess53 (Gast)


Lesenswert?

Hi

Das betrifft aber noch die Stellen mit RW und RS.

MfG Spess

von Jens S. (scribbler)


Lesenswert?

jup schon behoben =)

von Jörg S. (joerg-s)


Lesenswert?

Und geht immer noch nicht?

von Jens S. (scribbler)


Angehängte Dateien:

Lesenswert?

Ja, funktioniert leider immer noch nicht. werde mit jetzt nochmal ein 
bisschen was durchlesen in der Hoffnung das ich dann den Fehler finde.

Wenn ich bei der Initialisierung "Kursor nach rechts wandernd, kein 
Display shift" angebe, müsste er doch bei einem Wort wie "Hello" doch 
pro Zeichen eins nach rechts wandern. Aber wie kann ich zwischen den 
einzelnen Zeilen, wenn etwa eine Zeile voll ist, des Displays springen? 
Habe ein 2x40 LCD.

Gruß scribbler

von Klaus W. (mfgkw)


Lesenswert?

je nach Zuordnung von Speicheradressen zu LCD-Position (siehe
Datenblatt) schreibt er entweder direkt in der nächsten Zeile
weiter oder nicht.

Der richtige Weg wäre bei diesen LCDs jeweils nur soviel
auszugeben, wie in die aktuelle Zeile passt, dann Cursor neu
positionieren und dort weiterschreiben.

von Peter D. (peda)


Lesenswert?

Jens Schreiber schrieb:
> Ja, funktioniert leider immer noch nicht.

Wie lange wartet denn dieses ominöse wait(15)?

Wenn Dein Compiler keine wait-Funktionen hat, solltest Du Dir erstmal ne 
vernünftige Wait-Funktion schreiben, der man µs bzw. ms übergibt.

Hat man keine Lust, Assemblerinstruktionen auszuzählen, macht man sich 
das Wait ganz elegant mit nem Timer.

Und dann wartet man nicht 15 Äpfel oder Birnen, sondern mindestens die 
Zeiten, die im Datenblatt stehen (1µs, 15ms, 4.1ms, 100µs, 37µs, 1.5ms).

Ohne funktionierendes Wait wird es nix, niemals nie!


Peter

von Jens S. (scribbler)


Lesenswert?

Hi.

Danke nochmal für eure Hilfe, war noch ein kleiner Bug in der Hardware 
und ein kleiner in der Software. Wenn ich alles nochmal ausprobiert 
habe, dann stell ich den Quellcode nochmal rein.

Grüße

Jens

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.