Forum: Mikrocontroller und Digitale Elektronik USB-Interface (auf ein neues)


von Martin (Gast)


Lesenswert?

Hallo allezusammen!

Wie ich gesehen hab, habt ihr, in letztre Zeit ja schon viel über USB
in Verbindung mit µC diskutiert.

Ich hab ein Development Board mit dem PIC16c745 in meinem Projekt
eingebaut. Dieses kann folgendes, schalten von 8 Ausgängen über den PC
(Visual Basic). Alles kein Problemn da es für den PIC16c745 eine
entsprechende .dll für VB gibt.
Das Problem tritt jetzt erst auf: an der Eingangseite des PIC16c745
bekomme ich Bits im Abstand von 50µs hinein. Diese werden im AVR
gezählt und dieser Wert, wird mir im Visual Basic angezeigt. Wenn nun
ein bestimmter Wert erreicht ist schaltet mir VB einen der 8 Ausgänge.
Das Problem ist jetzt folgendes: Die Zeit bis VB den aktuellen Wert
empfangen hat und VB ab diesem Wert ausschaltet ist ziemlich hoch 0,5
sek. Also hab ich nocheinmal 0,5 sek länger, wie sich der Wert am
Eingang des µC ändert. Also sehr ungenau.

Mit welchen Mitteln kann ich meine Schaltung verbessern, welcher AVR
würde da besser in Frage kommen?
Also wie gesagt er muß folgendes können:

Schalten von 8 Ausgängen (auch über den PC)
Einlesen von 4 verschiedenen Signalen, jedes Signal besteht aus
mehreren Impulsen die gezählt werden müssen. (pro Signal sind es ca.
max 400 Impulse oder Bits)

Der µC müßte mit Visual Basic kommunizieren können (also man soll in
Visual Basic einen Endwert für den Zähler eingeben können, der nicht
immer gleich bleiben muß)

Wichtig ist allerdings das all diese Funktionen mit USB funktionieren!

Ich hab auch schon einige andere Dinge ausprobiert, wie z.B den PC als
Zähler zu verwenden, die Impulse hab ich in den PC geschickt und mit VB
zählen lassen. Aber das kann man echt vergessen! So langsam wie VB
arbeitet hat er mir immer wieder einige von Bits vergessen.

Ich bin für jeden kleinsten Tipp dankbar!!
Aber vergesst bitte nicht dass USB in Verbindung mit µC absolutes
Neuland ist. In Sachen µC bin ich eigentlich auch ein Newbie, aber die
Grundlagen hab ich und einige PICs hab ich auch schon programmiert.

Danke im Voraus an alle!!!

von martin (Gast)


Lesenswert?

Falls Ihr euch bei meinem doch sehr umfangreichen und vielleicht
kompliziert ausgedrückten Text nicht auskennt fragt mich einfach!
Danke!
Ich bin für jeden Tipp dankbar!!!

mfg

von thkais (Gast)


Lesenswert?

Öhm - so richtig schlau wird man aus Deinen Ausführungen nicht. Du hast
ein PIC-USB-Board am PC, aber irgendwie doch noch einen AVR (wie ist
der am PC / PIC angeschlossen?).
Prinzipiell ist der USB in Zusammenhang mit µC nicht das gelbe vom Ei.
Zwar lassen sich theoretisch ganz tolle Übertragungsraten realisieren,
realistisch sind aber eher die 1,5 MB/s und noch nicht mal die, denn
die USB - Schnittstelle ist ein Single-Master Bus, d.h. jede Abfrage
muß vom PC initiiert werden. Und da kommt Windows ins Spiel: Windows
war niemals und wird niemals ein Real-Time Betriebssystem. Um wirklich
Impulse genau zu zählen, kannst Du Windows getrost in die Tonne
kloppen, oder man beschränkt sich auf niedrige Frequenzen. Dann ist
aber zwischendurch ne CD brennen nicht möglich.
Ich würde es eher so machen: Den µC die Impulse zählen lassen und
Windows von Zeit zu Zeit mitteilen, wieviele Impulse angekommen sind.
Oder auf ein dafür geeignetes PC-Betriebssystem wechseln: DOS oder
Real-Time Linux.

von martin (Gast)


Lesenswert?

