SSD1306 Oled

  • 1
  • 2
  • 3
  • 4
  • Seite 1 von 4
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 68
Beiträge: 776
Dabei seit: 06 / 2013
Betreff:

SSD1306 Oled

 · 
Gepostet: 07.05.2015 - 21:06 Uhr  ·  #1
Da auch ich so langsam von den 16x2 LCD Displays mit {KS0073} weg kommen möchte, habe ich mir
ein Oled bei e..y gekauft.

SSD1306
128 x 64 Pixel. Mit I2C (VCC GND SCL SDA)

nun schlage ich mich die ganze zeit mit dem Display rum, hat jmd von euch, so ein display
schon mal in betrieb genommen ?
golf
Benutzer
Avatar
Geschlecht:
Herkunft: Donauwörth
Alter: 72
Beiträge: 266
Dabei seit: 11 / 2009
Betreff:

Re: SSD1306 Oled

 · 
Gepostet: 08.05.2015 - 07:32 Uhr  ·  #2
hallo thebeginner,
leider kenn ich das display bzw den controller selbst nicht. jedoch gibt es im internet jede menge beispiele für dessen initialisierung und betrieb. meist halt unter c oder basic. aber man kann da ja doch genügend abschauen.
beiträge, ohne diese näher angeschaut zu haben z.b. unter

http://sfcompiler.co.uk/phpBB3/viewtopic.php?f=5&t=1728
http://sfcompiler.co.uk/phpBB3…31&start=0
https://github.com/adafruit/Adafruit_SSD1306
https://www.kismetwireless.net…/ssd1306.c

ich habe sowas vor jahren mal gemacht mit den 320x240 tfts mit dem ssd1289 oder ähnlichen. die sind allerdings parallel angeschlossen. aber solche dinger gehen für mich einwandfrei gerade mit den atxmegas.

beispiel von gps-normalfrequenz generator mit dem ad9548. die gps-synchronisierten ausgabefrquenzen sind frei einstellbar bis 6 Ghz, bei einsatz des adf 5355 bis 13 Ghz.
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 68
Beiträge: 776
Dabei seit: 06 / 2013
Betreff:

Re: SSD1306 Oled

 · 
Gepostet: 08.05.2015 - 08:53 Uhr  ·  #3
Danke golf,

dieser erste link ist echt super, den habe ich nicht gefunden.
vieles ist in C geschrieben und das verstehe ich nicht.. :aerger:


Init OLed steht soweit weil das auch geht.-->

Code

Procedure FillDisplay(data : Byte);
var page : Byte;
    col  : Byte;
 begin
    For Page := $B0 To $B8 do
        SetAddress(page, $00 + OFFSET, $10);
        For col := 0 To SCREEN_HOR_SIZE - 1  do
            ssd1306_data(data);
        endfor;
    endfor;
end FillDisplay;








Gruß Frank
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 68
Beiträge: 776
Dabei seit: 06 / 2013
Betreff:

Re: SSD1306 Oled

 · 
Gepostet: 08.05.2015 - 09:12 Uhr  ·  #4
Damit komme ich nicht klar, vllt kann mir jmd helfen das umzuschreiben.

Original
Code

Public Sub oledWriteChar1x(letter As Byte, page As Byte, column As Byte, invert As Boolean)

    Dim b, i As Byte
    Dim ix   As Word

    ix = (letter - Byte(" ")) * 6       // Adjust character to table that starts at $20
    For i = 0 To 5
        b = _font8x6(ix + i)
        If (invert) Then
            b = Not(b)
        EndIf
        WriteData(b)
    Next
       
End Sub


Public Sub oledPutString(text As String, page As Byte, column As Byte, invert As Boolean = false)

    Dim  i, x As Byte
       
    If ((page>=0) And (page<8)) Then   
        i = column
        page = page + $B0
        x = 0
        While(Byte(text(x))<>0)
            oledWriteChar1x(text(x), page, i, invert)
            Inc(x)
            i = i+6
        Wend
    End If
End Sub




Das was ich schon umgeschrieben habe.
da habe ich Probleme mit
ssd1306_command($10+((column > 4)And $0F));
ix := (letter - Byte(" ")) * 6; // Adjust character to table that starts at $20
Code

Procedure oledWriteChar1x(letter : Byte; page : Byte; column : Byte; invert : Boolean);
Var b, i : Byte;
    ix   : Word;
Begin
   ssd1306_command(page);
   column := column + OFFSET;
   ssd1306_command($00 + (column And $0F));
   ssd1306_command($10+((column > 4)And $0F));
    ix := (letter - Byte(" ")) * 6;       // Adjust character to table that starts at $20
    For i := 0 To 5 do
        b := _font8x6(ix + i)
        If (invert) Then
            b := Not(b):
        EndIf;
        WriteData(b);
    endfor;
End;


Procedure oledPutString(text : String[16]; page : Byte; column : Byte; invert : Boolean);
var  i, x : Byte;
Begin
    If ((page> = 0) And (page < 8)) Then
        i := column;
        page := page + $B0;
        x := 0;
        While(Byte(text(x))<>0)
            oledWriteChar1x(text(x), page, i, invert)
            Inc(x)
            i = i+6
        Wend
    End If
End Sub


Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: SSD1306 Oled

 · 
