Forum: Mikrocontroller und Digitale Elektronik VUSB - Device wird nicht erkannt.


von Birgit P. (bpie)


Lesenswert?

Hallo an alle.

Ich verwende den VUSB-Treiber um einen Encoder als Tastatur zu emulieren 
und diesen an einem PC als Pfeil-runter und Pfeil-rauf Taste nutzen zu 
können.
Ansich funktioniert das auch.
Mein Problem ist aber, dass das Teil nicht vom PC erkannt wird, wenn es 
am PC angeschlosen ist, wenn dieser Hochfährt. Nehme ich ihn dann wieder 
ab und stecke ihn neu ein, läuft wieder alles.

Ich habe leider noch nix gefunden, was mir bei dem Problem helfen 
kann...
Hat jemand eine Idee woran das liegen kann? Bzw. was ich dagegen machen 
kann?
Ich habe hier Windows XP an meinem Testrechner. Bei Windows7 soll es 
auch auftreten.

Gruß und schon mal danke fürs drüber nachdenken. ;-)

bpie

von Studentle (Gast)


Lesenswert?

Zeig mal deine Hardwareumsetzung,

schon alleine dort gibt es viele Möglichkeiten.

z.B. gesammte Schaltung auf 3,3V oder auf 5V und dann die D+ und D- mit 
Z-Dioden auf 3,3V gebracht?

von Birgit P. (bpie)


Angehängte Dateien:

Lesenswert?

Gern.
Der Schaltplan ist in der PNG-Datei zu sehen.

von Studentle (Gast)


Lesenswert?

Versuch mal die Z-Dioden auf 3,6V zu erhöhen. habe auch schon 
Schaltungen mit 3,9V gesehen bei gleichen Widerstandswerten (R4, R5).

z.B. http://www.ulrichradig.de/home/index.php/avr/usb-avr-prog

von Stephan B. (matrixstorm)


Lesenswert?

Hi

Studentle schrieb:
> Versuch mal die Z-Dioden auf 3,6V zu erhöhen.

Bei der Gelegenheit sollte auch der USB-Shield auf GND "gebandpasst" 
werden.
1MOhm und 4.7nF sind wohl dafuer empfohlen.

Ist zwar fuer XMega Serie - aber man kann bestimmt etwas daraus 
verwenden: http://www.atmel.com/Images/doc8388.pdf

MfG

von Hans J. (step_up_mosfet)


Lesenswert?

Du könntest deine Versorgungsspannung auch auf 3.3V reduzieren, dann 
benötigst du keine Z-Dioden mehr und R9 darf dann nur noch 1k Ohm groß 
sein.

von Stephan B. (matrixstorm)


Lesenswert?

Zusaetzliche Anmerkung:

Wenn Hardwareanmerkungen bisher nichts bringen, koenntest du vielleicht 
fuer uns einmal kurz Linux (Knoppix?) per LIVE-CD auf dem betreffenden 
Rechner booten?
Dann den Stick reinstecken und uns das Log posten?

MfG

: Bearbeitet durch User
von Teo D. (teoderix)


Lesenswert?

Mal ne Frage von nem USB-Unwissenden.
Sollten die Z-Dioden nicht hinter R4/5 liegen?

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Birgit Pie schrieb:
> Mein Problem ist aber, dass das Teil nicht vom PC erkannt wird, wenn es
> am PC angeschlosen ist, wenn dieser Hochfährt. Nehme ich ihn dann wieder
> ab und stecke ihn neu ein, läuft wieder alles.

Hast du mal ausprobiert, nur den ATtiny45 anzuschließen und alle 
anderen USB-Geräte abzustöpseln? Manchmal behindern die sich 
gegenseitig.

von Stephan B. (matrixstorm)


Lesenswert?

Hi

Teo Derix schrieb:
> Mal ne Frage von nem USB-Unwissenden.
> Sollten die Z-Dioden nicht hinter R4/5 liegen?

Nein - denn die Dioden sollen das 5V Potential aus dem Mikrocontroller 
auf 3.3V reduzieren. Ohne Widerstand wuerden da theoretisch "unendliche" 
Stroeme fliessen - praktisch geht vermutlich der PIN am AVR kaputt.

Vom USB her kommen bereits 3.3V Kommunikationsspannung, welche durch die 
hohe Eingangstoleranz im AVR als korrekte Logikpegel erkannt werden.

MfG

: Bearbeitet durch User
von Hans J. (step_up_mosfet)


Lesenswert?

Teo Derix schrieb:
> Sollten die Z-Dioden nicht hinter R4/5 liegen?

Weil die 5V ja von AVR kommen und die USB-Datenleitungen mit 3.3V 
arbeiten.
Die Widerstände begrenzen den Strom auf (5-3.3)/68 = 25mA.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stephan B. schrieb:
> Ohne Widerstand wuerden da theoretisch "unendliche" Stroeme fliessen -
> praktisch geht vermutlich der PIN am AVR kaputt.
Der geht praktisch lange nicht kaputt. So einen (einzelnen) AVR Pin 
kannst du problemlos sogar an Vcc legen und gegen Masse schalten oder 
andersrum...

von Stephan B. (matrixstorm)


Lesenswert?

Hallo

Lothar Miller schrieb:
> Der geht praktisch lange nicht kaputt. So einen (einzelnen) AVR Pin
> kannst du problemlos sogar an Vcc legen und gegen Masse schalten oder
> andersrum...

Okay, gut zu wissen das die Dinger so robust sind.

Bei der Versorgung ueber USB fuhert das dann aber vermutlich dazu, das 
die Vcc absinkt und der BrownOut den AVR abschaltet.
Richtig funktionieren tut's USB dann auch nicht.

MfG

von c-hater (Gast)


Lesenswert?

Birgit Pie schrieb:

> Ich verwende den VUSB-Treiber um einen Encoder als Tastatur zu emulieren
> und diesen an einem PC als Pfeil-runter und Pfeil-rauf Taste nutzen zu
> können.
> Ansich funktioniert das auch.
> Mein Problem ist aber, dass das Teil nicht vom PC erkannt wird, wenn es
> am PC angeschlosen ist, wenn dieser Hochfährt. Nehme ich ihn dann wieder
> ab und stecke ihn neu ein, läuft wieder alles.

Was passiert, wenn du im BIOS den "USB legacy support" abschaltest? 
(Sofern das bei deinem BIOS/UEFI überhaupt noch möglich ist)

von Teo D. (teoderix)


Lesenswert?

Hans Jelt schrieb:
> Weil die 5V ja von AVR kommen und die USB-Datenleitungen mit 3.3V
> arbeiten.

Danke!
(Hatte die 5V dem USB zu geschrieben, wie peinlich :-} )

von Birgit P. (bpie)


Lesenswert?

Hallo.

Zunächst danke für die vielen Antworten und sorry für meine späte 
Antwort, die Grippe hat mich erwischt...aber jetzt kann es weiter gehen.

So, dann zu euren zahlreichen Ideen:

1. Versuch mal die Z-Dioden auf 3,6V zu erhöhen.

-> Das dauert leider noch etwas, da ich diese Z-Dioden nicht da habe, 
nur 4,7V und das ist dann wohl etwas zu hoch, oder?
Sobald der Test mit den 3,6V gelaufen ist, gebe ich Bescheid.

2. Bei der Gelegenheit sollte auch der USB-Shield auf GND "gebandpasst"
werden. 1MOhm und 4.7nF sind wohl dafuer empfohlen.

-> Das brachte bei dem aktuellen Problem keine Besserung, war aber wohl 
auch eher "allgemein" gemeint.

3. Wenn Hardwareanmerkungen bisher nichts bringen, koenntest du 
vielleicht
fuer uns einmal kurz Linux (Knoppix?) per LIVE-CD auf dem betreffenden
Rechner booten?
Dann den Stick reinstecken und uns das Log posten?

-> Dazu muss ich sagen, dass ich mit Linux bisher noch nicht so viel 
gemacht habe...die Live-CD kann ich mir vermutlich downloaden...aber wie 
komme ich dann zu dem Log?
Ich habe in einer VM Linux (Ubuntu) installiert. Das sollte doch auch 
als Test funktionieren, oder? Wenn ja, kann mir jmd. sagen, wie ich zu 
dem Log komme?


4. Hast du mal ausprobiert, nur den ATtiny45 anzuschließen und alle
anderen USB-Geräte abzustöpseln? Manchmal behindern die sich
gegenseitig.

