|
|
View previous topic :: View next topic |
Author |
Message |
KT315
Joined: 27 Oct 2009 Posts: 19
|
USB HID library error? |
Posted: Mon Nov 02, 2009 2:15 pm |
|
|
Hi! I've found a strange feature of your usb library:
When I connect my device to computer with Win7 it's always defined by OS.
When I connect it to computer with winXP, it can be defined, and can be not, it depends.
I've tried to rewrite my code on mikroC and use their library, the device is defined everytime I connect it to PC.
But I need some ccs functionality.
I think that it's your usb code error |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Mon Nov 02, 2009 4:41 pm |
|
|
What do you mean with "defined by OS"? What's exactly the error? |
|
|
KT315
Joined: 27 Oct 2009 Posts: 19
|
|
Posted: Mon Nov 02, 2009 5:31 pm |
|
|
Sorry for poor english
In XP:
"USB device was not recognized"... An yellow ballon near to tray.
In device manager I see exclamation sign near hid device icon. |
|
|
KT315
Joined: 27 Oct 2009 Posts: 19
|
|
Posted: Mon Nov 02, 2009 5:56 pm |
|
|
Error code 10
It seems that the device is not recognised when microcontroller clock frequency is other than 48 MHz
I use 20 MHz crystal -> HSPLL -> PLLDIV5 -> CPUDIV# |
|
|
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Mon Nov 02, 2009 10:55 pm |
|
|
Quote: | It seems that the device is not recognised when microcontroller clock frequency is other than 48 MHz | To start off - this is not a "HID library error". I think you're having problems with selecting the right oscillator fuses. The '2455/'2550/'4455/'4550 have an architecture that allows for various different clock speeds while keeping the USB clock at 48MHz.
The USB clock is driven from the primary clock source, which may range from 4MHz to 48MHz, but by a clever use of PLLs and dividers, the USB clock is kept at 48MHz.
Page 24 of the '4550 datasheet shows the oscillator block diagram. The primary oscillator (OSC1/OSC2) is fed to a prescaler which divides the clock down to 4MHz. Naturally, the prescale factor _and_ the crystal frequency (ie Fosc) have to be selected such that (Fosc/Prescale factor = 4MHz). This 4MHz is PLL'ed to 96MHz, divided by 2 to get 48MHz and then used as the USB clock.
The 96MHz is also sent to the PLL postscaler, divided by a suitable factor, and used as the CPU clock.
Fosc may directly be sent to a clock divider and used as CPU clock source.
Also, if the Fosc is a stable 48MHz, it may directly be sent to the USBDIV mux and be used as the USB clock.
The above explanation may sound confusing, but its easy enough to understand if you have the block diagram with you. As long as you chose the right combination of fuses you can use a wide range of crystal frequencies.
Rohit |
|
|
KT315
Joined: 27 Oct 2009 Posts: 19
|
|
Posted: Tue Nov 03, 2009 12:48 am |
|
|
Thanks, but I have already read about this in datasheet. I always read it before I want to create something.
Datasheet says that my device can be low-speed and a speed. As I don't need hi-speed transfer, I want to obtain a low-speed one. I change fuses according to datasheet.
When I use CCS hid library, XP does not correctly recognise device from time to time. There's about 1 error for 5 connections. TOO much.
When I write the same code using mikroC, (the same frequency options, the same descriptor!), there are no errors when i plug the device to computer.
That's why I think there's an error in ccs usb lib. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Tue Nov 03, 2009 1:22 am |
|
|
By mentioning the oscillator frequency point, you suggested yourself insufficient reading of the datasheet and incorrect programming on your side as the most likely reason for the said problem. It must not neccessary be the case.
As a fact, other users (me too) didn't yet experience the problems in the way you described them. Generally, I suggest to use a USB software monitor to clarify what's actually seen by the PC at the USB port. In my opinion, the most common fault in using the USB libaries is blocking the service of USB interface by your application, either by disabling interrupts or not servicing usb_task() longer than tolerated by the USB host. |
|
|
KT315
Joined: 27 Oct 2009 Posts: 19
|
|
Posted: Tue Nov 03, 2009 1:30 am |
|
|
There can be only one point where I can interfere with usb - I've added timer0 interrupt.
I toggles led on and off.
By the way, don't tell me that there can be no errors in ccs! Timer0 DIV_128 and DIV_256 give the same interrupt frequency |
|
|
KT315
Joined: 27 Oct 2009 Posts: 19
|
|
Posted: Tue Nov 03, 2009 1:31 am |
|
|
... for 18f2550 |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Tue Nov 03, 2009 2:36 am |
|
|
I'll be one of the last to say, there are no errors in CCS examples and no compiler bugs. I told, I didn't yet
experience it with the HID driver and suggested a more precise analysis.
I understand, that the question HID library error? intendeds to ask others, if they experienced similar problems.
I didn't (in this particular case). I'm interested to hear, if others did. |
|
|
Ttelmah Guest
|
|
Posted: Tue Nov 03, 2009 3:13 am |
|
|
Start with the following. You talk about 'your HID library'. Understand, this forum, is _not_ CCS. 99% of the people who post here, are nothing whatsoever to do with CCS (one moderator works for the company, but he rarely posts).
Now, the HID library does work, which suggests that there is a problem with the setup you are using for 20MHz, or a specific fault with your compiler version. So, post the following:
Your fuses - you don't say what you are using for CPUDIV. This is vital, since it affects the actual clock used by the CPU, and some timing factors.
Your CLOCK setup line. This too affects the same things.
Your compiler version number - this is in the format x.xxx, and is shown near the top of the .lst file.
Your fault does sound like a basic setup problem, some of the things you have to do to set things up 'right' for the CCS library, are poorly documented, so it is not uncommon to have problems with this.
Best Wishes |
|
|
KT315
Joined: 27 Oct 2009 Posts: 19
|
|
Posted: Tue Nov 03, 2009 8:39 am |
|
|
compiler 4.093
18f2550, Three computers with OS: win7, xp, xp
('bad' means there are more than 1 error device recognition per 5 connections)
20 MHz - HSPLL, USBDIV, PLL5, CPUDIV4 - win7 - good/ xp-bad / xp-bad
20 MHz - HSPLL, USBDIV, PLL5, CPUDIV3 - win7 - good/ xp-better / xp-bad
16 MHz - HSPLL, USBDIV, PLL4, CPUDIV4 - win7 - good/ xp-better / xp-bad
16 MHz - HSPLL, USBDIV, PLL4, CPUDIV3 - win7 - good/ xp-better / xp-bad
16 MHz - HSPLL, USBDIV, PLL4, CPUDIV2 - win7 - good/ xp-good / xp-good But not every packet is accepted by computer (eg I press "a", then release button, and computer doesn't receive terminating null report)
Code: |
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL4,CPUDIV2,VREGEN
#use delay(clock=16000000)
#include <pic18_usb.h>
#include "usb_headers.h"
#include "usb.c"
void main (void)
{
usb_init_cs()
{
while(TRUE)
{
usb_task()
if (usb_enumerated)
{
usb_put_packet(1,buffer,2,USB_DTS_TOGGLE);
}
delay_ms(10);
}
}
} |
|
|
|
Ttelmah Guest
|
|
Posted: Tue Nov 03, 2009 9:13 am |
|
|
You are not posting the corresponding clock lines.
#use_delay.
This is _vital_.
So:
20 MHz - HSPLL, USBDIV, PLL5, CPUDIV4 - win7 - good/ xp-bad / xp-bad
Needs #use_delay(clock = 16000000)
20 MHz - HSPLL, USBDIV, PLL5, CPUDIV3 - win7 - good/ xp-better / xp-bad
Needs #use delay(clock=24000000)
16 MHz - HSPLL, USBDIV, PLL4, CPUDIV4 - win7 - good/ xp-better / xp-bad
Needs #use_delay(clock=16000000)
16 MHz - HSPLL, USBDIV, PLL4, CPUDIV3 - win7 - good/ xp-better /
xp-bad
Needs #use_delay(clock=24000000)
16 MHz - HSPLL, USBDIV, PLL4, CPUDIV2 - win7 - good/ xp-good / xp-good
Needs #use_delay(clock=32000000)
I'd guess that you actually have the #use_delay, left at 48M, which is the default in the CCS example, and in the last case, things are getting 'close enough' to start working.
The value needed is the real frequency the CPU is running at. The CPUDIV fuses, give fuse patterns, corresponding to their number-1, so CPUDIV2, gives the fuse pattern 01. You then look in the data sheet, which shows that if using the PLL, this pattern gives division by 3. Then, 96M/3 = 32M, and this value _MUST_ be put into the clock statement, for the code to work.
The same is true with any of the other compilers. They _all_ require that you either use the settings exactly 'as written', or you _must_ adjust these parameters to match what you are setting. This is not a CCS specific problem.
Best Wishes |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
KT315
Joined: 27 Oct 2009 Posts: 19
|
|
Posted: Mon Nov 23, 2009 4:19 pm |
|
|
Hi!
I had a pause in creating the device, and now I continue... I still have problems with usb recognition on some computers.
That was surprise for me with the clock I need to write:
Quote: | 20 MHz - HSPLL, USBDIV, PLL5, CPUDIV4
Needs #use_delay(clock = 16000000) |
Cause in datasheet is written that microcontroller works on 24 MHz frequency.
So... Now I'm using 20 MHz quartz, this is my code:
Code: | #include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV2,VREGEN
#define __USB_PIC_PERIF__ 1
#device ADC=8
#use delay(clock=32000000)
#include <pic18_usb.h>
#include "usb_headers.h"
#include "usb.c"
|
With this settings my device is successfully recognized by 3 of 4
computers. But problems with one of them make me very sad.
(This computer was bought about a month ago, it's not broken or
something else)
If I use other combinations of plldiv/cpudiv/clock the device is recognized only by one computer.
Please, help me. What should I change to use my device with all computers? |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|