mir ist schon klar dass Windows kein Real Time Betriebssystem ist,
deswegen stellte ich ja die Frage wie ich mein Problem am einfachsten
mit einem µC realisieren kann. Windows benötige ich jedoch für die
Visualisierung! mfg

von Thomas Burkhardt (Gast)


Lesenswert?

So, wie du willst, dann frage ich halt :)


"Alles kein Problemn da es für den PIC16c745 eine entsprechende .dll
für VB gibt."

Ok, kenn ich nicht. Welche Transfermodi unterstützt diese DLL denn?
Bulk, Interrupt, Isochron?


"Das Problem tritt jetzt erst auf: an der Eingangseite des PIC16c745
bekomme ich Bits im Abstand von 50µs hinein. Diese werden im AVR
gezählt und dieser Wert, wird mir im Visual Basic angezeigt. Wenn nun
ein bestimmter Wert erreicht ist schaltet mir VB einen der 8 Ausgänge.
Das Problem ist jetzt folgendes: Die Zeit bis VB den aktuellen Wert
empfangen hat und VB ab diesem Wert ausschaltet ist ziemlich hoch 0,5
sek. Also hab ich nocheinmal 0,5 sek länger, wie sich der Wert am
Eingang des µC ändert. Also sehr ungenau."

Mmmh. Kann der µC hier nicht selbst entscheiden? Ich mein', warum an
den PC eine Aufgabe delegieren, die so einfach ist :)
Wäre es denn nicht möglich, dass du per VB die Werte, bei denen was
geschehen soll in den µC überträgst, damit dieser dann die
Schaltvorgänge selbst auslösen kann?

Ansonsten muss ich mich meinem Vorredner anschliessen und fragen, was
nun: PIC oder AVR?

von martin (Gast)


Lesenswert?

Sorry! Vergesst den AVR ich hab nur einen PIC! Ich hab  mich da durch
ein voriges Problem verschrieben!

"Wäre es denn nicht möglich, dass du per VB die Werte, bei denen was
geschehen soll in den µC überträgst, damit dieser dann die
Schaltvorgänge selbst auslösen kann?"

Das ist doch schon die Lösung! An das hab ich auch schon gedacht, aber
nur weiß ich nicht wie ich das realisieren kann!

Am Besten ist wenn ihr meine Schaltung die ich habe vergeßt!

Zitat: "welcher µC
würde da besser in Frage kommen?
Also wie gesagt er muß folgendes können:

Schalten von 8 Ausgängen (auch über den PC)
Einlesen von 4 verschiedenen Signalen, jedes Signal besteht aus
mehreren Impulsen die gezählt werden müssen. (pro Signal sind es ca.
max 400 Impulse oder Bits)

Der µC müßte mit Visual Basic kommunizieren können (also man soll in
Visual Basic einen Endwert für den Zähler eingeben können, der nicht
immer gleich bleiben muß)"


wie könnte ich das realisieren?? kennt ihr da einen µC der dafür gut
ist?

von Thomas Burkhardt (Gast)


Lesenswert?

Hi.

Jeder µC mit USB-Anschluss, der "schnell" genug ist :) evtl. tut es
sogar ein µC mit FTDI-Konverter fürs USB.

"schnell" genug heißt: Er muss schneller sein, als deine Signale,
wenn du die 4 Eingänge per Software pollen willst. Der von dir
angegebene Signalabstand reicht zur Beurteilung nicht aus. Auch die
Impulslänge ist wichtig. Naja, dann muss der µC doch nix weiter machen,
als Pulse zählen und mit Schwellwerten vergleichen.

Wie schnell soll dann das alternative Schalten per PC sein. Bedenke,
dass bei USB1.1 nur im Millisekundentakt Daten verschickt werden. Diese
Latenz hat es dann. (aber es klingt bisher nicht so, als würde dich das
stören ;-))

von martin (Gast)


Lesenswert?

Vielleicht hab ich wirklich falsch oder zu kompliziert ausgedrückt,
vergeßt die Schaltung wie ich es im Moment habe!

Ich will folgendes haben:

Im Windows (Visual Basic) gebe ich in einem Programm zwei Endwerte
ein.

Dann klickt man auf einen Button und diese Endwerte werden über USB in
einen µC geschickt.

Nun fängt der µC an zu arbeiten und schaltet mir 8 Augänge.

Während die Ausgänge geschaltet sind kommen an 4 Eingänge vom µC
laufend Impulse im Abstand von 50µs herein.

Diese Impulse werden von 4 Zähler gezählt und werden im µC, von dem
ganz am Anfang in Visual Basic eingegebenen Werten, verglichen. Nicht
vergessen sie werden im µC verglichen.

Im Visual Basic brauche ich nur eine Visualisierung, das heißt ich muß
nur wissen welcher Eingang gerade geschaltet ist, dieser Parameter muß
nicht in Echtzeit erfolgen, da ich lediglich nur die Zustände
beobachten will!

Was ich aber benötige ist, dass ich mit diesem Visual Basic Programm
die Ausgänge des µC auch zusätzlich Ein und Aus schalten können muß.

Ich weiß, dass es einige µC gibt die USB unterstützen jedoch hab ich
absolut keine Ahnung welcher, von den unzähligen µC für mein Projekt
der richtige ist: z.B.: FT8U245BM, FT2232C, I/O Warrior, PIC16c745
usw..

Was ich auch nicht weiß ist, wie ich die EndWerte von Visual Basic in
den µC übertrage bzw. wie ich mit den bereits oben genannten µC über
Visual Basic die Ausgänge schalte!!

ich hoffe ich hab mich jetzt besser ausgedrückt! vergeßt bitte die
Schaltung die ich bereits habe!

Danke!!!!

von thkais (Gast)


Lesenswert?

Ich persönlich würde mich für folgende Kombination entscheiden:

PC(USB) - > FT232BM -> AVR

Nicht zuletzt deshalb, weil die Programmierung eines USB-µC nicht
gerade trivial ist. Mit dem FT232-Adapter reduziert sich das Ganze auf
die Implementierung einer seriellen Schnittstelle (sowohl auf PC als
auch auf µC-Seite), und das ist doch noch etwas einfacher
beherrschbar.
Ich habe mal versucht, einen M16C245 per USB zum Laufen zu kriegen -
der reinste Horror. Bis man eine USB-Schnittstelle auf dem µC überhaupt
erst initalisiert hat, ist man mit der seriellen Schnittstelle schon
lange fertig. Vielleicht habe ich mich aber auch einfach zu blöd
angestellt....
Noch einfacher (und auch billiger): Ein USB-Seriell Adapter (bei
Reichelt 9,90 Euro) und dann dem µC eine ordinäre serielle
Schnittstelle verpaßt. Dann kann man sich auch das TQFP-Löten des
FTDI-Chips sparen.

von René König (Gast)


Lesenswert?

"Nicht zuletzt deshalb, weil die Programmierung eines USB-µC nicht
gerade trivial ist."

Wenn man sich daran gewöhnt hat, ist es nur noch halb so wild.  :-)
Aber im Ernst: Die Hersteller haben das erkannt und haben deswegen
anständige Samples parat. Für den C8051F320 z.B. gibt es eine fertige
HID-Firmware und das dazu passende PC-Progrämmchen, beides mit Quell,
versteht sich. Dann gibt es Samples für Bulk-Transfers, inklusive
Treiber und PC-Progrämmchen, natürlich auch alles mit Quell. Dann gibt
es Samples für Interrupt-Transfers, ebenfalls mit Treiber und
PC-Progrämmchen und ebenfalls mit Quell.

Auch läuft das Ding mit deren USBExpress (das selbe USBExpress, das
auch mit dem CP210x läuft). Das ist allerdings nicht Quell-Offen.

Ich kann zwar nicht sagen, wie gut oder schlecht das ist, weil ich das
in der Regel alles selbst programmiere, trotzdem halte ich das Angebot
für vollständig.

Für den geschilderten Anwendungsfall hätte ich das Gerät als HID
implementiert. Dafür gibt es, wie gesagt, bereits fertigen Quell, den
man an seine Bedürfnisse anpassen kann. Und die Kommunikation mit einem
HID aus VB heraus ist auch kein Problem; wer das (noch) nicht kann, kann
sich das in Jan Axelsons Buch anschauen. In seinem Werk macht er dann
auch genau das.

Das hat jedenfalls den Vorteil, nicht noch einen extra Baustein zu
benötigen. Und gerade die FTDIs benötigen ja auch zusätzlich noch
heftig viel externe Beschaltung. Und billiger als der IO-Warrior ist's
auch.

Naja, nur so eine Überlegung ...

von martin (Gast)


Lesenswert?

@René König

wie würde Sie mein Problem lösen?

Ich wäre sehr dankbar für Ihren Tipp!

von Thomas (Gast)


Lesenswert?

ich würde das mit jedem anderen USB Controller auser dem dem Pic machen
weil

- der Pic ist LowSpeed (Max 1.5 MBit /s)
- daher ist das maximum 8 Bytes / 10 ms
- die Beispiel Firmware ist kaputt (geht nicht mit jeder HW rev)

es hat mich 3 Tage gekostet den Fehler zu finden. Im Emu ging alles
die gleiche Firmware in einen Chip programmiert hat nicht
funktioniert.
nimm einen Controller der auch Treiber bereitstellt, oder bau ein ein
FullSpeed Hid Device dann kommst du auf max 64 Byte / ms

IOCtrls kann man übrigens in jeder Sprache absetzen. Dafür graucht man
keine DLL.

Thomas

von martin (Gast)


Lesenswert?

Hallo Thomas!

Danke für deinen Beitrag!

Wie gesagt, ich hab mit der Kombination USB und µC noch absolut keine
Erfahrung. Welchen USB Controller kannst du mir konkret empfehlen?
Welcher stellt Treiber bereit? Lieg ich richtig der Annahme, dass HID
keine Treiber benötigt?
Wie mache ich das mit den IOCtrls? Vielleicht kannst du mit in einem
Blockschaltbild oder so ähnlich das genauer erklären! Danke für deine
Tipps! Sie helfen mir wirklich riesig weiter!!!

Mit freundliche Grüßen

Martin Toth

von Thomas (Gast)


Lesenswert?

erste Wahl auch was die Verfügbarkeit in DE angeht ist die EZUSB
Reihe von Cypress AN2131. Für den gibt es massig Beispiele im Netz
Das ist ein 24 MHz 8051 Dalas core.
Vorteile :
- Treiber ist beim Kit dabei inc Source
- DDK lässt sich bei Cypress runterladen
- sehr gute Dokumentation
- gibts bei Reichelt
- realtiv preiswert ca 4$ in Stückzahlen
- vollständiger USB core in Fullspeed

TUSB xxxx von TI
viele Varianten aber ohne NDA kein Demo Code, Keine Treiber, billig,

AT89C513x von Atmel
relativ neu, ISP / IAP das übliche Atmel Zeug halt.Schlechtes Code
Beispiel. 16k / 32k Flash


Gearbeitet habe ich schon mit allen.


Es gibt unter Windows eine API Funktion DeviceIoControl()
mit der du auf Treiber Funktionen zugreifen kannst

Thomas

von martin (Gast)


Lesenswert?

Vom Cypress hab ich schon einiges gehört, ist der nicht auch im IO
Warrior eingebaut?
Wie schauts bei diesem aus, denkst du kann ich damit mein Problem
realisieren, also 4 interne Zähler bis max. 500 Impulse usw....

Mit dieser API Version kann ich direkt auf die Funktionen vom Cypress
zugreifen? Das klingt ja genial! Wie Programmiere ich den dann
eigentlich? Ich hab mich bis jetzt nur mit PICs beschäftigt.
Reintheoretisch müßte ich den Cypress ja auch über die USB prog. können
oder?

Danke für deine großartige Hilfe! Ohne dich wäre ich ziemlich
aufgeschmissen!!

von Rufus T. Firefly (Gast)


Lesenswert?

Cypress hat, bevor die Firma Anchorchips aufgekauft wurde, auch eigene
kleine RISC-Prozessoren mit USB-Interface entwickelt. Das sind die
I/O-Warrior.

von Thomas (Gast)


Lesenswert?

http://www.cypress.com/portal/server.pt?space=CommunityPage&control=SetCommunity&CommunityID=205&PageID=209&resource=Developer%20Kits&next=0

ist der Link zum DDK. Der Prozessor kann das locker. Die prog. schätze
ich bei entsprechender Erfahrung auf ca 8..9 h.
Für die Einarbeitung in USB und den AN2131 kannst du mal locker 100h
ansetzen. Ich hoffe du kannst Englisch.

Die Firmware kann zum Treiber dazugelinkt werden oder in ein EEprom
programmiert werden (B2 Download im Handbuch)

Thomas

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.