Autor Tema: Interrupcion aleatoria del USB en 18F2455  (Leído 1819 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Interrupcion aleatoria del USB en 18F2455
« en: 08 de Julio de 2010, 18:49:53 »
hola a todos, los introduzco en mi problemilla.

Resulta que estoy usando el 18F2455 con el ejemplo que provee Microchip
USB Device - HID - Simple Custom Demo - C18 - PICDEM FSUSB

Al principio estaba trabajando en el modo de comunicación por interrupciones, pero quice probar el modo polling porque estoy haciendo algo con las demas interrupciones, entonces para no afectar a estas es que he decidido hacer la comunicacion por polling.

El tema es que en la rutina de atencion a las interrupciones estoy poniendo unas salidas a led para ver cuando entra y me he encontrado que la interrupcion por el USB se sigue detectando, pero resulta que es aleatoria, es decir, no ocurre con una frecuencia preestablecida, sino que a veces tarda un segundo, otras menos y he contado hasta 20 segundos.

Esto no afecta para nada mi programa, porque lo que hago es ignorarla, pero me ha surgido la duda de donde viene esa interrupción, será algo normal del funcionamiento del USB, me refiero a que será algo como para que cada tanto el host tira la interrupcion y detecta si el dispositivo esta bien?

Como les decia, no afecta al funcionamiento, pero solo por curiosidad si alguien sabe porque pasa esto se los voy a agradecer.

Les pego partesita del codigo para graficar un poco lo que les digo.
Código: [Seleccionar]
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
// Check which interrupt flag caused the interrupt.
// Service the interrupt
// Clear the interrupt flag
// Etc.
mLED_2_Toggle();
if(INTCONbits.TMR0IF)
{
mLED_3_Toggle();
interrupt_flag = TRUE;
INTCONbits.TMR0IF = 0; // Clear interrupt flag
}

if(PIR2bits.USBIF)
{
mLED_4_Toggle();
#if defined(USB_INTERRUPT)
        USBDeviceTasks();
#endif
PIR2bits.USBIF = 0;
}

} // This return will be a "retfie fast", since this is in a #pragma interrupt section

Ademas queria hacer un comentarios/sugerencia, existiría la posibilidad de que se hiciera un sub foro dentro de Microcontroladores PIC que trate esclusivamente la comunicación USB? Les dejo la inquietud a los Administraodres  :mrgreen:
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Interrupcion aleatoria del USB en 18F2455
« Respuesta #1 en: 08 de Julio de 2010, 18:59:54 »
Hola, lo mejor es dejar que se atiendan los eventos USB en el PIC por interrupción. Hacerlo por polling provoca retrasos como los que ya viste.

Básicamente las interrupciones que ocurren y que deben atenderse son para darle mantenimiento al stack usb de paquetes recibidos. Recuerdo vagamente que es un stack de hasta 5 eventos y si se desborda el pic puede desenumerarse.

Mejor déjalo por interrupción, así el rendimiento del pic no se ve desgastado y te olvidas de estar metiendo subfunciones para mantener vivo al usb.

Te comento esto desde el punto de vista del compilador CCS, pero he visto por dentro las librerías USB de C18 y son casi lo mismo, sólo que en CCS lo predeterminado es trabajar por interrupción.