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

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado washi_w_z_r

  • PIC10
  • *
  • Mensajes: 20
Re: Dudas USB y 12Mbps
« Respuesta #45 en: 01 de Mayo de 2009, 14:29:57 »
hola , yo envio datos por cinco canales analog , al recepcionar solo uno en mi prgo en c# vuela como los dioses  :-/ , pero al habilitar cicanales se pone muy lento , por mi parte vi este parrafo en archivo .h

Código: C#
  1. //interface descriptor 0 alt 0
  2.          USB_DESC_INTERFACE_LEN,  //length of descriptor
  3.          USB_DESC_INTERFACE_TYPE,      //constant INTERFACE (0x04)
  4.          0x00,                //number defining this interface (IF we had more than one interface)
  5.          0x00,                //alternate setting
  6.          2,       //number of endpoints, not counting endpoint 0.
  7.          0xFF,                //class code, FF = vendor defined
  8.          0xFF,                //subclass code, FF = vendor
  9.          0xFF,                //protocol code, FF = vendor
  10.          0x00,                //index of string descriptor for interface

en la parte del descriptor , observo lo siguiente :


  2,       //number of endpoints, not counting endpoint 0.

intente aumentar el numero de endpoint hasta 6(contando con el enpoint 0 correspondiente ala descripcion del pic)



  6,       //number of endpoints, not counting endpoint 0.

luego en la parte de :

#DEFINE USB_TOTAL_CONFIG_LEN     32//config+interface+class+endpoint

cambio por:

#DEFINE USB_TOTAL_CONFIG_LEN      88 //config+interface+class+endpoint

todo esto para obtener mayor velocidad en la transmicion de los datos del adc ,eso fue lo que pense ,
compile sin problemas , pero la PC ya no reconoce mi dispositvo, al parecer el driver no me lo permite , asi que volvi a un solo endpoint y envio 10 bytes (particionando los LSB y MSB ya que uso pic18f4458 q soporta USB2.0+12bit ADC), pero bueno hice varias pruebas enviar 50 bytes , 40 bytes ,.... hasta llegar al minimo de 10 bytes , cuando envio mas de 10 bytes si que se pone lento aun no tengo idea del ¿por que? , sera por mi prog en c# , por el cod firmware , aun no lo se , pero aqui le dejo un pantallazo de lo que reciboe ne mi prog en c# , saludos





Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #46 en: 01 de Mayo de 2009, 15:23:21 »
Me parece que el muestreo de la imagen que adjuntas es inestable.

¿Cómo es la señal original que mides en cada canal del pic? ¿Cuánta velocidad has obtenido? ¿Tienes una frecuencia de muestreo mayor a la frecuencia útil de la señal? Es recomendable que sea de hasta 10 veces la frecuencia útil. ¿Das tiempo al canal del pic para que el capacitor sample&hold se cargue?


Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #47 en: 20 de Mayo de 2009, 18:03:13 »
Bueno, después de un retraso inesperado regresé a lo del USB.

Logré mejorar el tiempo de ejecución de la función usb_put_packet de 740us a 570us.  :mrgreen:



Básicamente reduje el tiempo usando constantes de direcciones RAM, eliminé unas rutinas redundantes en las que se hace el toggle del PID DATA0 o DATA1, coloqué el buffer a enviar en el mismo banco de los endpoint USB (banco 5 0x05C0) y quité la opción de enviar 1024bytes por paquete ya que en HID el máximo es de 64bytes.

La función siempre espera a que el endpoint esté disponible (UOWN = 0) para manipularlo, no es como la de CCS que entrega un 0 si no pudo manipularlo. Esta se espera hasta que se puede.

Todavía me falta mejorar el tiempo de otras funciones, pero bueno 170us de ahorro son algo  :D

Descarga usb_fast.h
http://www.4shared.com/file/106692845/cb1ba8bd/usb_fast.html

