Forum: Mikrocontroller und Digitale Elektronik Irmp + V-USB, geht nicht an jedem USB-Port


von Hugo P. (portisch)



Lesenswert?

Hallo!

Ich hoffe das mir noch jemand helfen kann!

Vorgeschichte:
ich habe das Irmp von Frank M. 
http://www.mikrocontroller.net/articles/IRMP
mit V-USB http://www.obdev.at/products/vusb/index.html kombiniert.

Sinn der Sache ist, dass empfangen Codes per USB an den Host übertragen 
werden.

Die Übertragung geht per Polling vom Host über HID Device:
http://msdn.microsoft.com/en-us/library/ms790913.aspx

Auf dem PC, wo ich es programiert und getestet hatte ging das Polling 
und empfangen von Codes einwandfrei.

Dann bin ich mit dem Empfänger zu einem anderen PC gegangen und siehe 
da, dass Init geht nicht. Dies hab ich behoben, das ich zuerst Timer0 
starte und nach ~4s der Timer1 gestartet wird, der die IR-Codes 
empfängt.

Dann geht das Init, jedoch gibt es weiterhin probleme mit dem Polling.

INT0: Wird für USB verwendet
INT1: Polling Timer für IR-Erkennung

Anbei habe ich einmal mit dem Oszi gemessen am D-:
(Die höheren Spannungen ist die Antwort vom AVR)

OK_Port: so schaut es an dem PC aus wo es keine Probleme gibt.
Reply_of_AVR: So schaut die Antwort des AVRs aus, jedoch nicht 4V wie im 
Bild sondern 3,6V (Z-Diode)
NOK_Port_1.gif: Wenn das Polling klappt sieht es so auf dem Port aus an 
dem es die Fehler gibt.
NOK_Port_No_Reply_of_AVR: hier sieht man, dass der AVR gar nicht 
antwortet
NOK_Port_No_Reply_of_AVR_2: hier nocheinmal
NOK_Port_No_Reply_of_AVR_3: und hier nocheinmal

Wie gesagt beim "guten" Port sieht es immer so aus wie bei OK_Port.gif. 
Bei Ports die Probleme machen so wie die anderen Gifs.

Getestet auf:
P35-DS4 Gigabyte, Win7 32: Alle Ports OK
MA785GM Gigabyte, Win7 32: Es gibt bei jedem Port gibt es Probleme, egal 
ob intern oder externe Ports.
X40-Laptop+Dockingstation, WinXP SP3: Ports am Laptop gehen, Ports auf 
der Dockingstation gehen nicht.

Gerade wegen dem x40-Laptop tippe ich auf vielleicht ein 
Spannungsproblem von D+ oder D-. Es scheint ja USB-Chips geben die sehr 
empfindlich sind.

Mein Atmega8-16 läuft leider nur mit min. 4.5V. Eine Alternative wäre 
der Atmega8-8. Der läuft auch mit 3.3V, jedoch weis ich nicht ob ich den 
auch mit 12Mhz betreiben kann. Das Datenblatt sagt 8MHz.

Auch habe ich den Atmega Source hier einmal drangehängt. Die Software 
vom Host kann ich auch noch zur Verfügung stellen. Der Source ist nicht 
ganz sauber, da ich schon viel herum probiert habe...

Ich hoffe, dass mir jemand noch den Entscheidenen Tipp geben kann, damit 
das endlich auf alle USB-Ports funktioniert.

Danke!

: Verschoben durch User
von Simon K. (simon) Benutzerseite


Lesenswert?

Tu dir doch einen Gefallen und nehme einen Prozessor mit on-board USB 
Unterstützung. HID über dieses V-USB hat bei mir überhaupt nicht 
funktioniert. Auf Mailanfrage hieß es dann, dass das wohl nicht 
zuverlässig funktioniert, da HID mindestens Full Speed Usb braucht 
(12MBit/s), aber der AVR nur dieses ganz langsame USB unterstützt.

von Hugo P. (portisch)


Lesenswert?

Danke für die Info!

Hast auch einen Tipp welcher AVR hier in Frage kommen würde?

Brauche einen Timer für 100µs Polling und einen Ausgangsport um einen 
Optokopler schalten zu können.

6 Bytes vom AVR lesen, 6 Bytes zum AVR schreiben.

Zusätzlich: Ich habe gesehen, dass ich den Thread im falschen Bereich 
des Forums geposted habe. Bitte in den richtigen verschieben. Danke!

von ... .. (docean) Benutzerseite


Lesenswert?

ft232+atmegawasweissich... und fertig...

von ir (Gast)


Lesenswert?

