Forum: Mikrocontroller und Digitale Elektronik Console auf µC oder ähnlich


von Thommy (Gast)


Lesenswert?

Hallo zusammen,

ich suche eine Möglichkeit über eine Schnittstelle (z.B. UART<->USB / 
Netzwerk) Werte auf einem µC in Echtzeit zu ändern.

Gibt es hierfür schon Beispiele?

LG
Thommy

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Ja, hierfür gibt es etliche Beispiele. Nahezu jedes Linux-System enthält 
eine Login-Shell, die über die unterschiedlichsten Wege zugänglich ist 
bzw. gemacht werden kann, d.h. per UART, SSH, TELNET. Selbiges gilt 
natürlich auch für andere unixoide Betriebssysteme wie z.B. verschiedene 
BSD-Derivate.

Für kleinere Systeme gibt es aber auch Shell-Implementierungen, häufig 
auch als Monitorprogramm bezeichnet. Ein populärer Vertreter ist Nucleus 
RTOS bzw. Nucleus PLUS. Laut der folgenden Seite ist die Nucleus Shell 
auch in diversen Fritzboxen enthalten:

http://www.wehavemorefun.de/fritzbox/Nucleus

Solch eine Shell kann entweder in einem eigenen Betriebssystemprozess 
bzw. Thread laufen oder auch komplett in dem/den Interrupthandler des 
angebundenen UART o.ä.. Selbst in kooperativen Systemen kann man solch 
eine Shell einsetzen und die betreffende Bearbeitungsfunktion zyklisch 
aufrufen. Je nach Prozessor kann solch eine Shell statt an einen UART 
auch z.B. an ein JTAG-Interface gebunden werden, z.B. ARM DCC. 
Lauterbach TRACE32 enthält auch ein Terminalprogramm, welches an den DCC 
gebunden werden kann. Somit kann man sich dann auch ohne UART oder 
Netzwerkverbindung auf dem Gerät einloggen.

von Lars R. (lrs)


Lesenswert?

eventuell Micropython.

von Johnny B. (johnnyb)


Lesenswert?


von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

In der Dokumentation zum AVR-GCC wird im 'grossen' Anwendungsbeispiel 
beschrieben, wie man iostreams auf z.B. den UART leitet. Auch eine 
einfache Konsole ist da schon bei.

von fop (Gast)


Lesenswert?

Es gibt auch ein Protokoll namens XCP, um auf Mikrokontrollern Parameter 
zu ändern und interne Daten im laufenden Betrieb auszulesen.
Dabei ist das Übertragungsmedium im Standard nicht festgeschrieben. Der 
Code, der auf dem Mikrokontroller laufen muss relativ übersichtlich.
Allerdings auf PC Seite braucht man Software, die
a) eine standardisierte Datei (.a2l) erstellt, die enthält an welcher 
Stelle (Adresse) im Mikrocontroller die interessanten Daten stehen und 
wie sie codiert sind
b) Kommunikation, Anzeige und Eingabe bewerkstelligt

von mh (Gast)


Lesenswert?

fop schrieb:
> ... XCP ...
> ... eine standardisierte Datei (.a2l) ...

Der Ansatz von XCP (möglichst wenig auf dem Zielsystem) ist schon gut, 
aber wenn man sich mal so ein a2l-file anschaut und schaut, was die 
entsprechenden Tools so kosten (*), vergeht's einem.

(*) OK, ich bin schon eine Weile weg von XCP, aber was das Zeug vor ein 
paar Jahren gekostet hat (in Relation zur Funktionalität) - das war 
schon sehr grenzwertig.


Lieber selber basteln... Ein einfaches Protokoll (Lese von Adresse, 
Schreibe nach Adresse, ...) in Kombination mit einem Mapfile-Parser 
(ggf. noch Parser für Kommentare im Source) und einer kleinen GUI und 
schon hat man sein eigenes pseudo-XCP-Toolkit.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thommy schrieb:
> eine Möglichkeit über eine Schnittstelle (z.B. UART<->USB / Netzwerk)
> Werte auf einem µC in Echtzeit zu ändern.
Nachdem inzwischen "ein µC" vom 6-Pin-SOT23 bis zum 1000-Ball-BGA und 
von 4MHz bis 2GHz Taktfrequenz und natürlich von 8 bis 32 Bit geht, wäre 
es für eine wirklich zielführende Antwort sinnvoll, zu wissen, WAS du 
WOMIT erreichen willst.

von HildeK (Gast)


Lesenswert?

Lothar M. schrieb:
> wäre
> es für eine wirklich zielführende Antwort sinnvoll, zu wissen, WAS du
> WOMIT erreichen willst.

Genau!
Ich habe zuerst an was in der Klasse ATMega8 gedacht. Da reicht eine 
UART-Verbindung zu einem PC mit Terminalprogramm, um einzelne 
Programmablauf- oder Parametersteuerungen vorzunehmen, weil so schon 
gemacht.

von Stefan F. (Gast)


Lesenswert?

>> WAS du WOMIT erreichen willst.
> Ich habe zuerst an was in der Klasse ATMega8 gedacht

Das ist nicht wirklich eine Antwort auf die Frage.

Eine brauchbare Antwort wäre zum Beispiel:

Ich möchte eine spezielle Waschmaschine für industrielle Zwecke bauen. 
Das Bedienfeld soll einfach nur drei Taster zur Auswahl von 3 
Waschprogrammen haben, sowie ein weiterer Taster für Pause (kurz 
drücken) und Stop (lange drücken). Die Wachmaschine hat einen BLDC Motor 
für den Antrieb der Trommen, zwei Motoren zum Vorschub des Waschmittels, 
sowie 6 Magnetventile zum Einlassen von Flüssigkeiten. Weiterhin hat sie 
3 Temepraturfühler, 4 Durchflussmelder, eine Waage, zwei 
Beschleunigungs-Sensoren (zur Erkennung von Vibration) und eine 
Abwasserpumpe.

Ein Mikrocontroller soll die Maschine autark steuern, über ein Interface 
zu einem tragbaren Terminal (kann gerne auch ein Laptop sein) möchte ich 
die Parameter der drei Waschprogramme konfigurieren können, Störungen 
analysieren können und Nutzungsstatistiken abrufen. Diesen brauchen 
nicht bunt viasualisiert werden, ein eines Textbasiertes Interface, wo 
man Kommandos eingibt oder Formulare ausfüllt, würde mir genügen.

Mit Parameter meine ich nicht nur konfigurierbare Zahlenwerte, sondern 
auch die Komposition der drei Programme aus einem katalog von 
Programmschritten. Zum Beispiel: Lasse x Liter Wasser einlaufen", "Heize 
auf x°C auf", "Drehe n mal links herum", "Führe x cm Waschmittel zu", 
...

Also: Was willst du erreichen?

Zu deinem ATmega8: Mit 8kB Speicher an einem seriellen Terminal kannst 
du nicht viel erreichen. Denn sicher willst du ein komfortabes Interface 
haben, das Texte anzeigt, Eingaben formatiert und validiert. Nimm da mal 
eher einen µC mit wenigsten 32kB Flash. Oder hast du Dir so ein 
kryptisches Minimal-Interface vorgestellt?:
1
w1434,244  (Schreibe den Wert 244 in die Speicherzelle 1434)
2
r0,10      (lese 10 Speicherzellen ab Adresse 0)
3
12,65,255,255,123,4,3,12,11,45

Beitrag #5112583 wurde von einem Moderator gelöscht.
von HildeK (Gast)


Lesenswert?

S. Landolt schrieb im Beitrag #5112583:
> Zwar wurde schon einmal über das Geschlecht von HildeK gerätselt, aber
> eines steht fest: Thommy heißt er/sie/es nicht.

Was willst du uns/mir damit sagen?
Um das Rätsel zu lösen (hab mich schon mehrfach geoutet :-)), ich bin 
männlich und den Nicknamen hab ich abgeschaut von meinem ersten mir 
zugeteilten Loginnamen auf einer UNIX-Workstation (~1990), bestehend aus 
einem Teil des Nachnamens und dem Anfangsbuchstaben des Vornamens (ja, 
Thommy passt nicht). Dass der Nachnahmenteil sich mit einem weiblichen 
Vornamen deckt, ist halt Zufall. Und, auch wichtig: ich poste nur 
unter diesem Nicknamen!

Stefan U. schrieb:
> Das ist nicht wirklich eine Antwort auf die Frage.
und
> Zu deinem ATmega8:

