You are on page 1of 10

Emulacin CDC RS-232 USB Microchip permite mediante la programacin de sus PIC realizar uno o varios puertos COM

virtuales e incluso la realizacin de USB 2.0 real mediante la CDC (Comunication Device Class). En este proyecto realizaremos la emulacin de un puerto RS232 en nuestro ordenador. Debido a la enorme facilidad de programar un puerto serie 232 mediante los compiladores Visual C++, Visual Basic y Delphi, esta aplicacin del PIC se nos hace especialmente apetecible, ya que podemos programar por ejemplo en Visual basic una aplicacin con comunicacin RS232 pero en realizad estamos sacando nuestros datos a travs de un puerto USB a la mxima velocidad de 1 Mb/seg.

Fundamentos Los microcontroladores de la casa microchip nos ofrecen numerosas y distintas aplicaciones para la realizacin de tareas sencillas a bajo coste, desde programacin de diagramas de estados, hasta comunicacin TCP/IP, pasando por USB y otras muchas aplicaciones interesantes como Modbus, I2C, SD Card, etc...
Pero para ello lo primero es conseguir un programador de estos integrados. Los podemos conseguir caseros desde 50 en numerosas pginas web, o incluso realizarlos nosotros mismos por un precio de 10. Podemos encontrar tambin programadores oficiales a un coste de ms de 80 en la web oficial de Microchip.

Material necesario

Material necesario
Protoboard, microcontrolador y componentes electrnicos Cuter y cables Cable USB / Mini-USB Programador de PIC 18F4550

Teora Vamos a usar un PIC 18F4550 que emule un puerto serie virtual (Virtual Comp Port "VCP"), aunque tambin se puede usar un PIC 18F2550, el cual configuraremos a nuestro gusto, donde le podremos poner el nombre de la empresa que queramos y el nombre de identificacin de ste.
Tambin hay que configurar dos parmetros esenciales en todo dispositivo que son el VID e ID. VID (Vendor ID): Es el identificador de la empresa. Cada empresa tiene un identificador, el cual puede vender diferentes productos a los que se les incluye el ID. ID (Product ID): Es el identificador del producto. Por tanto un dispositivo tendr un VID e ID fijos que les hace nicos con lo que no pueden sufrir incompatibilidad con otros dispositivos.

Estos son nicos para cada dispositivo que existe en el mercado, ya que si hubiese en nuestro ordenador dos dispositivos con el mismo VID/ID causaran conflictos entre ellos, impidiendo el correcto funcionamiento de ambos. Entonces cmo se soluciona que no haya conflictos entre dos dispositivos con la enorme cantidad de stos en el mercado informtico y electrnico? La respuesta es muy sencilla, pagando para tener nuestro nico e indivisible VID/ID, claro est que para trastear en casa no vamos a comprar un identificador para nuestro dispositivo, pero si queremos comercializarlo no nos quedar otra que comprar una "licencia".

Construccin Primero ADVERTIR que el esquemtico est realizado con un 18F4550 TQFP con lo que la numeracin de las patillas difiere al integrado DIP (cucaracha). Lo que no difiere es el nombre o funcionalidad de stas. Aqu podis encontrar la versin en OrCAD del esquemtico ms abajo en el punto Download de este mismo enlace.

Esquemtico

Programacin PIC La programacin del PIC la hemos realizado a travs de la aplicacin CCS denominada PIC C Compiler, ya que en nuestra opinin es uno, por no decir el mejor y ms sencillo complidor en C para microcontroladores.
El cdigo principal para crear nuestro VCP es el siguiente adems de convertirlo en emisor / receptor para nuestra aplicacin chat
#include <18F4550.h> #fuses

HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN #use delay(clock=48000000) #USE RS232(BAUD=19200, XMIT=PIN_A4, RCV=PIN_A5, stream=RF) #include <usb_cdc.h> #include <usb_desc_cdc.h> char c,d; void main() { usb_cdc_init(); usb_init(); //inicializamos el USB while (!usb_cdc_connected()) {} while (true) { usb_task(); if(usb_enumerated()) { if (usb_cdc_kbhit()) { c = usb_cdc_getc(); putc(c,RF); } if (kbhit(RF)) { d=getc(RF); usb_cdc_putc(d); } } } }