... ... schrieb:
> Tu dir doch einen Gefallen und nehme einen Prozessor mit on-board USB
> Unterstützung. HID über dieses V-USB hat bei mir überhaupt nicht
> funktioniert. Auf Mailanfrage hieß es dann, dass das wohl nicht
> zuverlässig funktioniert, da HID mindestens Full Speed Usb braucht
> (12MBit/s), aber der AVR nur dieses ganz langsame USB unterstützt.

Bei mir hat das alles wunderbar funktioniert und ist seit über inem Jahr 
im Einsatz.

Beitrag "Re: RC5, RC6 AVR/PIC Receiver mit USB"

von Hugo P. (portisch)


Lesenswert?

Ja, aber ich will die empfangen IR-Codes plain zum Host schicken und 
nicht im AVR entscheiden, welche Funktion bei welchen Code ausgeführt 
werden soll.

Ach, der AVR sollte auch DIL sein - wird ja ein Lochraster Aufbau...

von ir (Gast)


Lesenswert?

Hugo Portisch schrieb:
> Ja, aber ich will die empfangen IR-Codes plain zum Host schicken und
> nicht im AVR entscheiden, welche Funktion bei welchen Code ausgeführt
> werden soll.

Wo ist da jetzt das Problem. Das sind ein paar Zeilen Code geändert.

von kruemeltee (Gast)


Lesenswert?

>Ach, der AVR sollte auch DIL sein - wird ja ein Lochraster Aufbau...

Soweit ich weiss gibt es keine AVRs mit USB in DIL/DIP.

Aber schau dir mal die AT90USB... an, vorallem das AT90USBKEY-Board. ca 
2x5cm, AT90USB1287 drauf (entspricht in etwa einem mega128).

Alle I/Os sind auf Pinleisten rausgeführt.

von Michael M. (Gast)


Lesenswert?

ATmega#U#

von Hugo P. (portisch)


Lesenswert?

@IR

Ich will aber keine Tastendrücke schicken, sondern den nativen IR-Code.
So wie du es gemacht hattest, wurden ja Tastendrücke geschickt.
Mit einer Host Software kann ich die native IR-Codes dann auswerten und 
je nach Anwendung in Tastendrücke oder sonstige Steuerung umwandeln.

Hatte es am Anfang auch mit usbSetInterrupt versucht. Bin aber zu keinem 
Erfolg gekommen. Da ich nun einige Zeit mit dem V-USB gearbeitet habe 
werde ich es aber nocheinmal über usbSetInterrupt versuchen.
Das würde mir sowieso um Welten besser gefallen als über Polling. Es 
könnte dann auch das Problem lösen.

von Michael M. (Gast)


Lesenswert?

nativer ir code über usb???
und das mit dem irmp???

sry, aber das konzept taugt hinten und vorne nix

von Micha (Gast)


Lesenswert?

@ Hugo
Was willst du denn im Endeffekt erreichen? Ein Programm über FB steuern? 
Wenn ja: welches?

von Sebastian___ (Gast)


Lesenswert?

also USB HIDs laufen Millionenfach als Low Speed Devices wie es auch 
V-USB macht.
Das ist in dem Fall nur ein Problem mit der Pegelanpassung 5V <-> 3.3V.
Und ein HID ist wenn man wenig Daten übertragen möchte die beste USB 
Lösung, da man auf allen Betriebssystem keine weiteren Treiber benötigt.

von Micha (Gast)


Lesenswert?

Ah - hab's grad im anderen Thread gelesen: DVBViewer steuern.

Lässt der sich nicht über einzelne Tasten der Tastatur steuern? Falls ja 
könntest du doch eine Tastatur "emulieren". Vielleicht würde das deine 
Probleme lösen, wäre einfacher und schneller in der Ausführung von/ 
Reaktion auf Tastendrücke und du bräuchtest kein zusätzliches Plugin.

von markusj (Gast)


Lesenswert?

Kommst du dir nicht vielleicht mit einem Interrupt in die Quere?
Du musst garantieren, dass der USB-Interrupt (abhängig von deiner 
Taktfrequenz) innerhalb eines spezifizierten Zeitrahmens von ca. 10 
Takten (Details siehe Doku/Headerfile) ausgeführt werden kann.
Dass schließt die Verwendung eigener Interrupts fast vollständig aus, 
einzige Ausnahme: Unterbrechbare Interrupts, die aber etwas 
komplizierter sind ...

mfG
Markus

von Hugo P. (portisch)


Lesenswert?

Micha schrieb:
> Ah - hab's grad im anderen Thread gelesen: DVBViewer steuern.
>
> Lässt der sich nicht über einzelne Tasten der Tastatur steuern? Falls ja
> könntest du doch eine Tastatur "emulieren". Vielleicht würde das deine
> Probleme lösen, wäre einfacher und schneller in der Ausführung von/
> Reaktion auf Tastendrücke und du bräuchtest kein zusätzliches Plugin.

Darin liegt wieder das nächste Problem. Dafür muss DVBViewer im 
Vordergrund (aktiv) sein. Wenn ein anderes Fenster im Vordergrund ist 
bekommt das die Befehle.

markusj schrieb:
> Kommst du dir nicht vielleicht mit einem Interrupt in die Quere?
> Du musst garantieren, dass der USB-Interrupt (abhängig von deiner
> Taktfrequenz) innerhalb eines spezifizierten Zeitrahmens von ca. 10
> Takten (Details siehe Doku/Headerfile) ausgeführt werden kann.
> Dass schließt die Verwendung eigener Interrupts fast vollständig aus,
> einzige Ausnahme: Unterbrechbare Interrupts, die aber etwas
> komplizierter sind ...
>
> mfG
> Markus

Das erklärt mir leider aber nicht warum es bei einm USB-Port ohne 
Probleme geht - bei einem anderen Port am gleichem PC aber nicht...
Wenn das nicht wäre, wäre schon alles fertig... :(



Sebastian___ schrieb:
> also USB HIDs laufen Millionenfach als Low Speed Devices wie es auch
> V-USB macht.
> Das ist in dem Fall nur ein Problem mit der Pegelanpassung 5V <-> 3.3V.
> Und ein HID ist wenn man wenig Daten übertragen möchte die beste USB
> Lösung, da man auf allen Betriebssystem keine weiteren Treiber benötigt.

Also vielleicht doch einfach einmal mit dem ATmega8-8 Probieren? Diesen 
dann mit 12MHz & 3.3V betreiben?

Zu HID: genau das ist mein Ziel. Kleine Daten und vor allem kein extra 
Treiber!

von Michael M. (Gast)


Lesenswert?

markusj schrieb:
> Kommst du dir nicht vielleicht mit einem Interrupt in die Quere?
genau das isses. hab ich auch schon (in nem andren thread) angesprochen.
stieß auf taube ohren...

von Michael M. (Gast)


Lesenswert?

Hugo Portisch schrieb:
> Darin liegt wieder das nächste Problem. Dafür muss DVBViewer im
> Vordergrund (aktiv) sein. Wenn ein anderes Fenster im Vordergrund ist
> bekommt das die Befehle.
dann ist dein empfangendes programm schlecht geschrieben.
man kann auch tastaturbefehle an einen task schicken, der nicht im fokus 
ist.
vielleicht passt dir ja miriam von sixdots besser - das kann das auch.

> Das erklärt mir leider aber nicht warum es bei einm USB-Port ohne
> Probleme geht - bei einem anderen Port am gleichem PC aber nicht...
höchstwahrscheinlich ist eine hardware toleranter, was das timing angeht 
und verzeiht dir die verzögerung.

> Wenn das nicht wäre, wäre schon alles fertig... :(
aber murksig fertig. sorry =)

> Also vielleicht doch einfach einmal mit dem ATmega8-8 Probieren? Diesen
> dann mit 12MHz & 3.3V betreiben?
läuft denn dein controller momentan nur mit 5V und kommen diese pegel 
an die usb-seite? das wäre ungünstig!
und was genau soll der atmega8-8 sein? meinst du die "usb vriante"?
ATmega8U2?

von Micha (Gast)


Lesenswert?

Michael M. schrieb:
>> Darin liegt wieder das nächste Problem. Dafür muss DVBViewer im
>> Vordergrund (aktiv) sein. Wenn ein anderes Fenster im Vordergrund ist
>> bekommt das die Befehle.
> dann ist dein empfangendes programm schlecht geschrieben.
Das würd ich auch sagen. Macht ja aber auch wenig Sinn ein Programm zu 
steuern, das im Hintergrund läuft und dessen Fenster man am besten gar 
nicht sieht.

Kannst du nicht einstellen, dass DVBViewer immer im Vordergrund bleibt? 
Bei MediaPortal geht das.

von Michael M. (Gast)


Lesenswert?

Micha schrieb:
> Michael M. schrieb:
>>> Darin liegt wieder das nächste Problem. Dafür muss DVBViewer im
>>> Vordergrund (aktiv) sein. Wenn ein anderes Fenster im Vordergrund ist
>>> bekommt das die Befehle.
>> dann ist dein empfangendes programm schlecht geschrieben.
> Das würd ich auch sagen. Macht ja aber auch wenig Sinn ein Programm zu
> steuern, das im Hintergrund läuft und dessen Fenster man am besten gar
> nicht sieht.
ist bei mir und meiner tv karte oft der fall.
z.b., wenn per IM eine nachricht reinkommt, oder grad das video-text 
fenster offen ist und ich trotzdem programm wechseln will, weil ich zu 
faul bin, den epg zu starten =)

