Forum: Mikrocontroller und Digitale Elektronik Ein paar Fragen zum T6963C


von Marco Vogt (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

Hi,
also das mit den 0x20 ist einfach.
Beim T6963C ist der ASCI-Zeichensatz um 0x20
verschoben.
Die Steuerzeichen fehlen halt.

Dieter

von thkaiser (Gast)


Lesenswert?

mov data, temp1-0x20

-->

mov data, temp1
subi data,0x20

von Marco Vogt (Gast)


Angehängte Dateien:

Lesenswert?

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 :)

von thkaiser (Gast)


Lesenswert?

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.

von Marco Vogt (Gast)


Lesenswert?

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?

von Marco Vogt (Gast)


Lesenswert?

Ich hab jetzt auch die Grafikparameter eingestellt (gleiche Werte wie 
beim Text, ich stelle ja eh nur Text dar), aber es bringt trotzdem 
nichts...

von thkaiser (Gast)


Lesenswert?

Nimm mal den "XOR"-Mode raus. "Nur Text" einstellen.

von Marco Vogt (Gast)


Lesenswert?

"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 :)

von Marco Vogt (Gast)


Lesenswert?

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

von Marco Vogt (Gast)


Lesenswert?

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.

von Marco Vogt (Gast)


Angehängte Dateien:

Lesenswert?

Ach ja, hier der aktuelle Code

von Marco Vogt (Gast)


Lesenswert?

Kann mir denn keiner helfen? ;)

von Jochen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo marco
im Anhang ist ein C code der auch ein 160x128 T6963 LC-Display 
initiatisiert.

von Marco Vogt (Gast)


Lesenswert?

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.

von Jochen (Gast)


Lesenswert?

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

von Jochen (Gast)


Lesenswert?

ach was ich noch sehe ist das du denn RESET mit ; übergehst.
Der RESET ist wichtig und muss lang genug anliegen

von Marco Vogt (Gast)


Lesenswert?

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 
:)

von Sven Berger (Gast)


Angehängte Dateien:

Lesenswert?

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