Sorry, ich bin nicht der TO. Und der hat noch nicht mal gesagt, was er 
damit machen will.
Aber zu deinen Beispielen
> Lasse x Liter Wasser einlaufen",
> "Heize auf y°C auf

könnten ja UART-Kommandos der Art
 Wx bzw.
 Hy
ausreichen?
Die offene Frage (Lothar M.) war ja, welchen µC hat der TO denn zur 
Verfügung? Ist es ein leistungsfähiger mit Linux und Terminalprogramm 
oder eher ein kleines Teil, etwa ein Tiny oder Mega ...

von Stefan F. (Gast)


Lesenswert?

> Die offene Frage war ja
> welchen µC hat der TO denn zur Verfügung?

oder anders herum gefragt:
Was genau hast du vor, dann nennen wir einen dazu geegneten µC.

Jetzt wird's aber echt Zeit, daß  Thommy sich wieder meldet.

von S. Landolt (Gast)


Lesenswert?

an HildeK:
Ihnen/Dir wollte ich eigentlich gar nichts sagen, sondern nur Stefanus 
den Hinweis geben, dass er den Falschen adressiert hatte.

von Stefan F. (Gast)


Lesenswert?

Jetzt habe ich den Hinweis auch verstanden. Sorry, hat lange gedauert.

von S. Landolt (Gast)


Lesenswert?

Pardon, mein Fehler, ich hätte ein Grinsgesicht anfügen sollen.

von Gerd E. (robberknight)


Lesenswert?

Thommy schrieb:
> ich suche eine Möglichkeit über eine Schnittstelle (z.B. UART<->USB /
> Netzwerk) Werte auf einem µC in Echtzeit zu ändern.

Das geht auf verschiedenen Ebenen.

Du kannst eine kleine Shell entwickeln (oder wiederverwenden), die 
Befehle über die serielle Schnittstelle entgegennimmt, interpretiert und 
dann ausführt. Darüber kannst Du dann solche Befehle wie z.B. "set rpm 
1000" entgegennehmen und damit den Parameter "rpm" zur Laufzeit 
verändern.

Die andere Variante wäre ein standardisiertes Protokoll, welches bereits 
Mechanismen zum Verändern von Registern in einer Registertabelle 
vorsieht.
Beispiele hierfür wären Modbus oder CANOpen.

Letzteres macht vor allem Sinn wenn Du Deinen µC in einen Bus mit 
anderen, bereits vorhandenen Geräten einbringen oder mit anderen 
Steuergeräten etc. verbinden möchtest. So ein Protokoll umzusetzen 
dürfte komplexer sein als eine kleine Shell.

Beispiele für eine kleine Shell für µCs:
http://www.ethersex.de/index.php/ECMD_(Deutsch)
http://chibios.sourceforge.net/html/group___s_h_e_l_l.html

von Stefan F. (Gast)


Lesenswert?

Eigentlich macht I²C genau so etwas in kleinstmöglicher Form.

von Gerd E. (robberknight)


Lesenswert?

Stefan U. schrieb:
> Eigentlich macht I²C genau so etwas in kleinstmöglicher Form.

Dafür kommst Du aber vom PC aus nicht ganz so einfach auf I2C. Du 
brauchst erst sowas wie nen BusPirate, FT2232 etc. den Du dann vom PC 
aus ansteuern kannst. Jeder der Adapter verwendet sein eigenes Protokoll 
und braucht daher sein eigenes Programm zur Ansteuerung.

UART oder USB-CDC vom PC aus anzusteuern ist dagegen gängig, ohne 
ungewöhnliche Treiber möglich und braucht nur ein beliebiges 
Terminalprogramm.

von Thommy (Gast)


Lesenswert?

Cool, DAnke für die ganzen Antworten.

ich suche einfach eine Möglichkeit Parameter umzustellen wärend der 
Laufzeit. Erstmal nur zum Debugging. Z.b. die PWM von einem Lüfter oder 
so.
schön wäre es wenn man Variablen schreiben kann.
Kryptisch wäre erstmal okay.

Arbeite gerade auf einem STM32F103, hatte aber auch schon atmegas und 
pics in der hand.

Grüße
Thomas

von Adam P. (adamap)


Lesenswert?

Hey Thommy,

eine einfache Lösung wäre:

