Forum: Mikrocontroller und Digitale Elektronik GLCD T6963


von Schwarz (Gast)


Lesenswert?

Guten Morgen!

Ich möchte mit diesem Diplay eine Grafik (Bitmap) darstellen.
Ich konvertiere das RAW File mit dem Tool BIN2C.
Leider weiss ich nicht wie ich jetzt meinem Display erklären soll, dass
er blockweise die Pixel drstellen lassen soll.
Hat jemand für so was schon einen C-Code?

von thkais (Gast)


Lesenswert?

Da gibt es zwei Möglichkeiten:
A: Die Grafikdatei einlesen, die einzelnen Bits herausisolieren und je
nachdem einen Pixel auf dem Display setzen.
Vorteil: Die Grafik kann Pixelgenau gesetzt werden.
Nachteil: Langsam.
B: Die Grafikdatei Byteweise übertragen. Das T6963 ist Byteweise
organisiert (s.Datenblatt, da ist das sehr schön erklärt).
Vorteil: Wesentlich schneller.
Nachteil: Kann nicht (oder nur mit Aufwand) Pixelgenau gesetzt werden.

Software: Schau mal bei Holger Klabunde vorbei, er hat C-Code für das
T6963-Display auf seiner Homepage:
http://home.t-online.de/home/holger.klabunde/avr/avrboard.htm

von Schwarz (Gast)


Lesenswert?

Hei vielen Dank!

Ich habe da ne Funktion gefunden.
Leider verstehe ich nicht richtig wie die Funktion funktioniert.

void LoadBitmap(unsigned char *bitmap,unsigned char xpos , unsigned
char ypos, unsigned char width, unsigned char height)
{
 unsigned char bwidth,i,j,k,yp,xp;
 unsigned char by,mask;
 unsigned int xend;     //xpos + width kann größer als 255 werden

 xend=(unsigned int)xpos + (unsigned int)width;
 if(xend>LCD_WIDTH) xend=LCD_WIDTH; //Bitmap abschneiden wenn außerhalb
des Displays

 bwidth=width/8; //Anzahl Bytes horizontal
 if((width%8)!=0) bwidth++; //Bei Rest noch ein Byte mehr

 yp=ypos;
 for(i=0; i<height; i++) //Über die gesamte Höhe
  {
   xp=xpos; //Zum Beginn der Zeile

   for(j=0; j<bwidth; j++) //Über die gesamte Breite in Bytes
    {
     by=PRG_RDB(bitmap);

#ifdef PIXPERBYTE_8
     if((xp % 8 ==0) && (xp < LCD_WIDTH-8)) //Die schnelle Methode
      {
         SetPixel(xp,yp,0);
         WriteData1(by,0xC0); //write 8 pixel with one command
         xp+=8;
      }
     else //Die langsame Methode
      {
#endif //#ifdef PIXPERBYTE_8
       mask=0x80;         //Fängt bei MSB an

       for(k=0; k<8; k++) //Über ein Byte
        {
          //Nur vorhandene und keine Füllpixel,-bytes zeichnen
          if(xp < (unsigned char)xend)
          {
           SetPixel(xp,yp,(by & mask) );
           xp++;
          }

         mask>>=1; //Nächstes Bit
        }//for k

#ifdef PIXPERBYTE_8
      }//else if((xp % 8 ==0) && (xp <.....
#endif

     bitmap++;
    } //for j

   yp++; //Nächste Zeile
  } //for i
}

von Schwarz (Gast)


Lesenswert?

Ich verstehe diese Ausdrücke mit ifdef und endif nicht.

von Schwarz (Gast)


Lesenswert?

Hallo thkais !

Welche Methode würdest du mir empfehlen?
Was ist leichter und schneller zu realisieren?
Hast du ein Beispiel?

von Ralf (Gast)


Lesenswert?

Man kann die Schriftgröße beim T6963 Display Controller per Hardware
einstellen, z.B. 6x8 Pixel pro Buchstabe oder 8x8 usw. Das wirkt sich
auf die Grafik so aus, dass bei 6x8 Pixel auch nur 6 Bits eines Bytes
verwendet werden, um Grafik darzustellen. D.h. um acht Pixel
darzustellen, brauchst du 1 volles Byte für die ersten 6 Pixel, und 2
Bits vom nächsten Byte.

Daher die Anpassung mit dem #ifdef.

Gruß Ralf

von Schwarz (Gast)


Lesenswert?

Hallo Ralf!

Weisst du wie man 8Pixel blockweise auf ds Display bekommt.
Wie muss ich die C Funktion dazu schreiben?

von thkais (Gast)


Lesenswert?

Ähm, Schwarz, bitte nicht böse sein, aber wenn Du den Code von Holger
nicht verstehst, dann wirst Du auch keinen anderen Code verstehen. Viel
einfacher und universeller gehts kaum. Ich würde Dir empfehlen, Dich
erst einmal mit den Grundlagen des Controllers und der Sprache C
vertraut zu machen - insbesondere die Besonderheiten von C auf
µControllern - und dann, mit genügend Hintergrundwissen, kann man sich
an die Königsklasse "Grafik-LCD" wagen.
Schließlich kannst Du ja auch nicht direkt nach dem Führerschein einen
Formel-1 Wagen fahren...

von Ralf (Gast)


Lesenswert?

Hi Schwarz,

du musst den Beginn des Grafik-Bereichs im Display-RAM festlegen.
Danach den Adress-Pointer des Displays auf eben diesen RAM-Bereich
setzen. Dann kannst du 8 Pixel jeweils auf einmal setzen, indem du
einfach das entsprechende Byte dorthin schreibst.

Prinzipiell lässt sich sagen, dass der RAM auf dem Display = den
angezeigten Pixeln entspricht.

Nicht vergessen, den Grafik-Modus anzuschalten.
Angaben dazu findest du im Datenblatt zum Display bzw. zum T6963.

Gruß Ralf

von Schwarz (Gast)


Lesenswert?

In der Funktion "LoadBitmap" steht dieser Ausdruck
--> by=PRG_RDB(bitmap);

PRG_RDB kann ich aber nirgends finden. Was bedeutet PRG_RDB?

Wenn der Code ausgeführt wird, wird dieser Abschnitt nicht
ausgeführt,oder?

#endif //#ifdef PIXPERBYTE_8
       mask=0x80;         //Fängt bei MSB an

       for(k=0; k<8; k++) //Über ein Byte
        {
          //Nur vorhandene und keine Füllpixel,-bytes zeichnen
          if(xp < (unsigned char)xend)
          {
           SetPixel(xp,yp,(by & mask) );
           xp++;
          }

         mask>>=1; //Nächstes Bit
        }//for k

von Rufus T. Firefly (Gast)


Lesenswert?

PRG_RDB ist ein AVR-spezifischer Ausdruck, der einen Byte-Wert aus dem
Flash-ROM liest. Das hat mit der Harvard-Architektur der ARs zu tun.

Wieso sollte der Abschnitt nicht ausgeführt werden?

von Schwarz (Gast)


Lesenswert?

Ich verwende CodeVisionAVR. Das kann ich nicht "PRG_RDB" benutzen.
Wie müsste ich dann den Ausdruck bei CodeVisionAVR
"by=PRG_RDB(bitmap);" abändern?

Vielleicht so:

by = bitmap[i];

i++;

von Schwarz (Gast)


Lesenswert?

Wie kann ich dies unter CodeVisionAVR realisieren?

von Schwarz (Gast)


Lesenswert?

Hallo Rufus!

Den Ausdruck "PRG_RDB" gibt es bei CodeVisionAVR nicht.
Wie kann müsste ich es dort machen?

von Rufus T. Firefly (Gast)


Lesenswert?

PRG_RDB ist nur dann erforderlich, wenn konstante Daten aus dem
Flash-ROM gelesen werden sollen. Sollte die Bitmap im RAM liegen,
einfach

  by = *bitmap;

schreiben.

(bitmap ist ein Pointer, der anderswo in der Schleife inkrementiert
wird, daher ist kein Array-Zugriff à la bitmap[i] erforderlich),

Auf welche Art und Weise man Bytes aus dem Code-Speicher Deines
Prozessors extrahieren kann, sollte im Handbuch Deines Compilers
stehen.

von Schwarz (Gast)


Lesenswert?

Und wie muss ich dann dies hier schreiben? --> bitmap++
Kann ich da dann auch *bitmap++ schreiben?

Das Display zeigt nurSchrott bei mir an, anstatt ein Bild.
Meinen Code habe ich auf 8x8 eingestellt.

von Fichte (Gast)


Lesenswert?

So Leute nun Ist es geschaft Codevision kann nun auch grafiken
wiedergeben.!


www.EFichte.de


MFG: Fichte

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.