PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Usb + Avr



Killer
23.09.2007, 19:56
Hallo,
ich möchte seit längeren einen AVR über USB mit einem PC kommunizieren lassen. Ich habe viel gesucht aber sogut wie garnichts nutzbares gefunden.
Meine Vorüberlegungen waren, dass es ja wie in Wiki erklärt möglich ist, den AVR über einen RS232 Pegelwandler Daten auf dem Bildschirm ausgeben zu lassen. Doch ich möchte es jetzt eben über USB laufen lassen. Das Programm für den PC möchte ich selber unter C++ programmieren. Dazu muss das Gerät, welches über USB angeschlossen wird als Laufwerk erkannt werden!!!! Bei Embedit gibt es zwei
USB-Peripheriebausteine:
http://shop.embedit.de/browse_010004003_141__.php
Wenn es mit denen überhaupt öglich ist, welchen nehme ich von den beidem am besten und wenn beide nichts taugen wo sollte ich dann suchen?

MfG Killer

Hubert.G
23.09.2007, 20:20
Und wenn du dir so einen USB-RS232 Adapter kaufst ersparst du dir die unsicherheit ob das gebastelte geht und kosten tun diese Dinger auch kaum noch was.

Killer
23.09.2007, 20:32
Wie läuft das das ganze denn dann genau ab? Kann ich den AVR dann einfach an den Input/Output für RS232 "hengen" und den PC an Input/Output (oder wie auch immer) für USB??

MfG Killer

Hubert.G
23.09.2007, 20:42
Du gehst vom AVR über einen MAX232 an den RS232/USB Adapter und im PC gehst du auf den im USB für das Gerät vorgegebenen COM-Port

SIGINT
24.09.2007, 16:14
@Killer: Irgendwie glaube ich dir nicht, daß du nichts zum Thema AVR+USB gefunden hast. Wenn du ernsthaft gesucht hättest, dann hättest du den AT90USB gefunden.
Und wieso kommst du darauf, daß du ein Mass Storage Device benötigst um einen AVR mit einem PC kommunizieren zu lassen?!? Da gibt es noch andere schöne Klassen, wie Communications device class (CDC) oder human interface device (HID).
Wenn du aber wirklich ein mass storage device haben willst, dann hättest du folgenden Link finden können:
http://www.lvr.com/mass_storage.htm
Für HID und CDC gibt es sogar Softwareseitige implementationen für die meisten AVRs:
http://www.obdev.at/products/avrusb/index-de.html

Ich versteh also nicht, wie du darauf kommst, daß es im Netz nichts zu finden gibt...

Gruß,
SIGINT

P.S.: Noch vergessen: Da gibt es ja noch die FTDI-Chips die einfach einen virtuellen COM-Port im PC einrichten... dann kannst du mit deinem AVR wie über die RS232 Schnittstelle reden. (wurde ja schon erwähnt)

Killer
24.09.2007, 17:08
Okay, mal von diesem Beispiel unten abgebildet:
zu finden unter: http://www.obdev.at/products/avrusb/index-de.html
(feundlicherweise von SIGINT zu verfügung gestellt ;-) )

Wenn ich das jetzt richtig verstanden habe, wäre das aufgebaut inklusiv des entsprechenden Programmes aufgeladen ein HID Modul. Ich habe dort aber keinen Quellcode für dem AVR gefunden! Der AVR benötigt doch aber eine Art Treiber, damit das ganze "Bauteil" von PC als solches erkannt wird. Es gibt auf der Homepage zwar sämtliche Downloaddateien, doch diese sind glaube ich nichts für den AVR oder?

MfG Killer

SIGINT
24.09.2007, 18:35
@Killer: Wieso sollen die angebotenen Dateien nicht für den AVR sein?!
Noch nichts von WinAVR gehört?
http://www.mikrocontroller.net/articles/WinAVR

Der Treiber von OBDEV kann nicht nur HID Geräte realisieren, sondern auch CDC und eigene Klassen... aber HID dürfte für vieles ausreichen.
Aber an deiner Steller würde ich garnicht versuchen was eigenes zu schreiben, sondern eine fertige Lösung nehmen. Sowas dürfte optimal sein:
http://www.recursion.jp/avrcdc/
Wenn du ein 100% zuverlässiges Gerät haben willst, dann kauf dir aber lieber ein FTDI... was besseres gibt wahrscheinlich nicht.

Gruß,
SIGINT

Killer
24.09.2007, 19:13
Ich werde aber aus dem Quellcode nicht schlau darüber, wie das mit dem Empfangen und Senden abläuft. Kann man sich die Werte die Empfangen werden einfach an zwei Ports ausgeben lassen und zwei Pins definieren um die "Daten" die an den PC gesendet werden auszuwählen (Also am AVR) ?

MfG Killer

SIGINT
25.09.2007, 16:48
Das hängt vom der verwendeten Firmware ab. Die OBDEV-Treiber sind allgemeine USB-Treiber für Lowspeed Devices... du kannst also das USB-Gerät so definieren, wie du willst.
In deinem Fall würde ich aber eine fertige Lösung nehmen, da du sonst auf keinen grünen Zweig kommst. Nichts gegen dich, aber USB auf Protokollebene dürfte ein wenig zu kompliziert für dein aktuelles Wissen sein.
Also nehm dir einen USB<->RS232 Wandler und gut ist. Da gibts ja die FTDI-Chips und die AVR-Softwarelösung. Infos zum Thema gibts massenweise im Netz.

Killer
25.09.2007, 18:59
Dass das für mein aktuelles Wissen recht kompliziert ist, kann ich dir natürlich nur recht geben!! Aber der Schaltplan wie oben gepostet scheint ja relativ einfach unzusetzen zu sein, da hab ich schon aufwändigeres aufgebaut. Doch meine Frage ist, wie man von Dem AVR (In diesem Falle ATTiny2313) die Strombereitschaft "ablesen" kann oder wie das dort ÜBERHAUPT abläuft, da mir das nicht klar ist.

MfG Killer

SIGINT
26.09.2007, 17:11
Der Schaltplan sieht in der Tat sehr übersichtlich aus, aber die Hintergründe sind umso trickreicher. Der Aufbau ist nur ne Fingerübung... das kann jeder, der mit einem Lötkolben umgehen kann. Aber zur Firmware:
Auf der OBDEV-Seite gibt es einen Link "AVR-USB Projects". Wenn du da drauf klickst kommst du auf eine Seite mit Projekten, die den OBDEV-Treiber verwenden. (auf "All Projects" klicken!!) Hier kannst du aussuchen, welches Projekt am besten deinen Ansprüchen entspricht:
Möchtest du eine USB-Tastatur haben, einen USB<->RS232 Wandler, ein Gamepad oder ganz was eigenes (fällt in deinem Fall aber weg).
Wenn du z.B. AVR-CDC (ein Projekt) nutzt, dann wird der AVR als virtueller COM-Port im Rechner erkannt. Das bedeutet, daß dieser AVR (mit der OBDEV-Firmware) wie eine RS232 Schnittstelle arbeitet (mal abgesehen von den Pegeln. dafür benötigst du bei bedarf noch einen MAX232).
Wenn du aber das Projekt "C64 Keyboard" nutzt, dann wird der AVR als HID-Keyboard erkannt und du kannst an den AVR eine C64-Tastatur anschliessen. Schau dir die Projekte einfach alle an.
Wenn du es kannst, dann kannst du auch ein eigenes USB-Gerät programmieren, daß du dann mit einem speziellen Windoof-Treiber ansprechen musst... das ist aber nicht ganz einfach.

Kurz gesagt: Der AVR mit der OBDEV-Firmware dient im einfachsten Fall als einfacher Schnittstellenwandler. Es ist aber auch sehr viel mehr möglich. (der AVR-CDC hat einen Postscript-ähnlichen Interpreter eingebaut)

Gruß,
SIGINT

