Autor Tema: USB - Ejemplos de microchip - cambiar de interrupción a polling  (Leído 3143 veces)

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

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
USB - Ejemplos de microchip - cambiar de interrupción a polling
« en: 10 de Agosto de 2012, 20:39:37 »
Para que puedas simular los ejemplos de microchip debes cambiar de interrupcion a polling. !

Alguien sabe cual es la causa de que no funcione en modo interrupción el usb cdc en proteus con los ejemplos de Microchip? Es por tema velocidad de procesamiento de mi PC?
Suky de donde sacaste esa información? O llegaste a esa conclusión por horas de vuelo :) Quiero investigar al respecto.
           Estoy estudiando en proteus el ejemplo de microchip "Device - CDC - Basic Demo" con los archivos de la picdemfsusb, utilizando el modo interrupción y sólo pude hacer que me retorne los caracteres que envío desde el hiperterminal al pic. Pero los botones sw2 y sw3 no los procesa y por lo tanto no me manda a la PC la cadena "button pressed".
           Desde el watch windows veo los registros TRISB y ADCON1 que están configurados correctamente como entradas digitales y al pulsar los botones el registro PORTB no refleja ningún cambio. (esto me indica que el programa nunca llega a la función USBCB_SOF_Handler que está en main.c que es la que controla el estado de los botones).-
           

Código: [Seleccionar]

/********************************************************************
 * Function:        void USBCB_SOF_Handler(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        The USB host sends out a SOF packet to full-speed
 *                  devices every 1 ms. This interrupt may be useful
 *                  for isochronous pipes. End designers should
 *                  implement callback routine as necessary.
 *
 * Note:            None
 *******************************************************************/
void USBCB_SOF_Handler(void)
{
    // No need to clear UIRbits.SOFIF to 0 here.
    // Callback caller is already doing that.


    // CAMBIÉ LA LOGICA PARA ADECUARLA A LOS BOTONES DE LOS MÓDULOS IO DIGITALES DE LA ENTRENADORA DE FELIXLS
    // AHORA LA LÓGICA NO ES MAS INVERSA     //This is reverse logic since the pushbutton is active low
   
    if(buttonPressed == !sw2)  // antes sw2
    {
        if(buttonCount != 0)
        {
            buttonCount--;
        }
        else
        {
            //This is reverse logic since the pushbutton is active low
            buttonPressed = sw2; // antes !sw2

            //Wait 100ms before the next press can be generated
            buttonCount = 100;
        }
    }
    else
    {
        if(buttonCount != 0)
        {
            buttonCount--;
        }
    }
}

La única forma de que puedo hacer que los botones funcionen es testeando el estado de los botones dentro de la función ProcessIO, que en defintiva sería como hacerlo por polling. Ya que ProcessIO está dentro del super lazo while(1) dentro de main.


Código: [Seleccionar]
void ProcessIO(void)
{   
    BYTE numBytesRead;

    //Blink the LEDs according to the USB device status
    BlinkUSBStatus();
    // User Application USB tasks
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;




if(sw2) // testeamos RB4.
          {
mLED_4 = 1; // encendemos led 4
          }


    if(sw2)    // antes buttonPressed
    {


        if(stringPrinted == FALSE)
        {
            if(mUSBUSARTIsTxTrfReady())
            {
                putrsUSBUSART("Button Pressed -- \r\n");
                stringPrinted = TRUE;
            }
        }
    }
    else
    {
        stringPrinted = FALSE;
    }

    if(USBUSARTIsTxTrfReady())
    {
numBytesRead = getsUSBUSART(USB_Out_Buffer,64);
if(numBytesRead != 0)
{
BYTE i;
       
for(i=0;i<numBytesRead;i++)
{
switch(USB_Out_Buffer[i])
{
case 0x0A:
case 0x0D:
USB_In_Buffer[i] = USB_Out_Buffer[i];
break;
default:
USB_In_Buffer[i] = USB_Out_Buffer[i]; // MODIFIQUE LA LINEA. ANTES USB_Out_Buffer[i]+1;
break;
}

}

putUSBUSART(USB_In_Buffer,numBytesRead);
}
}

    CDCTxService();
} //end ProcessIO


                          Saludos a todos.
                                                 Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes