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.
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.
"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.
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
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