Autor Tema: Duda PIC USB  (Leído 6349 veces)

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

Desconectado cabflip

  • PIC10
  • *
  • Mensajes: 12
Duda PIC USB
« en: 07 de Mayo de 2013, 13:50:30 »
Hola gente, soy nuevo en el foro y estoy acá porque ya no se a quien mas recurrir!  :5]

Una empresa me encargo un proyecto USB, yo les dije que no tenia ni idea sobre el tema a lo que me contestaron que no importaba, que querían que lo haga yo, que averigüe... ja!
No quiero molestarlos con todo el resto del programa porque es largo y solo tengo problemas en la transmisión. El tema es el siguiente, con un PIC18F4550 y un xtal de 20Mhz, necesito transmitir 250KB en un segundo, que son repetidas mediciones de una plancha de 48x48 sensores, que ya están guardadas en la memoria del micro. Para probar la TX con la PC me base en el proyecto de http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php, el cual me anduvo sin problemas... excepto que solo lograba transmitir al rededor de 50kb en un segundo... demasiado lento para lo que necesito.
El programa lo hice en CCS y utilice el hyperterminal para recibir el los datos en la pc. Como podrán ver en el cogido a continuación, mi idea fue mostrar los datos en forma de tabla, 48 columnas, 48 filas y transmitir 50 veces la plancha, que es mas o menos lo que necesito. Una vez que envio las 50 planchas hace titilar un led que se encuentra en el PIN C0.
El circuito es TAN SIMPLE COMO ESO, transmite por USB y en el pin C0 hay un led, nada mas.

Este fue el codigo que utilice, basado en el proyecto de picmania:

Código: [Seleccionar]
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#include ".\include\usb_cdc.h"


void main() {
   BYTE columna,fila,plancha;
   output_high(PIN_C0);
   delay_ms(300);
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}
   output_low(PIN_C0);
 
 
   while (TRUE) {   
    for(plancha=1;plancha<=50;++plancha){
      for(columna=1; columna<=48;++columna){
         printf(usb_cdc_putc, "\r\n");
         for(fila=1; fila<=48; ++fila) {
            printf(usb_cdc_putc, "%2x" fila);
            printf(usb_cdc_putc, " ");
           
         }
      }printf(usb_cdc_putc, "\r\n\n Plancha: ");
       printf(usb_cdc_putc, "%2x" plancha );
       printf(usb_cdc_putc, "\r\n");
    }   

    while (TRUE)
      {output_toggle(PIN_C0);
      delay_ms(500);}

   }
}

Estaria muy agradecido si me pudieran ayudar con este problema!

Saludos!

Facundo

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Duda PIC USB
« Respuesta #1 en: 09 de Mayo de 2013, 14:05:27 »
Tu led nunca va a tildar porque el 1er while nunca termina.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #2 en: 09 de Mayo de 2013, 18:46:18 »
Hola.

Lamento decirte que en el modo en el que te estás comunicando, el máximo es de 64KBps por endpoint. Podrías intentar enviar mediante 4 endpoints la información, e intentar de esa manera llegar a los 256KB, o vas a tener que usar el oscuro y tabú modo Isócrono. Yo he implementado comunicación isócrona, pero con microcontroladores ARM, y he logrado velocidades de hasta 1023KBps con un sólo endpoint.

Saludos.
"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 jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Duda PIC USB
« Respuesta #3 en: 09 de Mayo de 2013, 18:52:51 »
Buno, el modo bulk no es mas rápido que el cdc?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #4 en: 09 de Mayo de 2013, 19:02:43 »
El máximo de la especificación full speed(12mbps que es el que tienen esos uC) si no recuerdo mal, es de 64 bytes por milisegundo por endpoint, máximo( <= 64KBps). El bulk es el peor de todos, porque es el que tiene menor prioridad. Cualquier otro dispositivo conectado al bus va a tener más o al menos igual prioridad para intercambiar datos.

Saludos.
"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 jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Duda PIC USB
« Respuesta #5 en: 09 de Mayo de 2013, 20:14:52 »
Mmm pense que el hid era el peor de todos, pues el bulk requiere de driver.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #6 en: 09 de Mayo de 2013, 20:20:56 »
El HID tiene tiempo de entrega garantizado, el bulk no. Igualmente el HID puede requerir de driver también, todo depende del descriptor.

Saludos!
"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 jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Duda PIC USB
« Respuesta #7 en: 10 de Mayo de 2013, 01:50:25 »
Si bueno, todo seria cuestion de pruebas. Yo realice algunas pero sin finalizarlas, andaba habilitando mas endpoints en modo bulk. Y bueno, como bien dices, el modo isocrono es un tabu en los pic, aunqe se que podria llegar algun bit defectuoso en este modo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #8 en: 10 de Mayo de 2013, 12:42:51 »
Si, en modo isócrono no hay verificación de integridad de paquete y por lo tanto tampoco reintento de envío automático. Pero siempre podés vos implementar un CRC o simil para verificar la integridad del paquete, si es que te hace falta. En mi caso como es un stream de video, si un valor falla, pues no es tan grave.

Saludos.
"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 cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #9 en: 14 de Mayo de 2013, 22:25:16 »
Tu led nunca va a tildar porque el 1er while nunca termina.

Este programa ya anduvo, el led titila porque esta adentro del while, solo que el programa lo dejo estancado ahi porque no necesito que haga nada mas una vez que envio la plancha.

