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
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.
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.
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
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.
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.
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.
>> 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.
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 ...
> 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.
an HildeK: Ihnen/Dir wollte ich eigentlich gar nichts sagen, sondern nur Stefanus den Hinweis geben, dass er den Falschen adressiert hatte.
Jetzt habe ich den Hinweis auch verstanden. Sorry, hat lange gedauert.
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
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.
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
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
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
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.
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.
> 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.
> 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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.