mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik T6963


Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!).

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich brauche nur die eine Unterstützung.

Warum wandelt die Funktion sprintf die Zahl nicht um?

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum gibt mit dazu keine Unterstützung.
Ist es so ein geheimnis.

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Unterstützung.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.