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
*** 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.