Forum: Mikrocontroller und Digitale Elektronik Microcontroller + gemeinsamer Datenbus + Möglichkeit des flashens


von Sebastian L. (arakis)


Lesenswert?

Hallo,
ich habe das Gefühl, ich komme auf Dauer nicht um Microcontroller herum. 
Da tun sich bei mir aber zwei grundlegend Fragen auf.

Derzeit werden meine GPIO's von einem Mini-Computer (raspberry pi, ARM 
prozessor, linux) gesteuert. Das Problem: Der Bootvorgang kann bis zu 
einer Minute dauern. Daher habe ich auf Hardwareebene eine 
Blinkanimation eingebaut. Schöner wäre jedoch, wenn direkt zu beginn das 
OLED-Display (per GPIOs) angesteuert werden könnte per Microcontroller. 
Ist Linux hochgefahren, soll der Microcontroller "nichts mehr machen" 
und der Linuxrechner soll die GPIO's steuern.

Ich bin mir nicht sicher, wie ich die verdrahten könnte. Die GPIOs sind 
ja direkt mit dem Linux-rechner verbunden (GPIOs für Shift-Register 
(parallel to seriell, seriell to parallel), OLED-Ansteuerung, etc.). Wie 
kann ich denn nun den Microcontroller da ran bekommen? Einfach parallel 
schalten? Kommen sich die High-Low-Pegel da nicht in die Quere? Anders 
ausgerückt: Soll der Linux-Rechner schweigen und der Microcontroller 
arbeiten, müssen dann die Ausgänge vom Linux-Rechner auf High oder Low 
sein? Natürlich low, aber dann auch das HIGH vom uC dorthin ab. Ich weiß 
jetzt nicht, ob ich die Ausgänge in einen "High-Impedance" Status 
versetzen kann(10K). Soweit ich weiß, kann ich das nicht mit allen 
Ausgängen/Eingängen.

Toll wäre da doch so ein "20 Kanal - Mutli-Umschalter). Gibt es so 
etwas? Eine andere Alternative wäre, den Microcontroller einfach in 
Reihe zu schalten, statt parallel. Dann dann müssten jedoch "alle" Daten 
durchgeschliffen werden. Hätte aber auch vorteile. Zeitintensive Dinge 
wie ständig die 64 Schalter abfragen (Schachbrett), dass wäre ja idealer 
für den uC. Der Bildschirmaufbau (mal abgesehen von einer simplen 
Ladeanimation) kann dann ja so  realisiert werden: Der Linux-Rechner 
schickt das BIld zum uC, dieser sendet es dann direkt weiter um 
OLED-Screen. Habe nur Angst, dass sich dann Übertragungsfehler 
einschleichen könnten bzw. das ganze dann doch "sichtbar" (z.B. 
flackern) werden könnte.

Das nächste ist, ist der Chip aufgelötet, muss/sollte er auf jedenfall 
auch nachträglich geflasht werden können. Aber so weit ich weiß, kann 
man die meisten uCs per SPI flashen.

Kann mir da jemand Erfahrungswerte/Tipps geben?

PS: Bei der Kommunikation mit dem OLED zählte taktzyklus, ansonsten 
wirds ruckelig. Eine direkt-Anbindung (Linux zu OLED) hat daher einen 
Vorteil. Beim booten soll aber der uC eine Ladeanimation anzeigen (uC zu 
OLED).

Lieben Gruß,
Sebastian

von c-hater (Gast)


Lesenswert?

Sebastian Loncar schrieb:

> ich habe das Gefühl, ich komme auf Dauer nicht um Microcontroller herum.

Mit scheint, du hast da sogar schon einen. Der Pi ist nämlich ein (sogar 
ziemlich leistungsfähiges) µC-System.

> Derzeit werden meine GPIO's von einem Mini-Computer (raspberry pi, ARM
> prozessor

Das beibehalten.

> linux

Das wegwerfen. Schon ist das Problem gelöst.

Nunja, dann tun sich allerdings ein ganze Reihe anderer Probleme auf. 
Ohne OS ist der Pi ein ziemlich dummes µC-System. Aber das ist ein 
reines Softwareproblem, wenn auch nicht in einer Nacht zu lösen.

Allerdings scheinst du ja in deiner Anwendung weder den Displaykram noch 
die anderen komplexen Schnittstellen des Pi überhaupt zu nutzen, sondern 
sowohl Ein- als auch Ausgabe komplett über die GPIOs abzuwickeln.

Dann rückt der Aufwand doch schon recht nahe an eine durchprogrammierte 
Nacht. Schließlich gibt es schon ziemlich viel von anderen geleistete 
Vorarbeit für eine Art "Minimal-OS" für den Pi.

Und das schleppt halt nicht die unheimlichen Blähungen eines universell 
einsetzbaren OS wie Linux mit sich herum.

