|
|
View previous topic :: View next topic |
Author |
Message |
hyper Guest
|
How to program for device to be used with and without usb |
Posted: Wed Mar 05, 2008 7:29 am |
|
|
Hi all,
I'm trying to create a device using PIC18F4550 which is able to :
- connect to the computer through USB to perform operations
- and also be used without a connection to the computer (as a stand-alone device)
I believe the the function 'usb_wait_for_enumeration()' runs infinitely until the PIC enumerates with the host. So, I cannot enter this function to the program, right?
I've tried using 'usb_enumerated()' to determine whether it has been enumerated or not. However, i have to add a certain delay before 'usb_enumerated()' or else it will always detect it as a stand-alone device. The rough structure of the program is:
//delay for the device to enumerate
delay_ms(3000);
// USB mode
if( usb_enumerated() == 1 )
{
//further codes here
}
// Stand-alone mode
else if( usb_enumerated() != 1 )
{
//further codes here
}
My question is, is there a more efficient solution other than inserting a delay? |
|
|
mskala
Joined: 06 Mar 2007 Posts: 100 Location: Massachusetts, USA
|
|
Posted: Wed Mar 05, 2008 7:54 am |
|
|
I use what's in the CCS examples, a couple 100K resistors from USB power to ground, tapped in the middle and sent to a pin on the PIC. A routine checks that pin for a high to know that you've plugged into USB port. |
|
|
hyper Guest
|
|
Posted: Wed Mar 05, 2008 8:19 am |
|
|
I believe you're talking about USB_CONNECTION_SENSE_PIN ?? I have considered that but wouldn't that only determine whether the PIC's supply voltage is turned on? Because VBUS is pin1 of the USB connecter which is also VCC.
However, I have an external battery to power the PIC and if i'm not mistaken, would also cause a high on VBUS (VCC) although the USB is not plugged in? Please correct me if I'm wrong. |
|
|
mskala
Joined: 06 Mar 2007 Posts: 100 Location: Massachusetts, USA
|
|
Posted: Wed Mar 05, 2008 2:01 pm |
|
|
Yes, you'll need a diode to isolate USB power from VCC while operating from another power source. I don't have it right in front of me, but it's just a $0.20 Schotky diode. |
|
|
hyper Guest
|
|
Posted: Thu Mar 06, 2008 3:21 am |
|
|
Could you please further explain how that would solve the problem? I still don't really get it.
Thanks for the quick replies |
|
|
Ttelmah Guest
|
|
Posted: Thu Mar 06, 2008 3:56 am |
|
|
You have two potential voltage 'sources'. Vusb, and the local Vcc. There are two configurations to deal with:
1) You draw power from Vusb if it is available.
2) You only use local power.
In the former case, what you have to do, is connect the Vusb pin to your local power rail, using a low voltage drop diode (either a schottky diode, or a MOSFET gate).
Then in either case, you feed the voltage at the Vusb _pin_, to your 'sense' input via the resistors. The sense input, only sees a 'high', when this pin has voltage on it (doesn't care what the local rail is doing).
Then in your ''main', you have a loop, with tests like:
Code: |
while (true) {
if (usb_attached()){
if (USB_IS_OFF) {
usb_init();
USB_ON;
}
}
else USB_OFF;
if (USB_IS_ON) {
usb_task();
if (usb_enumerated()) {
LED=TRUE;
}
}
//rest of main code here
}
|
'USB_IS_ON', is a local flag/test, set 'true' by 'USB_ON', and 'false' by USB_OFF.
What then happens, is that if the USB Vusb voltage becomes present, when the USB_IS_OFF (wasn't present before), the USB initialisation code is called. If the USB Vusb is present, and the USB initialisation has occured, the USB_TASK is called. This also handles recovery, if the voltage disappears. In this code, an LED is turned on, when the connection is present, _and_ the system has been enumerated.
Best Wishes |
|
|
hyper Guest
|
|
Posted: Thu Mar 06, 2008 4:24 am |
|
|
Hey,
Thanks for the explanation. I will be trying this out as soon as I can get my hands on the schottky diode. Hope it works. |
|
|
|
|
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
|