TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jorgejg en 05 de Septiembre de 2011, 19:37:05
-
Estoy usando C18, hay alguna forma de que se dispare la interrupción que me indique que ha llegado algún dato por USB? Hed probado con getsUSBUSART pero tendria que estar constantemente leyendo para saber si algo llegó, no hay formas de que se active la interrupción de byte recibido?
-
USB no es como un puerto serial :? Lo más adecuado es llamar con suficiente frecuencia a getsUSBUSART para recibir los datos.
Saludos!
-
Entiendo, entonces leeré constantemente con getsUSBUSART, gracias por todo.
-
tienes el USBIF el cual se activa en muchos casos. Creo que usando el TRNIF podrias detectar cuando llegan datos. el TRNIF te avisa de que una transaccion se ha completado, ahora lees los registros para ver que transaccion es, si es de datos/entrante pues lees los datos.
-
Segun el datasheet el usbif se dispara por varios motivos en cambio el trnif se dispara cuando una transaccion esta completa voy a leer mas esto y probare el trnif luego regreso a comentar los resultados, por el momento usare el cdc por ser relativamente mas facil despues lo hare con el hid.
-
Bueno estuve haciendo varias pruebas pero no parece originarse la interrupción por un byte(s) recibido(s), creo que se dispara en algún momento dado y las librerias usb borran los flags de tal forma que en mi main.c el flag ya viene en 0, y como recien estoy empezando en C no veo donde modificar, si alguien tiene resuelto esto a ver si me da una luz.
-
Tengo lo siguiente en el archivo usb_descriptors.c :
/* Endpoint Descriptor */
//sizeof(USB_EP_DSC),DSC_EP,_EP02_IN,_INT,CDC_INT_EP_SIZE,0x02,
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
_EP01_IN, //EndpointAddress
_INTERRUPT, //Attributes
0x08,0x00, //size
0x02, //Interval
/* Interface Descriptor */
9,//sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type
1, // Interface Number
0, // Alternate Setting Number
2, // Number of endpoints in this intf
DATA_INTF, // Class code
0, // Subclass code
NO_PROTOCOL, // Protocol code
0, // Interface string index
/* Endpoint Descriptor */
//sizeof(USB_EP_DSC),DSC_EP,_EP03_OUT,_BULK,CDC_BULK_OUT_EP_SIZE,0x00,
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
_EP02_OUT, //EndpointAddress
_BULK, //Attributes
0x40,0x00, //size
0x00, //Interval
/* Endpoint Descriptor */
//sizeof(USB_EP_DSC),DSC_EP,_EP03_IN,_BULK,CDC_BULK_IN_EP_SIZE,0x00
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
_EP02_IN, //EndpointAddress
_BULK, //Attributes
0x40,0x00, //size
0x00, //Interval
Creo que tengo definido el Endpoint1 IN pero no tengo el Endpoint 1 OUT tal vez por eso no se da la interrupción?
-
Gracias Mr. xxopiumxx por el apoyo y por el link mas adelante me meteré con el HID entonces. Saludos.
-
Hola muchachos, resolvieron el tema de la interrupción por USB con la clase CDC para C18??
Usando la comunicación con detección por polling anda perfecto, pero me gustaría hacer algo más eficiente!
No quiero pasarme a HID porque me resulta más fácil interactuar con un virtual COM del lado de la PC, ya que tengo muchas cosas funcionando de esa manera y debería mudar todo!!
Muchísimas gracias por sus respuestas!!