You are on page 1of 5

http://robotypic.blogspot.com/2013/02/comunicacion-pc-pic-por-usb.

html

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 PIC18F4550de 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

You might also like