Saludos

Desconectado cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #10 en: 14 de Mayo de 2013, 22:33:54 »
Hola.

Lamento decirte que en el modo en el que te estás comunicando, el máximo es de 64KBps por endpoint. Podrías intentar enviar mediante 4 endpoints la información, e intentar de esa manera llegar a los 256KB, o vas a tener que usar el oscuro y tabú modo Isócrono. Yo he implementado comunicación isócrona, pero con microcontroladores ARM, y he logrado velocidades de hasta 1023KBps con un sólo endpoint.

Saludos.

Okey, la verdad es que empece a mirar el tema este del usb hace unas semanas y todavia me cuesta manejar algunas cosas, sobre todo porque no logro encontrar alguna pagina o algun ejemplo que me explique bien como utilizar el metodo bulk, diferentes endpoints y todo lo que necesitaria para al menos conseguir unos 250kbps. No tenes algun link o algun programa donde pueda mas o menos entender como establecer una buena comunicacion con la menor perdida de datos posible?

Gracias! Saludos

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Duda PIC USB
« Respuesta #11 en: 15 de Mayo de 2013, 05:43:43 »
Tienes razon, tus llaves me confundieron xD

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #12 en: 15 de Mayo de 2013, 10:59:32 »
Hola.

Lamento decirte que en el modo en el que te estás comunicando, el máximo es de 64KBps por endpoint. Podrías intentar enviar mediante 4 endpoints la información, e intentar de esa manera llegar a los 256KB, o vas a tener que usar el oscuro y tabú modo Isócrono. Yo he implementado comunicación isócrona, pero con microcontroladores ARM, y he logrado velocidades de hasta 1023KBps con un sólo endpoint.

Saludos.

Okey, la verdad es que empece a mirar el tema este del usb hace unas semanas y todavia me cuesta manejar algunas cosas, sobre todo porque no logro encontrar alguna pagina o algun ejemplo que me explique bien como utilizar el metodo bulk, diferentes endpoints y todo lo que necesitaria para al menos conseguir unos 250kbps. No tenes algun link o algun programa donde pueda mas o menos entender como establecer una buena comunicacion con la menor perdida de datos posible?

Gracias! Saludos

Si eliges el bulk, ten cuidado porque como he dicho previamente, el bulk no tiene tiempo de entrega asegurado. Es decir que no se hará el mayor esfuerzo posible en intentar enviar la información rápidamente, sino que se le dará prioridad antes a cualquier otro dispositivo HID, Isocrono, etc.

RedPic ha generado un contenido muy completo de algunas clases del USB, entre ellas el Bulk:

http://picmania.garcia-cuervo.net/usb_0_desencadenado.php

El problema no es la pérdida de datos. El problema es que el USB Full Speed(12Mbps), que es el de mayor velocidad que soportan estos micros, tiene un límite de 64kBps en cualquiera de sus modos: Bulk, HID, CDC, etc. El único que se sale de eso es el Isócrono, que permite hasta 1023kBps.
En el foro de Microchip he visto gente que ha implementado Isócrono en PIC, claro que usando el compilador de Microchip, no el CCS.
"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 cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #13 en: 21 de Mayo de 2013, 14:19:35 »
Citar
Si eliges el bulk, ten cuidado porque como he dicho previamente, el bulk no tiene tiempo de entrega asegurado. Es decir que no se hará el mayor esfuerzo posible en intentar enviar la información rápidamente, sino que se le dará prioridad antes a cualquier otro dispositivo HID, Isocrono, etc.

RedPic ha generado un contenido muy completo de algunas clases del USB, entre ellas el Bulk:

http://picmania.garcia-cuervo.net/usb_0_desencadenado.php

El problema no es la pérdida de datos. El problema es que el USB Full Speed(12Mbps), que es el de mayor velocidad que soportan estos micros, tiene un límite de 64kBps en cualquiera de sus modos: Bulk, HID, CDC, etc. El único que se sale de eso es el Isócrono, que permite hasta 1023kBps.
En el foro de Microchip he visto gente que ha implementado Isócrono en PIC, claro que usando el compilador de Microchip, no el CCS.

Es que estuve revisando mucho el material subido por RedPic, el problema con el método bulk es que no conseguí hacer andar el driver, al menos no en mi PC (tengo Windows 7 de 64bits, capaz sea por eso) por lo que no pude ni enumerar el pic. Busque drivers para el metodo bulk, para win 7 de 64bits pero no me anduvieron.
No hay alguna forma de habilitar mas endpoints para el metodo CDC? Para hacer como vos decís de lograr 256KB/s.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #14 en: 21 de Mayo de 2013, 14:31:46 »
Raro lo del driver. Podrías bajarte el "Microchip Solutions" de la página oficial de Microchip. Allí dentro viene, entre otras tantas cosas, el último driver que debería ser compatible con x86 y x64. Si usas HID con descriptores que no se salgan de lo estándar, no requieres drivers para nada.

Por otro lado, deberías poder agregar endpoints y/o interfaces a gusto. Lamentablemente CDC es uno de los que menos he usado, y sólo para lograr un conversor USB a RS232. Lo que puede complicarse luego es la recepción de los paquetes por varios endpoints, pero si eres organizado y puedes identificar correctamente cada parte, seguramente lograrás reconstruir los datos en la PC.
"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.


 

anything