Killer
26.09.2007, 18:32
Die Projekte habe ich mir auch schonmal angeschaut, recht interessant!
Du meinst also die RS232 Schnittstelle zu verwenden wäre sinnvoller als USB? Wofür ich das genau will führe ich nochmal vor Augen: Ich möchte von AVR beliebige "einsen und nullen" zum PC senden, welche ich aber selber aussuche bzw. die Reihenfolge möchte ich selber auswählen. Das ganze auch andersrum also vom PC zum AVR. Ein Beispiel:
Vom PC kommt: "10" was heißen soll, er will was senden,
Vom AVRkommt: "10" was heißen soll dass er senden kann.
jetzt soll der PC von mir spezielle Dualzahlen zum AVR senden also beispielsweise "101100". Das ganze soll auch andersrum funktionieren. Ich hoffe es ist einigermaßen verständlich. Wenn ja, was ist dafür komfortabler USB oder RS232?

MfG Killer

SIGINT
26.09.2007, 19:31
Hmmm,
irgendwie kommen wir nicht auf einen grünen Zweig.
Also versuch ich es ander zu erklären. Es gibt mehrere Möglichkeiten der Kommunikation zwischen PC und AVR:

1) [ PC <-> COM-Port (RS232)] <->MAX232(Spannungs-Pegelwandler)<-> [USART (auch RS232) <-> AVR]

Der PC besitzt einen COM-Port mit dem er im RS232 Standard mit anderen Geräten kommunizieren kann. Diesen Port kannst du (über einen MAX232) direkt mit dem AVR verbinden. Die meisten AVRs besitzen einen sog. USART (das ist das Gegenstück zum COM-Port am PC) mit dem der AVR die Daten vom PC empfangen kann. Die Verbindung geht in beide Richtungen.

2) [PC<->USB-HOST] <-> [USB nach RS232 Wandler (FTDI oder AVR-CDC)<->virtueller COM-Port] <-> [USART<->AVR]

Der PC bestizt eine USB-Schnittstelle, die von einem sog. USB-Host Controller gesteuert wird. (nur zur Info... nicht weiter interesannt)
An der USB-Schnittstelle kannst du einen USB nach RS232 Wandler (z.B. einen FTDI-Chip) anschließen, der dann einen virtuellen COM-Port zur verfügung stellt. (Virtuell bedeutet, daß der COM-Port nicht physikalisch im PC ist) An diesem externen COM-Port kannst du nun wie bei der ersten Möglichkeit den AVR anschliessen.

3) [PC<->USB-Host]<->[GPIO<->AVR]
Diese Möglichkeit scheidet für dich aus, da du hierbei die OBDEV-Firmware ändern müsstest. Du kannst nämlich den AVR direkt, über die General Purpose IOs (also die normalen IO-Pins am AVR) an den USB-Bus hängen und die Software mit dem USB-Host reden lassen. Der Datenaustausch erfolgt dann über sog. Deskriptoren. Alle Projekte bei OBDEV nutzen diese Möglichkeit... einige bieten aber fertige Brücken zwischen USB und einer anderen Standardschnittstelle an (halt RS232 beim AVR-CDC).


Ich hoffe du konntest das jetzt etwas besser verstehen.

Gruß,
SIGINT

Killer
26.09.2007, 20:22
Also ich meine die Nummer 1 also Verbindung zwischen AVR und PC über RS232. Hardwaretechnisch dies aufzubauen ist ja kein Problem, da ich das schon öfters gemacht habe. Auch ausgaben auf dem Bildschirms des PC's.

Allgemeine Frage: Kann ich die Entsprechenden Ports (TXD und RXD) einfach auf 0 oder 1 schalten, sodass der PC eine Änderung "seiner" Pins abfragen kann? Also wie man diese Verbindung manuell befehligen kann, kann ich mir nicht vorstellen. Wie kann man sich das klar machen?

MfG Killer

NanoTomPI
27.09.2007, 16:50
Allgemeine Frage: Kann ich die Entsprechenden Ports (TXD und RXD) einfach auf 0 oder 1 schalten, sodass der PC eine Änderung "seiner" Pins abfragen kann?

Könnte man sicher, aber das wär' ehrlich gesagt ziemlich unsinnig. Dann könntest du auch jede andere IO-Leitung benutzen aber müsstest dich selber um die Synchronisation kümmern (damit meine ich: wenn zwei "Einsen" hintereinander kommen, woher weißt du, wann die erste zu Ende ist und die zweite anfängt?).

Am einfachsten wärs, wenn du immer komplette Bytes sendest/empfängst. Dafür ist RS232 ausgelegt und du kannst jedes Standardbeispiel dazu nutzen, ohne dich darum kümmern zu müssen, was auf der Leitung genau passiert.
(Notfalls kannst du ja deine Einsen und Nullen in je ein Byte packen, das verlangsamt die Übertragung dann aber logischerweise.)

Gruß,
Tom

Killer
27.09.2007, 17:13
Ich möchte nur leider genau wissen, was auf der Leitung genau passiert ;-)
Angenommen ich möchte ein Byte = "10000101" an den PC senden; wie geht das denn dann überhaupt? Und wie geht das andersherum also vom PC wieder zurück zum AVR?

Kann mir eventuell mal jemand einen Codefetzen posten, für die Übertragung des Bytes (s.o.) für den AVR? Wenn möglichen in BASCOM vielleicht verstehe ich es dann endlich mal :-)

MfG Killer

NanoTomPI
27.09.2007, 19:11
Ich möchte nur leider genau wissen, was auf der Leitung genau passiert ;-)

Du machst es einem (und auch dir) wirklich nicht leicht...

Ich verstehe nicht, inwiefern das für deine Fragestellung wirklich relevant ist, aber andererseits habe ich wohl dein Anliegen insgesamt noch nicht richtig verstanden (und ich befürchte, ich bin nicht der einzige...).

Zu wissen, was auf der Leitung passiert, schadet natürlich nicht, aber ich dachte, es geht dir in erster Linie darum, zwischen A und B (AVR und PC) Informationen zu übertragen. Wenn du das wirklich "zu Fuß" machen willst, dann musst du ein ganzes Stück tiefer ansetzen und dir erstmal Gedanken machen über Dinge wie Timing, Synchronisierung, Handshaking etc.
Warum es bei RS232 Start- und Stoppbit(s) gibt ist dir klar?



Kann mir eventuell mal jemand einen Codefetzen posten, für die Übertragung des Bytes (s.o.) für den AVR? Wenn möglichen in BASCOM vielleicht verstehe ich es dann endlich mal :-)

Mit BASCOM kann ich nicht dienen, aber wenn du in C den UART eines AVRs verwenden willst ohne das Rad neu zu erfinden, dann schnappst du dir 'ne passende Library, bindest die ein und nach der Initialisierung ist die Übertragung so einfach wie das hier:


uart_putc(0b10000101);
empfangenes_byte = uart_getc();

Gruß,
Tom

Killer
27.09.2007, 19:53
Ja, ich kann das schlecht beschreiben...
Meine Vorstellung: Der PC will zum AVR senden und sendet meinetwegen "10101010" als Anfrage. Sobald der AVR diese gleiche Dualzahl erwiedert soll der PC ein Byte zum AVR senden und der AVR soll dieses dann abfragen und in einer Variable zwischenspeichern. Das ist vorerst mein Hauptziel bzw. meine Vorstellung!
-----------------------------------------------------------------------
Ist das mit dem MAX232CPE realistisch diese Verbindung aufzubauen wie ich sie mir vorstelle?

MfG Killer

NanoTomPI
27.09.2007, 20:15
Das ist so möglich und auch üblich. Damit kannst du dann entweder direkt auf eine "echte" serielle Schnittstelle vom PC gehen oder über einen zusätzlichen USB-Adapter eben auf eine virtuelle (wie oben ja bereits erwähnt wurde).

Und wenn du dich nicht darauf versteifst, die Bits einzeln übertragen zu wollen, dann sind das auch nur ein paar Zeilen Programmcode... ;-)

Gruß,
Tom

Killer
29.09.2007, 16:12
Man überträgt ja für gewöhnlich Daten vom AVR zum PC beispielsweise in BASCOM wie folgt: "PRINT " blablabla" ". Lässt sich das auch anders niederschreiben wie eine Variable welche man dann sozusagen an den PC sendet? Und wie empfängt man? Vielleicht kann mal jemand zu diesen beiden Fragen ein Codebeispiel posten :-)

MfG Killer

NanoTomPI
30.09.2007, 14:07
Ich würde vorschlagen, du investierst noch ein wenig Zeit in die Einarbeitung in BASCOM. Dann dürften sich viele deiner jetzigen und noch kommenden Fragen von ganz alleine beantworten, ohne dass du auf Beispielcode angewiesen bist.

Die Mikrocontroller-Einführung von Roland Walter (eine mehrteilige Serie, es gibt auch ein ausführlicheres Buch) basiert beispielsweise auf BASCOM:
http://www.rowalt.de/mc/index.htm

Auf RN-Wissen gibt es eine Kategorie mit BASCOM-Beispielen (https://www.roboternetz.de/wissen/index.php/Kategorie:Quellcode_Bascom). Ein guter Einstiegsartikel wäre etwa der zu Variablen in BASCOM (https://www.roboternetz.de/wissen/index.php/Bascom_Variablen).

Und nicht zuletzt hat auch BASCOM selbst eine umfangreiche Onlinehilfe, wo du Erklärungen und Anwendungsbeispiele zu den von dir benötigten Befehlen findest (also PRINT und INPUT bzw. PRINTBIN und INPUTBIN):
http://avrhelp.mcselec.com/bascom-avr.html

Gruß,
Tom

Killer
30.09.2007, 18:35
Schlauer Rat!!
Ich hab jetzt mal eine Schaltung aufgebautwie in Wiki erklärt(AVR mit PC über RS232 verbunden).
Als Testprogramm:

$regfile "m32def.dat"
$crystal = 8000000
$baud 19200

do
PRINT "Test"
wait 1
loop
end


Auf den Bildschirm werden aber nur seltsame Zeichen ausgegeben, welche nicht wirklich an Buchstaben erinnern ;-)
Die einstellungen vom Terminalprogramm stimmen uch mit denen des Prozessors überein.
Kann es daran liegn, dass ich den interne Quarz verwende und keinen externen? Der iterne soll ja "störanfälliger" sein.

MfG Killer

uwed
30.09.2007, 19:17
ich sad jetzt auch mal was dazu, da dieses USB+Avr mir immer so ins Auge sticht.

1. Wie willst du deinem AVR im Ppogramm sagen, dass er 8 Megaherz machen soll . Über die Fuse kannst du ihm sagen wo er sie herbekommen soll
aber wie groß der dann wirklich ist hängt vom Quarz ab. und der Interne macht nun mal nur 1MHz 1. KO Fehler.

2. Wenn man im Forum nach "Problemen mit RS232" schaut kommt man zu 50% irgend wo raus wo mit dem internen Quarz eine Hohe butrate gefahren werden soll. es funktionieren aber nur max 1200 , besser ist es mit 300 die funktionieren auf jeden fall.

und nun noch ein nicht bös gemeinter Rat aber ich sags mal deutlich.
Mit so zähen Fragen zu einem " Simplen Thema" machst du dir nicht nbedingt Freunde, soweit ich das sagen darf.

Soweit ich das bisher gelesen hab würd ich sagen dir liegt was dran die Hintergründe zu verstehen. Nur ist Bascom dafür doch eigentlich das Falsche Mittel da man von der Arbeit des Controllers nichts mehr sieht.

Ich würde dir Raten mal ne Druckerpatrone zu kaufen :-) und den Uart Teil des datenblatts Ausdrucken, dazu noch alles was du an Tutorien hier und bei Mikrocontroller findest. und dich mal 2-3 Tage intensiev einließt inc. Bautratenberechnung. und wenns dann in Assembler klappt, dann hast dus auch verstanden und kannst es auf Bascom übertragen.

MFG
Uwe

python_rocks
01.10.2007, 14:23
$regfile "m32def.dat"
$crystal = 8000000
$baud 19200
Hallo Killer!

``$Baud = 19200``

Hast du wirklich einen 8Mhz-Quarz im Einsatz?

mfg
Gerold
:-)

Killer
02.10.2007, 17:13
Ja hatte ich. Hab es jetzt einmal mit dem internen also 1Mhz probiert und $Baud=2400 gewählt wo es zuverlässig funktioniert! Keine Ahnung wiso das bei 8Mhz nicht lief...

MfG Killer