UserDevice GraphIOS

  • 1
  • 2
  • 3
  • Page 1 of 3
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2090
Registered: 03 / 2003
Subject:

UserDevice GraphIOS

 · 
Posted: 17.09.2011 - 16:12  ·  #1
Hallo Rolf,

ich hoffe sie sind noch nicht am verzweifeln wegen mir ? :D
Eine Verständnisfrage zum UserDevice GraphIOS:
Im Handbuch sind folgende Übergabeparameter dafür angegeben:
Code
UserDevice GraphIOS (cmd : byte; adr : word; mask, pixel : byte) : byte;

Gehe ich recht in der Annahme, daß die Adresse "adr" in 8-Pixel-Blöcken erfolgt und die Variable "mask" diese 8 Pixel repräsentiert ?
Im angehängten Bild wäre also adr=0 und mask=%00100000 für das obere linke rote Rechteck und adr=74 und mask=%00000100 für das untere rechte gelbe Rechteck ?
Kann ich ein Display vollständig ansprechen, wenn nur die Routinen für Init, Clear, SetPixel und ClearPixel vorhanden sind ?

gruss
Harry
Attachments
UserDevice GraphIOS
Filename: GLCD.png
Filesize: 4.13 KB
Title:
Download counter: 135
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: UserDevice GraphIOS

 · 
Posted: 17.09.2011 - 18:01  ·  #2
Hallo Harry,

ich steige da nicht ganz durch. Oberes linkes Rechteck? Unteres gelbes Rechteck?

Es wird immer ein Byte übergeben. Dieses Byte enthält 8pixel. Wie dieses Byte auf dem LCD dargestellt wird, hängt von der Definition im Treiber ab. Normalerweise liegt dieses Byte horizontal bzw. zeilenweise im Display. Ausnahme sind diese Controller die spaltenweise schreiben. Dann dreht der Treiber die Bytes so dass sie vertikal angezeigt werden. Das LCD bestimmt die Darstellung, horizontal oder vertikal. Das muss via Define dem AVRco Treiber mitgeteilt werden.

Einfach mal die diversen Graphic LCD Beispiel anschauen und diese mal im Simulator laufen lassen.

rolf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2090
Registered: 03 / 2003
Subject:

Re: UserDevice GraphIOS

 · 
Posted: 18.09.2011 - 19:50  ·  #3
Hi Rolf,

meine Grafik oben soll ein Display mit 64x64 Pixel darstellen, in welchem 4 Pixelblöcke = 4 Bytes farbig markiert sind. Auf diese 4 Blöcke ist mein links/rechts/oben/unten bezogen.

Mir ist klar, daß ein Byte=8 Pixel sind. Wo ist diese Byte versteckt ? Ist das die Variable "mask" ? Ich habe hier ein Display mit 1 Pixel = 1 Byte und möchte das anpassen. Natürlich ist das wegen der aufwendigen Adressierung nicht so schnell, aber wenn es denn funktioniert bin ich :love: . Ich habe 4 Funktionen die auch funktionieren: ClrScr, Init, SetPixel und ClearPixel und muß diese "nur" noch ins UserDevice einbinden. D.h. mein SetPixel und ClearPixel wird 8x ausgeführt für ein "normales" Daten-/Pixelbyte. Nur (wie gesagt) welches ist das ?

gruss
Harry

PS: Dummerweise arbeitet mein Set/ClearPixel direkt mit X/Y-Koordinaten und nicht mit einer Displayspeicheradresse.
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2090
Registered: 03 / 2003
Subject:

Re: UserDevice GraphIOS

 · 
Posted: 18.09.2011 - 21:41  ·  #4
Ich komm ned drauf. Alsooooooo ich bin davon ausgegangen, daß vom LCDGraphic immer eine Adresse übertragen wird und ein Byte welches 8 Pixel enthält. Wenn ich meine obige Zeichnung (64x64 Pixel) als Beispiel nehme (lineare Adressierung z.B. T6963-Controller) und ein SetPixel(2,8) mache, habe ich vermutet, daß als Adresse 66 und als Mask %10000000 (wenn "Mask" die 8 Pixel enthält ???) übergeben wird. Der Displaybereich X=0-63 mit Y=0-7 sind Adresse 0-63 mit jeweils einem Byte. Demnach sollte doch X=0-63 mit Y=8-15 Adresse 64-127 sein ? Sorry so hab ich es eben verstanden.

gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2090
Registered: 03 / 2003
Subject:

Re: UserDevice GraphIOS

 · 
