Software USB mit AVR

Gast #320427
Lesenswert?

Hi,
ich will einem Atmega8 eine USB-Schnittstelle verpassen.
Aus "Geiz ist Geeiiill" gründen soll das natürlich die Softwarelößung
von "IGOR..." sein.
So nun läuft ja der Usb-Bus an sich ja auf 3,3V und mein AVR auf 5V.

Ich habe noch nirgends eine Lösung für dieses Problem gefunden(liegt
nicht daran das ich nicht danach gesucht habe;-).
Endweder mit mosfets so wie man es beim I2C Bus machen kann, oder
Z-Diode oder Einfach nur ein Widerstand rein?

Kann mir jeamdn weiterhelfen wie man das "Level shiftet" ? ;-)

Mfg
Ulrich

Grund der völligen Verwirrung:
http://www.harbaum.org/till/lcd2usb/
(Da geht der Pull-Up aufs gleiche Level wie VBus)
Gast #320428
Lesenswert?

Hi,

ich würde dir empfehlen, den AVR gleich an 3.3V laufen zu lassen. Der
sollte da keine Probleme damit haben und du kannst ihn dann auch gleich
aus dem USB versorgen (Vorsicht mit 5V, der kann bis etwa 4.2V
runterfallen!). Ausser natürlich, du hast noch andere Bauteile, die
unbedingt 5V(-Pegel) benötigen...
Gast #320430
Lesenswert?

Ich lasse alles mit 5V aus der USB-Versorgung laufen und siehe da: es
klappt, der PC ist nicht explodiert und der USB-Port wird nicht
abgeschaltet. Noch nicht einmal den Pullup-Widerstand musste ich
angleichen.

viele grüße
ralph
Gast #320432
Lesenswert?

Software-USB mit AVR hat immer irgend einen Hacken. Entweder, das
Dingens läuft mit 5V und schiebt daher auch 5V-Pegel an den Host, oder
der AVR wird hart an seiner Taktgrenze betrieben. Der Clock ist ja
festgelegt auf 12MHz. Es gibt diverse Schaltpläne, wo das Teil dann mit
3.5V betrieben wird. Wenn Du probeweise die Spannung weiter (ein wenig,
z.B. auf 3.3V) reduzierts, nippelt Dir das Teil ab.
Folgerung: Die Lösung ist nicht consumer-tauglich, da zu viele
unterschiedliche Geräte als Host denkbar sind, oder Serienstreuung
einen Strich durch die Rechnung macht.
Für den Privatgebrauch z.B. als Programmer oder so ist's vorzüglich
geeignet und funktioniert als einzeln erstelltes Gerät regelmäßig, bei
mir eben auch.
Der OP sucht aber wohl einen billigen Weg zum Serienprodukt, oder
Ulrich?
Gast #320434
Lesenswert?

Das musste ja kommen ;-)
Die USB-Versorgung ist ziemlich variabel und schlabberig, ich glaube
4.4V - irgendwas, um grosse Leitungslängen abdecken zu können. Die
Signalpegel sind aber sehr wohl auf 3.3V spezifiziert. Ein sauber
designtes USB-Gerät hat also irgendwo (und wenn's nur für die
Kommunikation ist) eine 3.3V Stabilisierung.
Gast #320435
Lesenswert?

Ich will nicht den Atmega8 bei 3,3V betreiben noch sontige basteleien
machen. Ich brauche nur eine möglichkeit die Pegelsoweit anzupassen das
ich sicherstellen kann, das mir nix auf dem Mainboard beim einstecken
abraucht...kann doch nicht sein das es da nix gibt?

Ich habe von "Analoger Elektroik" wenig Ahnung bzw. genauer gesagt
nicht viel Erfahrung.
Rein intuitiv stelle ich mir folgende Lösungselemente vor:
Zwischen GND und D+,D- Eine Z-Diode damit die Spannung nicht höher als
3,3V kommt.

Ich habe bisher noch recht wenig im Code von den Software-USB Lösungen
gelesen. Vielleicht ist es möglich für jede Datenleitung einen Ein und
Ausgang zu verwenden. Für die Eingänge müsste ich dann weiter nichts
mehr machen und für die Ausgänge könnte man Einfach noch einen
Widerstand in Reihe schalten.
Der Widerstand würde die Spannung begrenzen und die Z-Diode dann die
Spannung.

Oder soll ich den Levelshifter per Mosfet machen? Genau so wie sie in
der Elektor mal vor ein paar Monaten gepostet wurde?


Bezüglich kosten:
Wenn möglich würde ich es schon so günstig wie möglich lösen da es
eventuel eine Platine für andere Private User geben soll. Und die
freuen sich ja auch wenn das alles günstiger wird. Bedingung ist
natürlich immer das es funktioniert....

Mfg
Ulrich
Gast #320436
Lesenswert?

Eventuell geht ja sowas.

Den Ausgangspin auf LOW bzw. internen PULL-UP aus.
Den Ausgang über einen 3.3V pull-UP durch umschalten des DDR
realisieren.

=> DDR = 0 -> Hochohmig -> 3.3V über PULL-UP
   DDR = 1 -> Ausgang Low
Gast #320437
Lesenswert?

Hallo allerseits,

leider kenn ich mich damit nicht so gut aus und deshalb ist mein Post
auch eher als Frage zu verstehen ;o)

Kann man für diese Zwecke nicht einen Optokoppler verwenden?

Was ich weiß, sind die ca. 5V wegen der Kabellänge.

mfG Markus
Gast #320438
Lesenswert?

Es ist zwar schon etwas her, daß ich mich umgesehen habe, aber das
Problem ist wohl, zummindest für die Datenraten von USB 2.0 ausreichend
schnelle (und dabei erschwingliche!) Optokoppler zu finden ...
Gast #320440
Lesenswert?

Achja, da war ja noch was ... sorry, an das hab ich nicht gedacht.

Was USB 2.0 angeht, das ist sowieso ein Problem, oder? Wenn das per
Software gelöst werden soll, muss der uC erst mal die Daten so schnell
herbringen. USB 2.0 hat eine Theoretische Geschwindigkeit von
480Mbit/s, was ich weiß. Kommt da ein uC mit?

Für USB 1.1 sollte es kein Problem sein, denke ich. Das sind nur
12Mbit/s.

(Bin mir nicht ganz sicher ob das stimmt ;o)
Gast #320442
Lesenswert?

>Was USB 2.0 angeht, das ist sowieso ein Problem, oder? Wenn das per
Software gelöst werden soll, muss der uC erst mal die Daten so schnell
herbringen. USB 2.0 hat eine Theoretische Geschwindigkeit von
480Mbit/s, was ich weiß. Kommt da ein uC mit?

Klar, aber nur einer, der darauf ausgelegt ist...Ein AVR wird da schon
ganz schön ins Schwitzen kommen...

Wenn man Angst hat, irgendwas auf dem Mainboard zu zerschiessen, sollte
man überlegen, ob man nicht einfach einen USB-HUB zwischen Zielschaltung
und PC zu hängen.
Das erfordert aber, dass die Zielschaltung sich schon am HUB anmelden
kann...
Ansonsten sollten die Bausteine auf dem Mainboard sich um Überspannung
(also Spannungen >3,3V) mit Hilfe von (Klemm-)Dioden kümmern.
Weiterhin ist der USB auch ein Bus auf Basis differentieller
Signalübertragung;  es interessiert eigentlich nur welche Leitung
positiver ist...
Gast #320443
Lesenswert?

>es interessiert eigentlich nur welche Leitung positiver ist...

kannst das vielleicht ein wenig verdeutlichen? ich find das thema sehr
interessant, leider kenn ich mich nicht wirklich gut aus mit
bussystemen und dgl
Gast #320444
Lesenswert?

differentielle Schnittstellen (RS422, RS485 oder auch CAN-Transceiver)
arbeiten nach dem Prinzip, dass das Signal der einen Leitung vom Signal
der andere subtrahiert wird. So kann man Störungen eleminieren, die auf
beide Leitungen gleichzeitig wirken.
Wenn jetzt bspw. die Spannung zwischen USB+ und USB- > 0 ist liegt eine
logische 1 vor. Ist sie <0 liegt eine logische 0 vor.
Im Regelfall hat man auch noch eine Hysterese zwischen beiden
Zuständen. Bei RS485 sind das etwa 0,2V.
Die USB-Specs konnte man mal kostenlos herunterladen...
Gast #320445
Lesenswert?

So nach dem (entgegen meiner Erwartungen) keinerlei Schaltungsvorschläge
kamen, habe ich mal kurz selbst meine Überlegungen zusammengekrizelt.

Würde das so gehen?

An den Stellen "Hier muss noch was rein" denke ich an einen
Widerstand mit eventuell ca. 85 Ohm.

Oder ich probiere mal eine mosfetLösung falls dies besser sein
sollte...






Noch eine kleine aber in meinen augen wichtige Ergänzung bezüglich
differenziellen Übertragungen:
Die 2 Leitungen auf denen die differenzielle Signale Übertragen werden
sind eigentlich immer miteinander verdrillt. Der Sinn ist, dass
mögliche "Störungen" welche auf die Leitungen einwirken, beide
leitungen so gleich wie möglich erwischt. So werden die Pegel auf
beiden Leitungen gleich verändert, aber die Differenz beider Pegel
bleibt noch gleich!!! Das ist der Trick.

Wenn man das nun nicht weiß kann folgendes vorkommen:(Selbst
gesehen...)
Man macht Netzwerkstecker und denkt sich, ist doch völlig wurscht die
Belegung...ist sie aber nicht weil es auch hier eine differenzielle
Übertragung gibt. Deswegen müssen immer 2 >>>miteinander<<<< verdrillte
Leitungen ein Signal übertragen....
Angehängte Dateien:
Gast #320448
Lesenswert?

Dass ein Netzwerkkabel, das nach der "ist-doch-wurscht-Methode" nicht
funktioniert, hab ich auch schon bemerkt ;o)

Allerdings hat das mit den verdrillten Leitungen beim LAN noch einen
anderen Sinn (aus elektrotechnischer Sicht).
Durch das Verdrillen der Leitungen (immer + und GND) wirkt die
GND-Leitung auch als Schirm, da eventuelle Störungen sofort auf Masse
abgeleitet werden. Was ich weiß, kommt es auf die Länge an, die
benötigt wird, um eine komplette Verdrillung durchzuführen. Je
"besser" das Kabel (CAT5, CAT6) desto enger ist die Verdrillung (hat
irgendwas mit der Frequenz zu tun.

Ich bin mir nicht ganz sicher ob das so richtig ist (ist doch schon ein
Weilchen her, dass ich das gelernt hab), aber ich glaube mich daran zu
erinnern. Sorry, elektronik ist auch nicht so direkt mein Fachgebiet,
aber doch sehr interessant ;o) also verbessert mich bitte, wenn ich was
falsches schreib.
Gast #320449
Lesenswert?

>Allerdings hat das mit den verdrillten Leitungen beim LAN noch einen
>anderen Sinn (aus elektrotechnischer Sicht).
>Durch das Verdrillen der Leitungen (immer + und GND) wirkt die
>GND-Leitung auch als Schirm, da eventuelle Störungen sofort auf Masse
>abgeleitet werden. Was ich weiß, kommt es auf die Länge an, die
>benötigt wird, um eine komplette Verdrillung durchzuführen. Je
>"besser" das Kabel (CAT5, CAT6) desto enger ist die Verdrillung
(hat
>irgendwas mit der Frequenz zu tun.

Nö, danaben!
Die Leitungen von Netzwerkstrippen sind verdrillt, um möglichst wenig
Angriffsfläche für Störungen zu bieten.
Es handelt sich bei den Leitungen auch nicht (ausser bei
Power-over-LAN) um + und GND, sondern um differentielle
Signalleitungen.
Gast #320450
Lesenswert?

Moin,

es gibt auch noch eine andere SW USB-Implementierung für den AVR:
http://www.obdev.at/products/avrusb/index.html

Auf der Homepage sind einige Beispielprojekte mit den zugehörigen
Schaltplänen enthalten (unter 'Reference Implementations'), leider
gibt es hier auch keine einheitliche Anbindung an den USB. Der
offizielle Weg ist, einen AVR bei 3,3V und 12MHz zu betreiben, was
ausserhalb der AVR-Spec liegt (abhängig vom eingesetzten AVR).

Ich glaube, die einzig saubere Lösung wäre in diesem Fall ein
Levelshifter-IC zwischen AVR und USB zu verbauen....
Gast #320452
Lesenswert?

@Ulrich
Ich habe nur gemessen, ob an den USB-Buchsen 5 Volt anliegen. Das war
so. Die Stromaufnahme der Schaltung mit dem RS2323 Wandler mit dran
beträgt 110 mA. Das habe ich sowohl gemessen als auch im Gerätemanager
gesehen. Dort kriege ich auch angezeigt, was ein USB-
Gerät am Anschluß für einen Strom aufnimmt. Er stimmt mit meiner
Messung überein. An den Datenleitungen stehen 3,2 Volt gegen Masse.
(Wenn ich nicht auf das Gerät zugreife´).
Bei Zugriff ist die Amplitude dort 3 Volt (Ziemlich windschiefe
Rechteckimpulse.). Aber es funftioniert.

MfG Paul
Gast #320454
Lesenswert?

@Paul
THX für deine Mühen

Ich habe mich heute mal mit dem Oszi zwischen Host und USB-Stick
gehängt. Entgegen meiner Erwartungen fand ich dort keine schöne
Rechteksignale welche brav zwischen GND und 3,3V schwanken sondern
musste das Oszi auf 10ns 50mV/Division stellen damit ich etwas welliges
überhaupt zu gesicht bekommen habe. Die sichtbare Amplitude war trotzdem
noch recht klein. Also wenn das bei allen Geräten so ist,dann kriege ich
das nicht so fein hin.
Ich teste morgen aber noch weitere USB-Hubs mit unerschiedlichen
Endgeräten um zu sehen ob das wiklrich so ein "minisignal" ist oder
ob sich dr Hersteller des USB-Stick sich nicht so an die
Spezifikationen hält. Wenn ich das Triggerlevel auf ca. 2V eingestellt
habe,hat er kein einziges mal getriggert........ grbel
Gast #320455
Lesenswert?

Ich bin kein Experte für USB. Aber der Clou ist dabei, daß der
Datenstrom aus dem Differenzsignal der beiden DATA -Leitungen gewonnen
wird.
Die Amplitude habe ich nicht gegen Masse sondern zwischen den beiden
DATA Leitungen gemessen. Entschuldige das Mist-verständnis.
:-)
MfG Paul
Gast #320457
Lesenswert?

So nach dem ich nochmal das Oszi drangehängt habe, habe ich bemerkt das
es wohl gestern ein Problem miut der Masseverbindung gab.
Das angehängte Bild hat mir bewiesen das wenigstens "gescheite Pegel"
vorhanden sind.

Die Idee mit der 303V Z-Diode finde ich inzwischen doof, da sie dafür
sorgen würde das eventuell der Pin vom Atmega8 kaputteht.....

Interessant wäre noch wieviel Spannung an den 2 in Reihe geschaltenen
Widerständen mit oft 68 oder 100
Ohm abfallen. Ich traue der Sache noch nicht so ganz das das dem
USB-Host nichts ausmacht wenn die Leitung auf 5V gezogen wird....
Angehängte Dateien:
Gast #320458
Lesenswert?

@Ulrich
Es passiert nichts. Ich habe hier sowohl diesen Wandler (siehe oben)
als auch noch einen Infrarotempfänger, (nach Igorplug gebaut),dessen
Schaltung von USB-Schnittstelle genau so aussieht.

Ich rate Dir nichts, was Deine Kiste kaputt machen würde.
Wie sagte schon Pittiplatsch, der liebe: Kannstè glauben. :-))
MfG Paul

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren