LCD KS0076B Ansterung mit MSP430 im 4-Bit Modus

OP #1859688
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 ;)
Angehängte Dateien:
#1859719
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.
#1860037
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.
OP #1861588
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.
Angehängte Dateien:
OP #1863003
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
Angehängte Dateien:
#1863028
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.
#1863130
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren