Forum: PC-Programmierung Raspberry Pi Pico: OLED SSD1306 via C ansteuern


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 Florian J. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich bin auf der Suche nach Informationen bzgl. Ansteuerung OLED SSD1306 
auf einem Raspberry Pi Pico.

Und zwar nicht mit MicroPython (hierüber existieren sehr viel 
Informationen), sondern mit C.

Vorab: reines Kompilieren und "Anschaulichmachen" des Beispiels aus den 
Pico SDK Examples ist ja simpel.

https://github.com/raspberrypi/pico-examples/tree/master/i2c/oled_i2c

Wie auf dem angehängten Foto zu erkennen stellt er drei kleine 
Raspberries dar (die von links nach rechts auf dem Bildschirm wandern).

Mein Problem ist, dass ich ausser diesem einen Beispiel nirgendwo 
weitere erhellende Beispiele finden kann.

Ich mag jenen Code nicht besonders da er lang und kompliziert ist und 
ich zu anfangs eigentlich nur schlichten Text darstellen will.

Also was ich bräuchte wäre ein simples "Hello World" Programm.

Hätte da jemand einen Link zu einem Repository, Forumsbeitrag etc.?

Danke!

PS1: Hier kurz und prägnant was ich in MicroPython tippen würde.
1
(...)
2
from ssd1306 import SSD1306_I2C
3
(...)
4
i2c = I2C(0,sda=Pin(0),scl=Pin(1),freq=40000)
5
oled=SSD1306_I2C(128,64,i2c)
6
oled.fill(0)
7
oled.show()
8
oled.text("Hello",0,0)
9
oled.text("World",0,10)
10
(...)

PS2: Auch das Datenblatt hilft mir eher nicht.

https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

von Zeno (Gast)


Lesenswert?

Ach ja, wieder mal so ein Maker der denkt ist ja alles so simpel - 
zusammen stöpseln, etwas Copy & Paste und schon läufts. Nein so einfach 
ist es eben nicht. Man muß das schlichtweg lernen. Das passiert in Lehre 
oder beim Studium, wenn man dies zu seinem Beruf machen möchte. Für's 
Hobby geht das mit Lesen, Lesen nochmals Lesen und zwar Fachliteratur, 
Datenblätter etc. und dazu ne gehörige Portion Schweiß. Und ja auch 
Tiefschläge gehören da zum Geschäft, die sind aber in alle Regel äußerst 
lehrreich.

von Florian J. (Gast)


Lesenswert?

Naja, das Gute an meinem Aufbau ist: es läuft schon.

Codebeispiele im beschriebenen Kontext wären allerdings dennoch 
hilfreich. Die gibt es nach meiner Rechereche nämlich nicht. Aber 
vielleicht habe ich auch was übersehen.

Ansonsten finde ich es durchaus auch selber heraus, sow wie in der 
Vergangenheit auch.

Eine Mentalität wie du sie hier zur Schau stellst mache ich mir dennoch 
nicht zu Eigen. Ich freue mich eigentlich immer mein (gewiss begrenztes) 
Wissen zu teilen, auch mit Leuten wie dir.

von asd (Gast)


Lesenswert?

Kann es sein dass dein Problem in einem Denkfehler liegt? Ich hab nur 
kurz drüber geschaut aber es wirkt auf mich so als würde der "Treiber", 
bzw. das Code-Beispiel nur Pixel-Grafik unterstützt, und davon ausgeht 
dass du Pixel setzen und löschen willst. Von Text habe ich in dem ganzen 
Code nichts gesehen.
Schaut also so aus als müsstest du Text selber in Pixel umsetzen und auf 
das Display kopieren. Einen Diskussion um Pixel-Fonts in verschiedenen 
Größen findest du hier:
Beitrag "Re: 6-8px Win1252 Font"

von Olaf (Gast)


Lesenswert?

> Ich mag jenen Code nicht besonders da er lang und kompliziert ist und
> ich zu anfangs eigentlich nur schlichten Text darstellen will.

Das liegt daran das das gesamte Framework vom Pi Pico von vorne bis 
hinten ein ueberkomplizierter Schmerz im Arsch ist. Ich musste lange 
nicht mehr so kotzen wie beim lesen dieses Sourcecodes. Sowas will man 
einfach nicht in seinen Projekten haben, es tut weh.

Hier liefert dir jemand ein paar Beispiele wie es ohne den Kram geht:

https://github.com/dwelch67/raspberrypi-pico

Fuer das ansprechen der I2C-Schnittstelle und danach deines Oleds liesst 
du dann einfach nur die Datenblaetter und programmierst das eben runter. 
Keine grosse Sache. Hat bei mir 2-3h gedauert. Vorausgesetzt natuerlich 
du kannst schon programmieren und weisst das damit was anderes gemeint 
ist als aus dem Internet Source zu kopieren.

Olaf

von Olaf (Gast)


Angehängte Dateien:

Lesenswert?

Vielleicht noch mal einen Tip fuer diejenigen die einen Pico
als richtigen Microcontroller ohne das aufgeblasene System vom 
Hersteller
nutzen wollen. Der von mir oben gepostete Link zeigt nicht nur wie man
seinen eigenen Source viel einfacher uebersetzt, er liefert auch das
Tool um aus einem hex/bin das uf2 File zu erzeugen das man braucht um
sein Programm direkt auf den Pico kopieren zu koennen!

Man wird allerdings schnell feststellen das dies auf dauer nervig ist 
und man gerne eine echten Debugger verwenden will.

Es gibt von Arm eine definierten Stecker fuer das Debuging der schoen
klein ist:

https://www.keil.com/support/man/docs/jlink/jLink_connectors.htm

Den kann man sich auch gut selber auf den Pico kleben. Siehe Bild.

Bevor man das tut sollte man allerdings pruefen ob die eigene JLink
Hardware modern genug ist um den Pico zu unterstuetzen. Das geht
naemlich nicht mit jedem JLink! Es kommt da auf die Hardwarerevion
an und nicht ob man einen Ultra oder EDU hat!

Olaf

von Oliver S. (oliverso)


Lesenswert?

Olaf schrieb:
> Hier liefert dir jemand ein paar Beispiele wie es ohne den Kram geht:
>
> https://github.com/dwelch67/raspberrypi-pico

Und wie geht damit die gewünschte Textausgabe per printf ?

Das eigentlich Problem des TO ist nicht unschöner Code, sondern fehlende 
Funktionalität. Das löst dein link auch nicht.

Das hier ist das Problem:

asd schrieb:
> Schaut also so aus als müsstest du Text selber in Pixel umsetzen und auf
> das Display kopieren.

Oliver

von Olaf (Gast)


Lesenswert?

> Und wie geht damit die gewünschte Textausgabe per printf ?

Man programmiert es sich. Wobei ich gerne mein eigenes printf nutze das 
ich seit 20Jahren verwende. Einfach reinkopiert und fertig.

Allerdings gibt es natuerlich auch ein printf in den Libaries des 
Compilers. Bei so einem fetten Controller kann man ja mal schludrig 
sein. Das muss man sich halt _write und tiefer selber programmieren. 
Finde ich sowieso besser weil man dann seine eigenen Fonts verwenden 
kann.

Olaf

von foo (Gast)


Lesenswert?

Olaf schrieb:
> Hier liefert dir jemand ein paar Beispiele wie es ohne den Kram geht:
>
> https://github.com/dwelch67/raspberrypi-pico

Makefile Bug!

Die Makefile hat nen Bug die bei neuer gcc version den compile 
verhindert, das
-nostartfiles muss zu den COPS hoch:
1
COPS = -Wall -O2 -ffreestanding -nostartfiles $(XCPU)
2
LOPS = -nostdlib

Grund: https://sourceware.org/pipermail/binutils/2021-June/116826.html

von olaf (Gast)


Lesenswert?

> Makefile Bug!

Ist mir nicht aufgefallen. Aber ich habe auch mein eigenes Makefile.
Ich hab das was dwelch da geleistet hat auch nur als Anregung genommen
und vieles selber gemacht. .-)

Bei mir sieht es so aus:

CFLAGS += -fno-diagnostics-show-caret
CFLAGS += -fdata-sections -ffunction-sections
CFLAGS += -funsigned-char -funsigned-bitfields
CFLAGS += -mcpu=cortex-m0plus -mthumb
CFLAGS += -Wl,--gc-sections  -Wl,-Map=$(BUILD)/mapfile.map
CFLAGS += -MD -MP -MT $(BUILD)/$(*F).o -MF $(BUILD)/$(@F).d

LDFLAGS += -mcpu=cortex-m0plus -mthumb
LDFLAGS += -lc -lm  -lrdimon
#LDFLAGS += -nostdlib
LDFLAGS += -specs=nosys.specs
LDFLAGS += -lgcc
LDFLAGS += -nostartfiles
LDFLAGS += -Wl,--gc-sections
LDFLAGS += -Wl,--script=./syssrc/rp2040.ld
LDFLAGS += -Xlinker -Map=$(BUILD)/$(BIN).map


Olaf

von Uwe D. (monkye)


Lesenswert?

olaf schrieb:
>> Makefile Bug!
>
> Ist mir nicht aufgefallen. Aber ich habe auch mein eigenes Makefile.
> Ich hab das was dwelch da geleistet hat auch nur als Anregung genommen
> und vieles selber gemacht. .-)

Perfekt für einen Anfänger. HaHaHa.

Keine Ahnung ob er das lösen konnte, es hätte sicher gereicht, wenn er 
die Doku gelesen hätte…
https://docs.micropython.org/en/latest/esp8266/tutorial/ssd1306.html

Keine Ahnung warum das Fahrrad immer wieder neu erfunden werden muss.

: Bearbeitet durch User
von olaf (Gast)


Lesenswert?

> Keine Ahnung warum das Fahrrad immer wieder neu erfunden werden muss.

Weil Python ein rostiges Hollandrad mit defekter Tretkurbel und 
bescheidener Uebersetzung ist. Aber klar, man erreicht damit auch Ziele.

Olaf

von Uwe D. (monkye)


Lesenswert?

olaf schrieb:
>> Keine Ahnung warum das Fahrrad immer wieder neu erfunden werden muss.
>
> Weil Python ein rostiges Hollandrad mit defekter Tretkurbel und
> bescheidener Uebersetzung ist. Aber klar, man erreicht damit auch Ziele.
>
> Olaf

Die Frage bezog sich nicht auf Deine Meinung und Deine 
Selbstbeweihräucherung - Sorry. Es war nicht gefragt ob Du es kannst.
Und vergiss nicht negativ zu bewerten.

von Jack V. (jackv)


Lesenswert?

Uwe D. schrieb:
> Keine Ahnung ob er das lösen konnte, es hätte sicher gereicht, wenn er
> die Doku gelesen hätte…
> https://docs.micropython.org/en/latest/esp8266/tutorial/ssd1306.html
>
> Keine Ahnung warum das Fahrrad immer wieder neu erfunden werden muss.

Vielleicht, weil der TE ausdrücklich in C schreiben wollte – dass er 
Micropython kennt und weiß, wie das Display dort zu nutzen wäre, lässt 
sich aus dem unteren Teil des Eingangsbeitrags durchaus ableiten, finde 
ich.

Es ist für mich nachvollziehbar, dass man, wenn Micropython für einen 
Job nicht [mehr] reicht (gibt da Sachen, die gehen damit einfach nicht), 
oder man aus anderen Gründen (z.B. zum Lernen) mit C/C++ hantieren 
möchte, auch das Display aus C/C++ heraus ansprechen möchte.  Insofern 
halte ich die Frage grundsätzlich für legitim, und ich frage mich ein 
wenig, zu welchem Zweck du in diesem Kontext die Micropython-Doku 
verlinkt hast und von Fahrrädern schreibst.

: Bearbeitet durch User
von Joachim L. (nixiefan)


Lesenswert?

Billiger, schneller und einfacher wäre es dafür einen ESP32 zu benutzen. 
Dafür gibt es dann auch fertigen Code in verschiedenen Versionen (z.B. 
Arduino) auf Github. Wieso kauft überhaupt jemand einen Raspberry Pico 
W, wo es ESP32 schon so lange gibt? ESP ist nur halb so teuer und wenn 
man keinen Dualcore und BLE braucht, reicht auch ein ESP8266. 
Schopfküttel!

von olaf (Gast)


Lesenswert?

> Wieso kauft überhaupt jemand einen Raspberry Pico
> W, wo es ESP32 schon so lange gibt?

Schau mal kleiner, ich erklaers dir. Es gibt Leute die betrachten 
programmieren intellektuelle entspannende Uebung. Vielleicht so wie 
schlichtere Gemueter Kreuzwortraetzel loesen oder TV kucken. Die 
programmieren dann selbst. Die finden es nett einen Dualcore zu haben 
oder ein System wie eine PIO zu erforschen. Die halten kopieren und 
"moeglichst einfach" fuer nicht zielfuehrend.
Ich weiss alles schraege Nerds, aber die haben uns schon mal geholfen 
aus der feuchten Hoehle rauszukommen und das Feuer zu entdecken. Cool 
oder?

Olaf

von Uwe D. (monkye)


Lesenswert?

Jack V. schrieb:
> Uwe D. schrieb:
>> Keine Ahnung ob er das lösen konnte, es hätte sicher gereicht, wenn er
>> die Doku gelesen hätte…
>> https://docs.micropython.org/en/latest/esp8266/tutorial/ssd1306.html
> Vielleicht, weil der TE ausdrücklich in C schreiben wollte – dass er
> Micropython kennt und weiß, wie das Display dort zu nutzen wäre,
> …
> sich aus dem unteren Teil des Eingangsbeitrags durchaus ableiten,
> halte ich die Frage grundsätzlich für legitim, und ich frage mich ein
> wenig, zu welchem Zweck du in diesem Kontext die Micropython-Doku
> verlinkt hast und von Fahrrädern schreibst.

Mea culpa - habe das entscheidende Detail nicht MicroPython überlesen 
(selektive Wahrnehmung). Denn für MicroPython hätte der Link genügt.

Nach 10 Sekunden Suchmaschine:
- https://github.com/daschr/pico-ssd1306
- https://forums.raspberrypi.com/viewtopic.php?t=299754

Mit einer Vorlage in einer mir nicht völlig unbekannten 
Programmiersprache kann ich relativ einfach „abbasteln“.

Nachtrag: Und natürlich das Datenblatt in die Hand nehmen, da steht eine 
Menge drin (Befehle, Organisation, …) und macht den vorliegenden 
Quellcode verständlicher.

: Bearbeitet durch User

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.

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