Forum: Mikrocontroller und Digitale Elektronik UART Debug Schnittstelle auf PC


von Steven D. (draegi)


Lesenswert?

Hallo liebe Mikrocontroller.net Gemeinde :)

Zunächst einmal vorab, dies ist mein erster Forumbeitrag, also seid 
nicht zu hart :D


Zu meinem Vorhaben:
Ich habe vor, alles (das wichtigste) was der MC (Atmega2560, sollen aber 
auch mehrere werden) macht, über UART auf den PC zu schicken.
Sollte ja, solange es Text bzw ASCII bleibt, kein Problem sein.

Und zwar soll das eine Debugschnittstelle werden. Und sicherlich gibt es 
andere Möglichkeiten, würde mich aber gerne auf diese Konzentrieren, da 
ich vorhabe im laufenden Betrieb dauerhaft von mehreren Mikrocontrollern 
die Daten auszulesen.

Jetzt zu der eigentlichen Frage:

Ich möchte Text und Variablen schicken (z.b. "Es wurden 9,4V erkannt"), 
ist das ohne weiteres Möglich?
Gibt es Protokolle in denen man von einem ASCII zu einem Integer Wert 
und zurück wechseln kann?

von fop (Gast)


Lesenswert?

Prinzipiell ist das möglich. Meist wandelt man auf dem µC schon alles in 
ASCII. Ein standardisiertes gemischtes Protokoll ist mir nicht bekannt. 
Du kannst Dir aber gerne eines ausdenken.
Ich weiss ja auch nicht, in welchen Sprachen Du programmieren willst und 
wie leistungsfähig Deine µC minimal sind.
Sprich bei wenig Speicher bieten C-Compiler abgespeckte Varianten des 
(s)printf Befehls an, mit dem man z.B. auf Rechnern der Leistungsklasse 
Raspi solche Ausgaben erzeugen würde.
In Assembler wird das ganze natürlich beliebig kompliziert.

Ach halt, mir fällt doch gerade ein Standardprotokoll ein : XCP. Läuft 
über diverseste Schnittstellen, kann Werte auslesen und ändern. Auf µC 
Seite ist nur ein minimaler Treiber notwendig. Um es richtig bequem zu 
haben, benötigst Du jedoch zu jeder Softwareversion eine standardisierte 
Beschreibungsdatei, was wie wo im Speicher stecht.

von Steven D. (draegi)


Lesenswert?

@fop:
Danke erstmal für deine Antwort. Ich programmiere mit C und beschreibe 
aktuell einen Atmega328PB, sowie einen Atmega2560.

fop schrieb:
> Meist wandelt man auf dem µC schon alles in
> ASCII

Ja klar, kann man machen bzw finde ich ASCII auch leichter zu senden.
Aber woher weiß denn das Terminal dann dass die ersten 10 Bytes jeweils 
Buchstaben sein sollen und der nächste ein Zahlenwert?

von someone (Gast)


Lesenswert?

Steven D. schrieb:
> woher weiß denn das Terminal dann dass die ersten 10 Bytes jeweils
> Buchstaben sein sollen und der nächste ein Zahlenwert?

Muss es ja nicht, auch Ziffern kannst du als ASCII senden. Du musst eben 
selbst umrechnen oder (s) printf verwenden.

von Stefan F. (Gast)


Lesenswert?

printf()
itoa()  // braucht weniger Speicher

Das Gegenstück wäre
scanf()
und atoi()

von Pandur S. (jetztnicht)


Lesenswert?

Vergiss einfach float wenn moeglich. Also nit 7.4 V, sondern eher grad 
den ADC wert, der kann im PC dann ja verrechnet werden.

von Larry (Gast)


Lesenswert?

Ein "richtiges" Debugprint benutzt endweder das Semihosting
des JTAG oder einen UART der ohne Interrupts auskommen
sollte. Das kann auch ein Soft-UART sein.
Da muss man dann u.U. die Interrupts waehrend der Ausgabe
sperren.

Darueber solltest du erst einmal nachdenken.

Und Romane wie
> "Es wurden 9,4V erkannt"
gibt man darueber im allgemeinen auch nicht aus.

Ich habe schon Beispiele gesehen, wo zeitkritsche Software
mit so etwas debuggt werden sollte.
Mit den Debugausgaben war das Timing dann voellig kaputt.
Und nur, weil derjenige zu doof war, das mit dem vorhandenen
Debugger der auch eine Laufzeitausgabe von Variablen, Speicher,
etc. konnte, zu realisieren.

