SSD1306 OLED Display

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • SSD1306 OLED Display

      Hallo,

      OLED Display SSD1306 in der Größe 0.96 Zoll oder 1.3 Zoll mit der Auflösung 128x64 oder 128x32 Pixel.
      Das Display wird in der Regel mit I2C oder SPI angesteuert.

      Für die Ansteuerung mit I2C hat Bascom schon eine eigene LIB bereitgestellt.

      Bascom-AVR-SSD1306

      Die I2C Adresse von der Bascom LIB ist H78, bei den reinen I2C Display kann es per Brücke eingestellt
      werden. Bei den Modellen die I2C und SPI unterstützen ist der DC Pin auf GND und der
      Reset Pin auf VCC zu legen
      Pullup Widerstände für SDA und SCL mit 4,7K auf VCC nicht vergessen,
      bei den reinen I2C Displays sind die Pullup Widerstände für SDA und SCL meist schon mit verbaut.

      i2c001.jpg spi2.JPG




      Wer ein OLED Display mit dem Treiber IC SH1106-I2C erwischt hat kann diese LIB benutzen.
      SH1106-LIB.zip

      Da die Bascom LIB keine Grafik Funktion wie BOX – Line – Circle unterstützt hier noch ein paar Beispiele mit Grafik Funktion.
      SSD1306 und SH1106 128x64 Pixel über SPI angesteuert
      SSD1306-128x64-SPI.zip

      SSD1306 und SH1106 128x64 I2C
      SSD1306 128x64-I2C.zip

      SSD1306128x32 I2C
      SSD1306 128x32-I2C.zip

      Bitte unbedingt prüfen, ob das Display für 5V ausgelegt ist! Im Zweifel mit 3,3V betreiben und erst einmal damit versuchen.



      Gruß
      Hkipnik
    • Hallo hkipnik,
      woran zeigt sich der Unterschied zwischen SSD1306 und SH1106?

      Ich frage, weil ich Probleme mit meinem Display habe:
      Wenn das Ding nach längerer Ruhezeit angesprochen wird (Lib für SSD1306),
      bleibt der Bildschirm dunkel.
      Wenn ich dann die Spannung kurz unterbreche und den AVR (ATtiny85) mit dem Display neu starte,
      erscheinen die Zeichen alle korrekt auf dem Display.

      Ich habe gerade Deine Lib für den SH1106 eingebaut und da scheint alles auf Anhieb zu funktionieren.
      Habe ich also einen SH1106?

      Ansteuerung über TWI/I2C.

      LG RoBue
    • Hallo RoBue,

      Wenn dein Display mit der SSD1306_Lib was anzeigt ist es auch ein SSD1306 Display.
      Wenn es sich nach einiger Zeit aufhängt überprüf doch mal die Betriebsspannung 3,3V oder 5V
      und die Pullup Wiederstände für SDA + SCL.
      Sonst zeig mal ein Foto von der Vorderseite und Rückseite dann schau ich mir das mal an.


      Gruß
      Hkipnik
    • Jetzt kommen die Infos:

      Ich möchte das Display eigentlich als ein weiteres 1-Wire-Slave-Modul betreiben,
      um entweder Nchrichten vom 1-Wire-Server anzuzeigen
      oder um irgendwelche Messwerte des Moduls gleich anzuzeigen.

      Ich arbeite mit 5V, die Pullups sind 10kOhm.
      Das Ganze hängt an einem ATtiny85

      Witzigerweise funktionieren BEIDE Libs!
      - Die SSD1306-Lib nur nach dem 2. Start (s.o.),
      - die SH1106-Lib (anscheinend) immer.
      ?( ?( ?(
      Abstürze gabs bisher keine, habe aber das Display auch nur ein paar Stunden in Betreibe.

      Codeschnipsel:

      BASCOM Source Code

      1. '***************************************
      2. ' Variable und Init-Routinen
      3. Dim Ausgabewert As Single
      4. Dim Ausgabeinteger As Integer
      5. Dim Ausgabe As String * 8
      6. ' TWI initialisieren
      7. Config Sda = Portb.4
      8. Config Scl = Portb.3
      9. ' 1000000 / delaywert = I2C-Bus Frequenz in Hz
      10. ' 10 = 100 KHz ist Standard
      11. Config I2cdelay = 2.5
      12. I2cinit
      13. ' OLed einbinden
      14. '$lib "glcdSSD1306-I2C.lib"
      15. $lib "glcdSH1106-I2C.lib"
      16. Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
      17. Cls
      18. Setfont Font16x16 ' select font
      19. Lcdat 1 , 1 , "OW-Slave"
      20. Lcdat 3 , 1 , " Text"
      21. Lcdat 5 , 1 , " RoBue"
      22. Lcdat 7 , 1 , "26.06.17" , 1
      23. Waitms 3000
      Display All
      Hier nun die Bilder (leider etwas unscharf):
      Oled_V.jpgOled_R.jpg

      Soweit mal.

      Liebe Grüße,
      RoBue

      Nachtrag:
      Manchmal sind die Buchstaben auf dem Kopf!
      Neu starten, dann stimmts wieder.
      (SH1106-Lib)

      The post was edited 1 time, last by RoBue ().

    • Hallo RoBue,

      RoBue wrote:

      Witzigerweise funktionieren BEIDE Libs!
      - Die SSD1306-Lib nur nach dem 2. Start (s.o.),
      - die SH1106-Lib (anscheinend) immer.
      Ja das ist sogar richtig mit der SH1106 LIB kann auch das SSD1306 angesteuert werden
      aber dann fehlen dir 2 Pixel auf der linken Seite und das Init passt auch nicht richtig.
      Ein SH1106 Display kann aber nicht mit der SSD1306 Lib angesteuert werden da bleibt
      das Display dunkel und zeigt gar nichts an, also hast du ein SSD1306 Display.
      Versuch doch mal kleinere Pullups so 4,7K mit der SSD1306 LIB.

      Gruß
      Hkipnik
    • Hallo Hkipnik,

      habe wieder die SSD1306-Lib genommen und die Pullups auf 4,7kOhm gesetzt.
      Gleiches Phänomen wie oben beschrieben:
      Display bleibt beim ersten Start dunkel.
      Alles kurz aus- und wieder einschalten: Display gibt Text aus.
      (Vielleicht hat dies nur noch niemand so ausprobiert?)

      SH1106-Lib:
      Startet sofort mit Ausgabetext.

      Bin etwas ratlos.
      Verfolge das noch etwas - evtl. mal im Dauertest.

      Gruß RoBue
      (Danke für Deine Routinen)
    • Hallo RoBue,

      Source Code

      1. Waitms 200
      2. Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
      versuch mal das Waitms 200 vor den Config einzufügen.
      Habe mir noch mal dein Display etwas angesehen, es könnte sein das dar schon Pullup Wiederstände (R2 und R3) verbaut sind.
      Einfach mal ohne externen Pullups Widerständen versuchen.

      Gruß
      Hkipnik
    • Hallo, ich spiele auch ein wenig mit dem SH1106 rum.
      Dank der Lib und der Anleitung hat alles wunderbar geklappt. Auch der Fonteditor von Peer ist wirklich super !

      Ich möchte jetzt ein wenig Platz im Flash sparen, und da der eeprom fast leer ist würde ich gerne die Font Dateien (habe 2) im eeprom ablegen, aber wie ?

      Ein:

      $eeprom

      $include "font8x8TT.font"

      $include "font10x14.font"

      $data

      End

      Hat nicht geholfen.

      Bin für jede Hilfe dankbar !!!
      Waldo
    • Waldo wrote:

      Hat nicht geholfen.
      Fehlermeldungen?
      Hast du in den Optionen vom programmer auch das Häkchen bei 'Upload code and data' gemacht?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Es gibt keine Fehlermeldungen. Die $include Daten wandern einfach nicht ins eeprom, die werden immer im Flash eingebettet, obwohl die unterhalb dem $eeprom sind.

      Die könnte ich da reinbekommen wenn ich die im data ,,,, format umwaldeln würde. Aber ob die Lib damit klarkommen würde ?

      Waldo ?
    • Hallo Waldo,

      Font Dateien aus dem Eeprom lesen wird von der Lib leider nicht unterstützt.
      Es ist aber möglich BGF Bilder im Eeprom zu speichern.

      BASCOM Source Code

      1. 'we will load the picture data into EEPROM so we specify $EEPROM
      2. 'the data must be specified before the showpicE statement.
      3. $eeprom
      4. Plaatje:
      5. 'the $BGF directive will load the data into the EEPROM or FLASH depending on the $EEPROM or $DATA directive
      6. $bgf "mcs.bgf"
      7. 'switch back to normal DATA (flash) mode
      8. $data
      9. 'Clear the screen will both clear text and graph display
      10. Cls
      11. 'showpicE is used to show a picture from EEPROM
      12. 'showpic must be used when the data is located in Flash
      13. Showpice 0 , 0 , Plaatje
      Display All
    • Hallo hkipnik,

      danke für die super Beschreibung.
      Ich möchte die AVR Techniken "erst" lernen und habe "noch" 0 Ahnung.
      Als mein Erstes Versuch, habe ich mir vorgenommen einen Ereigniszähler mit [ATTiny85 uns 1" OLED) zu bauen.
      Anlage1 Oled mit ATTiny85.txt.
      Um es zu testen habe ich die SSD1306 und SH1106 128x64-Demo Datei in Bascom geladen.
      Leider bekomme ich es nicht Kompiliert:
      Anlage 2 SSD1306-Demo_Error.txt

      Bitte um Hilfe
      Files
    • @'hkipnik und/oder ein anerer Guter Geist,

      wie es scheint, habe ich kein Glück mit der Hoffnung auf eine Hilfe.
      -Ich versuche natürlich den Fehler zu lokalisieren.
      1. Ich habe versucht Deine SSD1306-Demo.bas zu lesen um etwas zu "Verstehen".
      Dabei fiel mir auf, das dort m328 deklariert wurde.
      Als Versuch habe ich folgende Änderungen gemacht:

      Demo for SH1106 - SSD1306 128x64 Pixel
      '*******************************************************************************
      $regfile = "attiny85.dat"
      $crystal = 8000000
      $hwstack = 8
      $swstack = 4
      $framesize = 4
      $regfile = "attiny85.dat"

      $baud = 9600

      $lib "i2c_twi.lbx" 'Hardware I2C
      Config Scl = Portb.2 ' used i2c pins
      Config Sda = Portb.0
      Config Twi = 400000 ' i2c speed // das ist Zeile 55
      I2cinit

      Bascom-AVR meldete folgender Fehler:

      Error : 46 Line : 55 Assignment error [TWSR: 0 0: 112] , in File : E:\Elektronik\AVR\ATtiny85\Code\SSD1306 128x64-I2C\SSD1306-Demo.bas
      Error : 46 Line : 55 Assignment error [TWBR: 0 10: 112] , in File : E:\Elektronik\AVR\ATtiny85\Code\SSD1306 128x64-I2C\SSD1306-Demo.bas

      also wurde auch keine *.hex geschrieben und ich komme nicht mehr weiter.

      2. In einem Bascom-AVR Basiskurs habe ich einen Testprogramm um die I2C Schnittstelle zu testen gefunden.

      'ATM18 I2C tester
      'I2C: SCL = PC5, SDA = PC4

      $regfile = "m88def.dat"
      $crystal = 16000000
      Baud = 38400

      Dim N As Byte

      Config Portb = Output
      Config Scl = Portc.5
      Config Sda = Portc.4

      Print "ATM18 I2C address test"

      For N = 2 To 254 Step 2
      I2cstart
      I2cwbyte N
      If Err = 0 Then Print N
      I2cwbyte &H55
      I2cstop
      Next N
      End

      Leider ist dieser Test für ATM18 und ich habe keine Ahnung, wie man ihm an ATTiny85 anpassen kann.

      Bitte um Hilfe

      Bo

      The post was edited 1 time, last by bm-magic ().

    • bm-magic wrote:

      $regfile = "attiny85.dat"
      $crystal = 8000000
      $hwstack = 8
      $swstack = 4
      $framesize = 4
      $regfile = "attiny85.dat
      Du hast hier schon mal ein paar Fehler drin. Zum einen reicht einmal $regfile = "attiny85.dat" aus. Zum zweiten sind deine Stack-Werte zu klein gewählt.
      Und ist dein Tiny auch wirklich auf 8 MHz über die Fuses eingestellt?

      Wenn dem so ist lass mal $lib "i2c_twi.lbx" 'Hardware I2C weg (auskommentieren), dann läuft der Tiny mit Soft-I2C. Denn soweit ich weiss hat der Tiny85 keine "echte" I2C-Schnittstelle.

      Der Scanner hingegen sollte aber laufen.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • @djmsc

      zu Frage 1:
      danke, Ich habe mein "Bestes" gegeben. Der Istzustand:
      001 '*******************************************************************************
      002 Demo for SH1106 - SSD1306 128x64 Pixel
      032 '*******************************************************************************
      033 $regfile = "attiny85.dat" Original m328pdef.dat
      034 $crystal = 8000000 Original ' 16000000
      035 $hwstack = 8 Original ' 80
      036 $swstack = 8 Original ' 90
      037 $framesize = 8 Original ' 100
      039 '$lib "i2c_twi.lbx" Original ' auskommentiert
      040 Config Scl = Portb.2 Original ' Portc.5
      041 Config Sda = Portb.0 Original ' Portc.4
      042 'Config Twi = 400000 Original ' auskommentiert
      064 Dim Ddata(256) As Byte Original 1024
      431 '*******************************************************************************
      432 ' Draw Fill Circle X-Y Center - Radius - Color=1 set Pixel Color=Black - White
      433'*******************************************************************************
      434 'Sub Lcd_fill_circle(byval X0 As Byte , Byval Y0 As Byte , Byval Radius As Byte , Byval Color1 As Byte )
      bis '
      461 'End Sub
      Wegen Fehler Anzeige: Declare Sub Lcd_circle(byval X As Byte , Byval Y As Byte , Byval Radius As Byte , Byval Color As Byte)
      Das komplette Beispiel auskommentiert also von 431 bis 461

      552 '*******************************************************************************
      --------------------------------------------------------------------------------------------------------
      | Ein Versuch die Leerzeilen zu löschen um der Beispiel kleiner zu bekommen schlug "natürlich leer aus. |
      | ' Original besitzt mit den Leerzeilen 606 Zeilen.|
      ---------------------------------------------------------------------------------------------------------

      Danach konnte die Datei Kompilliert werden ( ;) ) leider mit volgener Meldung:

      Error : 202 Line : 1 .EQU not found, probably using functions that are not supported by the selected chip [UBRR]
      , in File : E:\Elektronik\AVR\ATtiny85\Code\SSD1306 128x64-I2C\SSD1306-Demo.bas
      Error : 202 Line : 1 .EQU not found, probably using functions that are not supported by the selected chip [UCR]
      , in File : E:\Elektronik\AVR\ATtiny85\Code\SSD1306 128x64-I2C\SSD1306-Demo.bas
      Error : 999 Line : 552 DEMO/BETA only supports 4096 bytes of code
      , in File : E:\Elektronik\AVR\ATtiny85\Code\SSD1306 128x64-I2C\SSD1306-Demo.bas
      Error : 999 Line : 552 DEMO/BETA only supports 4096 bytes of code
      , in File : E:\Elektronik\AVR\ATtiny85\Code\SSD1306 128x64-I2C\SSD1306-Demo.bas

      Das war es. Kann mir niemand davon eine *.hex Datei erstellen?
      Ich hätte so gern gesehen, ob das Display irgend etwas anzeigt.
      Falls es funktionieren sollte, bin ich gern bereit die Vollversion zu kaufen,
      [Sonst bin ich besser bedient mit Arduino-ISP, denn dazu gibt im Internet viel mehr Beispiele.]

      Die Datei habe ich angehängt.

      Zu 2.
      Ich glaube, das der I2C Tester mit ATM18 funktioniert. Ich aber habe ATTiny85 und PortC steht mir nicht zu Verfügung
      und benötige Hilfe oder Beispiel, wie ich es von ATM18 auf ATTiny85 verwenden kann.
      Files

      The post was edited 1 time, last by bm-magic ().

    • Hallo Bo,

      Error:202 gibt dir den Hinweis UBRR -> das bezieht sich auf das Baudratenregister. Der Attiny85 hat halt keine Hardware UART.
      Lösche die Zeile $baud = 9600 es folgen im Programm eh keine weiteren Print Ausgaben.

      Des weitere ist das Programm noch viel zu lang für einen Attiny85. Da wird noch einiges raus fliegen müssen.

      Wegen dem I2C Scanner schau mal hier

      bascomforum.de/index.php?thread/11-i2c-scanner/

      Im zweiten Post ist er auf den Attiny85 zurecht geschneidert.

      Edit: Ich hab dir dein Programm mal "etwa" eingedampft, so dass es zumindest mal auf den Attiny85 passt. Es geht nur noch eine reine Textausgabe auf dem Display. Ob das für dich noch sinnvoll ist???

      Viele Grüße
      rakohr

      PS: hab es selbst nicht getestet
      Files

      The post was edited 2 times, last by rakohr ().

    • Hallo,

      I use this program, but with a picture I only see mess.
      Text is displayed properly.who can help me.Balou19.

      $regfile = "m88pdef.dat"
      $hwstack = 32
      $swstack = 32
      $framesize = 32
      $crystal = 8000000
      Config Clockdiv = 1 ' make sure the chip runs at 8 MHz

      Config Scl = Portc.5 ' used i2c pins
      Config Sda = Portc.4
      Config Twi = 400000 ' i2c speed

      I2cinit
      $lib "i2c_twi.lbx"' we do not use software emulated I2C but the TWI
      $lib "glcdSSD1306-I2C.lib"' override the default lib with this special one

      #if _build < 20784
      Dim ___lcdrow As Byte , ___lcdcol As Byte' dim these for older compiler versions
      #endif

      Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
      Cls
      Setfont Font8x8tt ' select font

      Lcdat 1 , 1 , "BASCOM-AVR"
      Lcdat 2 , 10 , "1995-2015"
      Lcdat 8 , 5 , "MCS Electronics" , 1
      Waitms 3000

      Showpic 0 , 0 , Plaatje

      End

      $include "font8x8TT.font"' this is a true type font with variable spacing

      Plaatje:
      $bgf "ks108.bgf"' include the picture data