Autor Tema: Dudas USB y 12Mbps  (Leído 43317 veces)

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #75 en: 04 de Septiembre de 2009, 12:41:57 »
jajaja

No es para tanto Pedro, la magia la hace la Sra. Jan Axelson con sus tutoriales mega excelentes.  ;-)
...

la verdadera magia es comprender todo ese chorro de lineas de programación  :D

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #76 en: 04 de Septiembre de 2009, 13:17:53 »
Un tip... en el libro vienen perfectamente explicadas Pedro.  ;-)

Capítulo 10 para obtener un handle al dispositivo HID y Capítulo 13 para leer los reportes. En el 13 se hace mención al ring buffer pero hay que buscar un poco en internet para saber cómo redimensionarlo. Acá arriba ya está cómo importar las funciones de la DLL.

Y lo bueno es que el código viene para Visual Basic o C# 2008... ambos funcionando incluso en la Express Edition.  :mrgreen:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Dudas USB y 12Mbps
« Respuesta #77 en: 06 de Octubre de 2009, 08:12:23 »
Hola muchachos.

Creo que tarde o temprano todos terminamos con este mísmo problema. A uno lo emociona leer 12Mbps, pero de ahí a conseguirlos...un abismo.

Actualmente estoy requiriendo la mayor velocidad posible. Usando modo Bulk, estoy en 5.5kBps. Actualmente mi tamaño de buffer es de 32, y sólo tengo habiltada 1 endpoint. Voy a intentar subirlo a 64 bytes de buffer, y 6 endpoints.

Haciendo pruebas, la mejor relación que he obtenido ha sido enviar paquetes de a 16 bytes por vez, y con una latencia de 3ms. Esto es desde la PC al uC usando la mpusbapi.dll. Estoy transmitiendo "video" a una matriz de LEDs. Por eso es crítica la velocidad. La matriz actual es pequeña(7x80 LEDs) y por ello llego a 50fps actualmente.Pero tengo matrices mas grandes y ya tendré grandes problemas con la velocidad actual.

Cualquier ayuda será bienvenida. Si todo falla tendré que pasar al modo HID como santiago y construir algo desde allí.

Un saludo.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Dudas USB y 12Mbps
« Respuesta #78 en: 06 de Octubre de 2009, 10:16:28 »
Alguno probó con endpoints de tipo isócrono?
Me consta que este tipo de endpoints se usan para transferencias a tiempo real de volúmenes de datos considerables (tramas de audio digitalizado, por ejemplo)...el tamaño de paquete para estos tipos de transferencias pueden alcanzar el Kbyte, a lo que se sumaría el uso de modos ping-pong, uso de varios endpoints para el mismo propósito, etc...
Lo que no se es si los dispositivos MSD, que son un claro ejemplo de velocidad de transferencia , también usan dicho tipo de endpoints.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Dudas USB y 12Mbps
« Respuesta #79 en: 06 de Octubre de 2009, 10:32:19 »
Pues éste, al menos, usa endpoints tipo bulk (página 5) de 64 bytes (página 7):

http://ww1.microchip.com/downloads/en/AppNotes/01189a.pdf

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #80 en: 06 de Octubre de 2009, 12:34:42 »
Bruno, para agilizar el envío de bytes desde los endpoints lo más recomendable es que reescribas las funciones de envío de CCS y hagas las tuyas, así es como solucioné mi problema de envío cada 1ms. CCS pierde mucho tiempo moviendo buffers de aquí a allá, eso ralentiza en sobremanera la preparación de endpoints (overhead processing como alguna vez Pali mencionó).

El segundo problema es que la PC sea capaz de leer todos los datos enviados al PIC sin perder información. Esto es el mayor problema ya que Windows hace mil cosas al mismo tiempo y no hay forma de asegurar que el procesador esté al tanto de los paquetes recibidos por el PIC. Usé código para ejecutar el hilo en tiempo real (System.Diagnostics - Process Priority) pero aún así no logré mejorar.

Usé el modo HID por sugerencia de Palitroquez, pero posteriormente descubrí que Windows contaba con el Ring Buffer y que el HID tenía muchas ventajas. Este ring buffer es llenado por el kernel de Windows y es 100% seguro que no se pierdan paquetes desde el PIC. Lo único que uno debe hacer como usuario es vaciar el buffer antes de que se llene.

Estuve viendo las funciones BULK de la mpusbapi.dll y no encontré una sola que lea de un solo golpe varios endpoints, implicando que entre peticiones de lectura Windows pueda desviar la ejecución del proceso hacia otro proceso acarreando retrasos. Con mi poca experiencia como programador creo que es necesario escribir un driver a nivel KERNEL (tiempo de uso del procesador asegurado) que se encargue de pedir paquetes al PIC y guardarlos en un buffer circular. Posteriormente solo se deberá vaciar el buffer a nivel usuario (tiempo de uso del procesador no asegurado).

Si deseas reescribir las funciones de envío por endpoints BULK hasta 64 bytes para agilizarlas, cuentas con mi ayuda  :mrgreen:

El problema con HID es que el máximo a transmitir es de 64kB/s por interfaz, pero tiene solución... agregar más HIDs por PIC, es decir, más interfaces por dispositivo. De esa forma puedes tener n * 64kB/s de transferencia constante y sonante y n ring buffers para no perder datos y todo con un solo PIC.

Sobre el modo isócrono... tiene la ventaja de enviar datos a velocidades altas y constantes pero tiene una desventaja peor, no hay detección ni corrección de errores... por ello se usa en audio y video para el usuario final. No se usa isócrono en Mass Storage Devices porque no es permitido ni un solo error en esa clase.

El modo Bulk solo transmite datos cuando el bus USB está desocupado, pero si tienes más dispositivos conectados el ancho de banda no será suficiente.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Dudas USB y 12Mbps
« Respuesta #81 en: 06 de Octubre de 2009, 16:43:31 »
Ok. Voy a revisar las funciones del BULK ahora...

Y sería muy bueno escribir una nueva dll que logre velocidades superiores. Seguro que más de uno estaría agradecido de que lo hiciesemos. ;)
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #82 en: 06 de Octubre de 2009, 18:02:40 »
Bueno, el código fuente de la mpusbapi.dll viene en el USB Framework de Microchip (Borland C++ creo). Lo difícil creo que sería escribir código a nivel kernel.

Te puedo ayudar del lado del pic con las funciones de envío pero del lado de la PC habría que estudiar un poco más la dll de microchip.

Desconectado Infernum1001

  • PIC10
  • *
  • Mensajes: 1
Re: Dudas USB y 12Mbps
« Respuesta #83 en: 22 de Octubre de 2009, 15:50:24 »
Saludos! estoy muy interesado en este tema ya que yo mismo estoy haciendo un proyecto con el puerto usb del 18f4550, no entiendo del todo de lo que exponen pero me parece excelente toda la informacion que se ha publicado.

migsantiago sera que puedes publicar el descriptor modificado que hicistes para la transmision a full speed y el codigo del firmware q hicistes para el pic, eso nos ayudaria mucho a entender mas este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #84 en: 22 de Octubre de 2009, 15:53:05 »
Leyendo el tema completo puedes encontrar las modificaciones necesarias.

Desconectado Armando702

  • PIC10
  • *
  • Mensajes: 2
Re: Dudas USB y 12Mbps
« Respuesta #85 en: 23 de Octubre de 2009, 10:29:38 »
Hola a todos! Yo estoy trabajando en un proyecto que tambien tiene que ver con usb, usando unos de los ejemplos de CCS compile un programa para el pic y a traves de easyHID genere un programa en visual basic para el programa en la PC. Veo que necesito modificar las rutinas del descriptor para poder llegar a enviar cada 1ms. Pero por lo que tengo ahora hecho el problema que tengo es que a traves del analizador USB del Proteus me dice que entre un dato y otro los intervalos de tiempo no son constantes, envia cada 10ms, 15ms, 5ms ...

Y en visual basic genero una grafica de la forma que muestro en el archivo adjunto.

Esta en mi rutina para el envio:

   while (TRUE) {
      usb_task();   
      usb_debug_task();
      if (usb_enumerated()) {   
         if (!send_timer) {
            send_timer=0;
            set_adc_channel (0); // Habilitacion del canal 0 del ADC
            delay_us(10);
            usb_out_data[0]=read_adc();
            set_adc_channel (1); // Habilitacion del canal 1 del ADC
            delay_us(10);
            usb_out_data[1]=read_adc();
            set_adc_channel (2); // Habilitacion del canal 2 del ADC
            delay_us(10);
            usb_out_data[2]=read_adc();
            set_adc_channel (3); // Habilitacion del canal 3 del ADC
            delay_us(10);
            usb_out_data[3]=read_adc();
            set_adc_channel (4); // Habilitacion del canal 4 del ADC
            delay_us(10);
            usb_out_data[4]=read_adc();
            set_adc_channel (5); // Habilitacion del canal 5 del ADC
            delay_us(10);
            usb_out_data[5]=read_adc();
       
            usb_put_packet(1, usb_out_data, 6, USB_DTS_TOGGLE);
         }
         if (usb_kbhit(1)) {
            usb_get_packet(1, usb_in_data, 2);
            printf("\r\n--> Received data: 0x%X 0x%X",usb_in_data[0],usb_in_data[1]);
            output_d (usb_in_data[0]);
         }
         send_timer--;
      }
   }
}

Mi pregunta es, a q se debe q el envio de datos sea a intervalos tan diferentes? que es send_timer?

Les agradeceria la ayuda que me podrian brindar!


Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #86 en: 23 de Octubre de 2009, 12:54:16 »
Creo que no has leído el tema completo, ahí está la respuesta al porqué del retraso en los paquetes.

Ah y no es necesario que crees una cuenta nueva para publicar otro mensaje.

Desconectado Armando702

  • PIC10
  • *
  • Mensajes: 2
Re: Dudas USB y 12Mbps
« Respuesta #87 en: 23 de Octubre de 2009, 21:58:42 »
Pues dejame decirte que yo no tengo dos cuentas, de que un amigo mio q esta trabajando en los mismo q yo, alla escrito aqui y yo tambien, no significa q yo alla creado dos cuentas para publicar otro mensaje. Por lo menos se q no cuento con tu ayuda!

Alguien mas q me pueda ayudar!

Desconectado alejandro20

  • PIC10
  • *
  • Mensajes: 5
Re: Dudas USB y 12Mbps
« Respuesta #88 en: 24 de Noviembre de 2009, 07:51:10 »
Hola muchachos, yo también me uno a su dolor porque he intentado también diferentes formas de transmisión del pic  al computador por usb (modo bulk, interrupción, intenté el modo isochronous pero no me funcionó, en clase cdc  y nada, claro que utilizando siempre un solo endppoint out-in) sin lograr resultados de velocidad, la recepción de datos en el compu  la hago con labview 8.5 y el envió desde labview al pic es muy buena, pero en todas los modos de transmisión del pic  a labview siempre ahi una demora ahi fastidiosa.  probé el envio de una señal senoidal de 5v/1hz  utilizando el adc del pic  y luego la envio en modo bulk a la cpu y la visualización en labview  y me la muestra muy distorsionada, nooo  1hz.  Ahora estoy teniendo problema con la clase cdc,  en la misma forma del pic  hacia la cpu  si se demoraba en bulk, en cdc peor!! no se q estoy haciendo mal, este es el codigo q  estoy utilizando pero sin adc , solo  lo que ahi en el puerto  d  que me lo envie a la cpu  y si le envio un byte desde la cpu me lo muestre por el pto b:

# include<18f4550.h>
# use delay (clock=48Mhz)
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,VREGEN,CPUDIV1,PLL5
#include<usb_cdc.h>
#include<usb.h>
#include <pic18_usb.h>
#include <usb_desc_cdc.h>
#include <usb.c>

#byte port_d=0xF83
#byte port_b=0xF81

char dato=0;
   


void main (void){

   
    char data;     

   enable_interrupts(global);
     usb_cdc_init();
    usb_init();
       
    output_b(0X00);
    set_tris_b (0x80);
    set_tris_d(0XFF);
     output_b(0x01);// ENERGY ON
   enable_interrupts(INT_EXT);
   EXT_INT_EDGE(L_TO_H);
   if(usb_enumerated())
     {   output_b(0X02);}
   else
      {usb_wait_for_enumeration();
     output_b(0X02);
                  }
     while (TRUE)
      {    usb_task();
          
          if (usb_cdc_kbhit())
              {port_b=usb_cdc_getc(); }   
         
         dato=port_d;
         if (usb_cdc_putready())
         {usb_cdc_putc(dato);}         
             
   
 }
   }

lo que le envio desde la cpu al pic si me lo muestra rápido pero lo q le envio desde el pic si toma demasiado tiempo,,, no se q hacer por favor ayuda si esta mal algo  en el codigo...  gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #89 en: 24 de Noviembre de 2009, 12:46:39 »
Hola, un consejo... la clase CDC es muy mala en cuanto a velocidades de envío constantes debido a que utiliza printf's y el tiempo de muestreo del endpoint de salida es de 250ms. Los printf consumen mucho tiempo de procesamiento.

Mi recomendación es que uses HID con polling de 10ms en adelante, modificable en el archivo usb_desc_hid.c.
« Última modificación: 24 de Noviembre de 2009, 13:01:20 por migsantiago »