Ich weiß, dass es schon ewig viele Beiträge von diesem Problem gibt, aber ich komme nicht weiter. Ich versuche mein LCD (Treiber: 44780) mit einem Atmega16 (16MHz) zu programmieren. Ich programmiere in Assembler. Allerdings geht nicht mal die initialisierung. Ich habe es nach dieser Anleitung probiert: http://www.sprut.de/electronic/lcd/#ks0073 Wenn die Initialisierung abgeschlossen ist, wird immer noch ein Balken in der oberen Zeile angezeigt, und der Cursor blinkt an der zweiten stelle. Im Anhang befindet sich mein Programm. Kann mir bitte jemand sagen was da nicht stimmt? mfg
:
Bearbeitet durch User
> Kann mir bitte jemand sagen was da nicht stimmt?
Du bist ein paar Größenordnungen zu schnell.
@g457 ich habe doch ein Delay von 255^3 Taktzyklen. Das wären bei 16MHz dann doch über eine Sekunde oder?
Zunächst, dein Code ist nicht kommentiert und schlecht lesbar. Ohne mich jetzt da hinein zu vertiefen, fällt mir als erstes auf: ";DB7-DB4 auf PB3-6" Das ist suboptimal, weil die Datenleitungen nicht mit einem vollständigen Nibble übereinstimmen und somit unnnötige Schiebeoperationen erforderlich sind (die ich im Code nicht finde). Schließ die Datenpins an PB7-PB4 an.
@holger das Problem ist, dass bei dieser Seite der Code für die Initialisierung nicht direkt aufgeführt ist, sondern nur der Ablauf. Ich verstehe nicht was man mit "$3" meint. Ist es eigentlich auch richtig, dass ich zuerst die Pegel für RS und R/W anlegen muss, dann die Enable leitung auf High legen, dann die Pegel für die Datenleitungen anlegen muss und dann Enable wieder auf low ziehen?
@lcke(R) Tut mir leid, ich habe die Kommentare hinzugefügt. Ich habe die Datenleitungen so angeschlossen, weil in dem Tut, welches ich gefunden habe, die Befehle in dieser Reihenfolge angegeben werden.
:
Bearbeitet durch User
@ Max H. ich brauche es doch nur 3 Mal, oder? einmal um die Initialisierung des Treibers abzuwarten und 2 mal zwischen den ersten 2 Steuerbefehlen, oder lieg ich da falsch?
Du musst mach jedem Befehl warten. Wie lange findest du auf S. 24: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
:
Bearbeitet durch User
@ Max ich habe jetzt nach jedem Befehl mein Delay eingefügt. Es funktioniert aber immer noch nicht. Die Angaben im Datenblatt müssten doch Mindesangaben sein, oder?
ldi R16, 0b00000110 ;Interface auf 8-bit setzen out PORTB, R16 sbi PORTB, 2 ;Enableleitung auf high Das geht so nicht. Du schreibst damit einerseits nur Nullen auf die Datenleitungen und gleichzeitig ziehst du R/W auf High, wodurch das Display in den Lesemodus versetzt wird. Vergiß das Tutorial und schau dir das hier auf µC-net an. holger schrieb: > Vergleiche deinen Code mit dieser Seite: > > http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
@ lcke 1.) Ich verstehe nicht ganz, wieso ich alle Datenleitungen auf low lege. Wenn ich die Zahl 0b00000110 auf Port B schreibe, so müssten doch DB5 & DB4 auf high sein. Außerdem setze ich R/W nie auf eins, weil auf Pin 2 ja Enalbe liegt. 2.) Ich verstehe die Initialisierung auf uC.net nicht wirklich. Was meint man da, wenn man $3 ins Steuerregister schreiben soll? mfg
Samuel J. schrieb: > Wenn ich die Zahl 0b00000110 auf Port B schreibe, so müssten doch DB5 & > DB4 auf high sein. Nein, das höchstwertige Bit (MSB) ist links.
Samuel J. schrieb: > 0b00000110 │││ └───PB0 │││ ... ││└────────PB5 │└─────────PB6 └──────────PB7
:
Bearbeitet durch User
facepalm Tut mir leid! Kaum macht man's richtig, funktioniert es ;) Vielen Danke für eure Hilfe!
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.