Bascom OLED mit SSD1306

Dieses Thema im Forum "LED + LCD" wurde erstellt von Knickohr, 1. Dezember 2012.

  1. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo zusammen,

    lange ist es her, das ich mal was von mir hören lassen habe :p

    Trotzdem bin ich nicht ganz abhanden gekommen. Hatte einige familiäre Probleme, die Arbeit müllt mich auch zu und der Streß läßt einfach nicht nach.

    Aber zurück zum Thema. Ich brüte gerade an einem Minidisplay mit einer 128x64 Pixelgrafik rum, das mit einem SSD1306 "angetrieben" wird über I²C. Soweit alles kein Problem, das Ding scheint auch zu funktionieren. Doch leider gibt es für dieses Display offiziell (noch) kein LIB.

    [​IMG]

    Datenblatt für den Treiberbaustein sind ebenfalls vorhanden :

    http://www.adafruit.com/datasheets/SSD1306.pdf

    Nun habe ich schon Stunden im Internet verbracht, um eine Library für BASCOM zu finden. Leider Fehlanzeige. Es gibt genügend LIBs für C, aber nciht für BASCOM.

    Hat jemand schon mal mit diesen Dingern rum gespielt ? Eventuell sogar eine brauchbare LIB ?

    Thomas
     
  2. diezel

    diezel Neues Mitglied

    Registriert seit:
    30. Juni 2011
    Beiträge:
    14
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  3. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo Gerhard.

    Für den 1325 gibts für BASCOM eine Library :cool:

    Ich weiß aber nicht, ob man die so 1:1 verwenden kann.

    Ja, Deine Website habe ich schon gefunden und durchgestöbert. Leider alles in C ... Schade.

    Thomas
     
  4. diezel

    diezel Neues Mitglied

    Registriert seit:
    30. Juni 2011
    Beiträge:
    14
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    nö, ist nicht meine Seite.
    Es gibt aber auch ein Beispiel in Bascom. In der Mitte der Seite heißt´s mal:
    den Code dafür gibt´s in Bascom auf Mikrocontroller.net
    Ich häng ihn einfach mal hier dran.


    Gruß
    Gerhard
     

    Anhänge:

  5. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Ahhh !!!

    :cool: Danke :)

    Das hilft schon mal weiter, da es "inline" geschrieben ist und somit alle Routinen und Aufrufe im Code enthalten sind. Da läßt sich sicher das eine oder andere Command anpassen. Zumindest die Initialisierungsroutine sieht schon vielversprechend aus. Das Darstellen von Text und Grafik dürfte ich mit der Zeit dann auch selbst aufs Display zaubern, wenn ich weiß, wie es tickt.

    Eigentlich habe ich mit dem Zwergendisplay nicht viel vor. Nur eine kleine Anzeige für die Innen- Außentemperatur auf meinem Armaturenbrett :

    [​IMG]

    [​IMG]

    Und vielleicht noch die Batteriespannung :

    [​IMG]

    Text auf das Display zaubern dürfte keine größeren Schwierigkeiten bereiten. Allerdings könnte die größere Schrift im Grafikmodus schon eine Herausforderung werden.

    Thomas
     
  6. diezel

    diezel Neues Mitglied

    Registriert seit:
    30. Juni 2011
    Beiträge:
    14
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    das Display schaut interessant aus. Gerade in dieser Größe gibt´s je nicht gerade viele.
    Hast Du bitte mal nen Link oder Daten dazu?
     
  7. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Hallo Gerhard,

    eine Version (adafruit) mit 128x32 Pixel und SSD1306 findest du zum Beispiel im www.mikrocontroller-praxis.de Shop.
    Das OLED Display mit 128x64 Pixel ist hier leider nocht nicht verfügbar.

    Monochrome 128x32 I2C OLED graphic display


    Dirk :ciao:


    [​IMG]
     
  8. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo.

    Ja, auch Dirk bietet es im Shop an ;)

    Es gibt das Display in verschiedenen Auflösungen :

    96x16
    128x32
    128x64

    Und in verschiedenen Farben :

    - weiß
    - blau
    - orange/blau (erste 8 Zeilen orange)

    Schaut Euch mal in der Bucht um, es gibt diverse Anbieter, angefangen von etwa 5 Euro (blankes Display) bis zur "Sternfrucht" (mit Ansteuerelektronik auf Platine) für etwa 20 Euro. Allen gemeinsam ist der Treiberbaustein SSD1306. Einige haben auch noch den alten 1303 oder 1305 drauf, also lesen.

    Ich denke mal, alle Displays mit dem 1306 sind von der Ansteuerung her identisch. Leider aber alle auf Arduino und netduino und in C adaptiert. Es gibt wunderschöne Libs (GOFi2cOLED, ug8lib), aber wie gesagt, alle in C :(

    Man müßte einen "Dummen" finden, der die Libs nach BASCOM konvertiert :D

    Das Display selbst zum Rennen zu bekommen und darauf Text (Font 7x5 ist offenbar on Bord) aus zu geben, wird das kleinste Problem sein. Komplizierter stelle ich mir die Grafikausgabe vor, da die Dokumentation (Datenblatt) sich hier zum größten Teil ausschweigt :confused:

    Thomas
     
  9. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.979
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Hmm...
    also ich finde im Datenblatt NUR Infos zum Graphik-Mode. S20 erklärt den Aufbau eines I2C-Paketes, ab Seite 25 dann die ganzen Kommandos, ab S30 gehts mit den zu sendenden Pixel-Columns los (ähnlich, wie das auch mit dem Dog-Displays von EA ist (nur, daß mir dort scrollbare Bildbereiche unbekannt sind).
    Bei den Dog mußte man ja eigentlich auch die entsprechende Page vorgeben, dann eine Start-Column, und dann konnte man mit jedem Byte die 8 Pixel setzen/löschen lassen (Column - autoincrement). Nur eben per SPI.
    Ok, Bascom hatte dafür 'ne lib, die es erlaubt hat, Text usw zu erzeugen.)
    Aber wenn Du das Display bereits über Bascom am laufen hast (Textmode), über I2C, kannst Du ja einfach mal versuchen, mit 'nem entsprechenden I2C-Paket irgendwas drüberzuzeichnen. Beim Dog hat das problemlos geklappt.
     
  10. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hi,

    ich weiß nicht, was das für ein Mode ist, aber der Code funzt :

    Code:
    ' OLED display 128x64 using SSD1306 0.96"
    ' Original Public Domain Arduino code from by Nicholas Zambetti
    ' 31/08/2012
    '
    $regfile = "m328pdef.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 40
    $framesize = 40
    $lib "i2c_twi.lbx"
    Config Scl = Portc.5
    Config Sda = Portc.4
    Config Twi = 100000
    
    Const Oled_address = &HA2
    Const Write_cmd = &H01
    Const Oled_reset = &H03
    Const Oled_8x16str = &H10
    
    Const Disp_area = &H11
    Const Fill_area = &H12
    Const Set_scrohor = &H13
    Const Set_scrover = &H14
    Const Set_scroverhor = &H15
    
    Const Scroll_up = &H01
    Const Scroll_down = &H00
    Const Scroll_right = &H26
    Const Scroll_left = &H27
    Const Scroll_vr = &H29
    Const Scroll_vl = &H2A
    Const Scrollstop = &H2E
    
    Dim A As Byte
    Dim B As Byte
    Dim C As String * 1
    
    Declare Sub Resetdisplay
    Declare Sub Deactivatescroll
    Declare Sub Display8x16str(byval Page As Byte , Byval Column As Byte , Byval Char As String * 16)
    Declare Sub Scrollingvertical(byval Rowsfixed As Byte , Byval Rowsscroll As Byte , Byval Scrollstep As Byte , Byval Stepdelay As Byte)
    Declare Sub Scrollinghorizontal(byval Lr As Byte , Byval Spage As Byte , Byval Epage As Byte , Byval Frames As Byte)
    Declare Sub Fillarea(byval Spage As Byte , Byval Epage As Byte , Byval Scolumn As Byte , Byval Ecolumn As Byte , Byval Filldata As Byte)
    
    I2cinit
    ' Main
    
    Do
       Call Resetdisplay
       Waitms 100
       Call Display8x16str(0 , 0 , "Hello World")
       Call Display8x16str(2 , 0 , "Hello OLED")
       Call Display8x16str(4 , 0 , "0123456789ABCDF")
       Call Display8x16str(6 , 0 , "Bascom AVR")
       Wait 2
       Call Scrollingvertical(0 , 32 , 1 , 250)
       Wait 2
       Call Scrollinghorizontal(&H27 , 4 , 5 , &H07)            ' To left
       Wait 3
       Call Deactivatescroll
       Call Scrollinghorizontal(&H26 , 4 , 5 , &H07)            ' To right
       Wait 3
       Call Deactivatescroll
       Call Fillarea(0 , 7 , 32 , 64 , 3)
       Wait 3
    Loop
    Sub Fillarea(byval Spage As Byte , Byval Epage As Byte , Byval Scolumn As Byte , Byval Ecolumn As Byte , Byval Filldata As Byte)
       I2cstart
       I2cwbyte Oled_address
       I2cwbyte Fill_area
       I2cwbyte Spage
       I2cwbyte Epage
       I2cwbyte Scolumn
       I2cwbyte Ecolumn
       I2cwbyte Filldata
       I2cstop
    End Sub
    Sub Deactivatescroll
       I2cstart
       I2cwbyte Oled_address
       I2cwbyte Write_cmd
       I2cwbyte Scrollstop
       I2cstop
    End Sub
    Sub Scrollinghorizontal(byval Lr As Byte , Byval Spage As Byte , Byval Epage As Byte , Byval Frames As Byte)
       I2cstart
       I2cwbyte Oled_address
       I2cwbyte Set_scrohor
       I2cwbyte Lr
       I2cwbyte Spage
       I2cwbyte Epage
       I2cwbyte Frames
       I2cstop
    End Sub
    Sub Scrollingvertical(byval Rowsfixed As Byte , Byval Rowsscroll As Byte , Byval Scrollstep As Byte , Byval Stepdelay As Byte)
       I2cstart
       I2cwbyte Oled_address
       I2cwbyte Set_scrover
       I2cwbyte Scroll_up
       I2cwbyte Rowsfixed
       I2cwbyte Rowsscroll
       I2cwbyte Scrollstep
       I2cwbyte Stepdelay
       I2cstop
    End Sub
    Sub Display8x16str(byval Page As Byte , Byval Column As Byte , Byval Char As String * 16)
       I2cstart
       I2cwbyte Oled_address
       I2cwbyte Oled_8x16str
       I2cwbyte Page
       I2cwbyte Column
       For A = 1 To 16
          C = Mid(char , A , 1)
          B = Asc(c)
          I2cwbyte B
       Next
       I2cstop
    End Sub
    Sub Resetdisplay
       I2cstart
       I2cwbyte Oled_address
       I2cwbyte Oled_reset
       I2cstop
    End Sub 
    Ist aus dem MCS-Forum "geklaut".

    Nu ja, ich brauche eigentlich einen Modus, in dem ich mir selbst ein Font erzeuge. Der Font muß groß genug sein, um ihn auf dem Zwergendisplay in ca. 1m Abstand lesen zu können. Ich denke mal, die Schrift muß ca. 40 Pixel hoch sein und sollte ein Kerning machen. Und genau da kommt das Problem auf, da muß ich wohl im Grafikmodus ran.

    Nachtrag :

    DAS wäre genau das richtige http://guy.carpenter.id.au/gaugette/blog/2012/11/11/font-support-for-ssd1306/

    Thomas
     
  11. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo zusammen
    Hat denn jemand das Adafruit-OLED 128x32 mit Bascom zum Laufen gebracht?
    Grüsse
    Thomas
     
  12. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
  13. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo Thomas
    Ja, dieses Display habe ich auch zum Laufen gebracht, rennen tut es aber nicht. Hast du was beschleunigt,
    dass die Anzeige so schnell ist? Bei mir wird der grosse Font recht langsam angezeigt?
    Dankende Grüsse
    Thomas
     
  14. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Overclocking *blinzel* :cool:

    Ich habe den I²C einfach auf 1,1MHz hochgetaktet, Der Atmel rennt mit einem 24MHz Takt auch schon über den Spezifikationen :patsak:

    Thomas
     
  15. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Ehhh komm, das ist jetzt ein heisser Sommerwitz, oder? :)

    Beim I2C habe ich nicht so ganz begriffen, wie ich den Speed erhöhen kann.
    Verwendest du TWI?

    Mit dem Quarz habe ich auch schon gespielt, aber über 20MHz bei einem ATmega328 oder
    ATmega2560 habe ich nicht merh so zuverlässigen Betrieb hinbekommen.

    Gruss
    Thomas
     
  16. dino03

    dino03 Aktives Mitglied

    Registriert seit:
    27. Oktober 2008
    Beiträge:
    6.684
    Zustimmungen:
    12
    Punkte für Erfolge:
    38
    Sprachen:
    BascomAVR, Assembler
    Hi,

    I2C und TWI sind ein und dasselbe. Die Bezeichnung I2C ist von Philips geschützt und muß bezahlt werden. TWI ist die Bezeichnung die sich die Hersteller einfallen lassen haben die keine Kohle bezahlen wollen.

    I2C = TWI (Two Wire Interface ... wegen SDA und SCL = 2 Leitungen)

    Gruß
    Dino
     
  17. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Du mußt den "richtigen" 328er nehmen, dann funzt das auch ;)

    Nun gut, ich nehme den 168, aber das dürfte bis auf den Mehr an Speicher der identische Core sein.

    Ach ja, Hardware-TWI verwenden !

    Noch besser scheint es mit einem xMega zu fluppen :D

    Thomas
     
  18. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo zusammen

    Vielen Dank für die Unterstützung!

    @Thomas:
    Ich finde den grossen Font schon super. Würde gerne z.B. den Tahoma oder
    Verdana Font "einlesen", aber das scheint mir nicht so einfach, oder?

    Viele Grüsse
    Thomas
     
  19. Knickohr

    Knickohr BASCOM-Experte

    Registriert seit:
    29. Februar 2008
    Beiträge:
    465
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Sooo einfach ist das nicht.

    Du brauchst einen Fontgenerator der dir das in eine entsprechende Bitmap umrechnet (Data-Array). Ich weiß jetzt nicht, wie das Programm heißt, aber es funktioniert damit fast komplett. Nur ein paar Datenwerte am Anfang müssen korrigiert werden. Schaue nachher mal nach.

    Übrigens, der Font frißt richtig viel Speicher !

    Thomas
     
  20. wer

    wer Neues Mitglied

    Registriert seit:
    2. Juli 2012
    Beiträge:
    485
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Sprachen:
    Assembler
    Monochrome Bitmaps lassen sich relativ gut komprimieren. RLE (z.B. das alte PCX-Format) oder PK-Fonts (Metafont Schriften). Je nach dem, wie die Daten in das Display geschaufelt werden, kann man sich da ja was geeignetes überlegen.

    Gruß, Wolfgang
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden