OLED-Display mit SSD1322-Controller und 256x64 Pixel

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

OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 02.10.2011 - 20:47  ·  #1
Bitte sehr :happy:

Soweit ich es testen konnte funktioniert alles bis auf gDrawBitMap (was ich mir allerdings überhaupt nicht erklären kann).

Ich hätte es gerne noch mit readonly/linear getestet, aber dieses EVAboard hat das vom µC nicht hergegeben (nur 2 k RAM). Ich bin sicher, daß das wesentlich schneller ginge/besser wäre. Leider müssen bei diesem Controller immer mindestens 2 Bytes (=4 Pixel) gelesen/geschrieben werden. Mein SetPixel/ClearPixel/XOrPixel muß also immer 2 Bytes lesen, Pixel ändern, 2 Bytes schreiben. Bei Read/WriteByte werden immer 8 Pixel = 4 Bytes verarbeitet.
Die Geschwindigkeit läßt also leider noch zu wünschen übrig (evtl. kann das ja mal jemand Assembler-optimieren).

gruss
Harry
You must be logged in or your permissions are to low to see this Attachment(s).
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 14.12.2022 - 15:42  ·  #2
Ein kleines Update .... Dank einer Spende von Miparo hatte ich die Gelegenheit ein solches Display doch noch linear/readonly zu testen. Zur Erinnerung: OLED 256x64 Pixel, Controller SSD1322,
Endlich ist der Bildaufbau gewohnt schnell ~82ms. Bei der erforderlichen und aufwendigen Schwarz/weiss-Graustufenumwandlung eigentlich ok. Evtl. weiß ja jemand, wie man das schneller machen kann?

Gruss
Harry
You must be logged in or your permissions are to low to see this Attachment(s).
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 15.12.2022 - 02:40  ·  #3
Hi Harry,
Supi.

GraphIOS evtl etwas flotter so:
Code
userdevice GraphIOS(Cmd: byte; Arg: byte);
begin
  if Cmd = 0 then                                          // command
    if Arg = 0 then
      SendOLEDCmd($15);        // Set Column Address  , sichtbarer Bereich 28 - 91 vertikal
      SendOLEDdata(28);        // 28
      SendOLEDdata(91);        // 91
      SendOLEDCmd($75);        // Set Row Address  , sichtbarer Bereich 0-63 horizontal
      SendOLEDdata(0);
      SendOLEDdata(63);
      SendOLEDCmd($5C);        // Befehl Write OLED RAM bleibt aktiv bis ein nächstes Kommando kommt
    endif;
  else                         // data

    asm;
      LDI       _ACCCLO, %.DispData AND 0FFh
      LDI       _ACCCHI, %.DispData SHRB 8
      LDD       _ACCB, Y+000h
      LDI       _ACCBLO, 4

      IOS_LOOP:
      CLR       _ACCA
      SBRC      _ACCB, 7
      LDI       _ACCA, $F0
      LSL       _ACCB
      SBRC      _ACCB, 7
      ORI       _ACCA, $0F
      ST        Z+, _ACCA
      LSL       _ACCB
      DEC       _ACCBLO
      BRNE      IOS_LOOP
    endasm;

    for DispCounter:= 0 to 3 do
      SendOLEDdata(DispData[DispCounter]);
    endfor;
  endif;
end GraphIOS;
{$D+}
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 15.12.2022 - 16:30  ·  #4
..... und ein Bild vom Display ... von Miparo gemopst :D
You must be logged in or your permissions are to low to see this Attachment(s).
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 15.12.2022 - 17:12  ·  #5
Hi Harry,
das gibt ne Abmahnung :D
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 15.12.2022 - 18:10  ·  #6
Hi Miparo,

bitteeeeeeeee nicht :D

Du bist ein Genie. Mit deinem Assembler-Code dauert der Refresh nur noch 41.3ms - doppelt so schnell.
Dein SendOLEDData und SendOLEDCMD hab ich allerdings nicht verwendet.

Gruss
Harry
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 15.12.2022 - 18:13  ·  #7
die For Schleife immer als downto benutzen, das geht flotter.
Wobei eine While Schleife noch schneller ist und immer runter zählen, da ein BRNE auf Null testen flotter ist als immer auf den Endwert zu testen.

"SendOLEDData und SendOLEDCMD"

Solltest du aber evtl tun, da hier immer ein unütze bytes auf den Frame gelegt werden muss.
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel

 · 
Posted: 20.12.2022 - 16:22  ·  #8
Wird das Programm wie folgt geändert ....
Code

Var
  OLED_CD[@PortD,2]     : Bit;
  OLED_RST[@PortD,3]    : Bit;
  
  DispData              : Array[0..3] of Byte;   // Displaydata schwarz/weiss --> graustufen
  ArrayCounter          : Integer;
  
  Counter               : Integer;


Procedure WriteOLED_C(Arg: Byte);                     // Command-Byte zum LCD senden
  Begin
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD(Arg);                                 // Output Arg
    OLED_CD:=1;                                       // Daten
  End WriteOLED_C;


Procedure WriteOLED_D(Arg: Byte);                     // Daten zum LCD senden
  Begin
    SPIOutByteD(Arg);                                 // Output Arg
  End WriteOLED_D;

  
Procedure Init_OLED;
  Begin
    MDelay(50);
    Oled_RST:=0;
    MDelay(50);
    Oled_RST:=1;
    MDelay(50);
    WriteOLED_C($FD);        //Display Lock  einmalig,damit das OLED Commandos empfängt
    WriteOLED_D($12);
    WriteOLED_C($AE);        //Display OFF  , Displaycontroller aktiv,Panel inaktiv
    WriteOLED_C($B3);        //Display Clock , interner Osc und Divisor , bleibt unverändert
    WriteOLED_D(%10010001);
    WriteOLED_C($CA);        //Set Multiplex , entspricht der Pixelhöhe des Displays
    WriteOLED_D(63);         //Höhe - 1    ,  64 Pixel
    WriteOLED_C($A2);        //Set Offset , beginne bei Reihe 0
    WriteOLED_D(0);
    WriteOLED_C($A1);        //Set Startline , beginne bei Reihe 0
    WriteOLED_D(0);
    WriteOLED_C($A0);        //Set Remap
    WriteOLED_D(%00000110);  //0b00000110  verkehrt ,0b00010100 normal(Displayanschluß unten)
    WriteOLED_D(%00010001);
    WriteOLED_C($B5);        //Set GPIO  , keine weitere Bedeutung da diese Pin's nicht rausgeführt
    WriteOLED_D(0);
    WriteOLED_C($AB);        //Set Funktion , bleibt unverändert
    WriteOLED_D($01);
    WriteOLED_C($B4);        //External VSL , bleibt unverändert
    WriteOLED_D($A0);
    WriteOLED_D($FD);
    WriteOLED_C($C1);        //Set Contrast Current , Genereller Kontrast , bleibt unverändert
    WriteOLED_D($FF);
    WriteOLED_C($C7);        //Set Master Contrast , Hier ist eine Helligkeitsanpassung möglich
    WriteOLED_D($08);        // 0-14  Empfehlung 9-10 oder weniger , je mehr umso weniger LifeTime !!!
    WriteOLED_C($B9);        //Set Default Gray Scale , bleibt unverändert
    WriteOLED_C($B1);        //Set pre & dis_charge , bleibt unverändert
    WriteOLED_D($E2);
    WriteOLED_C($D1);        //Enhance Driving Scheme , bleibt unverändert
    WriteOLED_D($82);
    WriteOLED_D($20);
    WriteOLED_C($BB);        //Set pre-charge Voltage
    WriteOLED_D($08);
    WriteOLED_C($B6);        //Set Second Pre-charge Period
    WriteOLED_D($0F);
    WriteOLED_C($BE);        //Set VCOMH
    WriteOLED_D($07);
    WriteOLED_C($A6);        //Display normel  , "0xa7" Display reverse
    MDelay(50);
    WriteOLED_C($AF);        //Display ON  , Displaycontroller aktiv,Panel aktiv
  End Init_OLED;


Procedure chDispRefresh;                              //
  Begin
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD($15);                                 // Output Arg
    OLED_CD:=1;                                       // Daten
    SPIOutByteD(28);
    SPIOutByteD(91);
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD($75);                                 // Output Arg
    OLED_CD:=1;                                       // Daten
    SPIOutByteD(0);
    SPIOutByteD(63);
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD($5C);                                 // Output Arg
    OLED_CD:=1;

    For ArrayCounter:=0 to 2047 do
      _ACCB:=GraphColArr[ArrayCounter];          // DisplayArray in _ACCB leden
        ASM;                                     // von Thorsten
          LDI        _ACCCLO, %.DispData AND 0FFh
          LDI        _ACCCHI, %.DispData SHRB 8  // Pointer auf Data laden
          //LDD        _ACCB, Y+000h               // Arg from Frame laden
          LDI        _ACCBLO, 4                  //

          IOS_LOOP2:
          CLR        _ACCA                       // Ausgangspunkt data:=0
          SBRC       _ACCB, 7                    // Bit 7 in ARG testen
          LDI        _ACCA, $F0                  // wenn gesetzt DATA:=$F0
          LSL        _ACCB                       // ARG nach links schieben
          SBRC       _ACCB, 7                    // Bit 6 ... jetzt testen  SkipRegisterBitClear
          ORI        _ACCA, $0F                  // gesetzt  Data := data or $0F
          ST         Z+, _ACCA                   // Data wegspeichern und Data Ptr um 1 erhöhen
          LSL        _ACCB                       // ARG shift left um oben Bit 5 ... zu testen
          DEC        _ACCBLO                     // wenn Loop var nicht 0 nochmal
          BRNE       IOS_LOOP2                   //
        EndASM;

        SPIOutD(@DispData,4);

      EndFor;
  End chDispRefresh;
  
  
{$D-}
UserDevice GraphIOS(Cmd: Byte; Arg: Byte);
  Begin
  End GraphIOS;
{$D+}

..... und anstatt gDispRefresh mein chDispRefresh verwendet, dauert der Displayrefresh unter gleichen Bedingungen wie oben nur noch 15.7ms anstatt 41.3ms!

Durch den Merlin-Optimizer gejagt, wird es nochmal um ca. 1ms schneller :) 14.67ms.

Gruss
Harry
  • 1
  • 2
  • Page 1 of 2
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: 15 · Cache Hits: 13   134   147 · Page-Gen-Time: 0.034537s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI