Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller mit PC via HID


von Dominik R. (reindo)


Lesenswert?

Hallo,

folgendes Problem.. Ich bin gerade dabei, eine große Anzeige mit 64x8 
LEDs zu realisieren, als Projekt in der Schule zu Lernzwecken.

Ich möchte nun eine Datenkommunikation zwischen dem µC (Atmega644) und 
dem PC herstellen, hierfür habe ich auf der Platine einen MCP2200 
vorgesehen, da dieser bei uns in der Schule sonst auch vorkommt.

Jetzt ist es so, dass ich noch so meine Probleme habe, wie ich die 
Verbindung aufbaue. Ich habe mir vorgestellt, ein C++ Programm am PC 
über den virtuellen COM Port mit dem µC kommunizieren zu lassen. Es 
würde schon reichen, wenn der PC nur Daten zum µC senden kann.

Ich habe nun gelesen, dass es HID gibt, um keine Treiber installieren zu 
müssen, sondern die Systemeigenen genommen werden können. Kann ich das 
mit dem MCP2200 realisieren?

Gibt es irgendwelche Bibliotheken für den MCP2200 für den Datenaustausch 
oder wird das einfach mit "normalen" Befehlen über den COM Port 
geschickt?

Grüße und schönen Abend,

reindo

von Seppel (Gast)


Lesenswert?

Hast Du den denn mal an den USB-Port gesteckt?
Im Datenblatt steht nämlich:
1
Uses standard Microsoft® Windows® drivers for Virtual Com Port (VCP)

von Dominik R. (reindo)


Lesenswert?

Guten Abend,

nun derzeit ist die Platine noch in der Herstellung, sodass ich das noch 
nicht testen kann. Unsere Testboards der Schule jedoch (MCP2200, Atmel 
C51) laufen garnicht ohne Treiber von MCP. Möglicherweise liegt es 
daran, dass in der Schule noch XP im Einsatz ist? Habe es unter neueren 
Systemen noch nicht testen können - erst wenn die Platine dann hier ist.

Wollte mich nur schonmal vorbereiten und mir überlegen, wie ich es 
angehen soll. Aber ich denke, ich schiebe es mal auf und warte bis die 
Platine da ist.

Nun aber zur anderen (wichtigeren) Frage, wie das mit dem Datenaustausch 
ist.. Ich weiß, dass man über die Verbindung Daten Byteweise übertragen 
muss. Ist auch kein Problem meine Daten so hinzuwursten. Nur wie genau 
sende ich denn Daten und Empfange diese, muss ich dies beim µC irgendwie 
vorbereiten oder wird das dann via Interrupt autonom empfangen?

Grüße

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


Lesenswert?

Dominik Rein schrieb:
> Nur wie genau
> sende ich denn Daten und Empfange diese,

Am PC benutzt du dafür ein Terminalprogramm, wie HTerm oder 
HyperTerminal und stellt es auf den Virtual Comport ein, denn der MCP 
enumeriert hat. Den kannst du im Gerätemanager sehen.

Dominik Rein schrieb:
> muss ich dies beim µC irgendwie
> vorbereiten oder wird das dann via Interrupt autonom empfangen?

Autonom geht nichts, wenn du den Mikrocontroller nicht so programmierst, 
das er seine serielle Schnittstelle (meistens UART genannt) zur 
Kommunikation benutzt. Der MCP2200 wird also die USB Kommunikation schon 
in serielle Signale umsetzen, aber der angeschlossene MC muss diese 
Daten dann auswerten und evtl. auch welche senden.

von Frank K. (fchk)


Lesenswert?

Dominik Rein schrieb:

> Ich habe nun gelesen, dass es HID gibt, um keine Treiber installieren zu
> müssen, sondern die Systemeigenen genommen werden können. Kann ich das
> mit dem MCP2200 realisieren?

Für den MCP2200 brauchst Du wie für alle CDC-ACM Devices nur ein 
passenden .inf, aber keinen extra Binärtreiber. Der systemeigene reicht. 
Bei XP ist SP3 Pflicht, aber das ist es ja ohnehin aus 
Sicherheitsgründen.

HID ist nur fürs Bitbanging der Ports da.

Da der MCP2200 nur ein vorprogrammierter PIC18F14K50 ist, kannst Du 
natürlich auch ein PICKIT3 dranhängen und mit der Microchip Application 
Library eine eigene Applikation basteln, die HID auch für den 
Datentransfer benutzt. Wenn Du dann so weit bist, wirst Du einsehen, 
dass es schlauer ist, Deinen Atmega gegen einen PIC18F46K50 oder 
PIC18F46J50 zu tauschen, um den extra USB-Chip einzusparen.

> Gibt es irgendwelche Bibliotheken für den MCP2200 für den Datenaustausch
> oder wird das einfach mit "normalen" Befehlen über den COM Port
> geschickt?

nix spezielles. CDC-ACM Devices werden wie COM-Ports behandelt, Custom 
HID Device sprichst Du per setupapi.dll und hid.dll an.

fchk

PS: Wenn Du keine Handshake-Leitungen brauchst, kannst Du auch den 
MCP2221 verwenden. Das ist ein vorprogrammierter PIC16F1455. Vorteil: 
billiger und braucht für den USB-Betrieb nicht zwingend einen Quarz. Für 
USB ist der PIC16F1455 und der PIC16F1454 (ohne Analogfunktionen) die 
billigste Möglichkeit, ein komplett USB 2.0 standardkonformes, 
zertifiziertes Full-Speed Device (also nicht dieser VUSB-Müll) zu bauen. 
Ein ATTiny 85 ist nur wenige Cents billiger, aber nicht 100% 
standardkonform und nur low-speed.

von Dominik R. (reindo)


Lesenswert?

Matthias Sch. schrieb:

> Am PC benutzt du dafür ein Terminalprogramm, wie HTerm oder
> HyperTerminal und stellt es auf den Virtual Comport ein, denn der MCP
> enumeriert hat. Den kannst du im Gerätemanager sehen.

Sprich das kann mein C Prog dann auch. Muss ich mich also weiter schlau 
machen.


> Autonom geht nichts, wenn du den Mikrocontroller nicht so programmierst,
> das er seine serielle Schnittstelle (meistens UART genannt) zur
> Kommunikation benutzt. Der MCP2200 wird also die USB Kommunikation schon
> in serielle Signale umsetzen, aber der angeschlossene MC muss diese
> Daten dann auswerten und evtl. auch welche senden.

AFAIK kann der Txd und Rxd einen Interrupt generieren, sprich ich sende 
vom PC ein "Wach auf" und der µC springt in die ISR, in welcher ich die 
Daten dann empfange? Wie ist das mit Puffer, sprich sind die ersten 
Daten bis er anfängt auszuwerten verloren oder wartet der PC mit dem 
senden, bis der µC bereit ist?

von chris (Gast)


Lesenswert?

Hast du es schon mal mit der UART des µC probiert bzw wie man damit 
daten an den PC überträgt?
Wenn dieses verstanden ist, ist die Umsetzung mit dem MCP2200 für USB 
denn nicht mehr ganz so schwer.

von Dominik R. (reindo)


Lesenswert?

Frank K. schrieb:

> HID ist nur fürs Bitbanging der Ports da.

Kannst mir kurz erklären, was du mit Bitbanging meinst?

> Deinen Atmega gegen einen PIC18F46K50 oder
> PIC18F46J50 zu tauschen, um den extra USB-Chip einzusparen.


> PS: Wenn Du keine Handshake-Leitungen brauchst, kannst Du auch den
> MCP2221 verwenden. Das ist ein vorprogrammierter PIC16F1455. Vorteil:
> billiger und braucht für den USB-Betrieb nicht zwingend einen Quarz.

Das Problem ist das der MCP2221 nicht pinkompatibel zum MCP2200 ist und 
die Platine bereits in Produktion ist. Aber für zukünftige Projekte 
interessant - danke!

von Frank K. (fchk)


Lesenswert?

PPS: Windows 10 soll angeblich kein .inf mehr für CDC-ACM Devices 
verlangen. Warum die aktuellen Windows-Versionen das brauchen, verstehe 
ich nicht. OSX und Linux und OpenBSD kommen auch ohne aus, da 
funktioniert das Zeugs nach dem Anstecken einfach so. Wahrscheinlich 
hatte Microsoft ein NIH-Problem (Not Invented Here). Die haben ja auch 
RNDIS erfunden, anstelle das Standard CDC-NCM vernünftig zu 
unterstützen.

von Dominik R. (reindo)


Lesenswert?

chris schrieb:

> Hast du es schon mal mit der UART des µC probiert bzw wie man damit
> daten an den PC überträgt?
> Wenn dieses verstanden ist, ist die Umsetzung mit dem MCP2200 für USB
> denn nicht mehr ganz so schwer.

Wie meinst du das? Sprich mit nem MAX232 und "wirklich COM" übertragen? 
Ist ja denke ich das gleiche, nur das es via MCP2200 via USB und 
virtuellem COM Port läuft - oder? Kann ich also die gleichen Befehle wie 
hierfür nehmen?

von Frank K. (fchk)


Lesenswert?

Dominik Rein schrieb:
> Frank K. schrieb:
>
>> HID ist nur fürs Bitbanging der Ports da.
>
> Kannst mir kurz erklären, was du mit Bitbanging meinst?

Direkte Ansteuerung der IO-Pins des MCP2200 vom USB-Host.

Siehe

http://ww1.microchip.com/downloads/en/DeviceDoc/93066A.pdf

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


Lesenswert?

Dominik Rein schrieb:
> Ist ja denke ich das gleiche, nur das es via MCP2200 via USB und
> virtuellem COM Port läuft - oder? Kann ich also die gleichen Befehle wie
> hierfür nehmen?

Ganz genau. Wenn du mit einem MAX232 das schon mal gemacht hast, ändert 
sich auf der MC Seite nix, ausser das du statt dem MAX den MCP 
anschliesst.

: Bearbeitet durch User
von Dominik R. (reindo)


Lesenswert?

Frank K. schrieb:

> Direkte Ansteuerung der IO-Pins des MCP2200 vom USB-Host.

Ach, dafür sind sie GP Outputs da? Super Sache, so im Nachhinein..

Danke für den Hinweis - da wäre ich nicht so schnell draufgekommen!

von Dominik R. (reindo)


Lesenswert?

Matthias Sch. schrieb:

> Ganz genau. Wenn du mit einem MAX232 das schon mal gemacht hast, ändert
> sich auf der MC Seite nix, ausser das du statt dem MAX den MCP
> anschliesst.

Ok, klingt soweit logisch. Aber eigentlich dürfte sich ja auch auf 
PC-/Anwendungsseite auch nicht viel ändern, bis auf eventuelle Treiber 
o.ä. - oder? Der COM Port existiert für die Software ja weiterhin, sie 
dürfte ja eigentlich garnicht merken, dass es ein virtueller ist und der 
MCP2200 müsste ja alles einfach wie ein MAX232 weiterreichen?

Grüße

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Dominik Rein schrieb:
> AFAIK kann der Txd und Rxd einen Interrupt generieren,
ja

> vom PC ein "Wach auf" und der µC springt in die ISR,
ja

> in welcher ich die Daten dann empfange?
ja

> Wie ist das mit Puffer,
muss selbst programmiert werden

> sprich sind die ersten Daten bis er anfängt auszuwerten verloren oder
> wartet der PC mit dem senden, bis der µC bereit ist?

jein hängt von deiner Programmierung ab, denn sollte man mit RTS / DTS 
arbeiten siehe

http://de.wikipedia.org/wiki/RS-232 unter Verkabelung

Matthias Sch. schrieb:
> Dominik Rein schrieb:
>> Ist ja denke ich das gleiche, nur das es via MCP2200 via USB und
>> virtuellem COM Port läuft - oder? Kann ich also die gleichen Befehle wie
>> hierfür nehmen?
>
> Ganz genau. Wenn du mit einem MAX232 das schon mal gemacht hast, ändert
> sich auf der MC Seite nix, ausser das du statt dem MAX den MCP
> anschliesst.

Das ist richtig doch hier werden gewisse Grundlagen gelegt die es vom 
Verständiss her, einfacher machen würden.

Warum komm ich drauf:
Dominik Rein schrieb:
> Nun aber zur anderen (wichtigeren) Frage, wie das mit dem Datenaustausch
> ist.. Ich weiß, dass man über die Verbindung Daten Byteweise übertragen
> muss. Ist auch kein Problem meine Daten so hinzuwursten. Nur wie genau
> sende ich denn Daten und Empfange diese, muss ich dies beim µC irgendwie
> vorbereiten oder wird das dann via Interrupt autonom empfangen?

Impliziert für mich das mit serieller Datenübertragung recht wenig was 
gemacht wurde da die UART der Dreh und Angelpunkt ist.

von Dominik R. (reindo)


Lesenswert?

chris schrieb:
> Dominik Rein schrieb:

>> sprich sind die ersten Daten bis er anfängt auszuwerten verloren oder
>> wartet der PC mit dem senden, bis der µC bereit ist?
>
> jein hängt von deiner Programmierung ab, denn sollte man mit RTS / DTS
> arbeiten siehe
>
> http://de.wikipedia.org/wiki/RS-232 unter Verkabelung

Habe mir das gerade durchgelesen und sehe gerade, dass diese Anschlüsse 
vom MCP2200 bei mir zwar unbedrahtet, aber glücklicherweise als Lötpunkt 
rausgeführt worden sind. Heißt ich werte diese dann einfach aus, der PC 
bekommt ein RTS (Sendeanforderung) und da er weiß, dass er nicht 
angefordert hat, schält er auf Empfang und schickt CTS (Sendeerlaubnis) 
und umgekehrt?

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


Lesenswert?

Dominik Rein schrieb:
> Ok, klingt soweit logisch. Aber eigentlich dürfte sich ja auch auf
> PC-/Anwendungsseite auch nicht viel ändern, bis auf eventuelle Treiber
> o.ä. - oder? Der COM Port existiert für die Software ja weiterhin, sie
> dürfte ja eigentlich garnicht merken, dass es ein virtueller ist und der
> MCP2200 müsste ja alles einfach wie ein MAX232 weiterreichen?

So isses. Leider geht das mit den INF Dateien bei Windows ein wenig 
durcheinander, aber wenn der MCP Trieber erstmal installiert ist, 
behandelt jedes Terminalprogramm diesen COMPort so, wie einen 'echten'. 
Baudrate muss auch hier mit dem Empfänger ( dem MC) übereinstimmen.

Dominik Rein schrieb:
> Heißt ich werte diese dann einfach aus, der PC
> bekommt ein RTS (Sendeanforderung) und da er weiß, dass er nicht
> angefordert hat, schält er auf Empfang und schickt CTS (Sendeerlaubnis)
> und umgekehrt?

Ja, nennt sich Hardware Handshaking und ist im Gerätemanager für den 
Comport einzustellen. Das erfordert auf der MC Seite allerdings die 
Programmierung, fast keine UART in einem MC unterstützt das von alleine.
Eine Alternative ist noch Software-Handshaking XOn/XOff. Hier sendet der 
überforderte Empfänger dem Sender ein 'XOFF' Code und der Sender wartet, 
bis er ein 'XON' Code bekommt, um dann weiter zu senden.

von chris (Gast)


Lesenswert?

Dominik Rein schrieb:
> Heißt ich werte diese dann einfach aus, der PC
> !!!bekommt!!!! ein RTS (Sendeanforderung) und da er weiß, dass er nicht
> angefordert hat, schält er auf Empfang und schickt CTS (Sendeerlaubnis)
> und umgekehrt?

Schau dir mal bitte das Blockschaltbild auf Seite2 an mit CTS/RTS und 
die Pfeilrichtung beachten.

PC !!!schickt!!!! eine Sendeanforderung µC ready für Daten ?
µc bekommt das RTS-Signal

µC !!!schickt!!!! eine Sendeerlaubniss PC ready für Daten ?
PC bekommt das CTS-Signal

von reindo (Gast)


Lesenswert?

chris schrieb:
> PC !!!schickt!!!! eine Sendeanforderung µC ready für Daten ?
> µc bekommt das RTS-Signal
>
> µC !!!schickt!!!! eine Sendeerlaubniss PC ready für Daten ?
> PC bekommt das CTS-Signal

Oh, ja das habe ich wohl verwechselt. Macht so  auch mehr Sinn!


Hoffe meine Platine kommt nächste Woche damit ich es mal testen kann, 
Bauteile habe ich schon.

von chris (Gast)


Lesenswert?

Man muss halt nicht Zwangsläufig damit arbeiten(RTS/CTS) wenn man nur 
ein paar bytes rübertingelt. Wenn man aber doch ne größere Menge hat und 
man sich vielleicht noch nicht schlüssig ist wie man es später 
realisieren will das bei zu vielen Daten die Kommunikation kurz 
eingestellt wird damit der µC Zeit hat die auch weg zu schaufeln.

von reindo (Gast)


Lesenswert?

chris schrieb:
> Wenn man aber doch ne größere Menge hat und man sich vielleicht noch
> nicht schlüssig ist wie man es später realisieren will das bei zu vielen
> Daten die Kommunikation kurz eingestellt wird damit der µC Zeit hat die
> auch weg zu schaufeln.

Also immer wieder ein paar ms warten? Danke für den Hinweis  :-)

Naja, schönen Abend noch, morgen gehts wieder früh los.

von chris (Gast)


Lesenswert?

reindo schrieb:
> Also immer wieder ein paar ms warten? Danke für den Hinweis  :-)

negativ. Die Empfangsunterbrechung sollte nur so lang wie nötig sein, 
nicht so lang wie möglich. Soll heißen bis das alle Daten auf dem RAM 
sind und die ISR sollte nicht länger dauern als ein BYTE zeitlich lang 
ist bei 1Baud(1bit/s) sollte die ISR nicht länger als 1s dauern zum 
abarbeiten weil dann die nächsten Bytes verloren gingen....

von reindo (Gast)


Lesenswert?

chris schrieb:
> negativ. Die Empfangsunterbrechung sollte nur so lang wie nötig sein,
> nicht so lang wie möglich. Soll heißen bis das alle Daten auf dem RAM
> sind und die ISR sollte nicht länger dauern als ein BYTE zeitlich lang
> ist bei 1Baud(1bit/s) sollte die ISR nicht länger als 1s dauern zum
> abarbeiten weil dann die nächsten Bytes verloren gingen....


Achso, ich bin jetzt davon ausgegangen, dass der Mikrocontroller sobald 
er in die ISR springt solange darin bleibt, bis alles übertragen ist und 
der Sender ein Ende signalisiert?

von chris (Gast)


Lesenswert?

reindo schrieb:
> Achso, ich bin jetzt davon ausgegangen, dass der Mikrocontroller sobald
> er in die ISR springt solange darin bleibt, bis alles übertragen ist und
> der Sender ein Ende signalisiert?

Ja das stimmt auch aber nur für 1Byte... soll heißen

Bit1 wird übertragen
.
.
.
Bit8 wird übertragen und nachdem alle 8Bit empfangen wurden wird
das RX-Complet-Flag gesetzt und löst damit deine ISR aus für 1byte 
wohlgemerkt!!!!!!!!

Wenn du jetzt natürlich alles dort abhandeln willst geht das auch und 
könnte wie folgt aussehen:

$AA Start Übertragung
$FF Ende Übertragung

PC sendet ein $AA damit BEGINN
µc empfängt Byte, vergleicht auf $AA

PC = µc
Gleich:
PC sendet Daten
µc speichert im RAM die Daten
µC vergleicht auf $FF wenn ja zu Ungleich, bei nein zu Gleich

PC != µc
Ungleich:
ENDE ISR

Das Problem ist wie möchte man vorgehen wenn die RX-ISR noch im Gange 
ist und andere ISR's auftauchen, möchte man die RX-ISR unterbrochen oder 
nicht usw usf

von Dietrich L. (dietrichl)


Lesenswert?

reindo schrieb:
> Achso, ich bin jetzt davon ausgegangen, dass der Mikrocontroller sobald
> er in die ISR springt solange darin bleibt, bis alles übertragen ist und
> der Sender ein Ende signalisiert?

Das macht man aber (normalerweise) nicht so. Denn dann ist der µC für 
die gesamte Zeit des Empfangs blockiert und kann nicht anderes machen - 
nicht mal eine andere ISR (z.B. Timer-ISR) kann (beim AtMega) ausgeführt 
werden.

Daher würde ich empfehlen:
Die RX-ISR wird angesprungen, wenn 1 UART-Zeichen empfangen wurde. Das 
Zeichen wird dann in einen Puffer geschrieben. Gesteuert wird alles 
durch das Protokoll, in dem man festgelegt hat, wie die Zeichenkette 
beginnt, wie lang sie ist oder wie das Ende gekennzeichnet ist. Diese 
Steuerung passiert auch in der ISR.
Ist alles fehlerfrei empfangen wird durch einen Merker dem Hauptprogramm 
gemeldet, das ein kompletter Datensatz im Speicher steht.
Das Hauptprogramm fragt diesen Merker ab, bearbeitet den Datensatz und 
gibt über den Merker den Empfang des nächsten Datensatzes wieder frei.

Beispiel:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART#Empfangen_.28RX.29

Gruß Dietrich

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


Lesenswert?

Dietrich L. schrieb:
> Die RX-ISR wird angesprungen, wenn 1 UART-Zeichen empfangen wurde. Das
> Zeichen wird dann in einen Puffer geschrieben.

Du kannst dir dabei noch eine Eigenart der meisten UARTs im MC zunutze 
machen, nämlich das sie den kompletten Empfang eines Byte nach dem 
ersten Stopbit melden. Wenn du die Kommunikation auf 2 Stopbits 
konfigurierst, hat der MC die gesamte Zeit des 2ten Stopbit zur 
Verfügung, um was in den (Ring-)puffer zu legen oder auf irgendwas zu 
prüfen. DMX z.B. macht das so, weil hier ein beinhartes Timing 
angewendet wird und zur Zeit der Erfindung viele Rechner noch nicht so 
schnell waren.

XON/XOFF hat bei einer Flusskontrolle den Vorteil, das sie keine 
zusätzlichen Leitungen benötigt, und somit eine extra Hardware 
Verdrahtung entfällt.

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.