Posted: 19.09.2011 - 12:50  ·  #5
Es geht :love: ..... bedingt :devil: . Danke Rolf - Ihr erster Post hatte versteckt den entscheidenden Hinweis enthalten.

Ich kann auf jeden Fall mit gDrawString Texte ausgeben auf dem gesamten Display. Was ich nun seltsam finde: warum gehen Line/Rect/BitMaps nicht ? Was ist da anderst ?
Auf dem Foto habe ich unten ein gFillRect(0,32,255,63,$FF) ausgegeben, jedoch fehlt der Bereich in der Mitte. Wie gesagt Text geht überall.

Irgendeine Idee ?

gruss
Harry
Attachments
UserDevice GraphIOS
Filename: OLED.jpg
Filesize: 17.16 KB
Title:
Download counter: 95
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2090
Registered: 03 / 2003
Subject:

Re: UserDevice GraphIOS

 · 
Posted: 19.09.2011 - 22:45  ·  #6
Update: Zeichenoperationen gehen immer noch nicht richtig. Ich habe aber inzwischen festgestellt, daß z.B. ein gFillRect immer soweit ausgeführt wird, bis ein vielfaches von 8 bei der X-Koordinate erreicht wird. Beim obigem Bild wird von einem gFillRect(0,32,255,63,$FF) nur gFillRect(0,32,7,63,$FF) und gFillRect(248,32,255,63,$FF) dargestellt - das dazwischen fehlt. bei jedem gFillRect, egal wo ich es platziere, wird immer nur X-Start bis zum vielfachen von 8 und von einem vielfachen von 8 bis X-Ende dargestellt. Irgendeine Idee wie das sein kann ?

Ich habe auch mal ein gFillCircle getestet: das gleiche (sieht witzig aus :D ). Die Außenkontur des Kreises ist erkennbar, aber die Füllung endet bei einem vielfachen von 8 in X-Richtung.

Implementiert im GraphIOS ist SetPixel, ClearPixel und XOrPixel.

gruss
Harry
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: UserDevice GraphIOS

 · 
Posted: 19.09.2011 - 23:59  ·  #7
Hallo Harry,

beachten Sie auch die Maske?

rolf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2090
Registered: 03 / 2003
Subject:

Re: UserDevice GraphIOS

 · 
Posted: 21.09.2011 - 11:00  ·  #8
Hallo Rolf,

ich denke schon und hoffe auch richtig. Anbei mal mein SetPixel.
Code
Procedure Set8Pixel(Adr:Word;Mask:Byte);
  Var DP         :Array[0..3] of Byte;
      XD,YD      :Byte;
      DC         :Byte;
      X1D        :Byte;
  Begin
    YD:=Lo(Adr div 32);                          // Y-Koordinate
    XD:=(Lo(Adr-(Word(YD)*32))*2)+28;// X-Koordinate + Offset
    Sende_C($15);                    // X-Bereich setzen X-Start  
    Sende_D(XD);                     // X-Bereich setzen X-Ende
    Sende_D(XD+3);                 // +3 = 8 Pixel (1 Byte=2 Pixel)
    Sende_C($75);                    // Y-Bereich setzen
    Sende_D(YD);                     // Y-Bereich Y-Start
    Sende_D(YD);                     // Y-Bereich Y-Ende
    Sende_C($5D);                    // Read
    X1D:=Read_D;                     // Dummy Read
    For DC:=0 to 3 do                // 8 Pixel lesen / 4 Byte
      DP[DC]:=Read_D;
      EndFor;
    Sende_C($15);
    Sende_D(XD);
    Sende_D(XD+3);
    Sende_C($75);
    Sende_D(YD);
    Sende_D(YD);
    Sende_C($5C);                     // Write
    For DC:=0 to 7 do
      If ((Mask shl DC) and $80)=$80         // PIxel setzen
        then
          If Even(DC)
            then
              DP[DC div 2]:=DP[DC div 2] or $F0;
            else
              DP[DC div 2]:=DP[DC div 2] or $0F;
            EndIf;
        EndIf;
      EndFor;
    For DC:=0 to 3 do                // 8 Pixel schreiben / 4 Byte
      Sende_D(DP[DC]);
      EndFor;
  End Set8Pixel;


gruss
Harry

PS: Sende_C = Write Command, Sende_D = Write Data, Read_D = Read Data
  • 1
  • 2
  • 3
  • Page 1 of 3
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 17 · Cache Hits: 15   138   153 · Page-Gen-Time: 0.025704s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI