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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Elias *. (green_phanta)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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ß.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.