//Bucle principal para USB
void main_USB(void)
{ usb = 1;
InitializeSystem();
while(usb)
{
USBTasks(); // USB Tasks
ProcessIO(); // See user\user.c & .h
}//end while
}//end main
void USBCheckBusStatus(void)
{
/**************************************************************************
* Bus Attachment & Detachment Detection
* usb_bus_sense is an i/o pin defined in io_cfg.h
*************************************************************************/
#define USB_BUS_ATTACHED 1
#define USB_BUS_DETACHED 0
if(usb_bus_sense == USB_BUS_ATTACHED) // Is the USB cable attached and the
{ // host actively driving Vbus high?
if(UCONbits.USBEN == 0) // Is the module off?
{
USBModuleEnable(); // When Vbus is high, it is okay
}
} // to turn on the USB module.
else
{
if(UCONbits.USBEN == 1) // Is the module on?
{
USBModuleDisable(); // If it is on, disable it
usb = 0; // so that the D+ or D- pull
} // up resistor no longer sources
// current onto D+ or D-.
// Note: You may get an "expression is always
// true" warning in some configurations.
// Ignore this warning, everything is ok.
}//end if(usb_bus_sense...)
........
De la unica manera que detecta la desconexion del cable es si pongo a tierra el pin D+ o puenteo el capacitor que va desde el pin Vusb a masa. El sistema esta alimentado a baterias, usa dos en serie para tomar el punto medio como masa y tener +-9V(que con reguladores llevo a +-5V).
Estoy seguro que es un problema de referencias, ya que si en vez de baterias uso una fuente externa conectada a tierra, todo anda de mil maravillas; y si por ejemplo uso la misma fuente pero con una laptop sin el cargador deja de funcionar. Las masas del cable USB y mi plaqueta estan unidas.
Cuando pones a tierra D+, en realidad el pic no detecta la desconexión del cable. Lo que sucede es que el pic y el host detectan un error en el bus y mejor cierran la comunicación USB.Esto seria aun cuando haya desconectado el cable? yo lo desconecto y toco ya sea con un cable o apoyo el dedo sobre el pin D+ en la ficha hembra USB y desconecta.
Sobre tu problema, pareciera que hay un capacitor entre C0 y algún otro punto, el cual almacena voltaje y mantiene en 1 el pin. Por ello talvez no se apaga el USB.Cuando desconecto el cable, directamente medi si C0 tiene tension y no tiene. Aun asi, forzando el puerto a masa tampoco se apaga el modulo.
hace ya un tiempito que vengo trabajando con esto del USB y el 18F2455 y la verdad no me he puesto a ver el tema de detectar la conección o desconección.
Para hacer el circuito me he guiado en la Documentación de la PICDEM FS USB DEMO BOARD, y en el esquematico de la pagina 28 del documento 51526b.
http://ww1.microchip.com/downloads/en/DeviceDoc/51526b.pdf
Lo que dices del uso de baterias y las tierras la verdad que me genera dudas, voy a investigar un poco y cualquier cosa te comento.
Ahora se me ocurre, imagino que las baterias las usas porque tienes un amplificador operacional, has pensado en reemplazar las dos baterias con alimentación desde la PC con un cable desde los 12V? Y hacer una fuente con los dos niveles que necesitas de -6V y +6V.
Aqui tienes un circuito simple con un LM380, http://www.aaroncake.net/circuits/vinvertr2.asp
aja, imagino tu aplicación como que fuera un datalogger, por decirlo asi, un acelerometro que pones en la bicicleta, sales y recorres un tramo, luego vuelves y lo conectas a la PC y bajas esa informacion para procesarla.
Tonces lo que necesitas es que cuando lo enchufes entre en el modo usb solamente, me fijare si por ahi veo algo.
Por lo del tema de ruido, he hecho el circuito en mi placa segun la info de la PICDEM y nunca he tenido problemas, pero quizas como dices al usar esas baterias puede que sea el origen, aunque lo dudo porque las baterias no son fuente de ruido.