Hola a todos! Hace unos días que estoy lidiando con este problema en un proyecto que estoy llevando a cabo usando el PIC2550. Actualmente mi aplicacion realiza algunas mediciones cuyos resultados quisiera pasarlos a la PC. Para transmitir los datos estoy usando el framwork CDC que da microchip.
Tengo configurado mi puerto RC0 para sensar si esta o no conectado el cable USB. El mismo esta conectado a Vusb del cable USB con una resistencia de 100k en serie y otra igual puesta a masa segun se recomienda en la figura 17-11 de la hoja de datos. De esta manera, solo se ingresa al modo usb si esta conectado el cable.
La configuracion anterior esta funcionando, solo entra al modo USB cuando el cable esta coenctado a la PC. La transmision de datos tambien funciona, puedo transferir todo sin ningun problema.
Mi problema esta en que asi como senso la conexion del cable, senso tambien la desconexion del mismo pero no quiere funcionar. Dentro de los metodos del framework, el que se encarga de revisar si esta conectado el cable, es el metodo
USBCheckBusStatus(); . Alli cuando se verifica que el cable no esta conectado, debe deshabilitar el modulo USB y cambiar la variable llamada "usb" (ésto lo agregue yo

) para que ésta se haga cero y abandone el bucle principal del USB y vuelva a mi programa principal. Aqui abajo dejo las partes masimportantes del codigo:
//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...)
........
Como dije arriba esto no funciona. 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.
Espero haber sido claro, si algo no se entendio diganme que tratare de aclararlo lo mejor que pueda. Desde ya muchas gracias! saludos!