Creamos un puerto serie mediante software mediante la lnea de cdigo: #USE RS232(BAUD=19200, XMIT=PIN_A4, RCV=PIN_A5, stream=RF) donde su identificador es RF Por lo que tenemos dos comunicaciones, una producida por el usb y otra producida por RF ya que nuestro mdulo de RF se comunica mediante UART a travs de protocolo 232. La programacin se resume en que cada caracter que le llegue al PIC por el USB ( c ) lo transmita al mdulo de RF y cada caracter que le llegue al PIC por el mdulo de RF ( d ) lo transmita al USB. Una cuestin muy importante es el PLL del PIC Necesitamos que a nuestro micro le lleguen slo 4MHz por lo que hay que usar un prescaler. Para ello en CCS se usa la sentencia PLLX, donde X significa la divisin de nuestro clock. As pues si tenemos un cristal de 20MHz, el prescaler tendr que ser 20 : 4 = 5 ->PLL5. Si por el contrario nuestro cristal es de 12MHz sera PLLl3. Ahora bien, Dnde personalizamos nuestro dispositivo?. Esta se realiza en el archivo usb_desc_cdc.h en las siguientes lneas de cdigo.

..... ..... .....

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 0xD8,0x04, //vendor id (0x04D8 is Microchip)//Aqui se cambia el VID, VID = 04D8 0x0A,0x00, //product id // Aqu se cambia el ID, ID = 000A 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 ..... ..... .....

Hacer notar que la numeracin hexadecimal de la descripcin del VID / ID va al revs, es decir, el primero nmero hex. ser el ltimo y viceversa.
..... ..... .....

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 (nmero de letras + 1)*2->(3 + 1)*2=4*2=8 USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) 'J',0, 'V',0, 'R',0, //string 2 34, //length of string index (nmero de letras + 1)*2->(16 + 1)*2=17*2=34 USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) 'V',0, 'C',0, 'P',0, ' ',0, 'M',0, 'U',0, 'C',0,

'H',0, 'O',0, ' ',0, 'T',0, 'R',0, 'A',0, 'S',0, 'T',0, 'O',0 }; #ENDIF

La longitud de la cadena tiene que ser exacta, sino saldrn caracteres que no tienen que ver con nuestro dispositivo si el nmero de la cadena es mayor o se suprimirn caracteres si el nmero de la cadena es inferior, para ello hay una frmula muy sencilla que es: (Nmero de letras + 1)*2 = longitud a poner Ejemplo en string1 queremos poner JVR, esta tiene 3 caracteres por tanto: longitud a poner = ( 3 + 1 ) + 2 = 4 + 2 = 8 Es recomendable cambiar la velocidad de comunicacin del CRC desde el PIC (baudRate) ya que as nos aseguraremos de no tener error alguno en nuestro dispositivo. Esto lo podemos realizar desde el archivo usb_cdc.h cambiando la siguiente lnea de cdigo en la funcin void usb_cdc_init(void):
..... ..... ..... void usb_cdc_init(void) { usb_cdc_line_coding.dwDTERrate=19200; //BaudRate que vamos a usar usb_cdc_line_coding.bCharFormat=0; usb_cdc_line_coding.bParityType=0; usb_cdc_line_coding.bDataBits=8; ..... ..... .....

Instalacin PIC Para que nuestro dispositivo sea detectado por el ordenador lo primero que tenemos que hacer es configurar nuestro driver. Para ello abriremos con el archivo mchpcdc.inf que se encuentra en la url ...\ VCP Microchip \ Drivers VCP \ win_2k_winxp \ mchpcdc.inf
Contiene lo siguiente:
; Windows USB CDC ACM Setup File ; Copyright (c) 2000 Microsoft Corporation

; Copyright (C) 2004 Microchip Technology Inc. [Version] Signature="$Windows NT$" Class=Ports ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} Provider=%MCHP% LayoutFile=layout.inf DriverVer=08/17/2001,5.1.2600.0 [Manufacturer] %MFGNAME%=DeviceList [DestinationDirs] DefaultDestDir=12 [SourceDisksFiles] [SourceDisksNames] [DeviceList] ;Aqu deberemos de poner el mismo VID e ID //que hemos programado en el micro de lo controrio los drivers no ;sern detectados. VID = 04D8, ID=000A %DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000A ;-----------------------------------------------------------------------------; Windows 2000/XP Sections ;-----------------------------------------------------------------------------[DriverInstall.nt] CopyFiles=DriverCopyFiles AddReg=DriverInstall.nt.AddReg [DriverCopyFiles] usbser.sys,,,0x20 [DriverInstall.nt.AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,usbser.sys HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" [DriverInstall.nt.Services] AddService=usbser, 0x00000002, DriverService [DriverService] DisplayName=%SERVICE% ServiceType=1 StartType=3 ErrorControl=1 ServiceBinary=%12%\usbser.sys ;-----------------------------------------------------------------------------; String Definitions ;-----------------------------------------------------------------------------[Strings] ;Aqu pondremos la informacin de nuestro dispositivo MCHP="www.MuchoTrasto.com" MFGNAME="www.MuchoTrasto.com" DESCRIPTION="Puerto de comunicaciones" SERVICE="USB RS-232 Emulation Driver"

Una vez configurado el driver a nuestro gusto, pasaremos a la instalacin del puerto de comunicaciones virtual. Lo primero ser conectar nuestro dispositivo a algn puerto usb libre que tengamos. Nada ms conectar el usb al ordenador aparecer el asistente para hardware nuevo

encontrado, si este nos pregunta conectarnos a Windows Update le diremos "No por el momento" y pulsaremos siguiente.

A continuacin seleccionaremos "Instalar desde una lista o ubicacin especfica (avanzada)" y pulsamos siguiente.

Seleccionaremos "Buscar el controlador ms adecuado en estas ubicaciones", "Incluir esta ubicacin en la bsqueda", para a continuacin pulsar sobre el botn con la etiqueta "Examinar". Aparecer un explorador de windows donde iremos a los archivos bajados de la seccin de download "Drivers CRC Muchotrasto" y accederemos a la url:

...\ VCP Microchip \ Drivers VCP \ win_2k_winxp Pulsaremos sobre el botn "Aceptar" del explorador y a continuacin al botn "Siguiente" de la ventana del asistente.

Buscar el dispositivo en pocos segundos ya que hemos puesto la ubicacin exacta donde encontrarlo

Le daremos a continuar a la advertencia de Windows...

Y ya habremos instalado nuestro dispositivo correctamente con lo que pulsamos el botn "Finalizar" Para asegurarnos que nuestro puerto serie de comunicaciones ha sido correctamente instalado tendremos que acceder al administrador de dispositivos que se encuentra en: Inicio -> Panel de Control -> Sistema -> Hardware -> Administrador de dispositivos

Si expandimos Puertos (COM & LPT) y a continuacin hacemos doble click sobre Puerto de comunicaciones (COM8) veremos los datos de nuestro dispositivo. Fabricante: www.MuchoTrasto.com Ubicacin: Ubicacin 0 (VCP MUCHO TRASTO)

Podemos cambiar el puerto por defecto que crea nuestro ordenador, es decir a nosotros por ejemplo nos ha creado el COM8 por lo que si queremos cambiarlo a COM4, tendremos que acceder a la pestaa "Configuracin de puerto" y luego pulsamos sobre el botn "Opciones avanzadas". Seleccionaremos en el slider con etiqueta "Nmero de puerto COM" el que creamos conveniente en nuestro caso COM4 y pulsamos sobre Aceptar. Si nos fijamos y vamos a la pestaa detalles dentro de las propiedades de Puerto de comunicaciones y seleccionamos en el slider Id. de instancia de dispositivo, veremos el VID e ID que hemos programado en el microcontrolador.

You might also like