Hi, Ich komme einfach nicht weiter mit der Lcd-ansteuerung. Ich habe nur das LCD(4bit Modus, 2*16Zeichen)angeschlossen. Der controller ist ein S6A0069 (HD44780 kompatibel). In Bascom funktionierte die integrierte HD44780 ansteuerung. LCD: D7==Portd.7 D6==Portd.6 D5==Portd.5 D4==Portd.4 EN==Portd.3 RS==Portd.2 Das LCD kann nur schlecht umgesteckt werden, da ich das Easyavr5a board benutze, und dort kann ich das LCD Pinout nicht ändern Ich schaffe es einfach nicht lcd-routines.asm aus dem AVR Tutorial so umzuschreiben, sodass mein Programm läuft. Kann mir jemand helfen, das Programm so umzuschreiben, dass es dann läuft (Steige von Basic auf Assembler um)? Habe bis jetzt das ganze tutorial (alles vor der LCD Ansteuerung) durchgemacht, doch in der LCD-routines.asm blick ich nicht mehr durch. Hoffe ihr könnt mir schnell helfen, da ich mich schon die ganzen Ferien mit disen Thema beschäftige. Mfg Pase-h PS: Benutze das AVRStudio 4.18.
Folgende Anpassungen müssen durchgeführt werden:
1 | lcd_data: |
2 | - die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht |
3 | auf dem unteren |
4 | - RS liegt auch an einem anderen PIN |
5 | |
6 | lcd_command: |
7 | - die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht |
8 | auf dem unteren |
9 | |
10 | lcd_enable: |
11 | - Pin ändern |
12 | |
13 | lcd_init: |
14 | - die ohne lcd_command/lcd_data gesendeten Daten auf deine Belegung anpassen |
avr-tutorial schrieb: >Wer eine höhere Taktfrequenz als 4 MHz verwendet, der sollte daran denken, >die Dauer der Verzögerungsschleifen anzupassen. Wenn du irgendwo hängen bleibst, kannst du dich gerne hier wieder melden. skriptkiddy
Skript Kiddy schrieb: > lcd_data: > - die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht > auf dem unteren > - RS liegt auch an einem anderen PIN > lcd_command: > - die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht > auf dem unteren > lcd_enable: > - Pin ändern > lcd_init: > - die ohne lcd_command/lcd_data gesendeten Daten auf deine Belegung anpassen Hi, Habe alles geändert, doch auf 1, 2 oder 4Mhz wird am Display nichts angezeigt. Bei 8Mhz, wird dann nur Müll auf dem Display angezeigt, und das auch erst immer nach dem 4. oder 5. Reset. Im anhang ist die geänderte lcd-routines.asm. Eigentlich müsste es jetzt alles stimmen, Ich kann zumindest keine Fehler mehr Feststellen
andi temp1, 0b11110000 ; oberes Nibble auf Null setzen das widerspricht sich mit dem Kommentar, hier wird das untere Nibble auf Null gesetzt. Gibt noch einige andere Stellen wie diese. -> ändern.
Hi >;; DB4-DB7: PD0-PD3 ;; >andi temp1, 0b11110000 ; oberes Nibble auf Null setzen Du setzt aber das untere (D3..D0) Nibble auf Null. MfG Spess
spess53 schrieb: > Hi > >>;; DB4-DB7: PD0-PD3 ;; > >>andi temp1, 0b11110000 ; oberes Nibble auf Null setzen > > Du setzt aber das untere (D3..D0) Nibble auf Null. > > MfG Spess Jetz blicke ich irgendwie garnichtmehr durch, Da mir das Lcd ja ab und zu mal etwas anzeigt(ungefähr jedes 4.-5. mal, und dann auch nur Müll). Es zeigt folgendes an: ein umgedrechtes J, TM übereinander, ', ein umgedrechtes J, Leerstelle, G, t, V, E >>;; DB4-DB7: PD0-PD3 ;; Ich betreibe es ja auch an PD4-PD7 und Nicht an PD0-PD3: D7==Portd.7 D6==Portd.6 D5==Portd.5 D4==Portd.4 EN==Portd.3 RS==Portd.2 Was müsste ich nun ändern, damit ich einen Output am LCD bekomme? Laut tutorial sollte im Lcd Test stehen. Mfg Pase
> andi temp1, 0b11110000 ; oberes Nibble auf Null setzen
Da ist
1) der Kommentar falsch. Das ist sehr verwirrend.
2) die Reihenfolge falsch. Da Du die Datenleitungen im oberen Nibble
hast, musst Du erst ausgeben (ohne swap - denn es muss das obere Nibble
ausgegeben werden, und das passt bereits) und dann swappen, damit das
untere Nibble im oberen landet. Oder erst temp2 ausgeben, dann temp1
(was aufs Selbe rauskommt).
erstmal änderst du die Kommentare in deinem Programm. Dann weißt du auch, was der Befehl tun muss, und kannst das dementsprechend ändern. Das fängt schon ganz oben an, wenn du PD4 -PD7 als Daten benutzt, auch reinschreiben! Dafür sind Kommentare da. Noch ne Frage nebenbei: Schon viel in Assembler gemacht? :-)
Hier nochmal die Datei mit Neuen Kommentaren. Habe jetzt nochmal die lcd.asm angehängt, da dort vielleicht auch ein Fehler sein könnte (denke nicht, da ich dort noch nichts geändert habe).
Hier die Dateien: Floh schrieb: > Noch ne Frage nebenbei: Schon viel in Assembler gemacht? :-) Nö, Lerne seit ca. 2 Wochen von Basic auf Assembler um. Und jetzt wird erstmal Gefrühstuckt! Mfg Pase
Pascal Haury schrieb: > Jetz blicke ich irgendwie garnichtmehr durch, Da mir das Lcd ja ab und > zu mal etwas anzeigt(ungefähr jedes 4.-5. mal, und dann auch nur Müll). > Es zeigt folgendes an: > ein umgedrechtes J, TM übereinander, ', ein umgedrechtes J, Leerstelle, > G, t, V, E >>>;; DB4-DB7: PD0-PD3 ;; > Ich betreibe es ja auch an PD4-PD7 und Nicht an PD0-PD3: > D7==Portd.7 > D6==Portd.6 > D5==Portd.5 > D4==Portd.4 > EN==Portd.3 > RS==Portd.2 > Was müsste ich nun ändern, damit ich einen Output am LCD bekomme? > Laut tutorial sollte im Lcd Test stehen. Dein Problem ist, dass du nicht analysiert hast, was denn die Funktion im Tutorial macht und wie sie es genau macht. Die Funktion bekommt einen 8 Bit Wert 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ die sie in 2 Etappen an den Port rausgeben muss, an dem die Datenleitungen an den Bits 0 bis 3 hängen. 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+ | | | | | | | | | Portbelegung +---+---+---+---+---+---+---+---+ | | | | | | | | v v v v Datenleitungen zum LCD Die Ausgabe muss in der Reihenfolge: zuerst die 4 höchstwertigen Bits 4 bis 7, dann die 4 niederwertigen 0 bis 3 erfolgen Da im Tutorial die Datenbits am Port an D0 bis D3 liegen, muss also für die 4 höchstwertigen Bits im Prinzip diese Verschiebung durchgeführt werden 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+ | o | o | o | o | | | | | Datenbyte +--\+--\+--\+--\+---+---+---+---+ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 7 6 5 4\ 3\ 2\ 1\ 0 +---+---+---+---\---\---\---\---+ | | | | | o | o | o | o | Byte das an den Port +---+---+---+---+---+---+---+---+ geschrieben wird | | | | | | | | v v v v Datenleitungen zum LCD denn jetzt liegen die 4 höherwertigen Bits an den Positionen D0 bis D3 und können so an den Port gegeben werden. Gemacht wird das Ganze, indem das Byte ganz einfach geswappt wird. Der µC tauscht die 4 höherwertigen Bits mit den 4 niederwertigen Bits. Damit liegen dann auch die bewussten 4 Bits an der richtigen Stelle und da die anderen gezielt auf 0 gesetzt werden, interessiert uns nicht weiter, was durch den Swap jetzt in die oberen 4 Bits gebracht wurde. Aber den Fall hast du ja nicht! Deine Datenleitungen liegen nicht auf D0 bis D3 sondern auf D4 bis D7. 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ | | | | | | | | v v v v Datenleitungen zum LCD D.h. die 4 höherwertigen Bits sind schon an der richtigen Position! Daher ist auch der Swap an dieser Stelle für die 4 höchstwertigen Bits nicht notwendig. Ganz im Gegenteil - du würdest dir die 4 richtigen Bits unter dem Hintern wegziehen. Bei den 4 unteren Bits ist es dann genau umgekehrt: Im Code im Tutorial sitzen die schon an der richtigen Stelle 0 bis 3. Man braucht nur die 4 oberen Bits wegmaskieren und kann das Byte dann so wie es ist ausgeben. Bei dir ist es dann anders rum. Deine 4 niederwertigen Bits müssen erstmal nach D4 bis D7 gebracht werden, ehe dann maskiert und ausgegeben werden kann. An dieser Stelle kannst du dann den swap sinnvoll einsetzen. Wie gesagt: Du musst Code analysieren um ihn ändern und anpassen zu können! Du musst verstehen, warum in einer Funktion bestimmte Operationen gemacht werden und warum sie genau an dieser Stelle stehen und nicht woanders. Du musst nachvollziehen, welche Bits wohin gehören und wie dies durch die Operationen gemacht wird. Das mit dem Code analysieren gilt grundsätzlich in allen Programmiersprachen, aber nirgends so sehr wie in Assembler! Zu denken "Ach, da pass ich einfach ein paar Zahlenwerte an und dann passt das schon" - das ist ein Trugschluss! Willkommen in Assembler, wo die Tante-BASCOM nicht mehr mit dir aufs Klo Lulu machen geht.
> @Pascal Haury
Und hast du Zeichen auf das LCD gezaubert?
Nö, bis jetzt noch nicht. Kann aber noch dauern, da ich zurzeit noch in der Planung Stecke, wo ich nächste Woche Verreise. Mfg Pase-h
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.