-> Ja. Sowohl an dem ersten Testrechner (Laptop) als auch an dem zweiten 
(normaler PC auch mit Windows XP) waren nur der ATMEGA angeschlossen, 
mit dem gleichen Ergebnis, dass er nicht gefunden wurde.

5. Was passiert, wenn du im BIOS den "USB legacy support" abschaltest?
(Sofern das bei deinem BIOS/UEFI überhaupt noch möglich ist)

-> Beim Laptop gibt es diese Einstellung im BIOS nicht. Beim PC war es 
bereits abgeschaltet. Habe es versuchsweise mal angeschaltet, brachte 
aber auch nichts.

Ich bin echt ratlos, hoffe, dass die 3,6V Z-Dioden helfen…

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Birgit Pie schrieb:
> -> Das dauert leider noch etwas, da ich diese Z-Dioden nicht da habe,
> nur 4,7V und das ist dann wohl etwas zu hoch, oder?
> Sobald der Test mit den 3,6V gelaufen ist, gebe ich Bescheid.

Falls du auch "normale" Dioden da hast, könntest du jeweils eine Z-Diode 
und eine normale in Reihe schalten (entgegengesetzte Polung natürlich). 
Damit kommst du auf ca. 3,9 Volt, was wahrscheinlich auch ok ist.

von Stephan B. (matrixstorm)


Lesenswert?

Markus Weber schrieb:
> Birgit Pie schrieb:
>> -> Das dauert leider noch etwas, da ich diese Z-Dioden nicht da habe,
>> nur 4,7V und das ist dann wohl etwas zu hoch, oder?
>> Sobald der Test mit den 3,6V gelaufen ist, gebe ich Bescheid.
>
> Falls du auch "normale" Dioden da hast, könntest du jeweils eine Z-Diode
> und eine normale in Reihe schalten (entgegengesetzte Polung natürlich).
> Damit kommst du auf ca. 3,9 Volt, was wahrscheinlich auch ok ist.

Da waere ich vorsichtig! Fuer Details lese bitte: 
http://forums.obdev.at/viewtopic.php?f=8&t=8751&sid=6a19b063a258fd8271fe62f46af5f646

MfG

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Stephan B. schrieb:
> Da waere ich vorsichtig! Fuer Details lese bitte:
> 
http://forums.obdev.at/viewtopic.php?f=8&t=8751&sid=6a19b063a258fd8271fe62f46af5f646

Halt, das war wohl ein Missverständnis. :-)
Die "normalen" Dioden jeweils in Reihe zu den Z-Dioden und natürlich 
nicht so, wie in deinem Link gezeigt.

von Birgit P. (bpie)


Lesenswert?

So, die Z-Diode ist da, getauscht...das gleiche Ergebnis, Problem also 
nicht behoben.

Ich habe das ganze mal noch an einem anderen Rechner probiert, auf dem 
Windows7 installiert ist. Da hat es erstaunlicherweise funktioniert. 
Allerdings muss ich dazu sagen, dass alle 3 Rechner unterschiedliche 
Hardware haben.


>Wenn Hardwareanmerkungen bisher nichts bringen, koenntest du vielleicht
>fuer uns einmal kurz Linux (Knoppix?) per LIVE-CD auf dem betreffenden
>Rechner booten?
>Dann den Stick reinstecken und uns das Log posten?

Wenn mir hierzu jemand sagen kann, wie ich an das Log komme und ob das 
ganze auch mit Linux in der VR-Umgebung funktioniert (denke schon), 
würde ich auch diese Infos gern noch bereit stellen.

Danke.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Birgit Pie schrieb:
> So, die Z-Diode ist da, getauscht...das gleiche Ergebnis, Problem also
> nicht behoben.

:-(

> Allerdings muss ich dazu sagen, dass alle 3 Rechner unterschiedliche
> Hardware haben.

100 µF an USB zu hängen, hab ich mich bisher nicht getraut, aber das 
sollte eigentlich trotzdem gehen.

> Wenn mir hierzu jemand sagen kann, wie ich an das Log komme und ob das
> ganze auch mit Linux in der VR-Umgebung funktioniert (denke schon),
> würde ich auch diese Infos gern noch bereit stellen.

Aus einer VR-Umgebung ist der Zugriff auf die Hardware immer nicht so 
einfach – oder er wird gar umgeleitet, und man nutzt dann die Treiber 
des Wirts-Systems, was dir dann natürlich nicht viel nützt.

Warum erzeugst du dir nicht einfach eine Linux-DVD (Ubuntu oder Knoppix 
oder Debian) und bootest den Windows-PC von dieser?
Linux ist sehr flexibel, man muss es gar nicht installieren, man kann es 
auch von einer DVD aus oder von einem USB-Stick aus verwenden. Dann 
läuft es natürlich langsamer, aber in diesem Fall stört das sicher 
nicht.

Und vielleicht gefällt es dir am Schluss doch so gut, dass du umsteigst. 
;-)

von Hans J. (step_up_mosfet)


Lesenswert?

Es gibt da noch etwas an das es liegen könnte ... hänge das V-USB-Gerät 
mal nicht direkt an den USB-Port des Rechners sondern hänge einen Hub 
dazwischen.
Wenn du noch einen USB 1.1 Hub hast wäre das natürlich ideal.

Was ich auch noch machen würde:
Versorgungsspannung auf 3.3V reduzieren (Z-Dioden entfernen)
-> R9 von 1.5k Ohm auf 1k Ohm verkleinern

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hans Jelt schrieb:
> Es gibt da noch etwas an das es liegen könnte ... hänge das V-USB-Gerät
> mal nicht direkt an den USB-Port des Rechners sondern hänge einen Hub
> dazwischen.
> Wenn du noch einen USB 1.1 Hub hast wäre das natürlich ideal.

Gute Idee, finde ich.

> Was ich auch noch machen würde:
> Versorgungsspannung auf 3.3V reduzieren (Z-Dioden entfernen)
> -> R9 von 1.5k Ohm auf 1k Ohm verkleinern

Hmmm... aber prüfen, ob der ATtiny45 dann noch läuft. Für V-USB ohne 
eigenem Quarz wird meist eine Taktfrequenz von 16,5 MHz verwendet 
(interner RC-Oszillator). Dafür könnten 3,3 Volt dann zu wenig sein. 
Muss man probieren.

von Birgit P. (bpie)


Angehängte Dateien:

Lesenswert?

Hallo.

Nach längerer Pause "muss" ich mich nun wieder mit diesem Problem 
beschäftigen. ;-)
Das heißt, es ist leider noch nicht erledigt.

> Es gibt da noch etwas an das es liegen könnte ... hänge das V-USB-Gerät
> mal nicht direkt an den USB-Port des Rechners sondern hänge einen Hub
> dazwischen.
> Wenn du noch einen USB 1.1 Hub hast wäre das natürlich ideal.

Das habe ich getestet, leider nur mit einem 2.0 Hub. Der Fehler ist 
genau der gleiche.


>Wenn Hardwareanmerkungen bisher nichts bringen, koenntest du vielleicht
>fuer uns einmal kurz Linux (Knoppix?) per LIVE-CD auf dem betreffenden
>Rechner booten?
>Dann den Stick reinstecken und uns das Log posten?

Ich habe das mit einer Ubuntu (12.04) Live CD probiert. Nun ist es so, 
dass an dem einen Laptop prinzipiell das gleiche Verhalten zu sehen war, 
wie bisher. Davon habe ich die 2 LogFiles bei getan. Eins nach dem 
Hochfahren, wo es nicht funktioniert hat.
Das zweite nachdem ich das Gerät nochmal abgezogen und wieder angesteckt 
habe und es dann funktionierte.

An einem anderen Laptop funktioniert es im Ubuntu auch direkt nach dem 
Hochfahren.
Aber bei beiden Laptops funktioniert es nicht im Windows.

Von der Windows-Variante habe ich gestern mal noch ein paar Screenshots 
der Datensignale gemacht. Vielleicht sagt das jemandem etwas.

USB-Gerät wird NACH dem Hochfahren angeschlossen:
VUSB_3.PNG: ständige Signalwechsel

USB-Gerät wird VOR dem Hochfahren angeschlossen:
VUSB_1.PNG: zu Beginn noch ein paar korrekte(?) Signalwechsel
VUSB_2.PNG: Dauersignal, Gerät wird nicht erkannt

Danke an alle, die drüber nachdenken.

Gruß.
bpie

von Bla (Gast)


Lesenswert?

Hängen da 100 µF am USB? Also, ich habe ähnliche Probleme oft mit einem 
USBASP. Wenn ich den an den PC stecke und danach eine Platine zum 
Programmieren anschließe, kackt der USB-Kram oft erstmal ab (durch den 
Ladevorgang am Elko). Da half dann nur rausziehen und neu anstecken...
bis ich der Firmware von USBASP mal eine kleine Änderung verpasst und 
außerdem den Brownout Detektor aktiviert habe. Jetzt passiert folgendes 
ganz am Anfang:

- Watchdog aktivieren
- usbDeviceDisconnect() aufrufen, wichtig, damit das Gerät bei einem 
Fehler (-> Reset) definiert getrennt wird
- dann die ganzen Port-Inits
- 500 ms Wartezeit
- dann erst usbDeviceConnect()
- ...

von Chris (Gast)


Lesenswert?

Ich könnte mir vorstellen, dass V-USB den vom Host ausgelösten 
Device-Reset nicht korrekt implementiert hat (ich kenne V-USB zwar 
nicht, aber das USB-Protokoll dafür etwas mehr). Beim Starten eines 
kompletten PCs ist es durchaus wahrscheinlich, dass der USB-Bus mehrfach 
neu enummeriert wird, obwohl die USB-Versorgungsspannung die ganz Zeit 
eingeschaltet bleibt. Das ist aus Sicht des USB-Devices eine vollkommen 
andere Situation als das anstecken an den Bus.

