Forum: Mikrocontroller und Digitale Elektronik V-USB mit einem ATmega8


von GrinderFX (Gast)


Lesenswert?

Hi.
Ich kämpfe nun schon sehr lange damit meinen ATMega8 mit USB zu 
betreiben.
Ich habe folgende Schaltung aufgebaut:
http://4.bp.blogspot.com/-c4xHKCT4nT0/UIpHv5HZB-I/AAAAAAAABCE/CtHQJDl95_g/s1600/schematic.png 
und dennoch passiert nichts aber wirklich rein gar nichts wenn ich sie 
an meinen Rechner anschließe.
Ich habe mir mit libusb sämtliche USB Geräte anzeigen lassen doch meins 
ist natürlich nicht dabei. Den Sourcecode
1
#define LED_PORT_DDR        DDRB
2
#define LED_PORT_OUTPUT     PORTB
3
#define LED_BIT             0
4
5
#define F_CPU 12000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
6
7
#include <avr/io.h>
8
#include <avr/wdt.h>
9
#include <avr/interrupt.h>  /* for sei() */
10
#include <util/delay.h>     /* for _delay_ms() */
11
12
#include <avr/pgmspace.h>   /* required by usbdrv.h */
13
#include "usbdrv.h"
14
#include "oddebug.h"        /* This is also an example for using debug macros */
15
#include "requests.h"       /* The custom request numbers we use */
16
17
usbMsgLen_t usbFunctionSetup(uchar data[8])
18
{
19
        usbRequest_t    *rq = (void *)data;
20
        /* buffer must stay valid when usbFunctionSetup returns - so it's static */
21
        static uchar    dataBuffer[4];  
22
23
        uchar bit = 1<<LED_BIT;
24
        
25
        // do operation based on received USB request code (defined in requests.h)
26
        if (rq->bRequest == SET_LED_STATE) {
27
        
28
        if(rq->wValue.bytes[0]){    
29
            LED_PORT_OUTPUT |= bit; /* set LED */
30
        }else{                      
31
            LED_PORT_OUTPUT &= ~bit; /* clear LED */
32
        }
33
                return 0; // no data to return
34
                
35
    } else if (rq->bRequest == GET_LED_STATUS) {
36
        
37
                // NOTE: you can pack an uint in 4 bytes or use bigger buffer to send more data!
38
        dataBuffer[0] = 0;
39
                dataBuffer[1] = 0;
40
                dataBuffer[2] = 0;
41
                dataBuffer[3] = (uchar)(LED_PORT_OUTPUT & bit);
42
        usbMsgPtr = dataBuffer; /* tell the driver which data to return */          
43
                
44
        return 4; // return 4 bytes                 
45
    }
46
        
47
    return 0;   /* default for not implemented requests: return no data back to host */
48
}
49
50
int __attribute__((noreturn)) main(void)
51
{
52
        usbInit();
53
        
54
        /* enforce re-enumeration, do this while interrupts are disabled! */
55
    usbDeviceDisconnect();  
56
    _delay_ms(1); /* fake USB disconnect for > 250 ms */
57
    usbDeviceConnect();
58
        
59
    LED_PORT_DDR |= 1<<LED_BIT;   /* make the LED bit an output */
60
        
61
        sei(); // enable global interrupts
62
        
63
    for(;;){                /* main event loop */
64
        usbPoll();/*
65
    PORTB |= 0b11111111;
66
    _delay_ms(1000);
67
    PORTB &= 0b00000000;
68
    _delay_ms(1000);
69
    */
70
    }
71
}

habe ich von der gleichen Seite von der ich auch den Schaltplan habe.
Ich habe aber schon unterschiedliche Sourcen verwendet, unter anderem 
von hier 
http://www.rn-wissen.de/index.php/V-USB:_Ein_Firmware_USB-Treiber_f%C3%BCr_AVR 
und weitere. Sie sind alle nahezu identisch, dennoch gibt es kein 
Lebenszeichen. Wie man oben in meinem Codebeispiel sieht, habe ich meine 
LED zu Testzwecken blinken lassen und das funktioniert auch vernünftig.
Ich habe meinen Aufbau nun schon 1000 mal überprüft und es scheint 
eigentlich alles in Ordnung zu sein.
Ich habe auch mehrere USB Kabel, Rechner und USB Ports benutzt. Trotzdem 
kein Lebenszeichen.

