mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GLCD T6963


Autor: Schwarz (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo thkais !

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

Autor: Ralf (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ralf!

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

Autor: thkais (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich dies unter CodeVisionAVR realisieren?

Autor: Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rufus!

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Schwarz (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So Leute nun Ist es geschaft Codevision kann nun auch grafiken
wiedergeben.!


www.EFichte.de


MFG: Fichte

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.