Dein VUSB_2.JPG zeigt schön das Reset-Signalling ... allerdings sind die 
Phasen mit High-Signal an der D- Leitung (ich nehme mal an Ch1 ist D-) 
zu kurz. Die Reset-Recovery-Time sollte eigentlich mindestens 10ms sein. 
( siehe USB2.0 Spec, 7.1.7.5 Reset Signaling, 
http://www.usb.org/developers/docs/usb20_docs/ )

Dazu passt dann auch gut die Linux-Fehlermeldung:
hub 2-0:1.0: connect-debounce failed, port 1 disabled

Du könntest mal schauen, ob V-USB den Tiny in dieser Situation auch alle 
ca. 20ms resettet? Dann würde evtl. schon helfen, vorm ersten 
usbDeviceDisconnect() etwas länger zu warten.

von Hans J. (step_up_mosfet)


Lesenswert?

Markus Weber schrieb:
> Hmmm... aber prüfen, ob der ATtiny45 dann noch läuft. Für V-USB ohne
> eigenem Quarz wird meist eine Taktfrequenz von 16,5 MHz verwendet
> (interner RC-Oszillator). Dafür könnten 3,3 Volt dann zu wenig sein.
> Muss man probieren.

@ Birgit Pie (bpie)
Vielleicht könntest du den ATTiny45 mal mit einem 12MHz Quarz bestücken 
und probieren ob es so besser läuft.

von Sven B. (mainframeosx)


Angehängte Dateien:

Lesenswert?

Lass mal die Z-Dioden weg! Ich arbeite schon mehreren Jahren mit dieser 
Schaltung und die Funktioniert ohne Probleme. Es gibt 3 Arten der 
Beschaltung . Hatte das gleiche Problem mit einem ATMega 8. Außerdem 
sollte man einen ATMega verwenden der eine eigenen Quartz benutzt. Dann 
ist man auf der sicheren Seite. Habe so mehrere usbisp aufgebaut und 
eine Schaltung
mit der man einen Atmega 32 als Schnittstelle für den i2c Bus verwenden 
kann.

von Bla (Gast)


Lesenswert?

Nein. Wenn der AVR mit 5 Volt betrieben wird, müssen die Z-Dioden rein. 
Der Standard sieht vor, dass gewisse Pegel eingehalten werden müssen. Es 
gibt auch Systeme, bei denen die Geräte sonst nicht erkannt werden 
(selbst getestet und stundenlang nach dem Fehler gesucht!)

von Tim  . (cpldcpu)


Lesenswert?

Chris schrieb:
> Ich könnte mir vorstellen, dass V-USB den vom Host ausgelösten
> Device-Reset nicht korrekt implementiert hat (ich kenne V-USB zwar
> nicht, aber das USB-Protokoll dafür etwas mehr). Beim Starten eines
> kompletten PCs ist es durchaus wahrscheinlich, dass der USB-Bus mehrfach
> neu enummeriert wird, obwohl die USB-Versorgungsspannung die ganz Zeit
> eingeschaltet bleibt. Das ist aus Sicht des USB-Devices eine vollkommen
> andere Situation als das anstecken an den Bus.

Der erste Beitrag, der ein tatsächliches Problem anspricht! Die ganzen 
Vermutungen zur Beschaltung passen nicht zur Reproduzierbarkeit des 
Problems.

Meine Vermutung wäre auch, dass der Reset nicht erkannt wird. Bisher 
wurde noch nichts über die Software gesagt? In V-USB wird der Reset 
"manuell" über usbpoll() gepollt. Wenn diese Funktion nicht häufig genug 
aufgerufen wurden, wird ein Reset nicht erkannt und die Enumeration 
funktioniert nur direkt nach dem Kaltstart des Controllers.

Kannst Du die Hauptschleife Deines Codes posten?

von Tim  . (cpldcpu)


Lesenswert?

Sven Schwiecker schrieb:
> Lass mal die Z-Dioden weg! Ich arbeite schon mehreren Jahren mit dieser
> Schaltung und die Funktioniert ohne Probleme. Es gibt 3 Arten der

Ja toll. Es enstpricht aber trotzdem nicht der Spezifikation und kann, 
je nach Bauart des Host-Controllers, diesen zerstören.

von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

So sieht ein Reset mit Enumeration auf dem Bus auf. Das sollte 
irgendwann auftauchen und dann auch korrekt interpretiert werden.

von Birgit P. (bpie)


Lesenswert?

Hallo.


Der Code der Hauptschleife ist folgender:
1
int main(void)
2
{
3
uchar   i;
4
uchar   calibrationValue;
5
6
    calibrationValue = eeprom_read_byte(0); /* calibration value from last time */
7
    if(calibrationValue != 0xff){
8
        OSCCAL = calibrationValue;
9
    }
10
    odDebugInit();
11
    usbDeviceDisconnect();
12
    for(i=0;i<20;i++){  /* 300 ms disconnect */
13
        _delay_ms(10); 
14
    }
15
    usbDeviceConnect();
16
    DDRB |= 1 << BIT_LED;   /* output for LED */
17
    PORTB |= 1 << BIT_KEY;  /* pull-up on key input */
18
    PORTB |= 1 << BIT_ENC_DIR;  /* pull-up on "key" input */
19
    wdt_enable(WDTO_1S);
20
    timerInit();
21
  init_encInt(); //Initialisierung Encoder
22
    usbInit();
23
    sei();
24
    for(;;){    /* main event loop */
25
        wdt_reset();
26
        usbPoll();
27
    
28
        if(usbInterruptIsReady() && nextDigit != NULL){ /* we can send another key */
29
            buildReport();
30
            usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
31
            if(*++nextDigit == 0xff)    /* this was terminator character */
32
                nextDigit = NULL;
33
        }
34
        timerPoll();//Drucktaster des Encoders abfragen
35
  if(enc_changed) { evaluateENC(); enc_changed=0; }//oo
36
  
37
    }
38
    return 0;
39
}

Ich habe testweise nach "odDebugInit();" ein "_delay_ms()" mit 
verschiedenen Zeiten eingefügt. So, dass am Oszi ca. 10ms zu sehen 
waren, leider hat auch dann das Erkennen nicht funktioniert.

von Birgit P. (bpie)


Lesenswert?

Noch ein Test mit der for-Schleife wie folgt:
1
for(;;){    /* main event loop */
2
        wdt_reset();
3
        usbPoll();
4
    
5
        }
6
    }
Also nichts weiter drin als das usbPoll() führte zu dem gleichen 
Problem...

Auch mit der Wartezeit vor usbDeviceDisconnect().

: Bearbeitet durch User
von Bla (Gast)


Lesenswert?

Wie verhält sich denn ein anderes VUSB-Bastelgerät am Rechner? Zum 
Beispiel ein USBASP?

von Bla (Gast)


Lesenswert?

Eventuell läuft ja auch deine Oszillatorkalibrierung Amok, wenn der PC 
bootet und Versorgungsspannung da ist, aber kein brauchbares Signal.
Ein richtiger Quarz wäre sicher mal eine Idee.

von Tim  . (cpldcpu)


Lesenswert?

Birgit Pie schrieb:
> Der Code der Hauptschleife ist folgender:

