Hi! Ich bin's wieder, der AVR Noob :). Ich bin zwar erst seit ein paar Wochen dabei, aber ich konnte einfach nicht warten und hab mich gestern und heute mit der Ansteuerung meines 160x128 LCDs befasst. Mein erstes Projekt (serielles LCD Terminal mit HD44780 Display) ist fast fertig und das hier ist mein zweites Projekt. Als Vorlage habe ich die C Lib verwendet und einen großen Teil in Assembler portiert. Ich war ganz schön erstaunt, dass die Sache läuft! Das LCD wird initialisiert und links oben blinkt fröhlich der Cursor :) Was jetzt noch nicht klappt ist die Darstellung von Text auf dem Display. In der Lib wird dazu die Funktion lcd_string verwendet: void lcd_string(char s[]) //print string on lcd (no auto linefeed) { register u08 *c; if (!(c=s)) return; while (*c) { lcd_print(*c); c++; } } Hier wird's schwierig, weil ich in C mit Strings so meine Probleme habe... könnt ihr das für mich in Assembler portieren? :D Ich hab's mal mit lcd_print versucht: void lcd_print(unsigned char data) { lcd_data((data-0x20)); lcd_command(0xC0); // flush character return; } Assembler: lcd_print: mov data, temp1-0x20 rcall lcd_data ldi comm, 0x0C rcall lcd_command ret aber da tut sich gar nichts. Bei den HD44780 LCDs kann man ja einfach ein Zeichen ans Display schicken und das wird dann dargestellt. Bei dem T6963C weiß ich nicht, wie es geht und deshalb kommt mir das "-0x20" komisch vor... könnte ihr mir das mit dem Zeichen-ans-Display-senden erklären? Als Anhang schicke ich mein Testprogramm mit.
Hi, also das mit den 0x20 ist einfach. Beim T6963C ist der ASCI-Zeichensatz um 0x20 verschoben. Die Steuerzeichen fehlen halt. Dieter
Danke, bin jetzt einen Schritt weiter. Nur verhält sich das LCD noch nicht so, wie es soll: Nach dem Initialisieren schicke ich eine Reihe Zeichen ans Display, die nicht angezeigt werden, weil das LCD ja noch voller "Müll" ist. Dann wird das Display gelöscht (dummerweise nur etwa die ersten drei Zeilen) und der Cursor blinkt links oben. Danach passiert nichts mehr, obwohl eigentlich ein "E" ausgegeben werden sollte... Das seltsame ist, wenn ich den AVR kurz von der Spannung trenne, passiert nichts, ein weiteres kurzes Trennen löscht das gesamte Display und erst dann ist es komplett leer! NAch einer weiteren Trennung wird dann wie gewünscht "Test1" in die erste Zeile geschrieben... und in alle anderen auch! Danch wird "Test1" wieder von links nach rechts über alle Zeilen gleichmäßig gelöscht. "Test2" wird nie angezeigt, das steht nach dem Löschen an und scheint ihgendwie verloren zu gehen. Obwohl das Programm einfach nur das Display löschen und "Test" schreiben sollte... ich komme einfach nciht weiter und frage mich, ob ich nicht besser nen neuen AVR in Reserve haben sollte, denn wenn das so weitergeht hab ich sehr schnell die 1000 Programmierzyklen voll :)
Beim T6963C muß einiges mehr an Initialisierung getan werden, als bei den 0815 LCDs: - Adresse der Text-Area definieren - Adresse der Grafik-Area definieren - Text / Grafik-Modus festlegen Das mit den ersten 3 Zeilen sieht mir sehr danach aus, daß Du einen Grafik-Modus eingestellt hast.
Ja, das hab ich auch schon gemerkt :) Ich stelle folgende Dinge ein: ldi data, 0x00 rcall lcd_data ;low byte rcall lcd_data ;high byte ldi comm, 0x40 rcall lcd_command ;Text Home Adresse setzen (0,0) ldi data, 0x14 rcall lcd_data ldi data, 0x00 ;low byte rcall lcd_data ldi comm, 0x41 ;high byte rcall lcd_command ;Zeilenlänge auf 40 setzen ldi data, 0x00 rcall lcd_data ;low byte rcall lcd_data ;high byte ldi comm, 0x21 rcall lcd_command ;Cursor Position (0,0) setzen ldi data, 0x00 rcall lcd_data ;low byte rcall lcd_data ;high byte ldi comm, 0x24 rcall lcd_command ;Text Position setzen (0,0) ldi comm, 0x81 rcall lcd_command ;XOR mode (Text und Grafik) ldi comm, 0xA7 rcall lcd_command ;Cursor Pattern (8 pixel hoher Cursor) ldi comm, 0x97 rcall lcd_command ;Display Modus 97=Text, 98=Grafik, 9F=Text+Grafik ...Rest siehe Anhang. Die Grafik-Area definiere ich nicht, weil ich erst mal nur die Textausgabe testen will. Muss ich trotzdem beides definieren?
Ich hab jetzt auch die Grafikparameter eingestellt (gleiche Werte wie beim Text, ich stelle ja eh nur Text dar), aber es bringt trotzdem nichts...
"Nur Text" (also 0x97) hab ich schon von Anfang an eingestellt und wenn ich XOR rausnehme oder auf AND umstelle, wird das Display zwar sofort gelöscht, aber dann wird auch GARNICHTS dragestellt :)
Ich hatte einen Fehler in der lcd_clear Sshleife. Jetzt wird immerhin schon mal das gesamte Display agelöscht. Aber dargestellt wird erst nach einem Reset des AVR etwas (Stromzufuhr kurz unterbrechen).
Also fassen wir zusammen: Das Display wird initialisiert und gelöscht. Text wird aber nicht dargestellt. Kappe ic kurz die Stromversorgung wird sehr kurz Text angezeigt (ich hab zum Testen mal zwischen lcd_init und lcd_clear ein paar Buchstaben gesetzt) aber dann von lcd_clear wieder gelöscht. Text, der nach dem clear geschickt wird, wird nicht dargestellt. Ich tippe mal ganz stark auf einen Fehler in meiner lcd_clear Routine. Aber ich kann nichts ungewöhnliches finden, weil ich mich einfach noch nicht so gut auskenne.
Hallo marco im Anhang ist ein C code der auch ein 160x128 T6963 LC-Display initiatisiert.
Danke! Hab mal beide Codes verglichen aber keine groben Abweicheung gefunden. Hier wird mal eine andere Adresse gesetzt, da ist eine Funktion etwas anderes aufgebaut. Aber im Grunde machen beide das gleiche. Ich hab bei meinem Programm ja die Vermutung, das sich der Fehler in der lcd_clear Funktion befindet. Ich setzt nach dem Löschen schön brav wieder die TextHome Adresse und den Cursor auf 0|0 in dem C Programm steht das nicht in der Löschfunktion.
ich hab den Cursor nicht aktiviert deswegen kommt er nicht vor wenn du in der endlos Schleife die ganze zeit was ans display sendest kann der vielleicht überfordert sein versuchs mal so: start: rcall pause rcall pause rcall pause rcall pause rcall init rcall pause ldi temp1, 'T' rcall lcd_print ldi temp1, 'e' rcall lcd_print ldi temp1, 's' rcall lcd_print ldi temp1, 't' rcall lcd_print ldi temp1, '1' rcall lcd_print loop: rjmp loop
ach was ich noch sehe ist das du denn RESET mit ; übergehst. Der RESET ist wichtig und muss lang genug anliegen
Danke! So wie du es vorgeschlagen hast, hab ich es schon versucht - bringt nix. Und Reset hab ich normalerweise fest verdrahtet, aber auch über den AVR reseten bringt keinen Unterschied :(. Was ich nur absolut nicht kapiere ist dass wenn ich mein programm laufen lasse, das Display an lasse und den AVR so programmiere, das es kein lcd_clear macht klappt es! Naja fast: Ein "Test" wird in alle 16 Zeilen gleichzeitig geschriben :)
Hallo, der Thread ist hier ja schon älter, aber ich versuch es trotzdem einmal. Vorweg, ich bin noch recht neu in Materie Assembler, also nicht über die Eventuellen Umwege in dem Code lachen :-) Ich habe mir auch eine Routine für den T6963C geschrieben, diese baut aber auf einem Code auf, den ich in einem alten Datenblatt des T6963c von '97 gefunden habe. Aber irgendwie klappt er nicht, das Display zeigt nur weiss an mit einigen dunklen streifen! Es ist ein EAW240-7KHLW und soll von einem ATMEGA8535 über PortC und D angesteuert werden. Ich hoffe das Reicht euch an Informationene
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.