Gepostet: 08.05.2015 - 12:47 Uhr  ·  #5
Hi Frank,

schau dir mal das Beispiel von dem OLED in Software an. Das ist parallel angeschlossen. Wenn die Initialisierung paßt mußt du nur den Grafikspeicher (eben nicht parallel sondern) via I²C ins Display schieben. Defines an dein Display anpassen (128x64).

..... oder ein anderes Display das mit I²C arbeitet.

Gruss
Harry

PS: In 8h geht's los :)

Im Prinzip so:
Code

  LCDGraphic     = 128, 64, 8;               { x-pix, y-pix, accesswidth }
  LCDgraphMode   = column, iData;            // linear, column, readonly
  DefCharSet     = 'Graphchars.pchr';                         { FileName }
  GViewports     = 1, iData;               { logical ViewPorts, scalings }
  TGraphStr      = 12;                     { Graphic Text String Length  }

Const
  LCDaddr        : byte    = $3C;                // TWI address ANPASSEN !
  LCDctrl        : byte    = $00;                // control type command byte
  LCDdata        : byte    = $40;                // data type command Byte

  STiniParms     : Array[0..6] of Byte =     // ANPASSEN !
                                ($21,  // FunctionSet register, ext reg on
                                       // v   = 0 horizontal addressing
                                       // pd  = 0 set active
                                       // mx  = 0 normal x addressing
                                       // my  = 0 normal y addressing
                                 $09,  // Display config, MSB top,
                                 $12,  // Bias system register
                                       // bs[2:0] = 010 1:65 mux rate
                                 $E0,  // VOP register set Vlcd to ?.?V
                                       // Contrast max. $FF
                                 $20,  // FunctionSet register, ext reg off
                                       // v   = 0 horizontal addressing
                                       // pd  = 0 set active
                                       // mx  = 0 normal x addressing
                                       // my  = 0 normal y addressing
                                 $0C,  // Display control register, normal mode, on
                                 $05); // Vlcd range = high

Procedure GraphInit;
  Begin
    TWIoutC(LCDaddr, LCDctrl, STiniParms);
    TWIoutC(LCDaddr, LCDctrl, $80);
    TWIoutC(LCDaddr, LCDctrl, $40);
    For i:= 0 to (128*8) do
      TWIoutC(LCDaddr, LCDdata, 0);
      EndFor;
    gClrScr(0);
    gDispRefresh;
  End;

{$D-}
UserDevice GraphIOS(cmd : byte; arg : byte);
begin
  if cmd=0
    then
    // set row addr
      TWIoutC(LCDaddr, LCDctrl, $80);     // x-addr <- 0
    // set column address, $40 is the y-addr command
      arg:= 7-arg+$40;                    // row addr 7 -> 0
      TWIoutC(LCDaddr, LCDctrl, arg);     // y-addr <- arg
      ii:=0;                              // reset Y-counter
    else
      If ii<128                            // Ausgabe auf <128 notwendig !
        then                              // 
        // data out                       // 
          TWIoutC(LCDaddr, LCDdata, arg);
          Inc(ii);
        EndIf;
    EndIf;
end;
{$D+}


- STiniParms anpassen mit den Initwerten und das Array entsprechend vergrößern
- Addressen anpassen
- TWIoutC durch dein I2COut ersetzen
golf
Benutzer
Avatar
Geschlecht:
Herkunft: Donauwörth
Alter: 72
Beiträge: 266
Dabei seit: 11 / 2009
Betreff:

Re: SSD1306 Oled

 · 
Gepostet: 08.05.2015 - 12:53 Uhr  ·  #6
hallo frank,
leider bin ich eher der hardwarebastler und kenn mich mit c oder basic auch nicht aus.
vielleicht sowas:

ssd1306_command($10+((column shr 4)And $0F));
ix := (letter - ord(' ')) * 6; // Adjust character to table that starts at $20

golf
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: SSD1306 Oled

 · 
Gepostet: 08.05.2015 - 13:10 Uhr  ·  #7
Also so sieht das aus (siehe Bild).

Immer ein Byte steht für 8 Pixel. Wenn du dieses Byte in der ersten Page überträgst, werden links oben die roten 8 Pixel behandelt (gesetzt oder nicht). Dein Programm schreibt nacheinander Page0, Page1, Page 2 ...... Page 7.

Mit dem Auto-Daten (siehe frühere PM) werden einfach nacheinander alle 128x8 Byte übertragen (wenn das Init zu dieser Speicherstruktur paßt bzw. so gemacht wurde). Mit einem Mega8 hast du da natürlich keine Chance, da du ja 128x64/8=1024 Byte an RAM schon dafür reservierst. Mega32 oder 644 aufwärts.
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 68
Beiträge: 776
Dabei seit: 06 / 2013
Betreff:

Re: SSD1306 Oled

 · 
Gepostet: 08.05.2015 - 18:26 Uhr  ·  #8
Harry morgen bin ich stolzer besitzer eines Atmega 32. :3some:

Ach Harry ist ja im Urlaub und versucht Fische aus dem großen weiten Meer zu fangen. :angel3:
  • 1
  • 2
  • 3
  • 4
  • Seite 1 von 4
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   139   153 · Page-Gen-Time: 0.027262s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI