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

que tal amigo jonathan moyano , pues estoy de acuerdo contigo pienso que el trabajo ha sido muy bueno y ademas pienso que si hay alguien que solo se ha dedicado a copiar los ejemplos "y pienso que los hay" no tienen el privilegio de decir que estudian :LOL: electronica :LOL: .

asi que invito a que si hay alguien que leyo o leera el foro se manifieste y nos cuente sus cosas , para mejorar entre magnfivo post que tanto nos ha ayudado
 
evvrivas dijo:
adjuntare el ejemplo para que vean, la verdad soy un poco nobato en esto de USBPIC pero hay va el ejemplo que uso, y el driver. este ejemplo lo encontre en esta direccion, mirala bien para ver donde es que el microenvia a la PC el PID y el VID, ojala me puedan ayudar

http://picmania.garcia-cuervo.com/USB_1_BulkTransfers.php

que tal evvrivas , tampoco he manejado python pero pienso que la forma mas facil de saber si el dispositivo se encuentra bien es mirar si lo reconocio en el administrador de dispositivos y si es asi alli encuentras el vendor y el id , de porque no te sale en python no sabria decirte
 
hola amigos de nuevo, yo he realizado aplicaciones realizadas con python y por el puerto serial,
Hoy por hoy estoy utilizando python para realizar un osciloscopio con el pic18f4550 y por medio del USB
He averiguado que existen 3 formas de comunicarme via usb
1 creando un com virtual ( siento que no tiene chiste pues se desperdician capacidades de velocidad del protocolo USB, )
2 interfase HID (dispositivo de interfase humana, que creo que es mas lento )
3 Bulk transfer, que creo que seria lo mas optimo y es lo que yo quiero implementar

pero ahorita tengo problemas no se si con Python o con el pic, seguire investigando para averiguar que es lo que pasa

La cosa es que ahorita mejor realizare el proyecto emulando la comunicacion serial con un com virtual, pues asi avanzare en el proyecto, seguire investigando bulktransfer para luego cambiar los firmware y software y drivers.

cualquier cosa en la que pueda ayudar ayudare.

volviendo a mi problema.

a) en que parte del firmware del pic se envia la información a la PC sobre los PID y los VID ?
b) sera que en python debo de cargar la libreria mchpusb.dll y ocupar las funciones que en ella estan?, pero en python hay un programita que corro y este si enumera los dispositivos usb conectados, incluso un pic18f2520 que esta en pickit2? y para esto no he cargado ningun driver o dll
c) porque si obtengo los PID y los VID de otros dispositivos conectados a la PC..
d) alguien ha obtenido estos valores ¿como lo has hecho en tu programa?
 
Hola evvrivas, mirá como te dije anteriormente no conosco el python. Solo se Visual Basic 6.0 y estoy tratando de aprender Visual C#.

En los últimos días he tenido algunos problemas tanto con HID como con mpusbapi.dll.

Con mpusbapi.dll, el programa me manda mensajes de error al ejecutar el programa.

Con HID, el programa de aplicación me manda errores al intentar leer datos desde el dispositivo, pero puedo escribir datos perfectamente.

Las posibles respuestas a tus problemas:

1 - El VID y el PID son identificadores del dispositivo USB. (En este caso el PIC18F2550), bien ahora el pic si lo programás en C de CCS , los identificadores o descriptores USB lo vas a encontrar en la libreríausb_desc_cdc.h
en caso de que utilizes el protocolo CDC.

Acá te muestro donde define los descriptores:
Código:
   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==0
         0x01, //the constant DEVICE (DEVICE 0x01)  ==1
         0x10,0x01, //usb version in bcd  ==2,3
         0x02, //class code. 0x02=Communication Device Class ==4
         0x00, //subclass code ==5
         0x00, //protocol code ==6
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
         08,0x04, // Vendor id de microchip ! acá le dice que le está conectando un PIC.
         0x0B,0x00, // Product id de microchip !
         0x00,0x01, //device release number  ==12,13
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==14
         0x02, //index of string descriptor of the product  ==15
         0x00, //index of string descriptor of serial number  ==16
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==17
   };

Ahora en esta parte describo mi identificador , este identificador le dice a la máquina por ejemplo: El fabricante del firmware. En esta parte le puedo poner cualquier cosa siempre y cuando respete ciertos parámetros.


//the offset of the starting location of each string. offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
char USB_STRING_DESC_OFFSET[]={0,4,12};

char const USB_STRING_DESC[]={
//string 0
4, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
0x09,0x04, //Microsoft Defined for US-English
//string 1
8, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'C',0,
'C',0,
'S',0,
//string 2
24, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) // Mi descriptor personalizado.
'C',0,
'D',0,
'C',0,
'_',0,
'U',0,
'S',0,
'B',0,
'_',0,
'P',0,
'I',0,
'C',0,

};

#ENDIF


Ahora las reglas de las cual hablaba era por este numero: 24, //length of string index

La formula general para generar nuestro propio descriptor es la siguiente:

Por ejemplo mi descriptor quiero que sea: Osciloscopio_USB
Contamos los caracteres que ocupa: 16 caracteres en total.

Formula del descriptor: (numero de caracteres del descriptor + 1) * 2 = (numero) //length of string index

Ejemplo aplicado:
Código:
//the offset of the starting location of each string.  offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
char USB_STRING_DESC_OFFSET[]={0,4,12};

char const USB_STRING_DESC[]={
   //string 0
         4, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         0x09,0x04,   //Microsoft Defined for US-English
   //string 1
         8, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'C',0,
         'S',0,
   //string 2
         34, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) // Mi descriptor personalizado.
         'O',0,
         's' ,0,
         'c' ,0,
         'i'  ,0,
         'l'  ,0,
         'o' ,0,
         's' ,0,
         'c' ,0,
         'o' ,0,
         'p' ,0,
         'i'  ,0,
         'o' ,0,
         '_' ,0,
         'U' ,0,
         'S' ,0,
         'B' ,0,
};

#ENDIF

2 - En python para poder usar la mpusbapi.dll proporcionada por microchip tenés que hacer llamadas a sus funciones para poder intercambiar datos con el host de lo contrario la PC no se va a poder comunicar con el PIC.
(A mi me están fallando las llamadas a la dll desde vb 6.0).

3 - Que obtengas los vid y pid no significa que la PC necesariamente "sepa" como comunicarse con tu dispositivo. Para esto tenés que usar drivers que se encuentran dentro de los archivos .dll. El vid y el pid de un dispositivo tambien lo podés ver desde un visor de eventos del puerto usb. Asi como los paquetes de datos que salen y entran del puerto.

4 - El vid y el Pid no los he obtenido , me los da en el archivo de descriptores que explique más arriba.

Espero esto solucione tus preguntas o al menos una parte de ellas.

Cualquier cosa preguntá.
 
si eso lo entiendo, ahorita estoy trabajando con python y la dll para ver pq no me puedo comunicar, al hacerlo les informaciónrmare cual era el error,

Yo les recomendaria que utilizen python,porque es muy sencillo de aprender simple para escribirlo y muy potenete, animense yo les ayudare
 
El tema me interesa bastante, porfa la información a mi tambien me la puedes mandar, imagino que si se puede por visual tambien se podra en matlab añadiendo los flujos de conexion en los com por medio de la funcion serial('COM1')
estoy haciendo mi tesis por puerto serial pero seria bueno por USB
 
Toda la información que necesites sobre usb la vas a encontar leyendo el tema completo. Ahora sobre como se hace en matlab no lo se. En labview te puede ayudar jokelnice que está trabajando en ese entorno. Yo solamente se Visual Basic 6.0 y algo de visual C# 2008.

Te repito cualquier duda sobre usb decime y tratamos de ayudarte.
 
Saludos a todos los integrantes del Foro.

He encontrado por fin después de tanto buscar información valiosa para intentar
aprender acerca de la comunicación USB con micros, y por ello agracezco a todos
los que participan aquí.

Gran parte de la experiencia que tengo en PICs es en ASM, y C es un lenguaje que
trato de aprender a pocos pasos. Sin embargo he estado cachareando con los post
que se han publicado aquí, y me ha gustado.

De este corto conocimiento, me he puesto a la tarea de tratar de hacer un programa
que permita comunicarme desde el PC con un micro de la familia 16Fx por USB, usando
el PIC18F2550 como puente, para poder usar computadores que no tengan puertos COM
con las aplicaciones que ya tengo en ASM en estos PICs, mientras aprendo mejor la
programación en C del PIC18F2550.

Basado en el primer ejemplo posteado intenté conseguir mi objetivo modificando parte
del programa, de lo que resultó el que anexo más adelante.

Sin embargo a la hora de probarlo no funciona, y como no se de que manera se manejan
interrupciones en C, tomé como ejemplo las bases del manual, pero como no hay códigos
en concreto que ejemplifiquen al usuario, no se si esto sea correcto.

Ah!, otra cosa. Vi que también han trabajo con el protocolo HID, el cual toqué
alguna vez con el MicroCodeStudio, pero no fue lo que esperaba. No se si sea mucha
molestia, pero quisiera pedirle el favor a Moyano si fuese tan amable de proveerme
el código de PC de los ejemplos que ha hecho sobre HID para VB 6.0, porque la verdad
no se manejar VS 2005 (estuve averiguando y parece que cambian muchas cosas), para
ver si puedo meterle la ficha a aprender acerca de este que tiene algunas ventajas
de simpleza con respecto al Bulk Transfer, ya que no se necesita instalar drivers,
lo que para nosotros puede parecer sencillo, pero como desarrollo material educativo
no quiero que los usuarios entren en estos pasos tan complejos, y simplemente sea
Plug-and-Play.

Agradezco cualquier ayuda que me puedan brindar.
 

Adjuntos

  • comm_usb_998.zip
    58.3 KB · Visitas: 566
Moyano Jonathan dijo:
Muchas gracias meta, lo que se de visual C# es lo que posteaste de ese manual , aunque ahora estoy tratando de crear e incorporar una clase a un proyecto de visual C#.

Para crear una clase en el mismo proyecto, vete arriba en la barra de herramientas y pulsa... "Proyecto-->Agregar Clase" y esta clase te pedirá un nombre y se agrega al proyecto.
 
Vi tu código quimcri , pero no se porque no te funciona en una de esas tenés algo mal en el firmware.
Para el tema de HID si no me equivocó en post anteriores fijate bien , porque creo que postee los dos que tenía.

Para meta: Bien hasta ahora lo de agregar la clase me salió , pero cuando quiero meter la dll al proyecto como hago? Es decir primero quiero definir las funciones en la clase pero he probado añadir la clase sin la librería y me dá error. Por eso me gustaría saber como es el tema del llamado a las librerías.

Para todos los usuarios:

He tenido problemas con los ejemplos que he estado desarrollando para mpusbapi.dll y HID ambos me están dando problemas en la programación bajo visual basic 6.0. Si alguien tiene ejemplos de recepción de datos en HID y cualquier ejemplo de comunicación con la mpusbapi.dll

Gracias por su ayuda y cualquier cosa que necesiten diganme haber si la podemos resolver.
 
Otra cosa, tengo pensado hacer una controladora de 3 motores paso a paso mediante las plataformas Visual Basic 6.0 y Visual C# 2008. El que quiera apuntarse al proyecto valla largando ideas yo por lo pronto lo voy a ir diseñando y posteando los avances a medida que lo valla haciendo.
 
Hola buenas, tras leer muchos post, tengo una duda, principalmente programais todo mediante CCS, mi preguntas son:

1 ¿se puede hacer mediante c18 de microchip?
2 en caso que si... ¿poque ustedes no lo hacen?
3 en caso que si... ¿que ventajas o inconvenientes hay?

todo esto lo pregunto porque he buscado los archivos .h para el c18 para utilizar el USB y no los encuentro.

Muchas gracias de antemano. Un saludo
 
Hola como andas proyectista:

1 - Si se puede hacer por C18 , pero no es el lenguaje que domino.
2 - Yo personalmente no lo hago en C18 ya que como dije anteriomente no es el lenguaje que uso y los demás participantes del foro están familiarizados con el C de CCS.
3 - Las ventajas que hay son las siguientes al usar C de CCS:

- Código más optimizado que en C18
- Más información en la red en lenguaje español.
- Más códigos de ejemplo
 
como estan , jonathan , proyectista , pùes yo tampoco se de C18 , pero ahora que sale a relucir el tema ........de microchip me descargue hace un tiempo una especie de librerias para C18 , pero como no sabia que hacer, nunca las utilice , las buscare para compartirlas
 
Atrás
Arriba