Forum: Mikrocontroller und Digitale Elektronik Emuliertes COM Port über USB lesen/schreiben


von Gerd J. (gerd_j)


Lesenswert?

Hallo,
ich habe hier einen DSP, der über USB mit dem PC verbunden wird und 
mittels GUI programmiert werden kann.
Die Kommunikation geschieht dabei über einen USB Treiber, der einen 
virtuellen COM Port einrichtet, also serielle Kommunikation zwischen PC 
und DSP.

Mit einem Terminalprogramm kann ich ausserdem Kommandos seriell in den 
DSP senden und die Antworten vom DSP empfangen.

Ich würde gerne mit einem Atmega samt LCD Display mit dem DSP 
kommunizieren, also ohne PC.

Der Atmega soll auf Tastendruck ein Kommando an den DSP senden, der gibt 
dann entsprechende Ausgaben aus, die der Atmega auswerten und 
entsprechend Daten am Display darstellt. Die Steuerkommandos hierfür 
sind mir bekannt.

Nur wie bekomme ich den Mikrokontroller an den DSP angebunden, als 
serielles Gerät per USB?

Ich hoffe ich habe mich verständlich ausgedrückt!? Ich freue mich auf 
Antworten :-)

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


Lesenswert?

Einen USB Host (wie den PC) auf dem AVR zu implemetieren, ist recht 
kompliziert, aber wahrscheinlich nicht unmöglich. Einfacher allerdings 
wäre es, sich den seriellen Port direkt unter den Nagel zu reissen, der 
auf dem DSP Board ist. Wie ist das realisiert? Gibt es einen 
Boardcontroller oder einen USB-Seriell Chip?
Hast du einen Schaltplan des DSP Boards?

von Jim M. (turboj)


Lesenswert?

Gar nicht. Du bräuchtest einen µC, der USB Host Modus unterstützt. Das 
habe ich bisher nur bei neueren 32 Bittern (wie Cortex M3/4) in Funktion 
gesehen,
weil es deutlich aufwändiger als UART ist.

von Gerd J. (gerd_j)


Lesenswert?

Matthias Sch. schrieb:
> Einen USB Host (wie den PC) auf dem AVR zu implemetieren, ist recht
> kompliziert, aber wahrscheinlich nicht unmöglich. Einfacher allerdings
> wäre es, sich den seriellen Port direkt unter den Nagel zu reissen, der
> auf dem DSP Board ist. Wie ist das realisiert? Gibt es einen
> Boardcontroller oder einen USB-Seriell Chip?
> Hast du einen Schaltplan des DSP Boards?

Schaltplan gibts leider nicht, ich schau mir aber die Platine genauer an 
ob ich da was finde

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

Wenn ich das richtig verstehe fungiert der PC bisher als USB HOST.
Wenn du den PC nun durch einen µC ersetzen willst musst der µC nun die 
Rolle des USB HOST übernehmen.

Es gibt zwar AVR mit nativen USB Port, aber diese fungieren alle nur als 
DEVICE und können nicht als USB HOST fungieren.
Du müsstest also die USB Host funktionalität durch einen Externen 
Baustein bereitstellen!

Im ergebniss also "DSP" <-USB-> "USB-HOST-BAUSTEIN" <-SPI-> "ATMEGA"

Das ist aus meiner Sicht allerdings relativ Sinnfrei.

Mein Rat:
Vergiss die ATMEGA für den Zweck und greife zu einem µC der auch eine 
USB HOST Funktion bereitstellt. Fündig wirst du bei diversen ARM 
Cortexen oder auch bei den PIC24 & PIC32...

Ob nun ARM Cortex oder PIC24/32 für dich die elegantere Wahl ist sei mal 
dhingestellt (ist GEschmackssache und abhängig von anderen 
Randbedingungen). Funktionieren wird beides.
Für die PIC weiß ich aber -da schon mehrmals erfolgreich eingesetzt- das 
es gerade für CDC eine vernünftige und kommerziell ohne Gebühren 
verwendbare CDC-Host funktion fast Mundgerecht serviert gibt.

Gruß
Carsten

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gerd J. schrieb:
> Die Kommunikation geschieht dabei über einen USB Treiber, der einen
> virtuellen COM Port einrichtet

Wenn Du das mit einem USB-Host nachbilden willst, musst Du das 
verwendete Protokoll nachvollziehen. Es könnte sein, daß hier USB-CDC 
verwendet wird, aber es kann natürlich auch irgendwas anderes sein (so, 
wie es bei den üblichen USB-Seriell-Bridges gemacht wird, die verwenden 
alle ihr eigenes, zu allen anderen inkompatibles Protokoll, ob nun von 
Prolific, TI, SiLabs oder FTDI).

Das aber musst Du herausfinden, denn das muss Dein USB-Host nachbilden, 
damit er mit dem DSP "reden" kann.

von Gerd J. (gerd_j)


Lesenswert?

Ok, das wird glaube ich sehr aufwendig mittels USB host :-(

Für den DSP habe ich noch eine kleine Controllererheit, die mit einem 
Atmega8 versehen ist. Anbindung zum DSP erfolgt über  einen RS485 mit 
einer 4 adrigen Leitung, wovon 2 wohl die Controllereinheit mit Spannung 
versorgen. Mit der Controllereinheit kann man z.B. den Ausgangspegel des 
DSP regeln.

Keine Ahnung ob und wie ich das Protokoll zwischen DSP und 
Controllereinheit 'belauschen' kann. Habe schon daran gedacht die 
Controllereinheit mit dem PC zu verbinden. Nur wie?!

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


Lesenswert?

Gerd J. schrieb:
> Keine Ahnung ob und wie ich das Protokoll zwischen DSP und
> Controllereinheit 'belauschen' kann. Habe schon daran gedacht die
> Controllereinheit mit dem PC zu verbinden. Nur wie?!

RS485 ist einfach. Es handlet sich um eine serielle Kommuniktion wie 
UART, nur mit differentiellen Signalen (symmetrisch, wenn eines + ist, 
ist das andere - und umgekehrt).
Für RS485 gibt es einfache kleine Transceiver (z.B. MAX485), die das 
Umsetzen erledigen können und direkt an z.B. die UART eines AVR 
angeschlossen werden.
Abhören kann mit dem PC sogar evtl. ganz ohne zusätzliche Hardware 
erfolgen, entweder direkt am COM Port, wenn dein Rechner so etwas noch 
hat, oder eben über einen USB - Seriell Adapter. Du musst RXD des PC nur 
mit der richtigen Ader der differentiellen Übertragung verbinden und die 
richtige Baudrate finden.

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Gerd J. schrieb:
> Keine Ahnung ob und wie ich das Protokoll zwischen DSP und
> Controllereinheit 'belauschen' kann. Habe schon daran gedacht die
> Controllereinheit mit dem PC zu verbinden. Nur wie?!

'Belauschen' setzt zwei Dinge voraus:
 - eine Software, die etwas mit dem Datenstrom anfangen kann
   (im einfachsten Fall ein Terminalprogramm, z.B. HTerm)
 - einen physischen Zugriff auf den Datenstrom. In deinem Fall wäre das 
z.B. ein USB-Seriell Wandler für RS485 Signale, den du nur 
empfangsseitig nutzt, um die vom DSP oder die vom Controller gesendeten 
Daten abzuhören.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Eine Alternative ist es, die Datenleitungen zwischen RS485-Treiber und 
dem AVR abzugreifen. Dann weiß man auch, wer gerade sendet, der AVR oder 
der DSP.

Zum ordentlichen Mithören braucht man dann am PC zwei serielle 
Schnittstellen, die o.g. Datenleitungen werden jeweils über einen 
passenden RS232-Treiber mit der RxD-Leitung der Schnittstellen 
verbunden. Somit kommt auf der einen Schnittstelle das an, was der AVR 
sendet und auf der anderen das, was der DSP antwortet.

Natürlich muss man noch die Baudrate bestimmen, dazu eignet sich ein 
Oszilloskop.

von Gerd J. (gerd_j)


Lesenswert?

Reicht es den Controller mit Strom zu versorgen und an RXD zu lauschen, 
oder muss der DSP verbunden sein? Es muss doch Master und Slave 
vorhanden sein, richtig?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gerd J. schrieb:
> Reicht es den Controller mit Strom zu versorgen und an RXD zu lauschen,
> oder muss der DSP verbunden sein?

Wenn da ein Protokoll verwendet wird, müssen natürlich beide Seiten da 
sein.

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


Lesenswert?

Gerd J. schrieb:
> Es muss doch Master und Slave
> vorhanden sein, richtig?

Master und Slave in dem Sinne gibt es bei RS485 nicht, es kann aber 
halbduplex ('wechelsprechen') sein, d.h. es kann sein, das der DSP auch 
was an den Controller sendet. Wissen wir nicht, deswegen ist es am 
besten, die existierende Verbindung anzuzapfen. Dann siehst du auch 
gleich, welche Datensequenzen welche Auswirkungen haben.

von Gerd J. (gerd_j)


Lesenswert?

Auf der Controllerplatine ist ein ADM485 verbaut, an A und B sind 
1000Ohm Widerstände in Reihe.  Soweit ich erkennen kann (SMD) sind RE 
und DE gebrückt und an den Atmega8 geführt. Weitere Verbindungen muss 
ich erst noch rausfinden :-)

Ist der Ausgangspegel des 485 ok für den COM Port des PC oder muss da 
noch ein Max232 zwischen?

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


Lesenswert?

Gerd J. schrieb:
> Ist der Ausgangspegel des 485 ok für den COM Port des PC oder muss da
> noch ein Max232 zwischen?

Nahezu allen heutigen COM Ports erkennen ein 0V Signal auch als gültige 
'1', was zwar nicht ganz normgerecht ist, aber meistens doch 
funktioniert. Da dein ADM485 eine Ausgangsspannung zwischen Vcc und 0V 
produziert, könnte es also klappen. Du musst lediglich die richtig 
'gepolte' Ader erwischen, wenn ich mich nicht irre, müsste es die B-Ader 
sein.

Wenn in deinem System ein Bias Netzwerk mit Widerständen vorhanden ist, 
funktioniert es dann wieder nicht so einfach, dann müsstest du 
tatsächlich mit einem Max232 o.ä. 'fischen'.
http://www.rn-wissen.de/index.php/RS485
https://de.wikipedia.org/wiki/EIA-485

Gerd J. schrieb:
> Soweit ich erkennen kann (SMD) sind RE
> und DE gebrückt und an den Atmega8 geführt.

Das ist die Sende/Empfangsumschaltung. Es könnte also wirklich eine 
Halbduplex Kommunikation stattfinden.

: Bearbeitet durch User
von Gerd J. (gerd_j)


Lesenswert?

B Ader? Ich dachte ich soll das Signal zwischen 485 und AVR abgreifen. 
Also RO oder DI!?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gerd J. schrieb:
> Ich dachte ich soll das Signal zwischen 485 und AVR abgreifen.
> Also RO oder DI!?

Wenn Du das tust, brauchst Du einen RS232-Treiber, und Du musst sowohl 
RO als auch DI abgreifen. Das bietet den Vorteil, klar zu wissen, wer 
gerade sendet - was beim Abhören am RS485-Bus nicht ohne weiteres 
möglich wäre.

von Gerd J. (gerd_j)


Angehängte Dateien:

Lesenswert?

So wie im Anhang?
Nur ohne RTS, da die Umschaltung zwischen Senden/Empfangen durch die 
Controllereinheit des DSP erfolgt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zum Mithören nicht.

Du hast zwei Signale, die Du beide an den PC senden willst, und zwar 
abwechselnd (wenn Du nur eine serielle Schnittstelle am PC hast).

Das eine Signal geht von RO des RS485-Transceivers an RxD des AVR - das 
kommt zusätzlich an T1IN des MAX232, damit kannst Du abhören, was der 
DSP dem AVR erzählt.

Das andere Signal geht vom TxD des AVR an DI des RS485-Transceivers. Das 
kommt zusätzlich an T2IN des MAX232, damit kannst Du abhören, was der 
AVR dem DSP mitteilen möchte.

Auf der anderen Seite des MAX232 schließt Du zwei zweiadrige Kabel an - 
eine Ader ist jeweils Masse, die andere T1OUT bzw. T2OUT. Jedes Kabel 
kommt an eine 9polige SubD-Buchse, Masse an Pin 5, T1OUT bzw. T2OUT an 
Pin 2.

Zum Mithören steckst Du entweder das eine oder das andere Kabel in die 
serielle Schnittstelle Deines PCs -- oder Du verwendest zwei 
Schnittstellen und schließt beide Kabel gleichzeitig an.

R1IN/R2IN und R1OUT/R2OUT des MAX232 lässt Du unbeschaltet, ebenso /RE 
und DE des RS485-Transceivers, die werden ja schon vom AVR bzw. vom DSP 
angesteuert.

von Gerd J. (gerd_j)


Lesenswert?

Klingt logisch so wie du es erklärst, danke!!!

Die Baudrate muss ich noch rausfinden, Oszi ist vorhanden.

Bei der eingangs erwähnten Verbindung über den virtuellen USB-COM Port 
muss ich 38400,8,N,1 einstellen. Wird wahrscheinlich hier genauso sein.

: Bearbeitet durch User
von Gerd J. (gerd_j)


Lesenswert?

Kleines Update von mir.

Die Controllerplatine ist auch ohne DSP nutzbar. Es findet nur 
Datenfluss vom Controller in Richtung des DSP statt. Also keine Antwort 
vom DSP wie, 'ok, Daten empfangen'. Mit Oszi gemessen, dass mit 
angeschlossenem DSP nichts am RO des 485 ankommt.