Para implementarla solo se requiere:
- Solo debe haberse configurado el EP0 y EP1
- Paquete debe ser de hasta 64bytes de largo
- El buffer a enviar deberá iniciar en 0x05C0 (banco 5, usar #locate)
- El PID de la transacción lleva toggle DATA0 y DATA1

El prototipo de la función es más simple:

Código: [Seleccionar]
/*
Librería USB Fast
Santiago Villafuerte
http://www.migsantiago.com
*/

#define STATUS_EP1_IN   0x040C
#define UOWN            7
#define DTS             6
#define CNT_EP1_IN      0x040D
#define ADRL_EP1_IN     0x040E
#define ADRH_EP1_IN     0x040F

////////////////////////////////////////////////////////////////////////////////
//Función put_usb_fast1
//Ejecuta put_usb_packet de forma rápida para el endpoint 1
//
//Requisitos:
//- Solo debe haberse configurado el EP0 y EP1
//- Paquete debe ser de hasta 64bytes de largo
//- El buffer a enviar deberá iniciar en 0x05C0 (banco 5)
//- El paquete lleva toggle DATA0 y DATA1
//
void usb_put_fast_1(int8 *buffer, int8 len)
{
int8 i;
int8 *buffer_ep1;

//Copia la dirección del buffer ep1
buffer_ep1 = *(int16 *)ADRL_EP1_IN;

//Espera a que la SIE deje de manipular el endpoint
while(bit_test(*(STATUS_EP1_IN),UOWN));

//Copia los bytes del buffer al endpoint
//Es recomendable que buffer esté ubicado en las 64 últimas posiciones del
//banco 5 para reducir tiempo entre saltos de banco
for(i=0; i<len; ++i)
   {
   *buffer_ep1 = *buffer;
   ++buffer_ep1;
   ++buffer;
   }

//Indica cuántos bytes de enviarán (no hace falta escribir BC9:BC8)
*(CNT_EP1_IN) = len;

//Invierte el bit de datos de paquete DTS (data toggle sync) y
//activa el envío del endpoint levantando UOWN
if(bit_test(*(STATUS_EP1_IN),DTS))
   *(STATUS_EP1_IN)= 0b10001000; //UOWN=1, DTS=0, DTSEN=1
else
   *(STATUS_EP1_IN)= 0b11001000; //UOWN=1, DTS=1, DTSEN=1
}
////////////////////////////////////////////////////////////////////////////////
« Última modificación: 20 de Mayo de 2009, 18:24:41 por migsantiago »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Dudas USB y 12Mbps
« Respuesta #48 en: 20 de Mayo de 2009, 18:23:23 »
Alguien sabe como hacer una aplicacion CDC que maneje las lineas de control del port serial, ademas de RX y TX ??
Perdon si no es el lugar de consulta, por favor moverlo a donde crean conveniente... :)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #49 en: 07 de Agosto de 2009, 16:56:30 »
migsantiago, eso lo estas haciendo con la mpusbapi.dll ?? Porque ahora que yo lo estoy necesitando (comunicion USB HID en VC# por mpusbapi.dll) no me esta funcionando, ni un byte puedo enviar. Lograste saber porque era esto ??


Gracias, Salu2.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #50 en: 07 de Agosto de 2009, 17:20:12 »
Hola Jeremy

Mi HID no funcionaba porque me faltó modificar correctamente el archivo de descriptores, acá publiqué mi error:

http://www.todopic.com.ar/foros/index.php?topic=25188.msg208502#msg208502

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #51 en: 07 de Agosto de 2009, 17:50:13 »
Estas usando el VC# con la mpusbapi.dll ?? Que es lo que haces entonces en el vc# porque simplemente quiero enviar un byte al pic y que se prenda un led pero ni eso pasa =S no encuentro el error.

Código: [Seleccionar]

#INCLUDE <18F4550.h>
#FUSES XTPLL, PLL1, CPUDIV1, VREGEN, USBDIV, NOMCLR, NOWDT, PROTECT, NOLVP, NODEBUG
#USE DELAY(CLOCK = 48000000)

#DEFINE USB_HID_DEVICE     TRUE
#DEFINE USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT
#DEFINE USB_EP1_TX_SIZE    8 
#DEFINE USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT 
#DEFINE USB_EP1_RX_SIZE    8 

#DEFINE USB_CON_SENSE_PIN  PIN_C2
#DEFINE LED_TEST_1         PIN_A0
#DEFINE LED_TEST_2         PIN_A1

#INCLUDE <pic18_usb.h>   
#INCLUDE "usb_desc_hid.h"
#INCLUDE <usb.c>     

unsigned int8 Recibe[64], Envia[64];

void Main(void)
{
   int16 Cont = 0;

   usb_init_cs();
   
   while (true)
   {
      usb_task();
     
      if (Cont++ > 10000) {output_toggle(LED_TEST_1); Cont = 0;}
     
      if (usb_enumerated() == true)
      {     
         if (usb_kbhit(1) == true)
         {
            output_high(LED_TEST_2);
            usb_get_packet(1, Recibe, 2);
         }
      }
   }
}


La pc reconoce todo bien el dispositivo como hid y lo instala y todo. pero no puedo enviar un misero byte para que se prenda el led_test_2. Cambiando los papeles, aora yo soy el de los problemas con el HID  :D


Salu2

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #52 en: 07 de Agosto de 2009, 19:46:12 »
Jeremy para HID no hace falta usar esa libreria. usa el software de Jan:





se descarga en: http://www.lvr.com/hidpage.htm

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

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #53 en: 07 de Agosto de 2009, 21:48:49 »
Ayaaaaaaaaa... ya entendi. Pense que cuando migsantiago mencionaba al GenreHID en el post al que memando, se referia a esos programas que es para ver lo que pasa en las comunicaciones usb. Por eso creia que no lo habia solucionado (almnos no con la mpusbapi.dll)

Pero bueno, al parecer con esto lo tengo tb solucionado. Ahora a investigar todo lo que hace y ajustarlo deacuerdo a lo que necesito.

Gracias Pali y migsantiago.
Salu2.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #54 en: 07 de Agosto de 2009, 23:15:36 »
Exacto, usé la librería de Jan Axelson.

Nunca pude usar HID con mpusbapi.dll.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #55 en: 08 de Agosto de 2009, 02:15:36 »
Nunca pude usar HID con mpusbapi.dll.
Nadie hombre. He estado buscando info en el foro, en san google y nada, no he encontrado nada. Tan dificil o algo asi es xD!


Salu2

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #56 en: 08 de Agosto de 2009, 03:07:32 »
Porcierto, sabes donde en esa libreria en VC# modifico para enviar más o menos bytes? Porque por default (nose donde) esta en 3, almeenos asi me lo muestra cuando hago:
Código: [Seleccionar]
MessageBox.Show(MyHid.Capabilities.OutputReportByteLength.ToString());


Gracias, salu2.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #57 en: 08 de Agosto de 2009, 11:55:13 »
No depende de VC# el tamaño de los reportes, depende de cuántos bytes el PIC les dé.

Código: [Seleccionar]
     0x75, 8,        // Report size = 8 (bits)
      //0x95, 2,        // Report count = 16 bits (2 bytes)
      0x95, 64,        // Report count = 64 bytes (MODIFICACION)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      //0x95, 2,        // Report count = 16 bits (2 bytes)
      0x95, 8,        // Report count = 8 bytes (MODIFICACION)
      0x91, 2,        // Output (Data, Var, Abs)
      0xc0            // End Collection

Checa tu archivo .h de descriptores. Si te salen 3 es porque se agrega un byte al inicio de los reportes y solo son 2 los que has declarado.

En el caso de arriba, el input report será de 65 bytes y el output deberá ser de 9 bytes. El primer byte de ambos es como un identificador de reporte que aún no entiendo pero que debes dejar en 0x00, sin que afecte tus I/O de datos.

Puedes usar este software para verificar el tamaño de reporte de tu pic:

SimpleHIDWrite3.zip
http://www.lvr.com/hidpage.htm
« Última modificación: 08 de Agosto de 2009, 12:03:19 por migsantiago »

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #58 en: 08 de Agosto de 2009, 16:24:38 »
Eso lo supe por algun post anterior qe pusiste. Y lo hice asi tb, puse a los dos en 64 bytes (el maximo) y por el lado de la PC el:
Código: [Seleccionar]
MessageBox.Show(MyHid.Capabilities.OutputReportByteLength.ToString()); me seguie mandando 3 nomas =S

Gracias, seguire probando.
Salu2

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #59 en: 08 de Agosto de 2009, 17:40:17 »
Veo inconsistencias en tu código... mencionas que en el descriptor ambos endpoints son de 64 bytes, pero en el main.c declaras los endpoints de 8 bytes y en la petición de datos pides 2 bytes  :z)

Código: [Seleccionar]
#DEFINE USB_HID_DEVICE     TRUE
#DEFINE USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT
#DEFINE USB_EP1_TX_SIZE    8 
#DEFINE USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT 
#DEFINE USB_EP1_RX_SIZE    8

Código: [Seleccionar]
usb_get_packet(1, Recibe, 2);