Control de dispositivos a través del módulo USB del PIC18F45/2550

:cool: Hola a todos.

Bueno siguiendo con el tema de mpusbapi.dll, veremos como utilizar las funciones usb_put_packet() y usb_get_packet(). Las cuales permiten enviar datos por el usb o recibir datos.
Bien una descripción breve de las mismas es la siguiente:
Código:
usb_put_packet(endpoint,*ptr,len,toggle) // Función completa

Vamos a ver lo que está dentro del parentesis:

1 - endpoint: Buffer de entrada o de salida (son unidireccionales) // Ya lo explique post atrás.
2 - *prt : apunta a la dirección del dato a enviar (es una variable declarada por nosotros).
3 - len: es el tamaño del paquete en bytes. (hasta 64 max)
4 - toggle:  En la parte de transmisión de datos USB, los paquetes de datos se encuentran en grupos de paquetes de datos, y dentro de estos, existen unos llamados DATA0, DATA1. hay un proceso llamado sincronización del data toggle. a grandes rasgos esto no es mas que un método de validación de paquetes, y lo que hace es enviar alternadamente a DATA0 y DATA1 en una secuencia seguido de su ACK respectivo. todo con el objetivo de mantener la sincronización transmisor <-> receptor. ver fig 1 y 2

Sumario de la función: Esta función manda un paquete de datos hacia el host, el tamaño de los paquetes de datos hay que definirlos en el programa.

por ejemplo:

#define USB_EP1_TX_SIZE    1             //  Tamaño del buffer de salida.
#define USB_EP1_RX_SIZE    3             //  Tamaño del buffer de entrada.
 

Adjuntos

  • paquetes_de_datos_100.jpg
    paquetes_de_datos_100.jpg
    32.5 KB · Visitas: 656
  • sincronizacin_de_datos_host_pic_173.jpg
    sincronizacin_de_datos_host_pic_173.jpg
    20.4 KB · Visitas: 689
Ahora para usb_get_packet():
Código:
 usb_get_packet(endpoint, *ptr, max)

el argumento 1: endpoint: es el buffer de datos de entrada, donde llega el paquete de datos.
el argumento 2  *prt: es el apuntador adonde guardaremos ese dato.
el argumento 3 max: es el tamaño de paquete en bytes.


 Siempre hay que llamar a la función USB_KBHIT() , para saber si el buffer de datos está lleno o no. En  caso  de no llamar a la función podríamos recibir datos erroneos.


 Summary: Toma un paquete de datos y lo guarda en una variable previamente declarada.

Bueno esa es la teoría para el lado del PIC , que puedo agrandar a medida que vallan apareciendo dudas.
 
Para que vallan leyendo esta es la hoja de descripción de funciones MPUSBAPI.dll, el autor es slalen del foro todopic.
 

Adjuntos

  • mpusbapidll_descripcin_de_funciones_199.pdf
    103.3 KB · Visitas: 1,273
Buenas, soy nuevito en este foro, quería agradecer por el gran esfuerzo que hicieron por explicar este tema que sinceramente si bien lo comencé a estudiar hace muy poquitos días, se me está haciendo extremadamente complicado de comprender. Programo pics hace más de 10 años para empresas importantes de Argentina y manejo varios idiomas tanto a nivel pic como a nivel software pero no he encontrado una guia concisa como para poder hacer funcionar por ejemplo un PIC como un dispositivo joystick, etc. O es muy complicado el tema o la información está muy mal brindada. De este tema que crearon es de donde he comprendido la mayor cantidad de cosas y si puedo ayudar en algo lo haré ya que la información que me brindaron fue excelente. Saludos
 
Bueno frickito, en lo que podamos ayudarte está bien y bievenido al foro. Mirá el tema del usb embebebido es algo bastante idocumentado por lo que he podido leer hasta ahora. Lo único que he visto más documentado son las notas de microchip y de AVR atmel, pero incluso con esa data se me hace complicado el tema del puerto usb.

Lo de hacer como vos decis que la PC reconozca al pic como un jostick , pendrive , o lo que sea es un tema complejo. Mas que nada por el lado de la programación para el pic. Yo en este momento a parte de los 3 tipos de comunicaciones por usb que he posteado hasta ahora estoy estudiando el protocolo MSD que solo hay código ejemplo en C18.
 
Estimado Moyano, gracias por tu pronta respuesta pero insisto, tratare de reflejar mi duda un poco mas explicita.
Yo escribo el programa de la funcion que deseo realize el PIC en algun compilador (CCS por ejemplo) donde seguramente imagino existen algunas directivas para el uso de la comunicacion USB y que seran usadas segun sea la necesidad de mi programa, una vez compilado el programa, el archivo .hex lo descargo a la program memory del PIC.
Ahora en VisualBasic 6.0 escribo mi aplicacion que deseo que se ejecute en la PC y la cual es la que tendra interaccion con el PIC via el puerto USB, en esta aplicacion es donde se haran las llamadas al file MPUSBAPI.DLL para con ello establecer la comunicacion, pero este archivo DLL que originalmente no esta en windows ni en las utilerias de visual dado que es un file que se descarga del site de microchip, donde rayos lo instalo, grabo, ubico para que visualbasic haga uso de el?

Gracias de antemano y saludos

PD Si estoy en algun error corrigeme.
 
- Con respecto a lo del PIC está bien ahora para usar la librería de microchip , tenés que tener el módulo de funciones , vos dirás que es esto ?. Bueno el módulo de funciones es básicamente lo que me permite trabajar con la librería mpusbapi.dll, es decir tiene todas las funciones que hay que llamar para que la comunicación se establesca. Para incluirlo en tus proyectos tenés que agregarlo.

Ahora una vez agregado tenés que ver cuales son las funciones de dicho móduo(postee un pdf que lo muestra mas arriba) y por último ver como hacer una interfaz gráfica de usuario para mandar o recibir valores desde el disposivo usb (pic)

Te pongo las inmagenes para que veas como se hace. Además te dejo la librería para visual basic.


espero que te sirva
 

Adjuntos

  • agregar_mdulo_155.jpg
    agregar_mdulo_155.jpg
    54.4 KB · Visitas: 793
  • agregar_mdulo_2_291.jpg
    agregar_mdulo_2_291.jpg
    34.6 KB · Visitas: 838
  • agregar_mdulo_3_199.jpg
    agregar_mdulo_3_199.jpg
    11 KB · Visitas: 863
  • libreras_206.rar
    29.3 KB · Visitas: 730
Mi estimado Moyano mas claro ni el agua, agradezco mucho tu ayuda. Por lo pronto leere el documento de las funciones del modulo para entender bien como usarlo
 
Hay algun libro preferentemente en castellano que me ayude a comenzar a entender este tema?, lo único que conseguí es el "USB Complete 3rd edition by Jan Axelson" que si bien parece muuuy completo y tiene 593 hojas estimo que deberia haber alguno mucho más compacto o bien algun tutorial. Les comento que con el Proteus se puede probar todas las interfases USB ya que emula una conexion como si lo conectaramos a un puerto real, genera la conexion, lo detecta y se puede interactuar. Es espectacular ya que me permite probar los proyectos sin tener que armarlos, le cargo el firmware al micro y lo ejecuto. Probé un firmware HID que permite hacer un joystick digital + 3 botones, pero me gustaria poder modificarlo para hacer que me permita ingresar datos analogicos.
 
Mi estimado Moyano he leido por ahi que el driver MPUSBAPI.DLL ha quedado incompatible con Windows Vista, por lo que todo tu trabajo no podria ser aplicable bajo esa plataforma.
Pero existe un archivo denominado WinBus.DLL que viene por default en Windows Vista y que ademas es compatible con Windows XP, has leido algo sobre esto?
Actualmente estoy estudiando que tipos de cambios o adecuaciones habra que hacer (si aplica) para adaptarlo a tu trabajo.

Saludos
 
hola de nuevo,tengo una duda, ?

ya he realizado varios jemplos usando CDC, ahora estoy probando con bulktransfer, utilizo Python para hacer las interfaces graficas y es alli donde tengo el problema.

Yo programo al pic18f4550 con un ejemplo que encontre, donde utilizan usb_init(), usb_task(), usb_wait_for_enumeration() , usb_kbit(), etc, todo se ve que funciona bien, pues al conectar el conector USB me pide el driver, lo instalo y listo, pero cuando con pyton trato de enlistar los dispositivos USB, no me aparece la información del dispositivo PID, VID, etc....

Lo raro es que tengo un mouse y este si devuelve la información del PID, VID etc, tambien tengo un programador USB este igual devuelve esa información cuando se la pido desde PYTHON,

yo he concluido pensando que desde el PIC18f450 no se envia la información, pues el ejemplo no hace eso,

Mi pregunta es, como hago para que el PIC18f4550 envie esa información?
Gracias a sus respuestas,
 
En el programa del PIC ¿cambiaste el VID_PID o lo dejaste como estaba?. Si lo dejaste igual tendrías que incluir el código fuente para ver porque el PIC no envía la información.
 
evvrivas, como te va. Mirá tenés mal configurados los fuses en el archivo rr2_usb_monitor.c
Los vid y pid (vendor id y product id) los envía en la librería rr2_usb_monitor.h, ahora lo que tendrías que revisar es el programa en python del cual yo no se como se usa (solo he usado visual basic). Para mi el error está donde vos intentas llamar a la mpusbapi.dll por eso no podés enviar datos.
 
Un poco acerca de mi y este tema: Hace un par de años realice una pequeña interfaz de extracción de datos y envio de estos a través de USB usando un par de pic's de la familia Pic18Fxxx5, PIC-C de CSS y C#.

En base a lo que he visto en este post, tengo algunos comentarios:
- Si bien es cierto que es un tema muy complicado, no es imposible implementarlo, así que animo.

- Moyano, es buena la información que posteas considero que has realizado un buen esfuerzo, pero no seas tan "explicito", no dejas que los demás traten, busquen y sobre todo lean... No hay que confundir la enseñanza ( o compartir conocimientos con los demas ) con darles todo tan sencillo y evitarles el esfuerzo de usar su cerebro un rato. Además a este ritmo el post se hará eterno, es mejor realizar un ejemplo "completo" y explicar sobre él varios temas, en lugar de uno por uno, los cuales muchas veces son basicos.

- Dudo que desde hace un par de años a la fecha no se hayan creado más proyectos o escrito más acerca este tema... así que lean! Desde mi punto de vista, es la mejor forma de romper las barreras, para todos los aspectos de nuestra vida. Y nos ayuda a ser autodidáctas.

No hay que olvidar que este tema está orientado a gente dedicada a la electrónica, con cierto nivel de conocimientos y habilidades. Si son estudiantes, entonces actuen como tales, no sólo hay que preguntar, también aporten. No es justo que sólo un par realicen todo el trabajo.

Salvo lo anterior, un buen Post.
Ánimo y Éxito a todos en este complicado mundo del USB.
Saludos, los seguire leyendo.
 
Muchas gracias por tu comentario je_aleph, mi método de enseñanza es directo. Acá yo no miro quien es el que lee o deja de leer sino mi objetivo es que aprendan de la forma más facil posible. Ahora el que solamente se deja guiar por mis ejemplos en este post pues yo le aconsejo que investigue ya que yo no entro en profundidad sobre el usb sino que doy una mirada rápida a las funciones de control más relevantes.
El que quiera aprender realmente como es el protocolo de comunicación les recoomiendo comprar un libro como por ejemplo usb complete.
 
Atrás
Arriba