von Frank K. (fchk)


Lesenswert?

Steven D. schrieb:

> Ich möchte Text und Variablen schicken (z.b. "Es wurden 9,4V erkannt"),
> ist das ohne weiteres Möglich?
> Gibt es Protokolle in denen man von einem ASCII zu einem Integer Wert
> und zurück wechseln kann?

Mache es folgendermaßen:

1. Definiere Dir Messages mit Platzhaltern, z.B.
1="Eingang %fV"
2="Ausgang hat Zustand %d"
3="Temperatur an Port %d ist %f°C"

Jetzt schickst Du über den UART nur die Nummer der Message, die Anzahl 
der Parameter und die Parameter selber, alles binär.

Der PC empfängt das, hat eine Liste mit den Texten und kann aus dem 
jeweiligen Text plus den Parametern eine aussagekräftige 
Klartextmitteilung machen.

Das hat den Vorteil, dass nur sehr wenig Daten über die Schnittstelle 
müssen und das man einfach die Sprache wechseln kann, indem man die 
Datei mit den Texten austauscht.

Dieses Verfahren wird z.B. bei der Ereignisanzeige von Windows 
verwendet.

fchk

von Martin V. (oldmax)


Lesenswert?

Hi
So ein solches Projekt hab ich in einem Buch beschrieben, allerdings 
unter Assembler. Das PC Programm ist VB und liefert, wenn die 
Kommentarzeilen vollständig sind, Werte im Format Byte mit Bitauflösung, 
Integer mit bis zu 32 Bit und Char
Das Buch kannst du kostenlos Downloaden bei Makerconnect.de in der 
Rubrik FAQ
Vielleicht gelingt dir die Erweiterung auf C. Mir war das VB Programm 
bisher eine große Hilfe. Zumal auch möglich ist, bei Durchlauf 
bestimmter Programmschritte die zu diesem Zeitpunkt gültigen 
Variableninhalte zu versenden. Also, nimm dir Zeit, das Werk hat knapp 
1000 Seiten
Viel Spass
Gruß oldmax

von Steven D. (draegi)


Lesenswert?

Vielen Dank erstmal für die ganzen Antworten!

Ich werde nach und nach eure Lösungsansätze probieren.


Frank K. schrieb:
> er PC empfängt das, hat eine Liste mit den Texten und kann aus dem
> jeweiligen Text plus den Parametern eine aussagekräftige
> Klartextmitteilung machen.

Das verstehe ich nicht ganz, da müsste ich dann zusätzlich am PC eine 
Software dafür schreiben oder?
Das wäre mir zu umständlich ^^ Vielleicht für später mal.



Larry schrieb:
> Darueber solltest du erst einmal nachdenken.

Über was genau? Ich habe weder JTAG, noch Interrupts in meinem UART..



Larry schrieb:
> Ich habe schon Beispiele gesehen, wo zeitkritsche Software
> mit so etwas debuggt werden sollte.

Ja dass es damit Probleme geben kann, ok. Aber das ist ja alles nicht 
Teil des Themas :P

von Stefan F. (Gast)


Lesenswert?

Steven D. schrieb:
> Das verstehe ich nicht ganz, da müsste ich dann zusätzlich am PC eine
> Software dafür schreiben oder?

Ja. Oder du lernst die Codes auswendig.

von A. S. (Gast)


Lesenswert?

Steven D. schrieb:
> Gibt es Protokolle in denen man von einem ASCII zu einem Integer Wert
> und zurück wechseln kann?

Ich glaube, diese Stelle in deinem Post ist verwirrend.

In der Regel macht man entweder ASCII ( "Es wurden 9,4V erkannt") oder 
"binärdaten" (z.b. ein Startbyte, ein Byte msgID, n Bytes Nutzdaten je 
nach msgID, 2 Bytes Checksumme, ein Stoppbyte)

Das kann man auch mischen, ist aber so wie saure und Milchgetränke zu 
mischen.

ASCII kann mit jedem Terminalprogramm mitgelesen werden, im einfachsten 
Fall sogar ohne (copy com1 > log.txt).

Binärdaten erfordern eine spezielle Auswertung.

von Steven D. (draegi)


Lesenswert?

A. S. schrieb:
> Ich glaube, diese Stelle in deinem Post ist verwirrend.

Meine Traumvorstellung ist eine Funktion für alles:

debug("ADC1: 9.4V");

So benutzt und alles im Terminal dementsprechend ausgegeben.
Ich hatte einen kleinen Denkfehler, da Integer bzw. einzelne Ziffern ja 
auch im ASCII sind...
Man muss es eben nur einzeln senden

von A. S. (Gast)


Lesenswert?

Steven D. schrieb:
> debug("ADC1: 9.4V");

naja, da brauchst Du zusätzlich sowas wie printf mit %f oder %d. Sonst 
kommt die 9.4 nicht in den Text.

von Frank K. (fchk)


Lesenswert?

Steven D. schrieb:

> Frank K. schrieb:
>> er PC empfängt das, hat eine Liste mit den Texten und kann aus dem
>> jeweiligen Text plus den Parametern eine aussagekräftige
>> Klartextmitteilung machen.
>
> Das verstehe ich nicht ganz, da müsste ich dann zusätzlich am PC eine
> Software dafür schreiben oder?

Genau so ist es. Das Problem, was Du nämlich oft hast, ist, dass das 
Logging Deinen Programmablauf ziemlich verlangsamen kann, wenn Du mal 
etwas mehr Meldungen hast. Daher willst Du die Datenmenge, die über den 
Debugport geht, minimieren, so weit es nur irgendwie geht. Und das ist 
genau der Ansatz dafür.

> Das wäre mir zu umständlich ^^ Vielleicht für später mal.

Wirst schon merken.

fchk

von MadMatt (Gast)


Lesenswert?

Hi Freunde,

hab früher jede Menge uC's für Messgeräte programmiert, Renesas, PIC's 
und Atmels (von der 88er-Serie bis zu den Mega256er-Modellen) ...

prinzipiell ist eine RS232/RS485-"Nabelschnur" zu Debugzwecken immer das 
Erste gewesen, das ich implementiert habe, und wenn's auch nur um 
Datalogging ging.
Implementiert hatte ich immer zuerst (auf der uC-Seite) eine serielle 
Komm. mit den entsprechenden UART-Settings und den dazupassenden 
Interrupts inklusive den sscanf() oder sprintf()-Routinen, auf PC-Seite 
bin ich teilweise noch mit dem MS-DOS Kermit gefahren, das ist (oder 
war) immerhin skriptprogrammierbar und ziemlich flexibel.
Das Erste ist immer, "hört Dich der uC und sagt es Dir auch" ... der 
Rest ist Fingerarbeit.

VG

von Larry (Gast)


Lesenswert?

> > Ich habe schon Beispiele gesehen, wo zeitkritsche Software
> > mit so etwas debuggt werden sollte.

> Ja dass es damit Probleme geben kann, ok. Aber das ist ja alles nicht
> Teil des Themas :P

Man kann versuchen die Realitaet auszublenden.
Um so heftiger wird man damit auf die Nase fallen.

> eine serielle
> Komm. mit den entsprechenden UART-Settings und den dazupassenden
> Interrupts inklusive den sscanf() oder sprintf()-Routinen

Spaetestens wenn der Controller keinen oder keinen freien
U(S)ART mehr hat, wird das wohl nichts.
Je einfacher ein Debugprint realisiert ist, um so besser stehen
die Chancen, dass er nicht die Anwendung stoert.
Aber jeder wie er mag.

von W.S. (Gast)


Lesenswert?

Larry schrieb:
> Und Romane wie
>> "Es wurden 9,4V erkannt"
> gibt man darueber im allgemeinen auch nicht aus.
>
> Ich habe schon Beispiele gesehen, wo zeitkritsche Software
> mit so etwas debuggt werden sollte.

Was hast du gegen Romane?
Also wenn man etwas als Mensch lesen will, ist eine menschlich lesbare 
Botschaft genau das Richtige. Ob das nun exakt so wie oben "Es wurden.." 
ausgegeben wird oder etwas anders "Batt: 9.4V" ist Geschmackssache.

Und du hast schon Beispiele gesehen... Ich hab z.B. meinen USB Treiber 
durchaus mit der Seriellen als Kommunikationsweg in Gang gesetzt. Dazu 
sind ein paar Maßnahmen nötig, aber es geht - im Gegensatz zum Versuch, 
sowas dreist per JTAG/SWD-Debugger machen zu wollen. Stichwort: 
postmortem-debug.



Steven D. schrieb:
> Ich möchte Text und Variablen schicken (z.b. "Es wurden 9,4V erkannt"),
> ist das ohne weiteres Möglich?
Ja.
1
String_Out("Es wurden ", toUART1);
2
FF_Out(&UBatterie, 3, 1, toUART1);
3
String_Out("V erkannt\r\n", toUART1);

