LCD die 100ste... Tag Ihr Leute. Bevor ich mit meinem Problemchen beginne: Ja, ich habe diese Forum durchsucht und Ja, ich habe andere Foren durchsucht und Ja, ich habe auch Google & Konsorten bemüht. Nun folgendes: Ich hab eine 2x16 DotMatrix-LCD mit HDD44780-Controller (nicht kompatibel, sondern genau DER) an einen ATmega16 (auf dem Pollin-Board) angeschlossen und der weigert sich, das zu initialisieren bzw. Anzusprechen. Das Display ist i.O. (läuft an C51) und weist das übliche (14-)Pinout auf. Da es, wie gesagt, an einem anderen Controller (89s8252) läuft, gehe ich davon aus, dass es ein Programmierfehler ist. (Fest) verdrahtet ist es folgendermassen: 4 RS - C.4 5 RW - GND 6 EN - C.5 7 D0 - GND . . 10 D3 - GND 11 D4 - C.0 12 D5 - C.1 13 D6 - C.2 14 D7 - C.3 RW ist an GND, da mich das BSY nicht wirklich interessiert, ich habe zeit... Ich wäre nun wahnsinnig dankbar, wenn sich jemand den Quelltext (anhang) mal ansehen könnte und mir dann sagt, was ich da falsch mache. Ich gehe nämlich mal davon aus, dass ich da als AVR & WinAVR - Neuling irgendwas vergessen habe. Besten Dank auf jeden Fall, Thilo
Hallo, sieht für mich auf die Schnelle recht glaubwürdig aus. Aaaaber.... Mega16.... JTAG-Fuse aktiv? Dann ist PortC.2 bis 5 mit dem JTAG belegt. Nimm einen anderen Port als C oder/und lies Dich über die Fuses schlau und über eventuelle Probleme damit. Gruß asu Berlin Michael
Hi, Du solltest nach jedem Enable eine Pause einlegen, wie lange die ist hängt von deinem Display ab. Das Programm ist sehr umständlich geschrieben. Kann es sein das Du im 4 Bit modus falschrum sendest, also Hi-nibble und Low-nibble vertauscht. Hab mir das nicht so genau angeschaut aber Du solltest Dir ein paar Routinen bauen die ein Byte in die Nibbles zerlegt und dann entsprechend die Enablepulse geben. Das macht das ganze viel Transparenter Ich hoffe ich konnte Dir ein paar Denkanstöße geben.
Vielen Dank! Die JTAG-Fuse war's. Es gibt halt immer was, woran man nicht denkt... Auch Danka an Pluto, werde mich mal an die SWAP-Routinen machen. In c51-ass wär das ganz einfach : ) Aber bietet GCC nicht auch ne fertige routine für den Fall. Oder hast Du zufällig ein Code-Snippet? Thomas
das nenn ich kryptisch : ) der schiebt mir also im prinzip die oberen vier bit auf die unteren vier?
Hallo, ich sag es mal so: es wird eine Kopie von data als 8Bit-Wert erzeugt, diese wird 4x rechts verschoben. Dann wird eine Kopie erzeugt, die 4x nach links verschoben wird. Dann werden die beiden Kopien oder-Verknüft und nach data kopiert. Wenn der Compiler gut ist, merkt er, was er da triben soll und benutzt den ASM-Befehl: swap data Wenn er nicht klug ist, macht er es wie beschrieben: ((uint8_t)data)>>4 mov temp1,data lsr temp1 lsr temp1 lsr temp1 lsr temp1 (data<<4) mov temp_2,data lsl temp2 lsl temp2 lsl temp2 lsl temp2 | or temp1,temp2 data= mov data,temp1 Alle möglichen Varianten dazwischen hängen auch von der Optimierungsstufe ab. ;) Gruß aus Berlin Michael
> Wenn er nicht klug ist, macht er es wie beschrieben:
Wie macht es der GCC? Hat mal jemand geschaut?
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.