Forum: Mikrocontroller und Digitale Elektronik T6963


von Max F. (Gast)


Lesenswert?

Hallo,

ich habe einen T6963 Display zu laufen bekommen.
jetzt habe ich da noch Probleme mit der Text Ausgabe.
Ich soche eine Funktion die so aufgebaut ist wie die printf Funktion in
ANSI C. Das heisst dass ich das Format der Ausgabe noch einstellen kann.
Gibt es im Netz irgendwo so eine Funktion für das Display T6963?

von Max F. (Gast)


Lesenswert?

Wenn ich eine Int oder Char Variable habe möchte ich diese der Funktion
printf übergebn, und diese soll den Wert auf das Display darstellen.

von Klaus (Gast)


Lesenswert?

Man muss mit "sprintf" die auszugebenden Strings im Speicher erstellen
und dann entweder an den Textlayer ausgeben oder in Grafik umwandeln
über einen eigenen Zeichensatz.
Der Speicherbereich sollte als 2-dim. Array, z.B. mit char
textarray[4][20]  definiert werden (mit der tatsächlich verwendeten
Zeilen- und Spaltenzahl des LCD).
Zunächst das Textarray jedesmal löschen mit Blanks 0x20 oder Nullen
0x00.
Dann z.B. mit  sprintf(&textarray[1][8], "Hallo");  in den Speicher
schreiben ; Format sonst wie bei printf, also  z.B.  %d  usw.
Das Textarray mit den einzelnen Strings über einzelne sprint
beschreiben, dabei Überschneidungen vermeiden.
Ausgaberoutine so gestalten, dass kein Abbruch bei 0x00 stattfindet
sondern erst am Ende des Arrays (Abschluss-Null der einzelnen
Strings!).

von Max F. (Gast)


Lesenswert?

Hallo,

ich hab mal die Funktionen mit CodeVision AVR programmiert.
//Deklaration
char text_buffer[20];
float zahl_buffer[20];
char flash format[20];

//Funktionen
void LCD_write_zahl(unsigned int x, unsigned int y, unsigned char
*zahl)    // write String an pos x, y
{
  unsigned int address;

  address = ((unsigned int)y * 22) + x + 0x1000;

  out(0x24,address & 0xff,address >> 8);
  while (*zahl)
   {
    out(0xC0,0,(*zahl++)-0x20);
   }
}

void LCD_write_text(unsigned int x, unsigned int y, unsigned char flash
*text)    // write String an pos x, y
{
  unsigned int address;

  address = ((unsigned int)y * 22) + x + 0x1000;

  out(0x24,address & 0xff,address >> 8);
  while (*text)
   {
    out(0xC0,0,(*text++)-0x20);
   }
}

void LCD_printfz(unsigned int x, unsigned int y, unsigned char flash
*format, unsigned char *zahl)
{
 sprintf(zahl_buffer,format,zahl);
 LCD_write_zahl(x, y, zahl_buffer);
}

void LCD_printft(unsigned int x, unsigned int y, unsigned char flash
*text)
{
 sprintf(text_buffer,text);
 LCD_write_zahl(x, y, *text_buffer);
}

Der Compiler von CodeVision AVR bringt immer folgende Warnung:
--> suspicious point conversion

Was mache ich da falsch?

von Max F. (Gast)


Lesenswert?

Kann mir dazu echt niemand helfen! Ich komme wirklich nicht weiter.
Ich habe jatzt mal eine andere Funktion gemacht, mit der ich einen
ganzen String auf das Display ausgeben will. Warum mekert der Compiler.
Ich weiss nicht mehr weiter.
Der CodeVisionAVR Compiler mekert mal wieder:

-->pointers are to different memory areas

//Code
void lcd_printf(unsigned char * string, unsigned char x, unsigned char
y)
{
 unsigned int address,i;
 address= y * 22 + x + 0x1000;
 out(0x24, address & 0xff,address >> 8);
 out(0xB0, 0, 0);

 for (i=0; string[i]; i++)
  {
   out(0xC0, 0, string[i]-0x20);
  }
 out(0xB2, 0, 0);
}

//Hautprogramm
lcd_printf("HALLO",10,10);

von Max F. (Gast)


Lesenswert?

jetzt funzt es: und zwar muss man bei dem sprintf Befehl das flash davor
stehe.

//Code
void lcd_printf(unsigned char flash * string, unsigned char x, unsigned
char
y)
{
 unsigned int address,i;
 address= y * 22 + x + 0x1000;
 out(0x24, address & 0xff,address >> 8);
 out(0xB0, 0, 0);

 for (i=0; string[i]; i++)
  {
   out(0xC0, 0, string[i]-0x20);
  }
 out(0xB2, 0, 0);
}

//Hautprogramm
lcd_printf("HALLO",10,10);

Ok, mit dieser Funktion kann ich jetzt einen Text Ausgeben.
Ja wie müsste die Funktion aussehen wenn ich eine Integer Variable auf
dem Display ausgeben will? Da hab ich noch meine Probleme.
Die Funktion sollte da so aussehen:
void lcd_printf(unsigned int x, unsigned int y, unsigned char flash
*format, unsigned char *zahl);

Im Hauptprogramm müsste man die Funktion so aufrufen:
int TEST = 1234;
lcd_printf(0,0."Variable %4d",TEST);