Hat jemand vielleicht eine Idee?

von Paul Baumann (Gast)


Lesenswert?

Die Schaltung des USB-Anschlusses ist in Ordnung, die wird mit den
gleichen Bauelementen auch beim AVR-Doper verwendet und der 
funktioniert.

Sind die Fuse-Bits auf den Quarz eingestellt?
Ich verstehe nichts von der Sprache C, aber im Queltext sehe ich 
nirgendwo
den Port D erwähnt, wo ja Data + und Data - von USB draufgehen.

MfG Paul

von GrinderFX (Gast)


Angehängte Dateien:

Lesenswert?

Ja natürlich, sonst würde die LED ja nicht vernünftig blinken, steht ja 
auch so im Text.

Ich zitiere mal rn-wissen.de:
Die Datenleitung D+ muss über den 68 Ohm-Widerstand mit dem Port INT0 
des AVRs verbunden werden. D- kann an einen beliebigen Port. Diese Ports 
müssen dann in der "usbconfig.h" angepasst werden.
In der usbconfig ist folgendes definiert:
1
#define USB_CFG_IOPORTNAME      D
2
/* This is the port where the USB bus is connected. When you configure it to
3
 * "B", the registers PORTB, PINB and DDRB will be used.
4
 */
5
#define USB_CFG_DMINUS_BIT      4
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.
8
 */

Und um die ganze Sache komplett zu machen ein Bild meines Aufbaus ist im 
Anhang zu finden.

von Paul Baumann (Gast)


Lesenswert?

>Ja natürlich, sonst würde die LED ja nicht vernünftig blinken, steht ja
>auch so im Text.

Entschuldige, daß ich helfen wollte...
:-O

Es soll vorkommen, daß man ein Blinken von einem mit 8 statt 12 MHz 
getaktetem Kontroller mit bloßem Auge nicht unterscheiden kann...

Deine Widerstände, die zusammen 2 KOhm ergeben sollen, sind nur
200 Ohm.

Der Widerstand MUSS 2,2 Kiloohm haben, sonst wird das Gerät nicht 
erkannt.

MfG Paul

von holger (Gast)


Lesenswert?

>Ich habe folgende Schaltung aufgebaut:
>http://4.bp.blogspot.com/-c4xHKCT4nT0/UIpHv5HZB-I/...

Die übliche Scheisse. AVCC nicht angeschlossen, LED ohne
Vorwiderstand.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

GrinderFX schrieb:
> _delay_ms(1); /* fake USB disconnect for > 250 ms */

Öh, wo sind da die mindestens 250ms?
Poste auch mal bitte die usbconfig.h und deinen Devicedeskriptor.
Für dein Projekt muss F_CPU auf 12000000 stehen und die Fuses auf High 
Frequency ext. Crystal.

von Paul Baumann (Gast)


Lesenswert?

Holger stellte entsetzt fest:
>AVCC nicht angeschlossen, LED ohne Vorwiderstand.

Ach ja -das hat er auf dem Steckbrett genau so nachgemacht.

Vielleicht ist das aber für die Funktion der Schaltung unabdingbar:
Durch den fehlenden Vorwiderstand der LED geht die Speisespannung
in die Knie und die Z-Dioden am USB-Anschluß bekommen dadurch erst
ihren richtigen Arbeitspunkt....

schnell fort hier

;-)
MfG Paul

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

holger schrieb:
> Die übliche Scheisse. AVCC nicht angeschlossen, LED ohne
> Vorwiderstand.

Und dann noch als einziges einen 4µ7 als Stütz-C. Fixe das erstmal und 
bau dann noch einen 100nF direkt am MC zwischen Vcc und GND.

von Oliver J. (skriptkiddy)


Lesenswert?

Manche Z-Dioden machen auch Probleme. Haben wohl zu viel parasitäre 
Kapazität und verschleifen somit die Flanken zu stark. Versuchs mal ohne 
Z-Dioden und speise die Schaltung mit 3.3V. Natürlich solltest du vorher 
noch die hier empfohlenen Modifikationen durchführen:
- Vorwiderstand an LED
- AVCC beschalten
- Und 100nF an den µC (VCC/AVCC) - natürlich nach Masse