von Sebastian L. (arakis)


Lesenswert?

Nun, mehrere durchprogrammierte Wochen trifft es schon eher. Wir 
sprechen hier von mehreren tausend Zeilen Quelltext für die Logik der 
Auswertung der Sensoren, Ansteuerung des Display, Benutzerführung auf 
der Oberfläche (OLED), ein abstraktes Modell eines Schachspiels, als 
auch die Ansteuerung der Schachengine. Ich werde jetzt bestimmt nicht 
hergehen und die Engine (C++) zu einem uC portieren, als auch meine 
umfangreiche "Steuerungssoftware", welche übrigens in C# geschrieben ist 
(Mono.NET). Außerdem wäre ein uC viel zu schwach um das alles zu 
stemmen. Geschweige denn, dass der Speicher reichen würde. Natürlich 
kann man das auch mit Mini-uCs hinbekommen, aber das ist und war nie das 
Ziel, denn es soll nicht "irgendein" Schachcomputer werden. Eine 
Internetanbindung ist z.B. ja auch erwünscht.

Mir ging es eher darum abzukären, was der richtige Weg wäre, denn ein 
falscher Weg/falsche Idee würde unter Umständen mehrere Wochen Zeit 
vernichten. Mein Gedanke ist im Prinzip, dass eine 60 Sekunden 
Blink-Animation vielleicht etwas unbefriedigend ist für einen Kunden, 
und da eine vorläufige Ansteuerung des OLED per uC 
"anwenderfreundlicher" wäre. Dieser soll/sollte dann aber die Kontroller 
der GPIOs hinterher komplett an den linux-rechner übergeben, ohne des es 
zu elektrischen Frickeleien kommt.

Lieben Gruß,
Sebastian

von c-hater (Gast)


Lesenswert?

Sebastian Loncar schrieb:

> Ich werde jetzt bestimmt nicht
> hergehen und die Engine (C++) zu einem uC portieren, als auch meine
> umfangreiche "Steuerungssoftware", welche übrigens in C# geschrieben ist
> (Mono.NET). Außerdem wäre ein uC viel zu schwach um das alles zu
> stemmen.

Du HAST da bereits ein µC-System, nämlich den Pi! Begreifst du das 
nicht? Und das System wird nicht schwächer, wenn du ein anderes OS zu 
seinem Betrieb benutzt.

> Geschweige denn, dass der Speicher reichen würde.

Auch der wird davon nicht weniger.

von Roland (Gast)


Lesenswert?

Mehrere durchprogrammierte Wochen sind wohl übetrieben.
Der OP hat ja seinen "Anwendungscode" schon fertig. Er muss also "nur" 
die Hardwaretreiber für seine Datenerfassung neu schreiben bzw aus einem 
Framework portieren. Das Display (als Hardwaretreiber) ist da schon bei. 
Das ganze dann in ein schlankes rtOS verpackt, und fertig ist die Laube. 
Schätz mal 1..2 normale Arbeitstage.

Was Zeit kosten wird, ist ein eigenes(G)UI zu bauen...

von Sebastian L. (arakis)


Lesenswert?

Danke für den Hinweis, dass der Pi auch ein uC ist. Ich war der festen 
Überzeugung, er sei ein FPGA. Scherz beiseite. Meine Frage/mein Problem 
ist ein anderes. Und mir geht es auch nicht darum, das Linux schneller 
hochzufahren (worin übrigens in der Tat Optimierungspotenzial besteht) 
oder eine andere Software auf den Pi aufzuspielen oder gar "alles" auf 
einen anderen uC zu portieren.

Mir geht es doch nur darum, beim booten ggf. das OLED VORHER schon 
anzusprechen, bevor Linux hochgefahren ist. Das ließe sich prima mit 
einem kleinen uC lösen, der muss nicht viel können.

Die Frage war einzig allein nach Feedback zu dieser Idee. Es gibt ja 
folgende Lösungsvorschläge:

In einen (weiteren) uC Reihe schalten mit den GPIOs (z.B. den uC 
zwischen OLED und Linux-Rechner): Alles muss durch den uC, "könnte" 
vieles verlangsamen. außerdem muss der uC dann doppelte so viele GPIOs 
haben, wie man am Ende braucht. (z.B. 5 benötigt: 5 rein, 5 raus).

Parallel schalten: uC wird zum schweigen gebracht, sobald Linux 
hochgefahren ist. Dazu müssten alle GPIOs dann von "dem" Chip (linux 
oder der kleine uC) auf High-Impedance gesetzt werden, der gerade 
"nicht" steuert, weil soweit ich weiß die Signale sich sonst verlaufen 
bzw. in de quere kommen.