von Micha (Gast)


Lesenswert?

Naja bei mir ist der HTPC halt nur zu diesem Zweck da. Ohne Onlinezugang 
und nur mit den wirklich nötigen Programmen für diese Aufgabe.

von Hugo P. (portisch)


Lesenswert?

@Michael M.

Im Datenblatt vom Atmega8 steht:
2.7 - 5.5V: ATmega8L-8*
4.5 - 5.5V: ATmega8-16*

Ich habe halt den ATmega8-16*

Habe es jetzt noch mit Interrupt (usbSetInterrupt) probiert.
Es kommen auch die Daten per Interrupt am Host an, jedoch geht das noch 
schlechter als über Polling.

Das mit dem Interrupt/Timing Problem im AVR durch den Polling Timer habe 
ich schon verstanden!

Das erklärt mir trotzdem nicht warum es an manchen Ports ohne Probleme 
geht, an anderen aber nicht!

Werde mir das AT90USBKEY Eval Board mal ansehen.

von Christian R. (supachris)


Lesenswert?

Das Problem mit dem Focus bei der DVB Viewer Steuerung kann man umgehen, 
indem man Girder oder EventGhost benutzt. Die schicken die Befehle über 
das COM-Interface zum Viewer. Da landen sie dann garantiert dort und nur 
dort. Egal, ob der im Hintergrund, im Vordergrund, minimiert oder 
sonstwas ist.
Ich hab das auch so mit dem DVB Viewer, aber um dem Gefrickel mit V-USB 
usw. aus dem Weg zu gehen per FT232R, und ein MSP430 dekodiert die RC5 
Befehle incl. ordentlicher Toggle-Bit Behandlung und sendet die dann in 
einem 6-Byte Paket zum EventGhost. Der Treiber für den FT232R wird über 
Windows Update in Vista und 7 mitgeliefert.

von Michael M. (Gast)


Lesenswert?

sag mal... gehst du jetzt mit 5V pegel in die usb-schnittstelle oder 
nicht?

das wurdest du jetzt btw zum dritten mal gefragt.

von Hugo P. (portisch)


Lesenswert?

Nei, ich gehe nicht mit dem 5V Pegel zu D+/D-.
Der AVR natürlich schon, aber ich habe die 3,6V Z-Dioden drinnen. Der 
Pulldown auf D- ist auch drinnen.

von seit_z80 (Gast)


Lesenswert?

Ich hatte mal bei einem USB IR-Empfänger mit 2313 genau das gleiche 
Problem, dass es an manchen Geräten/Boards lief und an anderen nicht. 
Ursache war ganz klar die Intoleranz der USB Schnittstellen in Bezug auf 
die Spannung.
Nachdem ich verschiedene 3,6V Zenerdioden ausprobiert und ausgemessen 
habe, lief es dann problemlos.
Habe seit ca. 6 Monaten einen Tiny45 mit V-USB zur Heizungssteuerung im 
Einsatz und läuft selbst mit internem Oszillator ohne Probleme. Einmal 
pro Minute wird die Temperatur von 2 DS18s20 ausgelesen und wenn 
notwendig ein Low oder High an den 45er geschickt.
Lasst doch bitte mal die Polemik mit internem USB (Stack) etc. - Wir 
basteln und da ist SMD nach wie vor eine (noch) vermeidbare 
Herausforderung.

Beitrag "USB Temperatursensor: USBTemp"

VG, seit_z80

von ir (Gast)


Lesenswert?

seit_z80 schrieb:
> Der AVR natürlich schon, aber ich habe die 3,6V Z-Dioden drinnen. Der
> Pulldown auf D- ist auch drinnen.

Laut Spezifikation muss D+/D- zwischen 2,7 und 3,6V sein. Probier 
einfach mal eine 3,3V-Z-Diode anstatt am oberen Limit zu arbeiten.

von Hugo P. (portisch)


Lesenswert?

Hi,

ich habe hierzu ein Update.

Nachdem ich nun für die Delphi Host-Software die HID-Komponente von 
JVCL.
Geht es eigentlich fast ohne Probleme.

Werde den Code noch zusammenräumen und dann das Projekt mit einer Demo 
Host Software zur Verfügung stellen.

Vielen Dank für die Hilfe von allen!

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.