Bascom OLED mit SSD1306

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
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.



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
 

diezel

Neues Mitglied
30 Jun 2011
14
0
0
Sprachen
nö, ist nicht meine Seite.
Es gibt aber auch ein Beispiel in Bascom. In der Mitte der Seite heißt´s mal:
hier noch noch ein paar Beispielscreens:
den Code dafür gibt´s in Bascom auf Mikrocontroller.net
Ich häng ihn einfach mal hier dran.


Gruß
Gerhard
 

Anhänge

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
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 :





Und vielleicht noch die Batteriespannung :



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
 

diezel

Neues Mitglied
30 Jun 2011
14
0
0
Sprachen
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?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.305
150
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
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
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.413
62
48
Marwitz
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.
 

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
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
 

riesen

Mitglied
10 Sep 2010
108
1
16
Hallo zusammen
Hat denn jemand das Adafruit-OLED 128x32 mit Bascom zum Laufen gebracht?
Grüsse
Thomas
 

riesen

Mitglied
10 Sep 2010
108
1
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
 

riesen

Mitglied
10 Sep 2010
108
1
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
 

dino03

Aktives Mitglied
27 Okt 2008
6.734
17
38
Sprachen
BascomAVR, Assembler
Hi,

Beim I2C habe ich nicht so ganz begriffen, wie ich den Speed erhöhen kann.
Verwendest du TWI?
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
 

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
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
 

riesen

Mitglied
10 Sep 2010
108
1
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
 

Knickohr

BASCOM-Experte
29 Feb 2008
465
0
16
Sprachen
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
 

wer

Neues Mitglied
2 Jul 2012
485
0
0
Sprachen
Assembler
Übrigens, der Font frißt richtig viel Speicher !
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

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)