Ich versuche gerade in einer vTimer CallBack Funktion einen Text auf ein OLED (SSD1306) zu schreiben. Leider springt mir anscheinend immer jemand dazwischen. Bei Start (setup()) benutze ich zum eigentlichen Schreiben auf das OLED die gleiche Funktion wie auch in der vTimerCB. Solange der Scheduler nicht gestartet ist, ist alles gut, die Texte sind sauber und sofort da. In der vTimerCB klappt schon das display.clearDisplay(); nicht, die alten Texte werden ggf. überschrieben aber nicht gelöscht. Man kann auch zusehen wie die einzelnen Zeilen geschrieben (verkrackelt) werden. Das deutet für mich darauf hin, das da immer wieder ein Prozess dazwischen geht und damit das Timing auf dem I2C-Bus gestört ist, jedenfalls war es so, als ich das schon einmal hatte und mit dem Oszi nachgeschaut hatte. Testweise habe ich alle anderen vTasks auskommentiert, die sind es nicht, die da dazwischen gehen. Vorher hatte ich es erfolglos mit vTaskSuspend und vTaskResume versucht. Ein Einfügen von vTaskDelay(50 / portTICK_PERIOD_MS) nach jedem Schreiben auf das OLED hat es auch nicht gebracht. Nächster Versuch war portENTER_CRITICAL(mux). Mir ist schon klar, das das eigentlich für so lange Operationen nicht gedacht ist. Natürlich hat gleich der "Wachhund" zugebissen. Es ist doch eigentlich ein trivialer Vorgang, was aber mache ich falsch? ESP32: framework = arduino platform = espressif32 Libs für OLED-Zugriff: Adafruit BusIO Adafruit SSD1306 Adafruit GFX Library Im Hintergrund gestartet sind noch Webserver und Wifi, die haben aber noch nie gestört. Vorher hatte ich das ganze klassisch laufen (setup/loop) und da hatte ich nie solche Probleme. Es gibt auch keinen anderen Prozess der versucht auf dem I2C-Bus rumzuwerkeln. Vielleicht sind die Adafruit - Libs auch für FreeRTOS nicht geeignet, welche währen es dann?
:
Bearbeitet durch User
Johannes A. schrieb: > vTimerCB Ist das vielleicht eine ISR? Wenn deine I2C Lib nicht darauf ausgerichtet ist, in einer ISR zu funktionieren, dann wird das wohl nichts.
Johannes A. schrieb: > Vielleicht sind die Adafruit - Libs auch für FreeRTOS nicht geeignet, Doch schon. In einer Task werden sie laufen, in einer ISR offensichtlich nicht.
Probiere mal das: In der vTimer CallBack ein Flag setzen, und in der Main-Loop die Textausgabe machen
Vielen Dank für die vielen Vorschläge. Leider führen die nicht weiter. Ein vTimer ist keine ISR und auch das Verschieben der Funktion von von einer vTimerCB in eine vTaskCB hat nichts gebracht. Btw. In FreeRTOS gibt es keine main loop, es geschieht alles in vTasks oder vTimern.
Lösung: So, vermutlich habe ich eine Lösung gefunden. Ich schließe zwar immer noch nicht die Adafruit Libs ganz aus, aber es scheint zu funktionieren. Ich erinnerte mich dunkel, das FreeRTOS-Zeugs läuft auf Core0, also habe ich es versucht mit:
1 | if (xTaskCreatePinnedToCore(display_CB, "Display", 10000, NULL, 30, &DisplayTask, 1) == pdPASS) { |
2 | ...
|
Die 1 als letzten Parameter Pinnt die Funktion auf Core1, damit kommen sich wohl die Prozesse nicht mehr quer. Sieh da, es funktioniert.
:
Bearbeitet durch User
Bin kein ESP Experte, wofür ist die BusIO Lib drin? Die SSD1306 arbeitet direkt mit Wire und SPI.
Keine Ahnung warum die BusIO Lib drin ist. PlatformIO scannt und sucht sich alles zusammen. Falls ich den Baum richtig interpretiere, ist das keine Abhängigkeit von den Adafruit-Libs sondern da hängt noch ein LoRa-Device über SPI dran. Das Ausmisten hatte ich mir für später vorgenommen.
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.