Forum: Mikrocontroller und Digitale Elektronik OLED Display legt Teensy lahm / Flackern


von Elias *. (green_phanta)


Lesenswert?

Hi Leute,

egal welche Library ich für mein 128x64 Oled Display (SSD1306) verwende, 
wenn ich den Screen Inhalt aktualisiere (sei es mit clear() oder per 
Leerzeichen) flackern kurz sämtliche LEDs meines Button Pads.

Ich dachte zuerst irgendeine Strom-Unterversorgung.
Aber dann habe ich meine OLED Funktionen im Code kommentiert, und siehe 
da, dann läuft's.

Es sieht sogar so aus, als würde sich dieses "Flackern" blockend – 
ähnlich einem Delay – verhalten.

Kennt jemand dieses Problem?
Danke für jeden Tipp!

von Jim M. (turboj)


Lesenswert?

Schaltplan.
Wenn die LEDs nicht gemultiplext sind, sollte man sich die GPIO Port/Pin 
Zugriffe genau anschauen, Stichwort Read-Modify-write und Interrupt.

von Rudolph (Gast)


Lesenswert?

I2C oder SPI und wie schnell?
Der komplette Inhalt sind 1024 Byte, so roh, ohne Adressierung, das 
dauert seine Zeit, vielleicht braucht das einfach so lange?

von Elias *. (green_phanta)


Lesenswert?

Rudolph schrieb:
> I2C oder SPI und wie schnell?

I2C, und ich habe den Teensy 3.6. Ich weiß leider nicht wie ich die I2C 
Geschwindigkeit herausfinden kann?


Jim M. schrieb:
> Wenn die LEDs nicht gemultiplext sind, sollte man sich die GPIO Port/Pin
> Zugriffe genau anschauen, Stichwort Read-Modify-write und Interrupt.

Die LEDs sind ge-Shiftregistert. Macht das einen Unterschied?
Ich zeichne gerne einen Schaltplan, ich habe derzeit keinen aktuellen, 
aber das schaffe ich erst heute Abend …

von Elias *. (green_phanta)


Lesenswert?

Ich hatte I2C auf 100Mhz, und es war schlichtweg zu langsam für die 
Buffergröße – so meine Annahme.

Ich habe jetzt auf SPI gewechselt, und sogar mit der "dicken" Library 
funktioniert alles wie am Schnürchen.

Offensichtlich bietet sich I2C nicht so gut für Displays mit hoher 
Refreshrate an?

Danke euch!
Gruß.

von Rudolph (Gast)


Lesenswert?

I2C eher auf 100kHz. :-)
Und da dauert das dann mal eben 100ms um den Refresh zu machen.

Da 10 Bilder pro Sekunde auf dem Display völlig ausreichend wären ist 
das Problem eher, wie die Daten in das Display geschaufelt werden.
Den Controller blockierend am Stück ist da nicht die beste Strategie. 
:-)

von Elias *. (green_phanta)


Lesenswert?

OK, selbst bei SPI bekomme ich bei aufwändigeren Display Änderungen 
Probleme. Meine LEDs beginnen zu flackern und ich flackere mit :/

Habe probiert mit einer displayRefresh() Funktion welche sich nur alle 
15 Millisekunden ausführen darf – wenn sie getriggert wird – eine 
Verbesserung zu erreichen, aber ne.

Rudolph schrieb:
> ist das Problem eher, wie die Daten in das Display geschaufelt werden.
> Den Controller blockierend am Stück ist da nicht die beste Strategie.


• Hast du eine bessere Strategie bzw einen Ansatzpunkt für mich?
• Ist es Performance-technisch ein großer unterschied zwischen Hardware 
und Software SPI?

Gruß!

von Max D. (max_d)


Lesenswert?

Hardware-SPI liefert dir einen Interrupt wenn ein Byte rüber ist, damit 
kansnt du in der zwischenzeit anderes erledigen. Bei richtiger 
Programmierung sind das Welten.

von Rudolph R. (rudolph)


Lesenswert?

Elias *. schrieb:
> • Hast du eine bessere Strategie bzw einen Ansatzpunkt für mich?

Ein volles Update könnte man in kleine Häppchen aufteilen, so 64*16 
Pixel und dazwischen was anderes.
Oder eben nicht blockierend per DMA.
Alternativ nur die Änderungen übertragen, etwa in dem man einen 
statischen Bereich und einen dynamisch bedienten Bereich im Display 
definiert und den statischen Kram nur einmal überträgt.

> • Ist es Performance-technisch ein großer unterschied zwischen Hardware
> und Software SPI?

Kommt darauf an, wenn man sowieso nur in einer Schleife einzelne Bytes 
verschickt, hat man zwischen diesen je nach Takt des SPI und des 
Controllers ohnehin nicht viele Taktzyklen in denen man was anderes 
machen könnte.
Eine 80MHz CPU hat zwischen zwei Transfers mit einem 10MHz SPI gerade 
eben mal 64 Taktzyklen.
Das ist schon was, aber eben nicht gerade viel.

Max D. schrieb:
> Hardware-SPI liefert dir einen Interrupt wenn ein Byte rüber ist, damit
> kansnt du in der zwischenzeit anderes erledigen. Bei richtiger
> Programmierung sind das Welten.

Auch eine Frage der Takte, bei einem 16 MHz AVR mit 8 MHz SPI würde der 
ja aus den Interrupts quasi nicht mehr raus kommen.

Der Teensy hat doch nen ARM drauf, oder?
Der hat doch bestimmt DMA -> Puffer füllen, Übertragung anschieben und 
der Interrupt kommt wenn der Puffer übertragen wurde.

von Elias *. (green_phanta)


Lesenswert?

Rudolph R. schrieb:
> Alternativ nur die Änderungen übertragen, etwa in dem man einen
> statischen Bereich und einen dynamisch bedienten Bereich im Display
> definiert und den statischen Kram nur einmal überträgt.

Habe ich probiert, läuft nur semi gut.

Rudolph R. schrieb:
> Oder eben nicht blockierend per DMA.

Ich habe mich eben ein wenig über DMA schlau gemacht, und das klingt ja 
genau nach dem was ich suche. Zu meinem Teensy 3.6:
180 MHz ARM Cortex-M4 with Floating Point Unit
1M Flash, 256K RAM, 4K EEPROM

Nun verwende ich aktuell die Adafruit 1306 Library für das OLED, und ich 
habe gesehen es gibt auch eine "DmaSpi" Library für den Teensy 3.6. Muss 
ich jetzt in der Adafruit Library etwas ändern um DMA zu verwenden oder 
kann ich das einfach in meinem Sketch deklarieren?

Und noch eine Verständniss Frage am Ende:
Wer verwendet denn OLED Displays zB mit Arduino und I2C wenn es so 
"lahm" ist? Ich meine einen Sensorwert auf einem Display auszugeben und 
ständig aktuell zu halten ist ja keine all zu spezifische Anwendung, und 
wenn das Arduino dann die ganze Zeit ins stocken kommt ... Wie machen 
die das :)?

Danke ihr helft mir sehr!
Gruß.

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.