du erzeugst dir ein globales Daten-Array, ob nun 8, 16 oder 32 bit.
32 bit wären evtl. bei vielen Daten überflüssig, dann lieber 16 bit und 
falls du 32 schreiben willst, nutzt du einfach zwei "Datenfelder / 
Register".
1
#define SYSTEM_REG_CNT    1000
2
uint16_t regs[SYSTEM_REG_CNT];

Nun nutzt du für Werte die einstellbar/veränderbar sein sollen, keine 
Variablen, sondern diese "Register".

Dann kannst dir ein kleinen Interpreter für UART schreiben und dir 
Befehle ausdenken, z.B.:

reg 123 500

Würdest du nun den Befehl über UART bekommen, würdest du die Zuweisung 
ausführen: (Natürlich nicht statisch.)
1
regs[123] = 500;

Und wenn du dir dann noch definierst an welchem Index was liegt, bist du 
fertig und es funktioniert super.

: Bearbeitet durch User
von Georg (Gast)


Lesenswert?

Adam P. schrieb:
> Und wenn du dir dann noch definierst an welchem Index was liegt, bist du
> fertig und es funktioniert super.

Achtung, Opa erzählt vom Krieg: früher gab es ein Monitor-Programm (so 
eine Art Emulator für Arme), mit Funktionen wie Start usw. und besonders 
Befehlen, in den Speicher oder in Register zu schreiben. Wo im Speicher 
eine Variable steht, weiss man vom Linker, der wirft ein Map-File aus, 
wenn man ihn drum bittet.

Dafür muss man ausser dem Map-File nichts vorbereiten, besonders nicht 
das Programm ändern. Mühsam ist es schon, aber mit etwas Übung kommen 
einem Hex-Zahlen ganz natürlich vor.

Georg

von Operator S. (smkr)


Lesenswert?

NuttX könnte man hier noch erwähnen. Ist ein Unix RTOS für sehr viele 
Mikrocontrollerarchitekturen.

Auf jeden Fall einen Blick wert, auch wenn der Einstieg nicht ganz ohne 
ist.

von fop (Gast)


Lesenswert?

Häh ???
I2C ist eine Schnittstelle. Das sagt gar nix über die Nutzdaten. Ob nun 
Ethernet, CAN, USB oder RS232 als Medium genutzt wird ist eine ganz 
andere Frage.
Wobei : nimm MOST und mach eine grafische Benutzeroberfläche.

von Stefan F. (Gast)


Lesenswert?

> eine einfache Lösung wäre: du erzeugst dir ein globales Daten-Array

Nur wenn man am Quelltext nicht mehr ablesen können soll, was wofür da 
ist. Dazu wurden Strukturen erfunden.

von Stefan F. (Gast)


Lesenswert?

> I2C ist eine Schnittstelle. Das sagt gar nix über die Nutzdaten.

Das ist richtig. I²C beinahltet aber schon eine Methode, Speicherzellen 
oder Register zu adressieren und wahlweise zu lesen oder zu beschreiben.

Im Grunde genommen macht es und jeder I²C Baustein vor. Zum Beispiel 
enthält der Beschleunigungs-Sensor BMA020 offensichtlich einen 
Mikrocontroller, dessen Variablen von außen via I²C gelesen und 
teilweise geändert werden können.

Ein ganz ähnliches Protokoll kann man auch mit der UART Schnittstelle 
umsetzen, wenn man möchte.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

fop schrieb:
> Häh ???
> I2C ist eine Schnittstelle.

Ich musste auch erst überlegen, aber eigentlich ist es ganz logisch. Du 
sprichst den MC über seine I²C Adresse an und behandelst ihn, als wäre 
er z.B. ein I²C EEPROM oder ein anderes Peripheriedings mit Registern.

Wie o.a. ist es allerdings etwas komplizierter, ein I²C Bus Master auf 
dem PC zu machen.

von Adam P. (adamap)


Lesenswert?

Georg schrieb:
> Achtung, Opa erzählt vom Krieg:

Es ist lediglich eine Lösung - klar kann man das auch über die Adressen 
der Variablen lösen, habe nie das Gegenteil behauptet.

Da er ja "Console" nutzen möchte, muss er die Befehlsinterpretation so 
oder so implementieren, unterschied: er schreibt nicht in die Register, 
sondern an die Adressen.

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.