Siguenos en ...

Google+facebooktwitter

youtubepinterest RSS aquihayapuntes

Últimos Tutoriales

Licencia

Creative Commons

 

Todo el contenido de este sitio está bajo una licencia de Creative Commons

 

Comunicación USB con el PIC PIC18F4550

Desarrollo del firware ó programa que se cargará en el microcontrolador.

Como dijimos al principio este ejemplo esta basado en el uso de la clase CDC, utilizando el compilador de CCS versión 4.107, me ha servido de guía el ejemplo EX_USB_SERIAL.C incluido en los ejemplos del compilador (con las modificaciones necesarias claro), como ya sabéis los ejemplos y librerías de CCS tienen copyright y su código no se puede publicar. Por lo que solo voy a comentar algunas cosas:

Unas de las cosas importantes que tenemos que tener en cuenta al programar el Microcontrolador son los fusibles, en los que entre otras cosas se define la velocidad de trabajo del PIC. Una característica que hay que tener en cuenta cuando usamos un PIC con interfaz USB, es que para que dicho módulo funcione la frecuencia de reloj en la entrada de dicho módulo debe de ser de 48 MHz, para conseguir dicha frecuencia se dispone de un multiplicador con pre-escaler y post-escaler. A la entrada del multiplicador tenemos que tener una frecuencia fija de 4 MHz. En la figura de abajo se muestra como configurar el pre-escaler del PLL cuando en nuestro circuito tenemos un cristal de 20 MHz.

 

Configuración reloj

 

Como se ve en la figura, en este caso el pre-escaler divide los 20 MHz por 5 para obtener los 4MHz requeridos a la entrada del PLL, este a su vez produce 96 MHz en su salida los cuales se distribuyen por un lado al módulo USB, dividiendo previamente la frecuencia por 2 para obtener los 48 Mz a la entrada del módulo por el otro lado alimenta el post-divisor del PLL, para que podamos elegir la frecuencia de trabajo del núcleo del micro, en este caso divide por tres por lo que tendremos 32 MHz para alimentar al "core" del PIC.

 

Debido a la complejidad de la comunicación USB o de otras como TCPIP lo que ha hecho tanto Microchip como otros desarrolladores de compiladores como CCS es proporcionar unas librerías que comúnmente se les llama "Stacks" o pila de software cuya finalidad es facilitar la tarea al programador de dispositivos, de tal forma que no es necesario conocer a fondo el protocolo de comunicación USB, simplemente se necesita saber que funciones públicas me proporciona el "Stack" correspondiente para poder enviar y recibir los datos a través del bus.

 

En el caso de este ejemplo que utiliza la clase CDC (Communications Device Class), las funciones que se han utilizado para enviar y recibir datos por el bus USB son:

  • usb_cdc_kbhit(): Es una función que retorna el valor booleano TRUE si hay uno o mas caracteres esperando en el buffer de recepción.
  • usb_cdc_getc(): Obtiene el carácter recibido en el Buffer de recepción.
  • usb_cdc_putc(char c): Coloca el carácter que recibe como parámetro en el buffer de transmisión para ser enviado.

Hay más funciones disponibles para su uso directo, la descripción de cada una de ellas las podéis encontrar en la cabecera del archivo usb_cdc.h.

La comunicación USB a de ser inicializada, eso se consigue llamando a la función: usb_init_cs() al principio de la función main()

Otra cosa que hay que tener en cuenta es que para que la comunicación USB se mantenga debe ser realimentada constantemente, para ello hay que llamar periódicamente a la función  usb_task(), por lo que nuestro programa tendrá que tener un bucle infinito principal donde deberemos incluir la llamada a esta función.  

Como veis es adaptar el algoritmo de nuestro programa a los requisitos que necesita el "Stack" para que funcione correctamente. Para ello CCS dispone de un gran número de ejemplos que nos sirven como plantillas para nuestros desarrollos.

 

De las librerías que nos proporciona CCS para la comunicación USB utilizando la clase CDC hay un archivo el usb_desc_cdc.h donde se guarda la información perteneciente a los descriptores del
dispositivo ese archivo podemos editarlo y modificar los descriptores perteneciente al VID, PID, consumo del dispositivo y versión del firware.

///////// Opciones de configuración /////////////////////////////////// 
#define  USB_CONFIG_PID       0x0033 
#define  USB_CONFIG_VID       0x0461 
#define  USB_CONFIG_BUS_POWER 100   //100mA  (rango de 0..500) 
#define  USB_CONFIG_VERSION   0x0100 //01.00  //range is 00.00 to 99.99 
//////// Fin de la configuración //////////////////////////////////////////

Si modificamos el VID y el PID tendremos que modificarlo también en el archivo .INF

 

Nota: según la versión del compilador utilizado, puede que haya modificaciones en los archivos de las librerías, en la que yo tengo las opciones de configuración de los descriptores vienen definidas por etiquetas al principio del archivo.

