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!!!
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
Ö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.
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
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?
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?
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 ;-))
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!!!!
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.
"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 ...
@René König wie würde Sie mein Problem lösen? Ich wäre sehr dankbar für Ihren Tipp!
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
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
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
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!!
Cypress hat, bevor die Firma Anchorchips aufgekauft wurde, auch eigene kleine RISC-Prozessoren mit USB-Interface entwickelt. Das sind die I/O-Warrior.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.