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


31 comentarios:

andrea soto 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??

Chabier 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.

david ramos 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"

Chabier 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

Chabier dijo...

Alvin. ¿Has instalado el driver para windows?

Alvin Estrada dijo...

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

Chabier 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

Chabier 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....

Luis Rúa 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

Luis Rúa dijo...

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

Abraham Mendoza dijo...

Gracias por este post. excelente trabajo

adrian calderon 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.

adrian calderon 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.

adrian calderon dijo...

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

adrian calderon 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

eduardo esparza lopez 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.

jonathan catari 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.

jonathan catari 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.

Related Posts Plugin for WordPress, Blogger...

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

*
*
*
*
*
contact form faq verification image

Web form generated by 123ContactForm