Also Controllerplatine mit 5V versorgt, und am DI den 485 den Max232 
angekoppelt und mit Com Port des PC verbunden. Hterm gestartet und 
verschiedene Baudraten probiert. Irgendwie kommt da nicht das Richtige 
an :-(

Als Hintergrund. Der Controller kann z.B. den Ausgangspegel des DSP 
regeln. Bei jeder Änderung schickt der Controller ein Datenpaket an den 
DSP.

Dieses Datenpaket scheint kein normales serielles Signal zu sein. Daher 
kommt im Hterm nur Datenmüll raus. Gibts einen Tipp für eine 
DatenloggerSW die am Comport alles mitloggt, am besten Freeware.

Das Signal fängt z.B. mit einem längerem Puls an, dann folgen die 
einzelnen Bits.

Am Oszi kann ich die Bits nachvollziehen, sagen mir aber nichts.

Ich mach mal einen Screenshot am Oszi und stelle die Kurve hier dann 
rein, evtl. kann jemand damit was anfangen und mir weiterhelfen.

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


Lesenswert?

Gerd J. schrieb:
> Das Signal fängt z.B. mit einem längerem Puls an, dann folgen die
> einzelnen Bits.

Klingt ein bisschen, als wäre das (ähnlich wie DMX) Frame-orientiert. 
Das lange Signal ist dann das Signal für Framestart und dann kommen die 
Bits. Wenn es dir gelänge, die Länge eines Bits zu messen, kann man 
HTERM entsprechend auf die Länge des Framestartes einstellen (neue 
Zeile) und dann die Bits dekodieren.
DMX z.B. verwendet 250kBits/s, d.h. ein Bit ist 4µs lang. Der Bytestrom 
bei DMX kommt dann ohne absetzen bis zum Frameende, aber schon mit 
Start- und Stopbit zwischen den einzelnen Bytes.
Kann es denn sein, das das Gerät aus der Show- und Entertainment Szene 
stammt? Dann wäre eine DMX Steuerung nämlich gar nicht so weit 
hergeholt. Hat es Adress-Schalterchen?

: Bearbeitet durch User
von Gerd J. (gerd_j)


Angehängte Dateien:

Lesenswert?

Der erste längere Puls ist lt. Oszi 38us lang, siehe Anhang. Im 2. 
Anhang finden sich die Bits etwas gestreckt. Das Bit zwischen den 
Cursormarkern dürfte eine 0 sein (etwa 25us), gefolgt von einer 1.

von Gerd J. (gerd_j)


Angehängte Dateien:

Lesenswert?

2. Anhang

von Gerd J. (gerd_j)


Lesenswert?

Es handelt sich um einen Car Hifi DSP.

von Robert (Gast)


Lesenswert?

Gerd J. schrieb:
> also serielle Kommunikation zwischen PC
> und DSP.

USB ist immer seriell.

Gerd J. schrieb:
> Ich würde gerne mit einem Atmega samt LCD Display mit dem DSP
> kommunizieren, also ohne PC.

Da nimmt man dann eher sowas wie SPI oder IIC.

Gerd J. schrieb:
> Nur wie bekomme ich den Mikrokontroller an den DSP angebunden, als
> serielles Gerät per USB?

Gar nicht, ausser Du schiesst mit Kanonen auf Spatzen.

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


Lesenswert?

Gerd J. schrieb:
> Das Bit zwischen den
> Cursormarkern dürfte eine 0 sein (etwa 25us), gefolgt von einer 1.

Ja, das sieht nicht kompliziert aus, und sollte recht leicht zu 
dekodieren/kodieren sein.

von Gerd J. (gerd_j)


Angehängte Dateien:

Lesenswert?

Danke erstmal.

Ich habe das Datenpaket, welches der AVR dem DSP bei Änderungen der 
Einstellungen sendet, mit dem Oszilloskop analysiert.
Das gesamte Datenpaket hat eine Länge von 2.178ms. Zuerst wird ein 38us 
langes High geschickt, gefolgt von einem 16us langem Low, zu sehen auf 
dem vorletzten Anhang (5 Postings zurück).
Dann kommen 88  Bits, jeweils ca.25us lang, die wie im Anhang unten 
aussehen. Erinnert mich irgendwie an IRDA Protokolle. Keine Start/Stop 
Bits.

Durch Vergleich der verschiedenen Einstellungen beim Controller konnte 
ich diese im Datenpaket wiederfinden. Z.B. Volume kann per Poti zwischen 
hex 00 bis 99 eingestellt werden, dieser Wert wird im Datenpaket 
gesendet.

Den Controller würde ich gerne weiterverwenden, nur eben mit einem 2. 
AVR das Datenpaket 'belauschen' die Werte entsprechend 
auswerten/rausfiltern und auf LCD ausgeben.

Problem für mich ist, wie programmiere ich den AVR dass er aus der 
gezeigten Art der Bits ein High oder Low erkennt. Bascom würde ich dafür 
benutzen. Die Bits haben ja keinen 'normalen' Zustand während der 25us, 
sondern die Länge des High Zustands unterscheidet zwischen 1und 0.

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


Lesenswert?

Gerd J. schrieb:
> Die Bits haben ja keinen 'normalen' Zustand während der 25us,
> sondern die Länge des High Zustands unterscheidet zwischen 1und 0.

Genau das ist dein Ansatzpunkt. Mit der steigenden Flanke startest du 
den Timer und wartest bis die Flanke wieder fällt. Ist die Zeit 38µs, 
hast du das Startsignal. Ist die Zeit grösser als 16µs und kleiner als 
20µS hast du eine 0, ist sie länger als 5 und kürzer als 9µs, ist es die 
1 (Das ist aber reine Definition, man kann auch umgekehrt agieren)
Roll die Bits in einen Buffer und übergib sie an die Anzeige (z.B. als 
11 Bytes), wenn du das Startsignal bekommst.

: Bearbeitet durch User
von Gerd J. (gerd_j)


Lesenswert?

Leider habe ich von Timer Programmierung nicht sooooo viel Ahnung :-(

Codeschnippsel am besten in Bascom währen sehr hilfreich.

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.