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
nicht, daß ich dir helfen könnte, aber von deinem Quelltext fehlt zumindest noch die LCD_Driver.h.
ja hatte sie weggelassen, das sie letztliche irrelevant ist, stehen ja nur die Prototypen der Funktionen drin! aber dennoch hier ist sie =)
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.
ich hab gerade nochmal nachgelesen, wenn man die int Variable im wait als volatile deklariert sollte es funktionieren! aber danke für den hinweis =)
> 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.
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 =)
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.
Hi
>P2OUT &= 0 << LCD_E;
Meinst du, das das funktioniert?
MfG Spess
ne funktioniert nicht! habs in ein
>P2OUT &= 011 << LCD_E; abgeändert. funktinoert leider trotzdem nicht :(
danke für deine antwort!
HI Mit meinen rudimentären C-Kenntnisse würde ich sagen, nimm P2OUT &= ~(1 << LCD_E); MfG Spess
okay hab ich gemcaht, macht aber keinen unterschied!
Hi Das betrifft aber noch die Stellen mit RW und RS. MfG Spess
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.