Oder halt ein Chip, der einen ganzen Datenbus "umschalten" kann. Wenn 0, 
werden Kanäle 0-16 an chip 0 geleitet, wenn 1, dann alle Kanäle nach 
chip1.

Mir geht es NICHT darum, meinen Raspberry Pi zu ersetzen oder da ein 
anders OS oder sonst was aufzuspielen ;) Es wurde sich ganz bewusst für 
die Lösung "Raspberry Pi mit vollwertigem Linux" entschieden, es gibt 
viele Pläne mit dem Gerät.

Der keine (weitere) uC soll nichts anders machen, als einen 
anwenderfreundlichen Start des Gerätes ermöglichen. Ca. 60 auf einen 
shwarzen Bildschirm zu starren ist nicht anwenderfreundlich. Daher habe 
ich ja bereits eine Blinkende LED eingebaut, aber ich dachte, ich mache 
etwas eleganteres.

Im Einfachsten fall sollen einfach nur ca. 10 GPIOs mit einem initialem 
Bit-Muster geflutet werden (natürlich mit timings), es wird keine bzw. 
kaum Logik im uC hinterlegt. Wie gesagt, das wäre das "einfachste", um 
eine Ladeanimation der LEDs als auch des OLED-Screens beizubringen. 
Danach hat der uC "nichts mehr zu sagen".

Lieben Gruß,
Sebastian

von Sebastian L. (arakis)


Lesenswert?

Oder noch einfacher ausgedrückt: Wie kann man bei einem Datenbus 
auswählen, mit welchen Chip er gerade verbunden ist. So, dass der Bus 
elektrisch auch sauber getrennt/verbunden ist von Chip. Ein 
"Chip-Select"-Flag reicht nicht, weil der Datenbus selber dann ja nicht 
getrennt sind bzw. die GPIOs vom "deaktivierten" Chip ja noch gültig 
verbunden sind, und die Ströme nicht dahin fließen, wohin sie sollen.

von Wusel D. (stefanfrings_de)


Lesenswert?

Ich schätze, dass die GPIO Pins vom Raspberry initial alle inaktiv (bzw 
als Eingang geschaltet) sind. Falls das stimmt, kannst Du einen weiteren 
Mikrocontroller einfach parallel schalten. Bevor der Raspberry die GPIO 
Pins aktiviert (das programmierst Du ja selbst) muss der andere 
Mikrocontroller seine Pins deaktivieren. Also brauchst Du wenigstens 
einen Pin, über den sich die beiden Controller gegenseitig umschalten.

von Eumel (Gast)


Lesenswert?

Sebastian Loncar schrieb:
> Oder noch einfacher ausgedrückt: Wie kann man bei einer Datenleitung
> auswählen, mit welchen Chip sie gerade verbunden ist. So, dass die
> Leitung elektrisch auch sauber getrennt/verbunden sind von Chip. Ein
> "Chip-Select"-Flag reicht nicht, weil die Datenleitung selber dann ja
> nicht getrennt sind bzw. die GPIOs vom "deaktivierten" Chip ja noch
> gültig verbunden sind, und die Ströme nicht dahin fließen, wohin sie
> sollen.

Du musst garnichts auswählen, verbinde einfach dein PI direkt mit deinem 
Display und den Controller über Widerstände. Wahrscheinlich (alles 
andere wäre lächerlich) sind die GPIOs des PI beim Start hochohmige 
Eingänge. Also kann dein kleiner Controller bestimmen was das Display 
"sieht". Nach einiger Zeit übernimmt dann dein PI das Display, durch die 
Widerstände kann der kleine Controller nicht mehr reinpfuschen und legt 
sich schlafen :)

von Reinhard Kern (Gast)


Lesenswert?

Sebastian Loncar schrieb:
> Mir geht es doch nur darum, beim booten ggf. das OLED VORHER schon
> anzusprechen, bevor Linux hochgefahren ist.

Dazu braucht man keine extra Hardware. Sieh dir mal eine Live CD von 
GPartEd an - da erscheint sofort ein kompletter grafischer Bildschirm, 
sogar mit Menüauswahl was man starten möchte, und erst NACH dieser 
Auswahl wird Linux hochgefahren. Viele andere zeigen vor und/oder 
während des Hochfahrens Splash Screens an.

Gruss Reinhard

von Roland P. (pram)


Lesenswert?

> Mir geht es doch nur darum, beim booten ggf. das OLED VORHER schon
> anzusprechen, bevor Linux hochgefahren ist. Das ließe sich prima mit
> einem kleinen uC lösen, der muss nicht viel können.

Das sollte sich doch auch mit einem gepatchten Linux-Kernel (oder 
Bootloader?), der gleich am Anfang ein paar IO-Befehle ans Display 
sendet,erledigen lassen?

Gruß
Roland

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.