General discussions about V-USB, our firmware-only implementation of a low speed USB device on Atmel's AVR microcontrollers
-
yardleydobon
- Posts: 2
- Joined: Sat Jun 11, 2011 8:25 am
Post
by yardleydobon » Mon Jun 27, 2011 8:17 am
Is it not OK to do work in the for loop outside of the if (usbInterruptIsReady()) code block?
I have code between wdt_reset() and usbPoll(). Sometimes the device enumerates correctly
but usually not. Why doesn't this work or why shouldn't I do this? Does the amount of
work done there matter? Do I need to call wdt_reset() multiple times?
Code: Select all
for(;;)
{
wdt_reset();
//doing some work here
foo = froobulate(foo, bar, baz);
usbPoll();
if (usbInterruptIsReady())
{
my_report.foo = foo;
usbSetInterrupt((void *)&my_report, sizeof(my_report));
}
}
-
ulao
- Rank 4
- Posts: 481
- Joined: Mon Aug 25, 2008 8:45 pm
Post
by ulao » Wed Jun 29, 2011 10:43 pm
Use the code below, this may help a little.
When ( ! usbInterruptIsReady() ) , You are limited to a very small amount of code space before the next pull must be done. I have tried using that section of code to preform a check on the d- line. My need was for a line Low for x amount of time. I realized there was little room to do anything. The amount of time is much less for Win7 then XP. Almost no time at all!. I added a cli and sli to try to get more room but still was not enough. I would like to know how to cheet this, as thus far I have not had much luck.
Code: Select all
//You can put anything here you want but you still have a limit from what I know.
// i have never hit it and its well over a second.
while (!usbInterruptIsReady()){ /* limited to a short amount of time. */ usbPoll();}
//You can put anything here you want but you still have a limit from what I know.
//i have never hit it and its well over a second.