Forum: Projekte & Code Universelles Oled-Libary (SSD1306) für AVR(8bit) und STM32/HAL


von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Inspiriert durch das Library von Michael Köhler:
Beitrag "SSD1306/1309 Library zum Darstellen von Text auf OLED Displays"
hab ich vor einigen Tagen begonnen, sein Library so umzubauen, daß das 
unverändert auf AVR und STM32 kompiliert.

Inzwischen sind die Änderungen allerdings so umfangreich, daß da kaum 
ein Stein auf dem Anderen geblieben ist, und aus diesem Grud hab ich 
diesen neuen Thread zu dem Thema erstellt.

Auf AVR gibt es 2 Modi (Text- und Grafik-Mode), die sich stark durch den 
Speicherbedarf  unterscheiden:
Der STM32 läuft immer im Grafikmode

Textmode: (nur AVR)
* sehr geringem Speicherbedarf (<2k Flash / 21 Byte RAM)
* 8x20 Zeichen

Grafikmode: (AVR und STM32)
* 4, 6- oder 8-Zeilen-Modus wählbar (20 Zeichen/Zeile)
* auf AVR werden zusätzlich 1046 Byte RAM benötigt

Damit das auf STM32 läuft, muß eine I²C-Schnittstelle mit DMA und 
Interrupt konfiguriert werden.
Die lcd_init()-Funktion bekommt das Handle der I²C-Schnittstelle 
übergeben.
Eine CubeMX-Datei befindet sich als Beispiel im Anhang.
Die Aktualisierung das Display läuft so komplett im Hintergrund ohne 
weiteres Zutun.

Bei AVRs muß zur Aktualisierung  die Funktion lcd_display() aufgerufen 
werden.

Unterstützte Zeichen:
Die putc()-Funktion vesteht die folgenden Zeichen:
* ASCII [0x20-0x7f]
* Umlaue ä ö ü Ä Ö Ü ß
* Sonderzeichen: ° µ Omega(Ohm)
* Steuerzeichen: \r \n \b

Was noch fehlt:
Das originale Library von Michael hat Unterstützung für die sehr 
ähnlichen SH1106-Controler.
Da ich nicht über so ein Display verfüge und ich das nicht testen kann, 
fehlt die derzeit noch.
Die Zeichen µ und Ohm im Font sind derzeit nur Dummys

Den Code gibts auf github:
https://github.com/HarryLipphaus/OledLib/tree/master

Harry

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?

*** Dieser Beitrag bezieht sich primär auf den AVR-Port ***

Ich hab mal den Speicherbedarf in Abhängigkeit von der Konfiguration 
ermittelt.

Den I2C-Core braucht man natürlich immer.

Der GFX-Core umfasst die Zeichen-Routinen für Linien, Kreise etc.
Wenn man nur die Text-Funktionen nutzt, werden die auch nicht gelinkt.

Speicherbedarf
1
Modul       | Code (Flash) | Stat. RAM
2
------------+--------------+------------
3
I2C-Core    | 234 Byte     |    0
4
Oled (TXT)  | 1619 Byte    |    9 Byte
5
Oled (GFX)  | 1759 Byte    | 1027 Byte
6
GFX-Core    | 1252 Byte    |    0
Im kleinsten Anwendungsfall kommen wir so auf 1853 Byte Code (Oled + 
I2C) und 9 Byte RAM für den reinen Text-Mode mit 8 Zeilen zu 20 Zeichen.


Hier einige Performance Tests

Getestet wurde mit einem 20 Zeichen langen String 
("12345678901234567890"), der via lcd_puts() in einer Zeile ausgegeben 
wird.
Zum Messen wurde der String 10 mal ausgegeben, und die Zeit in ms 
ermittelt.
Bei der display()-Funktion genauso.

Der I2C_bus läuft mit 400 kHz
1
Mode          | Zeit
2
--------------+----------
3
TXT (8 Lines) | 4.4 ms     // 1 Zeile direkt zum Oled
4
GFX (6 Lines) | 1.0 ms     // 1 Zeile in Framebuffer schreiben
5
GFX display() | 25.4 ms    // Framebuffer auf Display kopieren
6
7
Um ein gesamtes Display voll zu schreiben, benötigt man also 
8
9
...im 8-Zeilen Text-Mode:
10
11
8 Zeilen * 4,4 ms = 35.2 ms
12
                    ======= 
13
14
...im 6-Zeilen Graphic-Mode:
15
16
6 Zeilen * 1.0 ms =  6.0 ms
17
+ lcd_display()     25.4 ms
18
----------------------------
19
                    31.4 ms
20
                    =======

p.s.
den 6-Zeilen-Graphic-Mode hab ich zum Test gewählt, da das die 
aufwendigste Form der Darstellung ist, weil sich die Zeichen über 2 
phys. Display-Zeilen erstrecken, und da einige Shift- und 
Mask-Operationen im Spiel sind, die ich so ebenfalls erfasse.

.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.