closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

OLED-Display mit SSD1322-Controller und 256x64 Pixel



Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003
Private message
Subject: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 02.10.2011 - 20:47   -  
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).
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 1-times. Last edit: 02.10.2011 - 20:50 by Harry.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 14.12.2022 - 15:42   -  
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).
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 56
Posts: 935
Registered: 09 / 2007
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 15.12.2022 - 02:40   -  
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+}
Kein Support per PN! | No support via PM!
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 15.12.2022 - 16:30   -  
..... 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).
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 1-times. Last edit: 15.12.2022 - 16:31 by Harry.
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 56
Posts: 935
Registered: 09 / 2007
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 15.12.2022 - 17:12   -  
Hi Harry,
das gibt ne Abmahnung :D
Kein Support per PN! | No support via PM!
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 15.12.2022 - 18:10   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 56
Posts: 935
Registered: 09 / 2007
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 15.12.2022 - 18:13   -  
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.
Kein Support per PN! | No support via PM!
This post has been edited 1-times. Last edit: 15.12.2022 - 18:42 by miparo.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 20.12.2022 - 16:22   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 3-times. Last edit: 20.12.2022 - 16:38 by Harry.
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 56
Posts: 935
Registered: 09 / 2007
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 20.12.2022 - 23:09   -  
Hi Harry,
hättest du meinen Rest ASM noch dazu gefügt, wäre es schneller :)

SPIOutD(@DispData,4); hat einen riesen Overhead, das kann man gleich in der Umwandlung abschicken
dann wird auch DispData nicht mehr gebraucht.
Die dicke For Schleife wird dann auch schlanker .

Da bleibt für den Opti nichts übrig :)
miparo
Kein Support per PN! | No support via PM!
This post has been edited 2-times. Last edit: 20.12.2022 - 23:11 by miparo.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 57
Posts: 2020
Registered: 03 / 2003
Private message
Subject: Re: OLED-Display mit SSD1322-Controller und 256x64 Pixel  -  Posted: 21.12.2022 - 10:15   -  
Hi Miparo,

erst nach dem ich es getestet hab ;)

[Edit] getestet 14.21ms :) und ich glaube, schneller geht jetzt nicht mehr. Miparo deinen ASM-Code für WriteOLED_D und WriteOLED_C hab ich nicht übernommen, da die Adressierung des Display-RAMs nur einmal am Anfang des Refreshs nötig ist und es somit nicht viel bringen wird. Danke dir :) und ASM würde ich auch gerne können .....

Code

Procedure chDispRefresh;                               // 7.85ms @ 64MHz
  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;

    ASM;
      LDI        _ACCCLO, GraphColArr AND 0FFh
      LDI        _ACCCHI, GraphColArr SHRB 8           // Z Pointer auf GraphColArr
      LDI        _ACCFLO, 007FFh AND 0FFh
      LDI        _ACCFHI, 007FFh SHRB 8                // Zähler laden 2047

      REFRESH_L1:
      LD         _ACCB, Z+                             // PTR^ GraphData laden , PTR erhöhen
      LDI        _ACCALO, 4                            // 4 x BYTES

      REFRESH_L2:
      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
      call       SYSTEM.SPIOutByteD                    // nur _ACCA wird zerstört
      LSL        _ACCB                                 // ARG shift left um oben Bit 5 ... zu testen
      DEC        _ACCALO                               // wenn Loop var nicht 0 nochmal
      BRNE       REFRESH_L2

      SBIW       _ACCFLO, 1
      BRNE       REFRESH_L1                             //
    EndASM;
  End chDispRefresh;


Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 1-times. Last edit: 21.12.2022 - 10:49 by Harry.
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 06.02.2023 - 19:31