RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

Comunicación PC-PIC por USB

Vamos a mostrar el procedimiento para conectar un PIC de gama alta, el 18F4550, al PC por el puerto USB. Se va a tratar de una clase de dispositivo USB CDC (Communication Device Class) emulando un dispositivo RS232 mostrado como un puerto COM en windows. El ejemplo consiste en una comunicación básica que muestra en el PC el valor de tensión leído del conversor A/D. Dicha lectura la activaremos o desactivaremos desde el PC pulsando la barra espaciadora.  
En el PIC 18F4550 la configuración de fuses va a tener su importancia puesto que de ellos va a depender, entre otros, las frecuencias de reloj que van a ser utilizadas.

#fuses HSPLL   //Uso de un crystal oscilador >4 MHz usando el PLL
#fuses NOWDT   //No habilitación de reset por watchdog
#fuses NOLVP   //Inhabilitación de programación a bajo voltaje
#fuses USBDIV  //Clock del módulo USB se tomará del PLL/2 (48MHz)
#fuses PLL5    //La frecuencia se dividirá por 5 en el PLL
#fuses CPUDIV1 //El clock para el procesador serán los 96 MHz del
                 PLL divididos para 2 (48MHz)
#fuses VREGEN  //Habilita regulador 3,3 voltios para el módulo USB

Vamos a ver el porqué de esta configuración, sobre todo en lo que respecta a la frecuencia de reloj. El objetivo es obtener 48 MHz en el módulo del USB por mediación del PLL. Esta frecuencia no tiene porqué coincidir con la del cristal empleado. Fijándonos en el diagrama de bloques interno representado del PIC18F4550 (se puede encontrar también en el datasheet del PIC18F4550 de Microchip) deberemos conseguir obligatoriamente 4 MHz a la salida del MUX controlado por PLLDIV. Como empleamos un cristal de 20MHZ deberemos dividir por 5 esta frecuencia para obtener los 4 MHz. Esto lo conseguimos mediante el fuse  PLL5.
  
Siguiendo el diagrama vemos que los 4 MHz obtenidos se transforman en 96MHz que a continuación son divididos por 2 por lo que se quedan en 48 MHz.
Con la configuración del fuse  USBDIV1 estamos indicando que estos 48MHz obtenidos del PLL son los que vamos a utilizar para el módulo USB. Aclarar que podríamos emplear directamente la frecuencia de un cristal de 48MHz con NOUSBDIV.
Configurado el clock del módulo USB, debemos ahora hacerlo con el clock del resto de módulos del procesador. Igual que para el USB obtenemos el clock del módulo PLL. Si nos fijamos en el diagrama partimos de los 96 MHz conseguidos con los 4 MHz procedentes del PLL. Esta frecuencia la vamos a dividir por un valor configurado por CPUDIV. Podemos trabajar a frecuencias diferentes a la del módulo USB pero en este caso vamos a emplear la misma. Para ello, para obtener 48MHz debemos dividir por 2 por lo que configuraremos CPUDIV1.
Si somos observadores vemos en el diagrama otro CPUDIV. ¿Por qué la frecuencia de reloj para el procesador no nos viene por ahí? La respuesta es que al configurar el fuse HSPLL estamos indicando que hacemos uso de un cristal con frecuencia superior a 4 MHz (HS) y además que lo hacemos por mediación del PLL (HSPLL), por lo que ese CPUDIV queda deshabilitado.

Con respecto a los drivers que vamos a emplear van a ser, por un lado, lógicamente, el correspondiente al PIC 18F4550 y el correspondiente a la librería de uso de una clase de dispositivo CDC USB.

#include <18F4550.h>      //PIC a emplear
#include <usb_cdc.h>      // Librería de control USB

Las funciones utilizadas para control USB:

usb_cdc_init();    //Inicialización del modo CDC
usb_init();        //Inicialización del control del USB
usb_task();        //Detección de la conexión de dispositivo USB
usb_enumerated();  //Devuelve TRUE si dispositivo ha sido 
                     enumerado por el PC
usb_cdc_kbhit();   //Devuelve TRUE si hay recepción de datos
usb_cdc_putc();    //Envío de caracteres al buffer de trasmisión
usb_cdc_getc();    //Lectura del buffer de recepción

Ya tenemos el programa para el PIC. Pero ahora necesitamos que el PC reconozca el dispositivo USB al conectarlo. Para ello deberemos modificar en el archivo "usb_desc_cdc.h", que se encuentra en la carpeta "drivers" en el directorio de instalación del PIC C COMPILER, estas dos lineas:

0x61,0x04//vendor id(0x04D8 is Microchip,or is it 0x0461 ??)==8,9
0x33,0x00//product id ==10,11

Se deben sustituir respectivamente por estas dos:

0xD8,0x04//vendor id(0x04D8 is Microchip, or is it 0x0461??)==8,9
0x0A,0x00//product id ==10,11

Indican el identificador de fabricante (Microchip) y al identificador de producto (familia PIC18), y permiten la localización del driver de windows cuando se conecta el dispositivo USB.

[+/-] Ver / Ocultar programa completo

Si queremos simularlo todo en Proteus nos queda una cosa más. Debemos cargar el driver para la simulación virtual. Para ello, con proteus instalado accedemos a <Menu Inicio><Todos los programas><Proteus 7 Profesional><Virtual USB><Install USB drivers>



Ya podemos probarlo todo. Cuando conectemos el dispositivo USB, bien sea real o virtualmente en proteus, buscará el driver de windows y sino lo encuentra pedirá instalarlo. Se deberá indicar la ubicación del archivo "mchpcdc.inf" bien sea por el asistente de "Nuevo hardware encontrado" o bien manualmente con click derecho en el administrador de dispositivos de windows sobre el dispositivo CCS RS232 DEMO que aparecerá con un signo de interrogación o admiración amarillo, y posteriormente marcando "actualizar controlador" e indicando la ubicación del driver. Este archivo se puede descargar junto con el proyecto completo en el siguiente enlace de descarga. También se incluyen el archivo "usb_desc_cdc.h" ya modificado así como el resto de librerías C que intervienen: 

Descargar Comunicación PC-PIC por USB


Con el driver ya instalado y el dispositivo USB reconocido, abrimos el hyperterminal y seleccionaremos el puerto COM que corresponda al dispositivo. 

En esta animación se puede ver el resultado simulado en proteus:





Y en esta otra funcionando en un montaje real:





El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las siguientes versiones de software:
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084

Última revisión del artículo: Octubre 2013


46 comentarios:

Unknown dijo...

Buenas noches estoy empezando con la USB en el PIC18F4550, encontre este proyecto y m parecio interesante para implementarlo, la simulacion corre perfectamente pero al hacerlo fisicamente nisiquira se reconoce el pic en la PC tengo que instalar un driver en especial??

Robotypic dijo...

Hola Andrea.
El driver identifica al PIC frente a windows. Si lo hace a través de proteus, debe hacertelo fisicamente en el mismo PC. Asegurate de las conexiones fisicas. La alimentación del PIC así como el oscilador por ejemplo, ya sabes que no se representan en la simulación.

Unknown dijo...

es que en la carpeta no encuentro que hay que cambiarle por ningun lado encuentro eso valores pediria mas aclaracion por esa parte usb_desc_cdc.h"

Robotypic dijo...

David. Tienes que abrir el archivo usb_desc_cdc.h con el compilador y sustituir las dos lineas que se indican. Ese archivo está en la carpeta "drivers" dentro de la carpeta donde tengas instalado el compilador ccs pic c compiler.

Alvin Estrada dijo...

Tengo problemas, al momento de modificar este proyecto, al compilar, y probar en la emulacion la cual funciona correctamente con el archivo que descargue de aqui, no reconoce el puerto COM, ya verifique y compare, los archivos .lst y los asm generados, son diferentes, aun cuando únicamente re-compilo, agradecería su atención y ayuda,, nota: ya modifique el vendor, y el id de producto

Robotypic dijo...

Alvin. ¿Has instalado el driver para windows?

Alvin Estrada dijo...

Te refieres a copiar el archivo ""mchpcdc.inf"" a la carpeta drivers?

Robotypic dijo...

Si. Cuando conectas el dispositivo USB te dice que no lo reconoce y debes indicarle la ubicación de ese archivo.

Alvin Estrada dijo...

Aparece un dispositivo desconocido, y cuando indico la ruta donde debe de buscar el archivo, al parecer el driver no es el indicado

Robotypic dijo...

Está probado en windows xp y windows 7 de 32 bits. En el resto no debería porqué no funcionar pero no lo he probado. Si no te toma correctamente el driver puede ser que no hayas modificado correctamente el archivo usb_desc_cdc.h

Alvin Estrada dijo...

mi version de ccs compiler es 4.104 entonces y al buscar encuentro que debo de modificar lo siguiente

#ifndef USB_CONFIG_PID
#define USB_CONFIG_PID 0x000A
#endif
#ifndef USB_CONFIG_VID
#define USB_CONFIG_VID 0x04D8
#endif

Y AUN ASI NO RECONOCE EL DISPOSITIVO, SI ME PUDIERAS DECIR LA VERSION DE COMPILADOR QUE UTILIZASTE,

Alvin Estrada dijo...

despues de buscar y buscar,, y batallar comparando librerias, y codigos compilados, encontre el problema y la solucion,,, la version del CCS COMPILER 4.104 (con la que estuve trabajando) tiene otras versiones de los descriptores usb, las cuales al parecer no funcionan correctamente con los drivers,,, entonces procedí a cambiar de compilador a la versión 4.023 en la cual, y todo de maravilla (hasta ahora).....
PD. POR CIERTO MUY BUENOS APORTES, YA HACIA FALTA UNA PAGINA QUE CONDENSARA LA INFO CON EJEMPLOS COMO ESTOS, NO ESTARIA DE MAS COMPARTIR Y HABLAR UN POCO DEL CODIGO DE LAS APLICACIONES VB. PARA ENVIAR Y REVIVIR DATOS SERIALES....

Unknown dijo...

Hola Alvin, que bueno que alfin hayas dado con ello.
Te pregunto, lo has probado en winwows 8 de 64 bits?
Me podrías dar tu email por favor

Unknown dijo...

Alvin, una pregunta mas.
¿Donde conseguiste esa version del ccs?
No he podido encontrar ni esa, ni anteriores.

Unknown dijo...

Gracias por este post. excelente trabajo

Unknown dijo...

como se instala el mchpcdc?
:(

Robotypic dijo...

Adrian.
Cuando insertas el USB por primera vez te aparace una ventana como "nuevo hardware encontrado". En esa ventana debes indicar el camino donde se encuantra el archivo.O bien , con el USB insertado ir al administrador de dispositivos de windows, click derecho, actualizar software e indicarle desde ahí el camino.

Unknown dijo...

aaa orale gracias ya entendi, pero bueno esta debio ser mi primera pregunta, este se puede hacer con windows 8?

Robotypic dijo...

Personalmente no lo he probado.

Unknown dijo...

ya lo intenete y no se puede en windows 8,pero ya me salio en windows 7, muchas gracias por la ayuda.

Unknown dijo...

Estoy intentando hacer el proyecto físicamente pero no tengo un cristal de 20MHz, le puse uno de 8MHZ y le cambie en los fuses el PLL5 por PLL2 y tambien el delay clock por los 8000000 que uso, pero aun asi no me funciona, la computadora no detecta la usb, estuvo bien lo que hice o me falto algo? Te agradesco la ayuda

Robotypic dijo...

Prueba en otro puerto USB

Unknown dijo...

buenas tardes no puedo encontrar la parte a modificar usb_desc_cdc.h", es posible que sea por la version que tengo 4.130 de CCS, o donde puedo encontara la version 4.038 de CCS gracias espero su pronta respuesta.

Robotypic dijo...

Eduardo. En el enlace de descarga tienes todas las librerías C que se emplean. Debes utilizar esas en lugar de las de tu versión.

Unknown dijo...

hola amigo ... mi problema esta en q no me reconoce driver =( ... yo uso ccs compiler version 5 ... si le modifico a las librerias q dejaste en la seccion de descarga ... me reconoce driver???

Robotypic dijo...

Jonathan. Debes modificar los archivos C. Las librerías adjuntadas en el enlace de descarga están probadas en versiones 4 superiores a la del artículo. La versión 5 de ccs cambia significativamente respecto a la versión 4. Personalmente no lo he probado.

Unknown dijo...

sabes amigo probe con proteus 8 y ccs compiler 5 y le cambie los archivos de la acarpeta driver por los archivos de tu descarga y funciona ok pero en windows 7 a 32 bits ... pero yo tengo 64 bits =( ... entonces el problema seria ??? ... supongo yo el archivo .inf del driver usb de ccs compiler

Robotypic dijo...

Si. Se debe utilizar el driver compatible para 64 bits pero yo no dispongo de él.

Stephanya Casanova dijo...

Buenos dias, cuando le doy buscar el archivo y le doy la ubicación de Driver para Windows no me reconoce el archivo, estoy trabajando con Proteus 7.6, con compiler de 4.084 y cambie los archivos que descargué de esta página, de pronto sabes que me puede faltar? Gracias.

Stephanya Casanova dijo...

Estoy trabajando en Windows xp 32 bits, con todas las consideraciones, lo unico es que no me carga el archivo del controlador...

Robotypic dijo...

Cuando conectas el USB, en el administrador de dispositivos debe aparecerte aunque no tengas cargado el driver. Y desde allí podrás actualizar el dispositivo con el driver para windows. Si al conectar el USB ni siquiera te aparece en el administrador de dispositivos prueba otro USB del PC o revisa tu proyecto.

DavidRMMGB dijo...

Hola y saludos,
Muy buen aporte y bien resumido.
Lo he probado pero tengo un detalle, uso cristal de 8Mhz y probe pll2, todo anda, el driver, el puerto virtual, sin embargo a la hora de ejecutar en la hiperterminal, solo me manda basura, alguna experiencia al respecto. gracias

Robotypic dijo...

Hola David.
Si lo estás simulando, asegurate que en las características del PIC has indicado que empleas una frecuencia de 8MHz.

Unknown dijo...

Gracias. por tu aporte amigo, excelente te felicito.

Como hago para mandar datos directos a un block de notas? es decir que al presioanr un boton el dato se tome y se envie una vez y abierto el bloc de nota se vea Gracias..

Juan González dijo...

Holaaaaa.

Hice todos los pasos que me dijiste, pero al momento de cambiar el archivo usb_desc_cdc me aparecen estas líneas

USB_CONFIG_VID & 0xFF, ((USB_CONFIG_VID >> 8) & 0xFF), //vendor id ==9, 10
USB_CONFIG_PID & 0xFF,


((USB_CONFIG_PID >> 8) & 0xFF), //product id, don't use 0xffff ==11, 12

En donde y cómo debo modificar? Espero que puedas ayudarme y de antemano te agradezco

Unknown dijo...

La tasa de transmicion por default entre el pic y el pc es de 2400 Bauds?? es posible cambiarla a 9600? saludos.

Unknown dijo...

Buenas, tengo el siguiente problema... En la simulacion, funciona perfectamente.. cuando lo conecto a mi protoboard no reconoce el dispositivo, y cuando le cargo el archivo .inf Windows dice que ya determino que el software estaba instalado pero sigue sin reconocerlo

Robotypic dijo...

Liliana. Ves a administración de dispositivos y si esta reconocido instalale desde ahí el driver.
Sino prueba otro puerto USB.

Unknown dijo...

HOLA. AYUDA. SI ME RECONOCE EL PUERTO COM EN HIPERTERMINAL CUANDO CONECTO MI PIC. PERO NO ME MUESTRA LOS DATOS RECIBIDOS. NUNCA USE HYPERTERMINAL NOSE SI TENGO QUE TOCAR ALGOMAS

Be Discus Fish dijo...

Jose Ignacio.
Puedes usar cualquier visor de puerto serie. No tiene que ser obligatoriamente el hiperterminal.

Unknown dijo...

buenas amigo estoy probando este tipo de comunicación ya que estoy trabajando en un proyecto que requiere de comunicacion pcpic. Bueno te escribo para preguntarte porque cuando hago la lectura del puerto en el himperterminal este no me genera ningún dato solo se queda en blanco con el cursor de texto en parpadeo cual debe ser el problema.....

Robotypic dijo...

Carlos. No tienes comunicacion.Revisa las conexiones.

Jesus Bqto dijo...

Amigo gracias, excelente imformación! me ha ayudado a hacer la comunicación usb, en proteus funciona perfecto, pero en físico no pasa nada, ya estoy dudando del funcionanmiento del módulo usb de mi pic, bueno, creo que lo dañe, pues en la simulacion está el pin 18 (VUSB) a tierra y asi lo hice en fisico, luego me fije de la imagen que subiste y hay un capacitor de 470n, será que fué esto lo que provocó el mal funcionamiento del pic???

y otra prgunta, he visto que hay quienes usan esto: #define USB_CON_SENSE_PIN luego colocan un pinX, eso lo hacen para que?? es necesario?

Agradecería en gran manera si pudieras ayudarme con esto!
saludos!!

Unknown dijo...

hola buenas noches se podria vincular con matlab??y poder graficarlo con respecto al tiempo??

Ricardo Hernández dijo...

Hola, buenos días
Escribí el programa tal cual está y me aparecen los siguientes errores:
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 596(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 598(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 600(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 601(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 603(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 604(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 606(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 607(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 609(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 610(4,26): Undefined identifier usb_ep1_tx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 638(6,39): Undefined identifier usb_ep2_rx_buffer
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 653(21,22): Undefined identifier USBIE
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 653(21,22): Undefined identifier USBIE
*** Error 12 "C:\Program Files (x86)\PICC\devices\usb_cdc.h" Line 668(23,24): Undefined identifier USBIE

MGOTT dijo...

Bueno, pues para los que tienen problemas con la version del CCS y el driver. Solo Hay que reemplazar todos los achivos que vienen en la carpeta "drivers" del zip de descarga por los drivers que estan en tu instalacion de CCS. Recomendaria antes respaldarlos en otra carpeta. Otra cosa que no mencionan aqui es la configuracion del baudaje. Hay que configurar el puerto virtual. ( en propiedades del dispositivo una vez que lo detecta ). Yo lo coloque a 2400, e igual en la terminal que ocupen , colocar ese valor. Yo hasta ahora he logrado que el pic envie estos ASCII continuamente : mi duda es por que hace esto?.

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)