Könnte mir da irgend jemand dabei helfen?

von Max F. (Gast)


Lesenswert?

Hi Klaus,

mmmhhh...das ist echt kompliziert. Gibt es nicht irgendwo eine fertige
Routine mit der ich dies tun kann. Ok ich weiss es ist blöde wenn man
im Forum nach fertige Codes anfrägt. Aber ich hab ja soweit alles mir
fehlr halt nur noch diese Funktion.

von Max F. (Gast)


Lesenswert?

so mein erster Versuch:

//Funktion
void lcd_test(unsigned int x, unsigned int y)
{
 unsigned int address,i=0;
 sprintf(zahl_buffer,"%04u","1234");


 address = ((unsigned int)y * 22) + x + 0x1000;

 out(0x24,address & 0xff,address >> 8);
 while (zahl_buffer[i])
  {
   out(0xC0,0,zahl_buffer[i]-0x20);
   i++;
  }
}

//Hauptprogramm
lcd_test(0,0);

Auf meinem Display erscheint statt 1234 der Wert 04.

GRRRRRRRRRRRR ich bekomme noch die Krise. Was stimmt da nicht?

von Max F. (Gast)


Lesenswert?

Ich brauche nur die eine Unterstützung.

Warum wandelt die Funktion sprintf die Zahl nicht um?

von Max F. (Gast)


Lesenswert?

Warum gibt mit dazu keine Unterstützung.
Ist es so ein geheimnis.

von Max F. (Gast)


Lesenswert?

int flash zahl_buffer[20];

void lcd_test(unsigned int x, unsigned int y)
{
 unsigned int address,i=0;
 sprintf(zahl_buffer,"ZAHL=%6d",19385);


 address = ((unsigned int)y * 22) + x + 0x1000;

 out(0x24,address & 0xff,address >> 8);
 for (i=0; zahl_buffer[i]; i++)
  {
   out(0xC0, 0, zahl_buffer[i]-0x20);
  }
}

Wenn diese Funktion ausführe, dann erscheint auf dem Display nicht
exakt "ZAHL=19385 sondern nur jedes zweite Zeichen
"ZH=135". Wie kann dass denn sein?

von Max F. (Gast)


Lesenswert?

Danke für die Unterstützung.

von Klaus (Gast)


Lesenswert?

...na, wer ist denn so ungeduldig. Auch Rom wurde nicht an einem Tag
erbaut.
Bin der Klaus von gestern.
Meine Tips sind nur prinzipiell, weil ich in meinen Projekten nur den
alten HD61830 drinhatte, nicht den T6963 ; außerdem auch keinen AVR.

Es gibt aber ein gut dokumentiertes Referenzprojekt mit einem T6963 und
aber HC12 (HCS12), geschrieben in C bei ...

http://elmicro.com/hc12web/acprd/

Das sollte weiterhelfen.

Das Programm habe ich nur kurz angesehen.
Ich habe keine Möglichkeit das irgendwie auszuprobieren.

Mysterium: Nur jedes 2. Zeichen:
Es wäre aber zweckmäßig, deinen "zahl_buffer" mal anzusehen, ob da
die ASCII-Zeichen korrekt drinstehen.
--> Liegt also das Problem an der Erzeugung (sprintf) oder an der
Ausgabe / Darstellung am LCD ?
Und das Datenblatt des DISPLAYS  des T6969  die Initialisierung
nochmals GENAU ansehen. Vielleicht hat der Textbereich komische
Adresszuordnungen, oder es ist ein Modus wo nur das erste Byte als
Zeichen dargestellt wird und das zweite als Attribut vorgesehen ist
(blinken, Negativdarstellung etc.).

Klaus

von Max F. (Gast)


Lesenswert?

Hi Klaus,

vielen Dank!

Ich kann jetzt zumindest mal einen Integer Wert auf dem Display
darstellen.
Wie mache ich dies mit einer Float variable?

//Deklaration
char zahl_buffer[20];
char flash format[10];

//Funktion
void lcd_test(unsigned int x, unsigned int y, unsigned char flash
*format,unsigned int value)
{
 unsigned int address,i=0;
 sprintf(zahl_buffer,format,value);


 address = ((unsigned int)y * 22) + x + 0x1000;

 out(0x24,address & 0xff,address >> 8);
 for (i=0; zahl_buffer[i]; i++)
  {
   out(0xC0, 0, zahl_buffer[i]-0x20);
  }
}

//Hauptprogramm
lcd_test(0,0,"DEZ:%6d",23456);

von Klaus (Gast)


Lesenswert?

Vielleicht mit ...

//Hauptprogramm
lcd_test(0,0, " %4.2f ",  3.14 * 12.34 );

Natürlich kann man auch float Variablen anlegen und dann damit rechnen.


Allerdings: Sobald man "float" verwendet, wird das Programm ofmals
erheblich größer weil dann die entsprechenden Funktionen aus den
Libraries eingebaut werden müssen. Auf kleinen uP kriegt man schnell
Speicherplatzprobleme.

Das ist dann alles ganz normales C.
Vielleicht mal ein Vorlesungsskript lesen:
kommunikationstechnik.fht-esslingen.de/~harms/inf1/c_gesamt.pdf


Klaus

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.