Empezando con el USB modo CDC



1. Introducción:

 El modo de funcionamiento CDC (Communication Devices Class) emula un puerto serie a través del USB. Es decir, en administrador de dispositivos del PC, detectará nuestro microcontrolador como un puerto COMx virtual.

La forma de funcionar está definica en el AN1164.


2. Empezando:

 Lo primero que haremos será abrir el ejemplo (USB Device - DCD -Basic) del directorio MLA para ver qué ficheros son necesarios:


2.1.Ficheros importantes:

 En el datasheet AN1164, nos describen las funcionalidades de cada fichero:


  Ficheros:


2.2.Funciones importantes:

 Lo primero que se hace es inicializar el puerto USB; para esto se llama a la función "USBInitialize()", esta función habilita el USB.
La función "USBTask()" gestiona los estados del USB y maneja los eventos. Esta función debe llamarse periódicamente para mantener el USB funcionando.

 La declaración de las estructuras descriptoras está en el fichero "usb_ch9.h", y se definen sus valores en el fichero "usb_descriptors.c":





2.3.USB Stack options:

  La configuración se define en el fichero "usb_config.h":


  Líneas de configuración que el CDC Serial pasa al host:


2.4.Ejemplo funciones recibir y enviar:






3. Creando un proyecto nuevo para modificar:

 Empezamos abriendo el ejemplo:
 File -> Open Project y buscamos en el directorio de instalación de las MLA lo siguiente: \Mla\v2016_11_07\apps\usb\device\cdc_basic\firmware\picdem_fs_usb.x


Lo establecemos como proyecto principal y vemos que compila sin problemas.


3.1. Copiando el proyecto:

Con el botón derecho sobre el proyecto, seleccionamos la opción "Copy". Así podremos tener una copia en nuestro directorio de pruebas para modificar.


Lo establecemos como proyecto principal y al intentar compilar falla. Este fallo se debe a que está buscando una serie de ficheros que no encuentra.




Quedando así el directorio de nuestro proyecto:


Hay ficheros que se mantienen apuntando a los directorios anteriores. Esto lo sabemos porque al posicionar el puntero sobre ellos, nos sale un mensaje indicando el "Storage path".


Con el secundario escogemos "Remove from project" y añadimos los que tenemos en nuestro directorio usando la opción del botón secundario "Add Existing Items From Folder"
También debemos añadir las rutas en XC8Compiler:


Ahora podemos compilar sin errores.
Con esto conseguimos que copiando el directorio del proyecto, podamos compilarlo sin tener instaladas las MLA.


4. Adaptando a nuestra placa:

 Para adaptar el proyecto a nuestra placa debemos realizar los siguientes cambios:

En el directorio bsp, añadimos los ficheros que habíamos creado en proyectos anteriores:


Reemplazando buttons.c, buttons.h, led.c y led.h en el proyecto. Las funciones son las mismas por lo tanto no hay problema.
Al compilar nos saldrá error porque los nombres de los ficheros no coinciden. Debemos corregirlo:


También debemos configurar los fuses; para esto modificamos el fichero "system.c" dejándolo de la siguiente forma:


El último paso es reservar la memoria para el bootloader:


Compilamos y cargamos.
Cuando conectemos nuesta placa al pc por USB, será reconocida como un nuevo puerto COM en Administrador de Dispositivos:




Usando un terminal como puede ser "Hercules", nos conectamos. Los parámetros de la conexión están definidos en el fichero App_device_cdc_basic.c:





5. Ejemplos:

  Presentaremos dos ejercicios de prueba.

5.1. Pulsadores y led:

  En este ejemplo, monitorizaremos todos los botones y controlaremos los led a través de comandos.

Se pulsa un botón y no se envía mensaje hasta que se suelta.
Para hacer toggle de los led debemos enviar: "led8", "led7", "led6" o "led5"

 La primera modificación es en el fichero "system.c" para habilitar cuatro led más (8, 7, 6 y 5) y los 3 pulsadores restantes:


 Ahora modificaremos el fichero app_device_cdc_basic.c:





- Pic18f4550 usb CDC monitorizar pulsadores y control de led:



5.2. Lcd por USB

 Modificaremos el ejemplo del lcd por uart para que funcione a través del usb.

Lo primero es añadir las librerías necesarias:


Ahora las incluiremos. Estas librerías llamaban a "config.h" que es dónde estaba configurado el "#define _XTAL_FREQ 48000000".
Como ahora estamos realizando la configuración desde el "system.h", lo cambiamos en "lcd.h".


Deshabilitamos los led usados con la función toggle ya que serán usador por el lcd en el fichero "system.c":


Estado final del fichero "app_device_cdc_basic.c":




Envío desde la aplicación "Hércules":


Resultado:



- Pic18f4550 usb CDC escribir en LCD:




6. Conclusiones:

 Comentarios a destacar.

6.1. Limitación del Buffer:

 El buffer de recepción es limitado a 64 bytes; por lo tanto si enviamos cadenas mayores no serán escritas completas. El display tiene capacidad para 80 caracteres repartidos en 4 líneas.

 El tamaño del buffer se define en el fichero "usb_config.h":


 Los posibles tamaños son: 8, 16, 34 y 64:


 La solución sería desarrollar un protocolo para dividir la información en paquetes de 64 bytes.

6.2. Pid, Vid:

 Estos valores se usan para identificar los dispositivos USB en el mercado. En caso de realizar una comunicación emulando un puerto COM, es más sencillo usar integrados como el FTDI232 y así no tener que adquirir las licencias. La comunicación con este integrado se hace a través del puerto UART.


7. Descargas:



www.microedu.es

Si chove, non orballa!