www.mikrocontroller.net

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


Autor: Jens Schreiber (scribbler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Jens Schreiber (scribbler)
Datum:
Angehängte Dateien:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens Schreiber (scribbler)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define LCD_E 2  //P2, Bit 2: Enable
[...]
  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.

Autor: Jens Schreiber (scribbler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 =)

Autor: Jens Schreiber (scribbler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>P2OUT &= 0 << LCD_E;

Meinst du, das das funktioniert?

MfG Spess

Autor: Jens Schreiber (scribbler)
Datum:

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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI

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

P2OUT &= ~(1 << LCD_E);

MfG Spess

Autor: Jens Schreiber (scribbler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay hab ich gemcaht, macht aber keinen unterschied!

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Das betrifft aber noch die Stellen mit RW und RS.

MfG Spess

Autor: Jens Schreiber (scribbler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jup schon behoben =)

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und geht immer noch nicht?

Autor: Jens Schreiber (scribbler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Schreiber (scribbler)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.