Forum: Mikrocontroller und Digitale Elektronik Problem mit Standard-LCD an AVR


von Dirk Schlage (Gast)


Angehängte Dateien:

Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

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

von Dirk Schlage (Gast)


Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

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

von Dirk Schlage (Gast)


Lesenswert?

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

von tarzanwiejane (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.