Otra cosa que se puede modificar en este archivo son los "Strings" o cadenas de caracteres que sirven para que Windows muestre información referente al fabricante del dispositivo, como por ejemplo nombre de la compañía y nombre del producto. Estas cadenas están colocadas al final del archivo usb_desc_cdc.h y hay que colocarlas en un formato determinado según se muestra en el siguiente ejemplo:

 
 //string 1  - Fabricante 
 20, //Longitud de la cadena = (Nº caracteres + 1)x2= (9+1)x2=20 
 USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) 
 'F',0, 
 'A',0, 
 'B',0, 
 'R',0, 
 'I',0, 
 'C',0, 
 'A',0, 
 'N',0, 
 'T',0, 
 'E',0, 
//string 2 - producto 
 18, //Longitud de la cadena = (Nº caracteres + 1)x2= (8+1)X2=18 
 USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) 
 'P',0, 
 'R',0, 
 'O',0, 
 'D',0, 
 'U',0, 
 'C',0, 
 'T',0, 
 'O',0

En el archivo .INF también hay un campo llamado [Strings] que podemos editar para personalizar la información que presentará el Sistema Operativo sobre nuestro dispositivo.


¿Que diferencia hay entre unas cadenas y otras?, pues bien, las que se encuentran en el archivo de los descriptores se mostrarán solo la primera vez que se conecta el dispositivo al ordenador. En Windows esa información aparecerá en el "bocadillo" informativo que sale a la derecha en la barra de herramientas, cuando el sistema detecta un nuevo hardware.

Nota: en Linux esta información no aparece y en MAC lo probaré pero claro, cuando consiga uno.

Después de que el dispositivo haya sido reconocido por el sistema esa información la cogerá el S.O desde las cadenas contenidas en el archivo .INF y la podremos ver en Windows si vamos a la ventana de "Administrador de dispositivos" seleccionamos el dispositivo y hacemos clic en propiedades.

Instalación de los drivers en el PC

Bueno este punto solo es cierto a medias, ya hemos dicho que si utilizamos la clase CDC el sistema operativo utiliza drivers genéricos instalados ya en el Sistema Operativo, pero para que Windows sepa que driver tiene que asignarle al dispositivo precisa que se instale el archivo .INF, el proceso de instalación de este archivo es como si fuera un driver completo, es decir, la primera vez que enchufemos el dispositivo al ordenador el plug and play nos detectará un hardware nuevo y nos saldrá el asistente para la instalación del nuevo hardware encontrado. Cuando nos aparezca la ventana preguntándonos si queremos que Windows se conecte a Windows Update para buscar el Software seleccionaremos la opción: No por el momento. En la siguiente ventana donde nos pregunta ¿que desea que haga el asistente? marcaremos la opción de: Instalar desde una lista o ubicación específica (avanzado) y en la siguiente ventana nos aparecerá las opciones de búsqueda en la que seleccionaremos la opción Buscar el controlador más adecuado en estas ubicaciones y marcaremos la casilla Incluir esta ubicación en la búsqueda, pulsando sobre examinar seleccionaremos la carpeta donde se encuentra nuestro archivo .INF, si todo ha ido bien comenzará el proceso de instalación. Y una vez instalado si abrimos el administrador de dispositivos (inicio -->ejecutar-->devmgmt.msc) veremos que nos ha creado un puerto serie virtual, y si quieres ver el driver que le ha asignado Windows sigue los pasos de la figura de abajo empezando por la izquierda.

 

Driver Windows para la clase CDC

 

El archivo .INF que he utilizado para esta Demo es el que viene con el compilador de CCS lo podéis encontrar en la ruta donde instalasteis el compilador en la carpeta drivers, este archivo está preparado para que funcione en Windows NT, Windows 2000, XP, Windows Vista y Windows 7 en sus versiones de 32 y 64 bits.

 

¿Y como se hace todo esto en Linux? pues muy sencillo porque no hay que instalar ningún archivo .INF automáticamente el Sistema Operativo reconoce el dispositivo y le asigna el driver correcto. Lo podemos ver si abrimos la carpeta /dev que es el directorio donde se guardan los controladores de dispositivos en Linux, como ya sabéis todo en Linux se gestiona como si de un archivo se tratara, después de conectar el dispositivo veremos que se nos ha creado un nuevo archivo (puerto COM) con el nombre ttyACM0, ese será el puerto al que tendremos que conectarnos desde la aplicación de escritorio.

La distribución de Linux con la que he probado la demo ha sido Ubuntu 10.04 LTS con el kernel 2.2.25  

Bueno ya hemos conseguido que nuestro ordenador reconozca a nuestro PIC como un dispositivo válido, lo único que nos queda ahora es crear la aplicación de escritorio para que podamos comunicarnos con el.

 

© 2007-2017 AquiHayapuntes.com