Nimm dir den Beitrag von MadMatt zu Herzen. Er hat genau den richtigen 
Punkt getroffen: Zuerst die Firmware soweit aufbauen, bis daß man 
irgendwie seriell mit dem PC kommunizieren kann, dann erst kommt alles 
weitere. Auch ich bin mit dieser Methode seit langen Jahren gut gefahren 
- und wenn man sich noch einen kleinen Kommandointerpreter einbaut, dann 
kann man auch für diverseste Zwecke sich mal eben ein kleines 
Spezialkommando schreiben, um irgendwas spezielles (je nach 
Anwendungsfall) damit zu tun.

W.S.

von Dr House (Gast)


Lesenswert?

MadMatt schrieb:
> bin ich teilweise noch mit dem MS-DOS Kermit gefahren, das ist (oder
> war) immerhin skriptprogrammierbar und ziemlich flexibel.

Mir wird ganz warm ums Herz...

Damit habe ich für eine (die) damals größte "private" Baufirma in DE,
ein komplettes weltweites System aufgebaut, mit welchem 
Buchhaltungsdaten über ein zentrales UNIX System (SNI MX500) (C-Kermit) 
mit selbst programmierter  Modemshell ( Modem Getty) eingesammelt wurden 
und an eine BS 2000 für weiter betriebswirtschaftliche Auswertungen 
übermittelt wurden.

Das war damals Hightech ;-)

Gedankt hat man es mir nie wirklich;-(

von Dr House (Gast)


Lesenswert?

Das war 1993!
Ein Kumpel hatte einen Modemzugang zur Uni Darmstatt und von dort ging 
es per Internet in die weite Welt........

von Dr House (Gast)


Lesenswert?

Dr House schrieb:
> Ein Kumpel hatte einen Modemzugang zur Uni Darmstatt und von dort ging
> es per Internet in die weite Welt........

An der Columbia Universität gabs dann den Sourcecode und ich compilierte 
den dann auf den Siemens Nixdorf Unix Rechnern.
Die Siemens Leute (Vertrieb und Sytemingenieure) lachten mich aus, aber 
nicht mehr als alles lief ;-).
Als wir dann auch noch Drucketreiber für die Ansteuerung von HP500 
Tintenstrahlern und Epson Druckern programmierten, brach für die 
Vertriebler die Welt zusammen.
Die Siemensdrucker kosteten damals alle so um die 10.000 DM!!

Da ging im Hintergrund dann auf GF Ebene so richtig die Post ab.
Abwerbeversuche hielt ich standhaft durch..

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

W.S. schrieb:
> Und du hast schon Beispiele gesehen... Ich hab z.B. meinen USB Treiber
> durchaus mit der Seriellen als Kommunikationsweg in Gang gesetzt. Dazu
> sind ein paar Maßnahmen nötig, aber es geht - im Gegensatz zum Versuch,
> sowas dreist per JTAG/SWD-Debugger machen zu wollen. Stichwort:
> postmortem-debug.

Mal wieder keine Ahnung von garnichts und ne Allergie vor Debuggern?
Cortex-M mit SWD kommt meist mit Trace.
Selbst ohne Trace gibts das hier:
https://www.segger.com/products/development-tools/systemview/

von Larry (Gast)


Lesenswert?

> "Es wurden 9,4V erkannt"
> Was hast du gegen Romane?

Wenn das mit troedeligen 9600 baud aus der Leitung tropft,
braucht das knapp 23 ms.
Fuer sowas muss man dann eine Queue und alle damit
verbundenen Mechanismen bereitstellen.
Und wenn dann noch mehr geloggt wird, wird die dann
irgendwann wohl ueberlaufen.

Das mag im Einzelfall nicht stoeren, aber im allgemeinen
wird man damit frueher oder spaeter irgendwo anecken.

Genau aus diesem Grund, stellen Controller/DSPs auch
Mechanismen bereit, die Bandbreite des Logs signifikant
zu steigern. Die muss man dann halt kennen und einsetzen.

Hat man das nicht zur Verfuegung, hilft eben eine gewisse
Sparsamkeit. Dafuer bevorzuge ich eben z.B. Soft-UARTs.
Bei kurzen Mitteilungen und entspechender Geschwindigkeit,
z.B. 230 kbaud. Zum Senden brauchen die nicht notwendigerweise
einen Interrupt, koennen fast auf jedem Pin Daten ausgeben,
und greifen damit nur minimal in das System ein.

> ich bin mit dieser Methode seit langen Jahren gut gefahren

Ja, ich auch.

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.