Sieht soweit eigentlich ok aus, so lange nicht einer der 
Funktionsaufrufe hängen bleibt. Ich würde das Problem jetzt weiter 
angehen, in dem ich mir einen Debugausgang schaffe, z.B. ein pin mit 
soft-UART, und mir anzeigen lasse, wann ein Reset erkannt wird. Den Bus 
mit dem Oszi zu beobachten ist schwierig, da ist ein Logikanalyzer 
besser geeignet.

Bla schrieb:
> Eventuell läuft ja auch deine Oszillatorkalibrierung Amok, wenn der PC

Könnte man auch gleich über den Debugausgang ausgeben.

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

usbDeviceDisconnect() und usbDeviceConnect() vor dem usbInit() kommt mir 
persönlich seltsam vor, steht allerdings auch so in diesem Wiki: 
http://vusb.wikidot.com/driver-api  Man könnte mal im V-USB sourcecode 
nachschauen, ob das ernst gemeint oder ein Versehen ist.

Was soll das Programm bei einem Bus-Reset machen? Die Neukalibrierung 
wie bei http://vusb.wikidot.com/examples unter "Clocking the AVR from 
the RC oscillator with auto-calibration" beschrieben? Dann würde ich mal 
in der USB-Spec und mit dem Scope schauen, ob die Annahme mit dem 
Frame-Clock auch wirklich stimmt, oder ob das nur beim ersten mal 
anstecken passiert.

Ansonsten musst Du Dich an den Fehler herantasten. Debug-Ausgang wie von 
Tim vorgeschlagen wär natürlich klasse. Als Vorstufe dazu könnte man 
auch erstmal die Pins für den Encoder vorübergehend als Status-Anzeigen 
verwenden.

von Tim  . (cpldcpu)


Lesenswert?

Chris schrieb:
> usbDeviceDisconnect() und usbDeviceConnect() vor dem usbInit() kommt mir
> persönlich seltsam vor, steht allerdings auch so in diesem Wiki:
> http://vusb.wikidot.com/driver-api  Man könnte mal im V-USB sourcecode
> nachschauen, ob das ernst gemeint oder ein Versehen ist.

Die Reihenfolge ist ziemlich egal, da die Macros fast nichts machen :)

Chris schrieb:
> Was soll das Programm bei einem Bus-Reset machen? Die Neukalibrierung
> wie bei http://vusb.wikidot.com/examples unter "Clocking the AVR from
> the RC oscillator with auto-calibration" beschrieben? Dann würde ich mal
> in der USB-Spec und mit dem Scope schauen, ob die Annahme mit dem
> Frame-Clock auch wirklich stimmt, oder ob das nur beim ersten mal
> anstecken passiert.

Wenn am Bus ein Reset ohne anschließendes Keepalive/Framsignal ausgelost 
wird, wird calibrateosc den RC-Oscillator komplett dekalibrieren, da die 
Routine keinen Sanity-Check hat.

Edit: Es ist sogar noch schlimmer: Die mitgelieferte Routine hat einen 
Timeout, verabeitet diesen aber nicht. Evtl. funktioniert meine 
Alternative in Assembler besser - die hängt einfach so lange, bis wieder 
ein Keepalive kommt:

https://github.com/micronucleus/micronucleus/blob/master/firmware/osccalASM.S

: Bearbeitet durch User
von Buchhalter (Gast)


Lesenswert?

Die Fehlermeldung deutet auf irgentwelche Lowlevel-Probleme hin, der 
USB-Port an der Maschine ist wohl nicht tolerant wie an den anderen 
Maschinen.

Ändere dein Design auf 3,3V mit Quartz und dann taste dich an dein 
Zieldesign ran.

von Mike J. (linuxmint_user)


Lesenswert?

Buchhalter schrieb:
> Ändere dein Design auf 3,3V mit Quartz und dann taste dich an dein
> Zieldesign ran.

Du kannst ja PB3 als externen Takteingang nehmen, entweder du nimmst 
12MHz einen Oszillator oder einen 12MHz Quarz mit Verstärkerschaltung.
http://elektroniktutor.de/signalkunde/quarzosz.html
http://www.rn-wissen.de/index.php/Quarzoszillator

von Birgit P. (bpie)


Lesenswert?