Grüße Oliver

von Tim  . (cpldcpu)


Lesenswert?

Ich sehe keine Verbindung der Versorganungsspannungsleiten?

von GrinderFX (Gast)


Lesenswert?

Punkt 1:
Der 100nf Kondensator ist da, das ist der kleine blaue Punkt unter/neben 
dem Quarz.

Punkt 2:
Der Vorwiderstand war mal da, hatte ihn nur nach einer kleinen 
Modifikation kurz entfernt, da es kurz zum testen auch so geht. Macht 
auch keinen großen Unterschied. Da die diode auch nur für kurze 
Testzwecke eingebaut ist, hätte es auch ohne funktioniert.

Punkt 3:
Die Fuses sind immer noch richtig gesetzt wie ich nun schon mehrmals 
schrieb. Die LED blinkt sauber im Sekundentakt. Ich arbeite mit Atmel 
Studio 6, da ist es sehr einfach sie zu setzen.

Punkt 4:
Doch es sind 2K und keine 200 Ohm! So wie es auf meiner 100er Packung 
steht, so wie es die Beringung sagt und so wie es auch mein Multimeter 
sagt.

Punkt 5:
3.3 V ist der seltsamste Vorschlag, da Laut Datenblatt der ATMega8 einen 
Arbeitsbereich von 4.5 - 5.5V hat. Es wird also nicht funktionieren.
Es wurde extra ein ATMega8 und kein ATMega8L gewählt, weil dieser mit 
12Mhz laufen kann.

Punkt 6:
Das AVCC ist richtig, das ist der einzige Punkt den ich so stehen lassen 
muss. In den meisten Beispielen wird dieser nicht beschaltet und da es 
bis jetzt nie Probleme ohne gab, hab ich das auf dem Steckbrett 
weggelassen.

Ich möchte jetzt nicht flamen aber die Vorschläge, die bis jetzt kamen 
waren weit schlimmer als der vergessene/absichtlich weggelassene 
Vorwiderstand.

von Simon K. (simon) Benutzerseite


Lesenswert?

Optimier doch mal die USB-Anbindung mit so wenig Steckbrücken wie 
möglich und so kurzen Kabeln wie möglich.

von Paul Baumann (Gast)


Lesenswert?

Grinder schrob:
>Ich möchte jetzt nicht flamen aber die Vorschläge, die bis jetzt kamen
>waren weit schlimmer als der vergessene/absichtlich weggelassene
>Vorwiderstand.

Ich möchte Dich jetzt nicht zum Weinen bringen, aber meine USB_Schaltung
mit Mega8 läuft und Deine nicht.

Da kotzt Du nicht -da mußt Du durch!

