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?
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
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.
>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
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.
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
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.
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
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.
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
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.
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.
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.
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.
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
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