Bla schrieb:
> Wie verhält sich denn ein anderes VUSB-Bastelgerät am Rechner? Zum
> Beispiel ein USBASP?

Kann ich leider nichts zu sagen, habe kein anderes Gerät mit VUSB.

von Birgit P. (bpie)


Lesenswert?

Ich habe mal nach "usbDeviceDisconnect();" und vor "for(i=0;i<20;i++)" 
ein LED_TOGGLE eingefügt. Wenn man diese dann mit dem Osci beobachtet, 
sieht man das der Pin ständig toggelt. Also wird anscheinend ständig ein 
Reset ausgeführt...aber warum?
Der Watchdog? Ganz am Anfang der Routine habe ich anschließend ein 
"wdt_disable()" eingefügt...ohne Erfolg. Willkürlich gesetzte 
"wdt_reset()" brachten auch keinen Erfolg.
Wenn ich die Datenleitung D- aus dem USB-Kabel raus nehme erfolgt zwar 
logischerweise keine Kommunikation, aber die LED toggelt auch nicht. 
Kann es sein, das der Reset vom PC ausgeführt wird?

von Mike J. (linuxmint_user)


Lesenswert?

Dein Gerät bekommt keinen richtigen Kontakt zum PC.

Wie sieht denn die Resetbeschaltung bei dir aus?
Im Schaltplan ist das scheinbar eine LED, ist nicht wirklich passend.
Ein 10k bis 100k Ohm Widerstand nach Vcc und ein 100nF Kondensator nach 
Masse sind die Standardbeschaltung.
Wenn alles okay ist liegt während des Betriebs am Reset-Pin die 
Versorgungsspannung an.

Es könnte auch an der Methode "buildReport()" liegen, aber an deiner 
Stelle würde ich erst mal nicht bei der Software suchen, sondern bei der 
Hardware.

Kopiere dein Projekt, schreibe die Software so um dass zwei oder ein Pin 
frei sind und nutze den 12MHz Takt.
Da das bei 3.3V läuft könntest du vielleicht auch die Spannung auf 3.3V 
stellen.

Du versuchst weiter bei der Software obwohl der Fehler woanders liegt.

von Tim  . (cpldcpu)


Lesenswert?

Birgit Pie schrieb:
> Ich habe mal nach "usbDeviceDisconnect();" und vor "for(i=0;i<20;i++)"
> ein LED_TOGGLE eingefügt. Wenn man diese dann mit dem Osci beobachtet,
> sieht man das der Pin ständig toggelt. Also wird anscheinend ständig ein
> Reset ausgeführt...aber warum?

Auf welchem Pegel liegt denn der Reset-Pin? Ist die Spannungsversorung 
stabil, oder cycled der PC diese beim hochfahren? Kannst Du den Watchdog 
auch einfach ausbauen?

von Chris (Gast)


Lesenswert?

Birgit Pie schrieb:
> Also wird anscheinend ständig ein Reset ausgeführt...aber warum?

Nun, wir können da nur in die Glaskugel schauen, während Du alle 
Möglichkeiten hast das herauszubekommen. ;-)  Auch der Tiny selbst kann 
Dir dabei helfen: Siehe MCU Status Register (MCUSR).

Möglichkeiten gibt es sooo viele ... ich tippe ja eher auf 
Softwarefehler, da die Schaltung beim normalen Anstecken an den Bus ja 
funktioniert. Man kann den RC-Oszillator auch so übel oder so schnell 
verstimmen, dass die CPU des Tiny hängen bleibt und dann vom Watchdog 
resettet werden muss. (siehe Oscillator Calibration Register (OSCCAL) 
aus dem Tiny45 Datenblatt)



Tim schrieb:
> Ist die Spannungsversorung stabil, oder cycled der PC diese
> beim hochfahren?

Embedded Hosts machen sowas manchmal um ein vollkommen abgestürztes 
USB-Device wiederzubeleben, aber bei einem PC habe ich sowas noch nie 
gesehen. Nachmessen schadet aber nie und ein Scope ist ja auch 
vorhanden.

von fleeting (Gast)


Lesenswert?

Mich überrascht, wie groß der Anteil der "Herumprobierer" hier ist. Ich 
finde es nicht zielgerichtet bei einem Problem einfach mal die Schaltung 
zu verändern, ohne das Problem vorher analysiert zu haben.

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.