:-(

Paul

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


Lesenswert?

GrinderFX schrieb:
> Punkt 5:
> 3.3 V ist der seltsamste Vorschlag, da Laut Datenblatt der ATMega8 einen
> Arbeitsbereich von 4.5 - 5.5V hat. Es wird also nicht funktionieren.
> Es wurde extra ein ATMega8 und kein ATMega8L gewählt, weil dieser mit
> 12Mhz laufen kann.

Ja... oft funktionieren die ATmega8L aber trotzdem mit 12 MHz. Auch wenn 
das dann keine saubere Lösung ist.

Ich geb zu, ich hab nicht alles durchgelesen, aber steckt der rechte 
2-k-Vorwiderstand wirklich auf der VCC-Schiene? Das ist auf dem Bild 
nicht klar zu erkennen.

von Oliver J. (skriptkiddy)


Lesenswert?

GrinderFX schrieb:
> Punkt 5:
> 3.3 V ist der seltsamste Vorschlag, da Laut Datenblatt der ATMega8 einen
> Arbeitsbereich von 4.5 - 5.5V hat. Es wird also nicht funktionieren.
> Es wurde extra ein ATMega8 und kein ATMega8L gewählt, weil dieser mit
> 12Mhz laufen kann.

Ich habe hier einen Schwung USBasp aus China. Die laufen alle mit 3.3V 
und haben einen ATMega8L drauf (der darf nicht schneller als 8MHz). Das 
ist selbstverständlich out of spec, funktioniert aber trotzdem. Darüber 
hinaus hab ich einige USB-Displays mit einem ATtiny2313 gebaut; 
ebenfalls mit 3.3V gespeist bei 12MHz.
Da wir hier nicht von 10000 Stück reden, die alle funktionieren sollen, 
ist es doch einen Versuch wert. Wenn es läuft, dann läuft es. Wenn 
nicht, dann eben nicht. Es ging bei meinem Vorschlag lediglich darum, 
die Z-Dioden mal herauszuwerfen, um zu schauen, ob die nicht eventuell 
das Problem verursachen (Hab ich schon mal gehabt). Um dann wenigstens 
noch die von USB erforderlichen ca. 3.3V Signalpegel zu erreichen, hab 
ich den Vorschlag mit 3.3V Betriebsspannung gemacht. Manche USB-Hosts 
kommen zwar auch mit 5V-Pegel klar, die meisten jedoch nicht.

Mach was daraus oder eben nicht.

von Petr (Gast)


Lesenswert?

GrinderFX schrieb:
> Punkt 3:
> Die Fuses sind immer noch richtig gesetzt wie ich nun schon mehrmals
> schrieb. Die LED blinkt sauber im Sekundentakt

Na dann liegt es wohl kaum an der Schaltung.

Ich habe auch einmal etwas mit V-USB gemacht und hatte auch so eine 
Schaltung wie Du. Damals habe ich einfach deren (Keyboard-)Demo 
aufgespielt (ich glaube, die liegt sogar als .hex-Datei bei) und alles 
hat funktioniert.

Also: Zunächst mal deren Beispiel zum laufen bringen und nicht selber 
programmieren.

von Petr (Gast)


Lesenswert?

GrinderFX schrieb:
> _delay_ms(1); /* fake USB disconnect for > 250 ms */

Das hier ist auch ein interesanter Ansatz für einen 250ms Delay.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Petr schrieb:
> GrinderFX schrieb:
>> _delay_ms(1); /* fake USB disconnect for > 250 ms */
>
> Das hier ist auch ein interesanter Ansatz für einen 250ms Delay.
Jo, hatte ich oben auch schon mal erwähnt.
@TE: Ohne dir nahezutreten, aber dein Aufbau ist grausam. Wenn da 
überhaupt was geht dann höchstens Donnerstag bei Vollmond. Da müssen 
kurze Leitungen an USB und MC. Das du nicht mal ein Signal des PCs beim 
Einstecken bekommst, deutet darauf hin, das nicht mal der 2k2 Pullup an 
D- erkannt wird, das sollte zu denken geben.
Du hast nach wie vor nicht deine 'usbconfig.h' gepostet und auch nicht 
den Device Deskriptor.

von matrixstorm (Gast)


Lesenswert?

Hi.

Ich empfehle dir einfach mal tinyUSBboard Rev3. aufzubauen. (Geht auch 
auf Steckbrett)

Dazu gibt es ein "VUSB skeleton/example with corresponding linux, 
windows (delphi) and platform independent GTK libusb program".

Auf diese Weise kannst du Softwarefehler zunaechst ausschliessen und 
dich auf Hardware konzentrieren.
Die Defaultfirmware enthaelt ausserdem einen umfangreichen Selbsttest.

http://matrixstorm.com/avr/tinyusbboard/

MfG

von Oliver J. (skriptkiddy)


Lesenswert?

GrinderFX schrieb:
> Punkt 5:
> 3.3 V ist der seltsamste Vorschlag, da Laut Datenblatt der ATMega8 einen
> Arbeitsbereich von 4.5 - 5.5V hat. Es wird also nicht funktionieren.
> Es wurde extra ein ATMega8 und kein ATMega8L gewählt, weil dieser mit
> 12Mhz laufen kann.

Hab gerade noch ein paar ATMEGA8-16PU (1109I) gefunden. Einen davon hab 
ich mit der USBasp-Firmware beglückt und siehe da, er schafft es mit 
3.3V Betriebsspannung Targets zu flashen.

Das nächste mal wäre es vielleicht von Vorteil nach dem Hintergrund für 
einen Vorschlag zu fragen anstatt ihn gleich, wenn auch nicht ganz 
unbegründet, als seltsam abzutun.

Grüße Oliver

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.