Hallo, Ich habe ein Problem mit der Ansteuerung eines Standard-LCDs. Ich habe den Assembler-Code aus dem Tutorial für WinAVR umgeschrieben. Seinerzeit auf PortC hat das auch wunderbar funktioniert. Jetzt wollte ich auf PortD umstellen, da ich PortC anderweitig benötige (A/D-Wandlung) und in PortD die beiden Nibble vertauscht und E an Pin 3 und RS an Pin 2, da ich an Pin 0 und 1 die serielle Schnittstelle verwenden will. Prozessor ist ein Mega48 mit einem externen 3,6864MHz Quartz. Ich musste dafür die Bitschieberei der Originalversion natürlich etwas anpassen. Nachdem es nicht klappte, habe ich alles mögliche ausprobiert. Z.B. wieder die alte Software genommen und das LCD umgesteckt. Hat funktioniert. Den Controller gegen ein neues Exemplar getauscht, ein anderes Kabel. Daran lag es auch nicht. Ein alternatives LCD hat auch nichts gebracht. Gestern habe ich eine neue Platine gelötet, das war es auch nicht. Ich habe entweder den gleichen Fehler nocheinmal gemacht, bei der Hardware, oder PortD geht prinzipiell nicht, so wie ich es mir denke, oder was ich für das Wahrscheinlichste halte, ich habe einen dummen Fehler bei der Umstellung der Software gemacht. Ich habe da jetzt schon mehrere Tage die Software mit dem alten Stand verglichen. Ich weiss nicht mehr weiter. Falls einer von euch mal einen Blich drauf wergen könnte... hier noch die Belegung: alt neu PortC PortD 0 DB4 - 1 DB5 - 2 DB6 RS 3 DB7 E 4 RS DB4 5 E DB5 6 - DB6 7 - DB7 danke Dirk
Hallo, C ist nicht meine Sache, Assembler ist mit lieber... Aber: void lcd_data(unsigned char chData) { unsigned char uchTmp; uchTmp = chData; uchTmp &= 0b11110000; uchTmp |= 0b00000001; <-- wenn das RS sein soll, das hast Du an Pin 2 dran und nicht an Pin 0, also 0b00000100 PORTD = uchTmp; lcd_enable(); uchTmp = chData; uchTmp <<= 4; uchTmp |= 0b00000001; PORTD = uchTmp; lcd_enable(); _delay_us(50); Gruß aus Berlin Michael
Danke, das war schon mal ein kapitaler Bock. Ich habe in beiden Zeilen geändert, aber leider immer noch nicht mehr als den schwarzen Balken in der ersten Zeile. Kann ich daraus eigentlich irgendwas schließen, z.B. daß die Initialisierung schon mal ok ist? servus Dirk
Hallo, nein, der schwarze Balken in der ersten Zeile zeigt, daß nicht initialisiert ist. Die Folge sieht eigentlich ok aus, die Pausen sind auch ok, soweit ich sehe. 3 NOP beim E-Impuls sollten bei knapp 4MHz dicke reichen, ich habe bei 16MHz 4 NOP drin und es läuft mit verschiedenen Displays. Leitungen wirklich an den richtigen Pins? RW auf Masse? Nicht, weil ich es Dir nicht zutraue, sondern weil ich solche Fehler bei mir auch immer erst suchen darf... ;-) Gruß aus Berlin Michael
Ich habe es mir eben nochmal aufgezeichnet, also was ich gesteckt habe auf Papier gebracht und überprüft. Dann habe ich die alte Version wieder gesteckt, alle Leitungen, die auf Masse gehen bleiben gleich, ich muss nur die D7-D4 und E und RS. Dann habe ich wieder meine alte Software aufgespielt (mit der Originalbelegung) und der Text erscheint. Deswegen denke ich kann ich auch das Timing ausschliessen. Es kann immer noch sowohl Hardware, als auch Software sein, deswegen hatte ich ja gestern auch das Board nochmal gebaut. Den ganzen Code bin ich eben auch noch mehrfach durchgegangen und habe ausprobiert ob das initielle Beschreiben des Port mit 0 oder 0xff was bringt, Fehlanzeige. Ausserdem habe ich bei den Bitshifts nachträglich die leeren Bits ausmaskiert, falls doch Einsen reingeschoben würden. Mit systematischer Fehlersuche hat das nichts mehr zu tun. Da ich keinen Logicanalyser besitze wäre es jetzt wahrscheinlich das nächste getrennte LEDs an den einzelnen Pins zu betreiben und schauen, ob ich die Ausgänge wirklich so ansteuern kann, wie ich will..... Dirk
Hi Dirk, wenn es ein Mega16/32 waere wuerde ich sagen schau mal auf die JTAG Fuse. Ich weiss aber leider nicht ob das Debugwire vom Mega48 auch disabled werden muss. Alternativ empfehle ich an PortC deinen Code mit dem Nibbletausch zu testen, da kannste Probleme mit JTAG ausschliessen. Ich haette noch einen Assemblercode hier (fuer den Mega16) bei dem du die LCD-Pins frei an den AVR antackern kannst solange du alle Pins an einem Port hast. Vielleicht willste da ja mal nen Blick drauf werfen. Der nutzt allerdings auch die RW Leitung ivm Ready auslesen, verzichtet dafuer auf lustige Wuerfelei/Warterei ob das LCD fertich ist. Ich denke das auch am Umbelegen deiner Pins deine Probleme liegen. Jedenfalls haste die Bits fuer RS und E in den letzten 3 lcd_command in der lcd_init procedure falsch wenn du nur nibbles tauschst. Und 3 Zeilen weiter oben beim Initialisieren des 4-Bit Modus auch. Du musst die RS und E Bits in den Binaerzahlen richtig setzen dann gehts bestimmt. cu Tommi
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.