I'm trying to get vusb to work. I've dowloaded the following code onto an atmega8 . I've also set the frequency to 16mhz. However, when i plug the usb into the port, it gives me an error 'usb not recognized. Some device has malfunctioned...' I was under the impression that if it was working a message would pop up saying 'found new hardware. ' Not happening, though, its being recognized as an unknown device. I'm on windows vista.
My hardware setup is the one involving 3.6 zener diodes to the ground from the D+ and D-lines. However, i have 360 ohm resistors instead of 68 ohm resistors. This shouldn't make a difference though.
I've measured some voltages:
2.522 V on the D- line
0 V on D+ lines
5.01 V supplied
4.68V supplied to microcontroller.
1.478 K resistor from D- to VCC.
I cannot figure out what would be causing this. Any ideas? Thanks! D4 is the D- line and D2 is the D+ line. Everything else in usbconfig.h is default. I'm using
the winAVR eclipse plugin, so it generates Makefile automatically.
//One of the usb devices attached to this computer has malfunctioned and windows does not
//recognize it.
Code: Select all
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/wdt.h>
#define F_CPU 16000000
#include "usbdrv.h"
#include "oddebug.h"
#include <util/delay.h>
usbMsgLen_t usbFunctionSetup(uchar setupData[8])
{
return 0;
}
void setupUSB () {
uchar i;
wdt_enable(WDTO_1S);
odDebugInit();
DDRD=~USBMASK;
PORTD = 0; //no pullups on usb pins
/* We fake an USB disconnect by pulling D+ and D- to 0 during reset. This is
* necessary if we had a watchdog reset or brownout reset to notify the host
* that it should re-enumerate the device. Otherwise the host's and device's
* concept of the device-ID would be out of sync.
*/
usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */
i = 0;
while(--i){ /* fake USB disconnect for > 500 ms */
wdt_reset();
_delay_ms(2);
}
usbDeviceConnect();
usbInit();
sei();
}
int main(void)
{
setupUSB();
for(;;) { /* main event loop */
wdt_reset();
usbPoll();
}
return 0;
}