Tutoriales

PIC - Puerto serial por USB CDC

led matrix usb cdcEn este tutorial podrás aprender a enumerar un microcontrolador PIC (PIC18F2550) como un puerto serial USB a través de la clase CDC (Communication Device Class). Esto te permitirá montar un puerto COM virtual en tu computadora y hacer programas muy sencillos que se comuniquen con el PIC a través del COM. Adicionalmente podrás ver código para aprender a usar una Matriz de LEDs y podrás tener un reloj de tiempo real en ella, entre otras cosas. 

 

¿Te interesa adquirir la tarjeta? Visita la página de características de la LED Matrix.
http://migsantiago.com/index.php?option=com_content&view=article&id=30:lcd-matrix-pcb&catid=1:tutorial&Itemid=23

Items necesarios

+ PIC18F2550 y demás componentes que verás en el esquemático
+ o puedes comprar una de mis tarjetas LED Matrix (checa disponiblidad)
+ Código fuente del PIC en Git (link)
+ Código fuente de la aplicación en C# en Git (link)
+ Microchip MPLAB X IDE v2.15 o mejor (link
+ Compilador XC8 de Microchip para PICs de 8 bits v1.32 o mejor (link
+ Microchip Libraries for Applications 
v2013_12_20 o mejor (incluye el USB Framework gratuito, link)
+ Visual C# 2008 Express Edition
+ Windows 7 en adelante (sólo si se desea el efecto Aero en la aplicación)
+ Esquemáticos (link

 

 

Esquemático 

Para lograr una conexión básica de un puerto serial USB CDC con tu computadora, debes tener listo el siguiente esquemático. No te preocupes por las etiquetas que puse en algunas terminales del PIC, sólo conecta lo mostrado en el esquemático. Te sugiero que siempre uses un fusible en el puerto USB para proteger tu computadora ante cualquier accidente.

Es importante colocar un capacitor electrolítico en VUSB (14) ya que éste se encarga de filtrar la fuente interna del PIC que permite que el periférico USB funcione correctamente.

 

Código fuente PIC - Configurando el modo CDC USB

El código fuente CDC USB se tomó de las librerías para aplicaciones de Microchip. El ejemplo usado es el que puedes encontrar en:

C:\microchip\mla\v2013_12_20\apps\usb\device\cdc_basic

Y nosotros lo modificaremos para que funcione a nuestro gusto.

Asegúrate de copiar el contenido del directorio siguiente en el directorio de tu proyecto. Este te servirá para poder compilar el proyecto posteriormente sin tener instaladas las librerías de Microchip.

C:\microchip\mla\v2013_12_20\framework\usb 

Dentro del subdirectorio src que recién copiaste, elimina todos los archivos salvo los dos siguientes. Ellos definen las funciones CDC y otros detalles necesarios para enumerar al PIC y que funcione todo el periférico USB correctamente.

usb_device.c
usb_device_cdc.c

Asegúrate de tener vinculados esos archivos C en tu árbol de proyecto, junto con cualquier otro H que necesites.


cdc project tree

En el archivo usb_descriptors.c se define el comportamiento de tu PIC ante el host USB. El único parámetro en el que debes estar interesado en modificar es el consumo de corriente de tu dispositivo USB. En mi caso dejé el circuito completamente alimentado por USB y pedí al host USB que después de la enumeración proporcione 400mA de corriente:

200,                     // Max power consumption (2X mA)

Pero si tú piensas alimentar tu circuito por tu cuenta, remueve el fusible F1 y coloca lo siguiente en el descriptor:

0,                      // Max power consumption (2X mA)

Toda la demás información se encarga de reportar el dispositivo como CDC y no es necesario modificarla, salvo el VID y PID, pero para efectos de este tutorial no hacen falta tampoco.

El archivo usb_config.h define los tamaños de los endpoints que usará el dispositivo para enviar y recibir datos del host. Asegúrate de tener los siguientes datos correctamente capturados.

#define CDC_DATA_OUT_EP_SIZE    64
#define CDC_DATA_IN_EP_SIZE     64 

Un punto importante a notar es que con las últimas librerías de Microchip, las direcciones RAM de los endpoints del PIC18F2550 deben ser configuradas manualmente. Asegúrate de capturar lo siguiente en el archivo system.h.

/**
 * The USB endpoint has to be used to store the CDC buffers
 */
#define FIXED_ADDRESS_MEMORY
#define IN_DATA_BUFFER_ADDRESS_TAG      @0x500    // for CDC device (XC8)
#define OUT_DATA_BUFFER_ADDRESS_TAG     @0x540
#define CONTROL_BUFFER_ADDRESS_TAG      @0x580 

En el archivo system.h es donde ahora Microchip sugiere que se declaren los periféricos de nuestro PIC. Ahí encontrarás todas mis definiciones de pinout del micro así como los prototipos de unas funciones que Microchip agregó en su librería.