Hi, Ich soll die Steuerung eines Lüfters bauen, der Später in einem mini-Windkanal in meiner Schule als Lehrmittel eingesetzt wird (ich bin Schüler). Die Regelung des Lüfters gestaltet sich als denkbar einfach. Dieser hat einen Eingang, welcher je nach Spannung die Drehzahl regelt. Dieser Eingang zieht keinen Strom (vll ein paar µA). Der Lüfter soll aber über den PC gesteuert werden. Derzeiteiges Konzept: PWM ATMega16 (ich weis,der langweilt sich zu tode), RS232 Das problem ist, dass neuere PC ja keine RS232 mehr haben, jetzt wäre USB schön. für wie aufwändig würdet es ihr halten, die Software von UlrichRadig umzuschreiben? (ich mach das nämlch mehr oder weniger freiwillig) http://www.ulrichradig.de/home/index.php/avr/usb-relaiskarte die virtuelle RS232 würde mir sehr gefallen. zum µC muss eigentlich nur immer eigentlich nur 1 Wert gesendet werden (zB Drehzal aus der der µController dann den Timer/Spannungswert errechnet) Hardware USB Lösungen mit zusätzlichen IC's möchte ich eher vermeiden. mfg J.K.
>Das problem ist, dass neuere PC ja keine RS232 mehr haben, jetzt wäre >USB schön. Dann nimm einen fertigen USB-RS232 Wandler und schon gehts wieder. Tu dir das mit dem USB Kram im AVR nicht an.
Hier gibts nen USB zu RS232 Wandler auf AVR-Basis: http://www.recursion.jp/avrcdc/ Erzeugt über den Windows-Treiber eine virtuelle COM-Schnittstelle. Das einfachste Wäre der Einsatz von zwei µCs. Einer als Schnittstellenwandler und einen für die Lüftersteuerung. Wäre das einfachste, da du nicht in dem Programm mit der USB-Software herumdoktern musst. Ansonsten hier mal schauen: http://www.obdev.at/products/avrusb/prjall.html PS: Oder natürlich einen fertigen Wandler (das allereinfachste ;-) ) oder einen USB zu RS232 Wandler IC (FTDI).
RS232 ist wieder am kommen. Richtige Desktop-PCs werden wieder mit einer RS232 ausgerüstet. (Meiner hat jedenfalls eine) Okay, in Billigpcs vielleicht nicht unbedingt.
@Tobias: > RS232 ist wieder am kommen. Das würde mich als Bastler freuen, allerdings glaub ich da nicht dran. Die RS232-Schnittstelle wird es genau solange geben, wie es Geräte damit im Consumerbereich geben wird. Wenn ich mich allerdings in Mediamärkten so umschaue, find ich leider kein Gerät, welches eine physikalischen RS232-Schnittstelle hat. Das heißt jetzt nicht, das es nicht etliche RS232-über-USB Varianten (FTDI oder Prolific) gibt/geben wird. Aber für die breite Masse lohnt sich RS232 einfach nicht, da 1. es aufgrund der riesigen Stecker viel Platz am Gerät braucht (der IPOD säh schon bissl schräg mit 'ner SUB D9 aus, oder? ;) ) 2. es verglichen mit USB 2.0 extrem langsam ist 3. es kein einheitliches Treiber-Schema gibt und somit Plug&Play im Gegensatz zu USB wo es zumindest auf dem Papier möglich ist, nicht funzt 4. es zu teuer ist, so ein MAX232+Hühnerfutter kostet nunmal etwas mehr als 3 Widerstände Die Liste kann man ewig fortsetzen. RS232 lohnt nur bei klobigen Geräten in kleiner STückzahl, wo die Entwicklungskosten nennenswert ins Gewicht fällt. Und auch die Entwicklungskosten werden aufgrund der Verbreitung freier USB-Stacks im Laufe der nächsten Jahre bald kein nennenswerter Grund mehr sein..
Also RS232 mit 0/5V oder 0/3.3V Logiklevel mit einer etwas höheren Datenrate ( variabel oder mit ein paar Stufen, Low, Normal und High) wär ganz interessant. Irgend etwas was hardwaretechnisch leicht zu realisieren ist und softwareseitig leicht zu nutzen. Es sollte ohne Treiber auskommen, man wählt einfach nur die Buchse an der das Gerät steckt. So ähnlich wie USB, nur besser.
Da wäre wohl RS485 auch interessant. Schneller und störsicherer als RS232. Aufwand ist leicht erhöht. Zudem ist RS485 in der Industrie als Feldbus weit verbreitet. Ich denke nicht, dass sich diese alten Schnittstellen am PC-Markt wieder behaupten können. USB ist (in Massen) spottbillig. Plug&Play, hohe Datenrate, liefert gleich ne Versorgungsspannung, BUS, kompakte Stecker,... Für den Heimanwender hat USB eigentlich nur Vorteile - da spricht eigentlich nichts für die alten Legacy-Schnittstellen. Mal schauen, ob die µC-Hersteller mal ordentliche USB-Hardware integrieren. Im einfachsten Fall einen Wandlerchip (wie FTDI) oder eben eine getrennte Recheneinheit, die das USB-Protokoll verwaltet. Einfacher wird es natürlich nicht als RS232.
Eine virtuelle RS-232 über Software-USB auf dem AVR ist, streng genommen, Murks. Warum? Software-USB auf dem AVR geht nur mit Low-Speed (1,5 MBit/s). Virtuelle RS-232-Schnittstellen über USB nutzen den Bulk-Transfer, der aber nach USB-Standard nur für Full- und High-Speed vorgesehen ist. Wenn Bulk-Transfer mit Low-Speed trotzdem funktioniert, liegt das am Wohlwollen des PC-seitigen USB-Controller-Treibers, der dies nicht abprüft. Solche "wohlwollenden" Treiber sind bspw. der von Win XP und der Linux-Treiber für OHCI-Controller. Pedantisch ist hingegen der Linux-Treiber für UHCI-Controller, weswegen dort diese Soft-USB- RS232-Lösungen ohne Kernel-Patch nicht funktionieren. Wie es bei anderen Betriebssystemen aussieht, weiß ich nicht. Die sauberere Lösung ist es aber auf jeden Fall, einen hardwaremäßigen USB-Seriell-Konverter an den AVR dranzupappen. Der FT232RL bspw. kommt fast ohne externe Komponenten aus und kann deswegen problemlos in der Anwendung.
>Hier gibts nen USB zu RS232 Wandler auf AVR-Basis: >http://www.recursion.jp/avrcdc/ danke, das dürfte der source sein den urlich radig verwendet hat. ich schau mal ob ich es schaff diesen für den mega16 umzuschreiben. (momentan ärgert mich das makefile ein bisschen) am ende wird wohl noch platz für eine pwm sein.. >Eine virtuelle RS-232 über Software-USB auf dem AVR ist, streng >genommen, Murks. naja, das Ding soll ja nicht verkauft werden. Auf dem PC läuft XP, mit Vista soll es ja auch noch funktionieren. mfg J.K
so, hab mich ein wenig mit dem Programm beschäftigt und sehe optimistisch in die Zukunft ... ... ;-) ich will jetzt den code editieren von http://www.recursion.jp/avrcdc/ und zwar die CDC - IO download: http://www.recursion.jp/avrcdc/CDC-IO.2008-08-25.zip in der main.c Datei gibt es eine
1 | void usbFunctionWriteOut( uchar *data, uchar len ) |
funktion. In dieser werden die Steuerzeichen abgefrag und abgearbeitet. die empfangenen Daten stehen im data-Array. Ich stell mir das jetzt so vor, dass ich den Code in dieser Funktion einfach durch meinen ersetze. also -wert auslesen -timer berechnen -hw-pwm timer setzten da die pwm durch Hardware realisiert wird, beeinflusst es auch nicht die usb Kommunikation. Jetzt zu meinem Problem: Was ich noch nicht genau weiß: wie/wann wird diese funktion aufgerufen und was steht dan im rbuf array? auf der virtuellen COM Schnittstelle wird was eingegeben, mit Enter bestätigt. Das wird jetzt über USB an den AVR gesendet und die usbFunctionWriteOut aufgerufen. Im "data"-Array steht der eingegebene String, im "len" eben die Länge. Stimmt das soweit? mfg J.K
Hallo, vielleicht passt meine Frage nicht hier aber ist auf jedem Fall von USB to RS232! wenn ich ein Adapter baue mit dem code bzw. Schaltplan USB zu RS232 Wandler auf AVR-Basis von http://www.recursion.jp/avrcdc/ wie bekomme ich die 5V an der Ding? funktioniert das nur dann wenn ich es in eine Platine wie http://www.ulrichradig.de/home/index.php/avr/usb-relaiskarte baue? oder wird es von der USB mit dem 5V versorg? vielen Dank Gruß
Kannst du machen wie du willst. Kannst die USB-Versorgung direkt anzapfen. Trick: Einfach zwei Si-Dioden in Reihe zwischen AVR und 5V Versorgung. So läuft der AVR mit ~3,3V und du musst dann keine Pegeländerung mehr für die USB-DAtenleitungen vornehmen, die ebenfalls mit 3,3V arbeiten. Du musst dann nur eins beachten: Wenn dein 3,3V AVR mit einem 5V AVR zusammenarbeitet, dann musst du eine Pegeländerung vornehmen, d.h. dass das TX-Signal vom 5V AVR über nen Spannungsteiler auf ca. 3,3V begrenzt wird. Umgekehrt sollte der 5V AVR ein 3,3V Signal als high-Signal erkennen. PS: Die Versorgung über die zwei Dioden ist in dem Link: http://www.recursion.jp/avrcdc/ aber auch eingezeichnet. Der Kreis mit dem Strich durch soll als Symbol für die Versorgungsspannung des AVR herhalten. Hab das Ganze hier schonmal als Prototyp aufgebaut - funktioniert bisher. ABER: Benutze- wenn möglich- nicht sehr hohe Baudraten. Hab mir ein kleines Testprogramm auf dem AVR geschrieben, der mit das empfangene USART-Signal als Echo zurücksendet. Wenn ich größere Datenmengen am Stück (1000 Byte) mit 115000 Baud geschickt habe, wurden manchmal Zeichen verschluckt. Vielleicht könnte man dies mit einem Pufferspeicher verbessern. Bei einer lansameren Übertragungsrate gabs keine Probleme. Wenn du die Version mit ATmega8/48/88 aufbaust, kannst du über den Windows-Treiber bzw. deinem Terminal-Programm oder sonstwas die Übertragungsrate bequem einstellen. Brauchst also keine Jumper oder sonstwas an der AVR-Hardware rumbasteln. PS: Wenn du Versorgungsspannung vom USB anzapfst, dann denke bitte daran, dass deine Schaltung nicht mehr als 100mA zieht. Bzw. Versorge NUR den 3,3V AVR damit. Die Restliche Hardware mit einer weiteren Spannungsquelle (GNDs natürlich verbinden)
Hallo Igor, vielen Dank für die SUPER Antwort, bin leider nicht der Profi :-( bin noch Anfänger in Mc aber habe fast alles verstanden. Ich bastle gerne daher war meine Frage ob ich es sowas bauen könnte. >> PS: Wenn du Versorgungsspannung vom USB anzapfst, genau das möchte ich, das heißt ein Adapter unabgängig von Platine oder sonst was. >> dann denke bitte >> daran, dass deine Schaltung nicht mehr als 100mA zieht. Bzw. Versorge >> NUR den 3,3V AVR damit. das ist klar! aber >> Die Restliche Hardware mit einer weiteren >> Spannungsquelle (GNDs natürlich verbinden) wie andere Spannungsquelle wenn ich aber nur über USB Spannung verfüge?
Wenn du z.B. POWER-LEDs betreiben willst. Dann bräuchtest du noch ne andere Spannungsquelle für die stromhungrigen Komponenten. Z.B. wenn du den USB zu RS232 Wandler direkt in eine Schaltung integrierst, wo schon ein µC sitzt. Willst du dir nur einen USB zu RS232- Umsetzer bauen? Falls ja, dann brauchst du nur die USB-Versorgung.
Ich probier jetzt einfach mal das RS232 Projekt aus. Wenn ich das Ding anstecke wird ein unbekanntes USB-Gerät entdeckt. Das liegt wahrscheinlich daran, dass ich die .inf datei noch verwenden muss. Wo kopier ich die hin das es funktioniert?
Hab rechte maustaste > installieren probiert nichts erscheint soll ich das mitbekommen wenn sich das ding installiert?
Das neue Gerät, erschein dann (wenn alles gut läuft) in Gerätemanager unter Anschlüsse Gruß
Ok, es erscheint ein unbekanntes Gerät, wollte für dieses einen neuen Treiber anlegen > diese .inf datei Fehlermeldung: Datei enthält keine Informationen über die Hardware. Hab auserdem ein kleines Problem mit den Z-Dioden. Kann es an dem liegen? Beitrag "z-diode 2,7 statt 3,9" Was kann passieren, wenn ich die Z-Dioden ganz weglasse? USB arbeitet doch mit 5V ? mfg J.K
Mhm, wahrscheinlich liegts am Code. Hab jetzt die Leitungen zum µC abgesteckt, es erscheint immer noch die selbe Meldung. Ich wollte mir die Anwendung auf nen mega16 umschreiben. Hab das Makefile vom MEGA168 auf MEGA16 umgestellt und einfach compiliert. Keine Fehler. Gibt es tükische Unterschiede vom 16er zum 168er außer, dass der 16er nicht auf 20Mhz läuft? mfg J.K
>Pull up an d-
Wenn ich mir meine Schaltungen mit FT245BM ansehe gehört
der Pullup an d+.
http://avrusb.wikidot.com/hardware danach an d- wenn ich ihn an d+ hänge tut sich gar nichts. der dient ja dazu, dass ein gerät erkannt wird
>Wenn ich mir meine Schaltungen mit FT245BM ansehe gehört >der Pullup an d+. Hab mir gerade mal meine Schaltungen mit PIC18F2550 angesehen. Da hängt er auch an d-. Der PIC ist ein Slowspeed Device. Der FT245 ein Fullspeed Device. Macht wohl den Unterschied. USB ist grausam!
oh mann habs aufgegeben gehabt jetzt file noch mal runtergeladen, neu geöffnet, auf mega16 eingestellt, compiliert... jetzt gehts! device wird erkannt! danke für eure hilfen! (hat mir mental sehr geholfen es immer wieder zu versuchen!!! :-) ) mfg J.K (ps: als "Z-Dioden" verwende ich 2 gelbe Leds ^^ )
Hallo, Ich habe mir auch die Schaltung mit dem Mega8 aufgebaut. Habe den Controller geflasht und die Fusebits eingestellt. Als ich die Schaltung an meinem Laptop(WinXP) ansteckte, bekam ich keine(!!!) Meldung. Weder dass das Gerät erkannt / nicht erkannt wurde. Jedoch konnte ich keine Spg zwischen GND und VCC messen! Meine Frage: benötigt USB eine Mindest-Last, um ein Device zu erkennen?
>Jedoch konnte ich keine Spg zwischen GND und VCC messen! Kurzschluss auf der Platine? Dann schaltet der USB Port sich ab. >Meine Frage: benötigt USB eine Mindest-Last, um ein Device zu erkennen? Nein.
Hallo, Ich habe nocheinmal nachgemesssen: Nein ich habe keinen KS zw. Vcc und GND! Wenn ich das Gehäuse des Steckers mit GND verbinde, bekomm ich die Fehlermeldung, Stromüberhöhung... MFG Unbekannt
>>Jedoch konnte ich keine Spg zwischen GND und VCC messen! >Kurzschluss auf der Platine? Dann schaltet der USB Port sich ab. Hätte ich fast vergessen. VCC oder GND nicht angeschlossen könnte auch noch sein. Also irgendwo eine offene Leitung.
Das ist die Schaltung von der obdev-Seite. Ich habe im Code nur die Pins geändert (D+, D-)...
>Ich habe im Code nur die Pins geändert (D+, D-)...
Und das solltest du besser NICHT tun.
>D.h.: ich sollte die Schaltung besser neu ätzen?
Fummel die auf das Original um. Das sollte reichen.
>Und das solltest du besser NICHT tun.
wieso?
1 | #define USB_CFG_DMINUS_BIT 3
|
2 | /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
|
3 | * This may be any bit in the port.
|
4 | */
|
5 | #define USB_CFG_DPLUS_BIT 2
|
6 | /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
|
7 | * This may be any bit in the port. Please note that D+ must also be connected
|
8 | * to interrupt pin INT0! [You can also use other interrupts, see section
|
9 | * "Optional MCU Description" below, or you can connect D- to the interrupt, as
|
10 | * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
|
11 | * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
|
12 | * markers every millisecond.]
|
13 | */
|
Hab jetzt auch wieder ein Problem ;-) Wollte jetzt den Beispeil-Code von http://avrusb.wikidot.com/driver-api mal ausprobieren.
1 | static uchar buffer[64]; |
2 | static uchar currentPosition, bytesRemaining; |
3 | |
4 | usbMsgLen_t usbFunctionSetup(uchar setupData[8]) |
5 | {
|
6 | usbRequest_t *rq = (void *)setupData; // cast to structured data for parsing |
7 | switch(rq->bRequest){ |
8 | case VENDOR_RQ_WRITE_BUFFER: |
9 | currentPosition = 0; // initialize position index |
10 | bytesRemaining = rq->wLength.word; // store the amount of data requested |
11 | if(bytesRemaining > sizeof(buffer)) // limit to buffer size |
12 | bytesRemaining = sizeof(buffer); |
13 | return USB_NO_MSG; // tell driver to use usbFunctionWrite() |
14 | }
|
15 | return 0; // ignore all unknown requests |
16 | }
|
17 | |
18 | uchar usbFunctionWrite(uchar *data, uchar len) |
19 | {
|
20 | uchar i; |
21 | if(len > bytesRemaining) // if this is the last incomplete chunk |
22 | len = bytesRemaining; // limit to the amount we can store |
23 | bytesRemaining -= len; |
24 | for(i = 0; i < len; i++) |
25 | buffer[currentPosition++] = data[i]; |
26 | return bytesRemaining == 0; // return 1 if we have all data |
Bekomme immer die Fehlermeldung, dass VENDOR_RQ_WRITE_BUFFER nicht existiert, hab ich auch "per hand-suchfunktion" nicht gefuden. hat das schon mal wer verwendet? kennt sich damit jemand aus? source http://www.obdev.at/products/avrusb/download.html mfg J.K
Hab jetzt doku ducht, hab irgendwie nichts mehr über VENDOR_RQ_WRITE_BUFFER gefunden?!
Ganzer Code im Anhang! Ich hab auch schon alle restlichen Files durchsucht. Mich wundert es gar nicht dass VENDOR_RQ_WRITE_BUFFER nicht gefuden wird. ich find es auch mit der Suchfunktion nicht.
hab die umschreibevariante jetzt aufgebeben möchte jetzt den rs232 - Wandler nachbauen. die einzige Änderung ist, dass ich einen mega16 verwende, dürfte ja kein Problem sein - dachte ich. copiliert > makefile mega16 eingestellt > hat funktioniert > controller bespielt > treiber installiert schalt ich auf die virtuelle com Schnittstlle erscheint nach jedem Tastendruck auf der Tastatur ein <CE-995>. Von usb nach rs232(2.terminal) wird nichts übertragen. ist das <CE-995> eine art Fehlercode?
Ach, die blöden uart register heissen beim 16er wieder anders als beim 8er problem gelöst mfg J.K
Projekt fast fertig: Mein Lösungsweg (falls jemand mal die Suchfunktiohn verwendet und auf diesen Beitrag stößt): RS232->USB Wandler Software auf MEGA16 aufgespielt. In der uart.c wird das senden/empfangen abgefangen. Die Daten werden nicht auf die sereielle Schnittstelle weitergegeben sondern im Controller verarbeitet. Nicht die schönste Lösung, aber die einfachste ;-). mfg J.K
Hallo, Bei mir funktioniert so weit alles -> Der PC erkennt das USB-Device und erstellt mir einen virtuellen Com-Port... Wie kann ich jetzt mit dem Controller kommunizieren? -> Verwende Hyper-Terminal
J. K. schrieb: > In der uart.c wird > das senden/empfangen abgefangen. Sorry, das ich nen alten Thread auskrame, aber ich stehe zur Zeit vor dem Problem, das ich mir die uart.c angucke und nicht weiß, wo ich da ansetzen soll. Wo genau fängt man denn da das Senden (was ja dann das Empfangen vom USB wäre) ab?
@quotschmacher: Wenn du die uart.c gefunden hast, wo ist das problem? in der Funktion void uartPoll(void) ist schön komentiert: /* transmit */ Das "wo?" wäre somit geklärt. Schau es dir mal genauer an, und denk über das "Wie?" nach. Eigentlich gar nicht so schwierig. MfG Jürgen PS.: Möchte jetzt nicht arroganterweise Infos vorenthalten, aber wenn man das "wie" nicht selbst versteht, geht das "wie mach ich weiter" auch nicht.
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.