Вы находитесь на странице: 1из 55

Control de dispositivos mediante el puerto USB: Desarrollo de proyectos en Visual C# Moyano Jonathan 2011

PIC18F2550 Control de dispositivos mediante el puerto USB: Desarrollo de proyectos en Visual C#

Autor: Moyano Jonathan Ao: 2011

INTRODUCCIN:
En este manual veremos como crear una pequea aplicacin en Visual C# y CCS para poder controlar dispositivos USB usando el microcontrolador PIC18F2550. Este apartado no pretende ser una explicacin completa del funcionamiento del puerto USB, sino una gua para poder crear aplicaciones de manera rpida. Como elemento hardware usaremos la placa de desarrollo USB trainer v0.1, desarrollada para este curso en particular. Esta herramienta est diseada para usarse en conjunto con el programador PicKit2. Las caractersticas de la placa son las siguientes: 4 pulsadores NA usados para simular las entradas digitales. 4 Leds verdes de 3mm para simular las salidas digitales. 2 potencimetros multivuelta de 10K para simular entradas analgicas. 2 Leds de alta luminosidad para las salidas PWM. 1 Led bicolor para indicar el estado de conexin al puerto USB. 1 Conector USB hembra tipo B. 1 Puerto ICSP para la programacin. 1 cable ICSP de 10cm para la conexin al programador.

Con esto ya podemos empezar a crear una aplicacin demo o aplicacin de prueba, con la que demostraremos como comunicar nuestra placa con la PC mediante USB. Todas las aplicaciones que escribiremos son compatibles y fueron testeadas con Windows 7 y Windows XP, as tambin como versiones intermedias.

Introduccin a Visual C#:


Como habamos dicho anteriormente, disearemos una aplicacin para la PC en visual C#. Para esto debemos tener instalada la suite Visual Studio 2008 o en su defecto Visual C# 2008 Express. Para el desarrollo de este curso usar Visual Studio 2008, que es la herramienta que tengo a mano. Visual C# Express es la versin gratuita del programa la cul podemos descargarla directamente de la pgina de Microsoft. Una vez instalado el programa procederemos a crear nuestro proyecto. Al abrir Visual Studio 2008, nos tendra que quedar una ventana como la Fig. n1:

A simple vista podemos ver el men superior, el cuadro de herramientas a la izquierda, el explorador de soluciones a la derecha y el cuadro de errores, mensajes y advertencias abajo. Para poder crear un nuevo proyecto de Visual C#, nos dirigimos hacia Archivo Nuevo Proyecto. Una vez realizado esto, nos aparecer una ventana con los diferentes tipos de lenguajes disponibles y los tipos de aplicaciones que se pueden llegar a crear con ellos. Tambin aparecer al costado derecho, la plataforma de trabajo elegida, a la que conocemos por Framework. En mi proyecto usaremos .Net Framework 3.5.

En la Fig. n 2, podemos apreciar los tipos de proyectos que se pueden crear con Visual C#.

Como podemos ver, hemos elegido el tipo Aplicacin de Windows form y le agregamos un nombre. Luego de aceptar, nos quedar la ventana como se ve en la Fig. n 3:

Ahora tenemos listo nuestro proyecto para empezar a trabajar, pero antes lo guardaremos en caso de alguna eventualidad. Para ello presionaremos sobre el botn Guardar todo; cuando nos aparezca el cartel para guardar tenemos que elegir la carpeta donde se guardar y quitar la opcin que dice: Crear directorio para esta solucin.
4

Fig. n 4:

Lo primero que vamos hacer es configurar el espacio de diseo para poder trabajar cmodos. Lo que haremos ser dejar fija la barra de herramientas para tenerla siempre a mano como lo muestra la Fig. n 5:

Ya tenemos todo listo para empezar a programar, pero antes veremos un poco del entorno de trabajo de visual C#. Al principio necesitamos ver donde introduciremos cdigo de programacin, para esto podemos usar 3 formas: - Hacer doble clic sobre el control o formulario. - Presionar con el botn derecho del Mouse sobre el control o formulario y seleccionar Ver cdigo - Pulsar Ver cdigo en el explorador de soluciones como lo muestra la Fig. n 6:

Algo que usaremos muy a menudo para crear La interfaz grfica ser el llamado cuadro de herramientas el cul podemos ver en la Fig. n 7.

En el cuadro de herramientas se encuentran los controles que podemos arrastrar hacia el formulario para crear nuestra aplicacin. Las herramientas se dividen en 2 grupos principalmente: Las que forman parte de la interfaz de usuario ya sean botones, cuadros de texto, etc. Y las que ofrecen funcionalidad pero no son visibles en tiempo de ejecucin tales como timers, procesos en 2 plano, etc.
6

El explorador de soluciones que vimos ms arriba sirve para administrar archivos, proyectos y configuraciones de la aplicacin. El cuadro de propiedades que vemos en la Fig. n 8 sirve para modificar propiedades y eventos de los controles que se encuentran en la interfaz de usuario.

Para compilar o ejecutar el programa nos acostumbraremos a usar la tecla de acceso rpido F5. Tambin podemos dirigirnos hacia depurar iniciar depuracin, con el mismo resultado. Con esto damos por finalizado la introduccin al ambiente de trabajo. Ahora comenzaremos con el diseo del programa.

Diseo de la interfaz de usuario:


La primera accin que realizaremos ser tomar 4 GroupBox del cuadro de herramientas y los aadiremos al formulario. No importa el orden, a medida que vallamos avanzando los iremos configurando. En este momento tiene que quedar como lo muestra la Fig. n 9:

Ahora, a cada uno de los elementos creados les cambiaremos el nombre. Por ejemplo al primer Groupbox, llamado groupBox1, le pondremos SALIDAS DIGITALES correspondiente al control que contendr los botones que activarn o desactivarn las salidas digitales del entrenador. Para poder cambiar el nombre del control pulsamos con el botn derecho sobre el mismo y hacemos clic en propiedades. Dentro del cuadro de propiedades del groupBox1, modificamos los siguientes parmetros:

Parmetro
Name Text Lo mismo con los dems Groupbox. Para el grouBox2.

Valor
CONTENEDOR_SALIDAS SALIDAS DIGITALES

Parmetro
Name Text Para el grouBox3.

Valor
CONTENEDOR_IN_DIGITALES ENTRADAS DIGITALES

Parmetro
Name Text

Valor
CONTENEDOR_ANALOGICAS ENTRADAS ANALOGICAS
8

Para el grouBox4.

Parmetro
Name Text

Valor
CONTENEDOR_PWM CONTROL PWM

Una vez que se han modificado los parmetros de todos los controles nos tiene que quedar el formulario como se ve en la Fig. n 10:

Ahora ya tenemos los contenedores listos, por lo tanto, hay que empezar a aadir los controles asociados a esos contenedores. Primero agregamos los botones correspondientes a las salidas digitales, quedndonos una ventana como la que se ve en la Fig. n 11:

En total tenemos que insertar 4 Buttons de la barra de herramientas y ordenarlos de modo tal que coincidan con la anterior imagen. Ahora, hay que modificar sus parmetros al igual que hicimos con los contenedores. Como tenemos 4 salidas digitales representadas por 4 leds, nombraremos los botones de la siguiente manera:

Salida 1 Salida 2 Salida 3 Salida 4

Hacemos clic derecho sobre los botones y en las propiedades de cada uno cambiamos los siguientes parmetros: Para el button1.

Para Parmetro
Text Font (Name) Para el button2.

Valor
SALIDA 1 Microsoft Sans Serif, 8,25pt, style=Bold OUT_DIGITAL_1

Para Parmetro
Text Font (Name) Para el button3.

Valor
SALIDA 2 Microsoft Sans Serif, 8,25pt, style=Bold OUT_DIGITAL_2

Para Parmetro
Text Font (Name)

Valor
SALIDA 1 Microsoft Sans Serif, 8,25pt, style=Bold OUT_DIGITAL_3

10

Para el button4.

Para Parmetro
Text Font (Name)

Valor
SALIDA 4 Microsoft Sans Serif, 8,25pt, style=Bold OUT_DIGITAL_4

Cada uno de estos botones comandar una salida del entrenador USB. Nuestra aplicacin, luego de las modificaciones tendra que quedar como muestra la Fig. n 12.

Para las entradas digitales, incluiremos 4 PictureBox, los mismos nos indicarn mediante un cambio en su color si un interruptor ha sido presionado. Una vez aadidos los controles, el formulario tendra que quedar como muestra la Fig. n 13:

11

Ya ordenados los diferentes PictureBox, procedemos a modificar sus parmetros. Para el PictureBox 1.

Parmetros
(Name) BorderStyle BackColor Para el PictureBox 2.

Valor
IN _ DIGITAL_1 FixedSingle DarkSeaGreen

Parmetros
(Name) BorderStyle BackColor Para el PictureBox 3.

Valor
IN _ DIGITAL_2 FixedSingle DarkSeaGreen

Parmetros
(Name) BorderStyle BackColor Para el PictureBox 4.

Valor
IN _ DIGITAL_3 FixedSingle DarkSeaGreen

Parmetros
(Name) BorderStyle BackColor

Valor
IN _ DIGITAL_4 FixedSingle DarkSeaGreen

Con todos los parmetros configurados, el formulario tendra que tener el siguiente aspecto: Fig. n 14

12

Para las entradas analgicas, utilizaremos 2 barras de progreso llamadas ProgressBar, que me indicarn el valor que presenta la salida del CAD (Convertidor analgico digital). Fig. n 15

Este es el aspecto del formulario con los controles aadidos. Ahora, hay que configurar 2 parmetros bsicos para poder utilizarlos. Para el ProgressBar 1:

Parmetros
(Name) Maximum Para el ProgressBar 2:

Valor
ADC1_VALUE 1024

Parmetros
(Name) Maximum

Valor
ADC2_VALUE 1024

El valor 1024, dentro del parmetro Maximum, significa el valor mximo que puede tomar el control y coincide con la resolucin mxima de 10 bits del CAD (Convertidor analgico digital). Por ltimo, nos queda el control de PWM (Pulse Width Modulation), que consiste en 2 barra de desplazamiento llamadas HSscrollBar. A travs de este control, podremos controlar el ciclo de trabajo de los 2 PWM definidos por software.
13

Esto quiere decir que tendremos la capacidad de variar el tiempo Ton (Tiempo en que la seal PWM est en alto) y el tiempo Toff (tiempo en que la seal PWM est en bajo). Por lo tanto controlaremos la potencia aplicada y en consiguiente el brillo de los leds PWM, segn el valor que tome la barra de desplazamiento. Los 2 PWM definidos por software tienen una resolucin mxima de 8 bits. Esto nos da 255 valores de brillo diferente para los leds. Por lo que la barra tiene que tomar un valor que no supere 255; este valor lo configuraremos en los parmetros de dicho control. Fig. n 16

Para el hsScrollBar 1. Parmetros (Name) Maximum Para el hsScrollBar 2. Parmetros (Name) Maximum

Valor PWM_CONTROL_1 255 Valor PWM_CONTROL_2 255

Adems de los controles que ya hemos visto, necesitamos 2 elementos ms dentro de la aplicacin: Un botn para conectar el dispositivo (hardware USB), con la aplicacin de control y un cuadro de texto donde se muestren los diferentes eventos que ocurran dentro y fuera de la aplicacin. Por lo comentado anteriormente, agregaremos un ListBox y un Button de la barra de herramientas, con lo que el formulario nos quedara de la siguiente manera:

14

Fig. N 17

Como podemos ver, hemos redimensionado los dems controles para obtener una mejor esttica final de la aplicacin. Los parmetros de los nuevos controles son los siguientes: Para el button.

Parmetros
(Name) Text Para el ListBox.

Valor
CONECTAR _ DISPOSITIVO CONECTAR DISPOSITIVO

Parmetros
(Name) Backcolor

Valor
MENSAJES_USB 255, 255, 128 (Amarillo)

Por ltimo para darle un mejor aspecto al formulario, vamos a configurarle los siguientes parmetros: Parmetros (Name) Backcolor FormBorderStyle Text StartPosition MaximizeBox Icon Valor USB_HID 224, 224, 224 (Gris plateado) FixedSingle USB HID Demo CenterScreen False Elegimos un icono predeterminado
15

Finalmente la Interfaz de usuario nos tendra que quedar como muestra la Fig. n 18:

An faltan controles por agregar pero no afectan a la funcionalidad del programa por lo que podemos empezar a introducir cdigo de programacin.

Programacin de la Interfaz de usuario:


En esta parte del manual, veremos como agregarle funciones a los controles creados previamente. Lo primero que tenemos que hacer es agregar la clase easyHID.cs al proyecto de Visual C# que habamos creado antes. A travs de ella podremos llamar a las diferentes funciones de control que se encuentran en easyHID.dll, una librera proporcionada por la empresa MecaniqueUK para el control de dispositivos USB mediante protocolo HID. Para poder agregar la clase tenemos que agregar al directorio donde se encuentra nuestro proyecto 2 archivos: - mcHID.dll (Librera de control). - easyHID.cs (Clase con las funciones de control definidas).

16

En la Fig. n 19, vemos como quedan agregados ambos archivos a nuestro proyecto:

Ahora que los archivos estn incluidos a la carpeta del proyecto tenemos que agregarlos a nuestro entorno de trabajo. Para esto hacemos clic en Proyecto Agregar nuevo elemento existente. Fig. n 20

Una vez que anexamos la clase y la librera al proyecto ya podemos trabajar con ellas. En este momento hacemos clic derecho sobre el formulario y ponemos ver cdigo; nos tendra que quedar algo as:

17

Fig. n 21

Hemos agregado algunos elementos de cdigo que estn comentados en verde. Los mismos son necesarios para poder usar las funciones incluidas en la librera mcHID.dll. En este momento ya estamos listos para poder comenzar a escribir las funciones de control, pero antes vamos a echar un vistazo a la clase donde estn definidas las diferentes funciones. Explicaremos el cdigo paso por paso para un mejor entendimiento del mismo.

Ac tenemos 4 constantes fundamentales en la comunicacin con el dispositivo USB; las 2 primeras identifican el dispositivo mediante 2 valores VendorID y ProductID. Los mismos son proporcionados por el fabricante (MecaniqueUK) y deben coincidir con el descriptor de dispositivo en el firmware para poder entablar la comunicacin mediante USB. Las otras 2 constantes, BUFFER_IN_SIZE y BUFFER_OUT_SIZE, indican el tamao del buffer del reporte de entrada y del reporte de salida.

18

Ac definimos los mensajes que obtenemos del controlador HID cuando ocurre un evento. Ms abajo tenemos las llamadas a las diferentes funciones incluidas en la librera mcHID.dll. Entre ellas podemos destacar las siguientes:

Conecta la aplicacin al controlador.

Desconecta la aplicacin del controlador.

Leemos el reporte de entrada para ver si hay datos provenientes del dispositivo. El tamao del reporte depender de la constante BUFFER_IN_SIZE. La funcin retorna 1 si hay datos disponibles para leer y 0 si no los hay.

Escribimos un reporte de salida con los datos almacenados en la variable pData, que es un puntero a un buffer no administrado. El tamao del reporte depender de la variable BUFFER_OUT_SIZE. La funcin retorna 1 si se ha podido enviar el reporte y 0 en el caso contrario.

A travs de estas funciones obtenemos el vendorID y el productID del dispositivo.

Activamos el servicio de notificaciones para recibir mensajes cada vez que se produce un evento de lectura. El servicio se activa una vez que el dispositivo ya se ha conectado al controlador.

A travs de esta funcin obtenemos el estado de conexin del dispositivo mediante el vendorID y el productID.

19

Con esto ya hemos explicado todas las funciones que se usarn en el programa. Ahora veremos el desarrollo de 2 de ellas: Write y Read, correspondientes a las funciones para leer y escribir datos.

Esta funcin lee el reporte de entrada para ver si hay datos disponibles. En primera instancia asigna memoria con un tamao igual a BUFFER_IN_SIZE a un puntero:

Se utiliza el mtodo Marshal, para poder trabajar con memoria no administrada. Luego guarda el retorno de la funcin Read en la variable result, que corresponde a la presencia de datos en el reporte de entrada.

A travs del mtodo try, crea un buffer llamado pData. Como es una porcin de memoria no administrada, usa Marshal nuevamente y copia los datos usando el puntero creado con anterioridad en el buffer pData, quedando los datos del reporte guardados en este ltimo.

Como el espacio de memoria que al que haca alusin el puntero no se utiliza ms y es memoria no administrada, usamos Marshal para liberarla para otros procesos.

Finalmente la funcin retorna con el valor que haya tomado result.

20

Esta funcin escribe un dato en el reporte de salida. En primer instancia es igual que la funcin anterior, salvo que la variable result se le asigna un valor luego de copiar los datos en el reporte de salida; para poder indicar si los datos se han escrito correctamente. Ahora que ya tenemos la clase easyHID.cs explicada, comenzamos con el ncleo principal del programa. Anteriormente comentamos que para saber si el dispositivo estaba conectado/desconectado o enviando datos, necesitbamos leer los diferentes mensajes que entregaba el controlador. Para este fin incluimos dentro de la clase principal el siguiente cdigo.

Esta funcin toma los mensajes de Windows, los procesa y segn el valor que tomen podemos realizar diferentes acciones. Por ello crearemos 3 funciones:

21

- Dispositivo _ conectado (En caso que el dispositivo est conectado al host) - Dispositivo _ desconectado (En caso de que desconectemos el dispositivo) - Lee _ dispositivo (Si se recibe el mensaje de que hay datos disponibles) El parmetro de cada una de las 3 funciones se da segn el mensaje que se recibe por parte del controlador, con lo cul la funcin que mostramos ms arriba queda de la siguiente manera.

Ahora tenemos que crear las 3 funciones dentro de la clase principal:

Con esto, cada vez que se produzca una notificacin podremos realizar diferentes acciones en consecuencia. Las 3 funciones las desarrollaremos ms adelante ahora nos encargaremos de los controles principales. Primero trabajaremos sobre el control Coneccin_USB. El mismo nos permitir conectar la aplicacin al controlador y a su vez el dispositivo a dicho controlador. Para aadir el cdigo necesario haremos doble clic sobre el botn y nos tiene que aparecer la siguiente funcin, asociada al evento clic del mismo:

22

Ahora es momento de aadirle los elementos de la funcin:

Vemos el uso del mtodo try match y la funcin:

A travs de ella conectamos la aplicacin al controlador y a su vez el controlador al dispositivo. Para poder ver si realmente estamos conectados con el entrenador USB hacemos uso de la funcin:

Con esto podemos detectar cualquier dispositivo conectado que coincida con el VID, PID declarado en la aplicacin.

Ahora es momento de ejecutar nuestro programa por primera vez, para esto conectamos el entrenador al host, pulsamos F5 y hacemos clic en el botn conectar dispositivo. Nos tendra que quedar como muestra la Fig. n 22:
23

Vemos que al pulsar el botn conectar dispositivo, busca el dispositivo y nos muestra el VID, PID del mismo. Si ahora lo desconectamos y volvemos a presionar sobre el botn conectar dispositivo, veremos la Fig. n 23:

Podemos apreciar que la aplicacin se ha conectado con el controlador (mcHID.dll), pero no ha logrado encontrar el dispositivo USB.
24

Ya tenemos el primer control funcional dentro del programa. Ahora es el turno del control de las salidas digitales el cul, mediante el uso de 4 botones cambiar el estado de 4 leds dentro del entrenador USB. Para comenzar, hacemos clic en cada uno de los 4 botones asignados al control de salidas digitales. Con lo cul nos quedar el siguiente cdigo:

Las 4 funciones corresponden a los eventos que se producen al hacer clic en cada uno de los botones. Ahora agregaremos algunos trozos de cdigo para enviar un comando de control y otro de datos hacia el dispositivo USB. Con el fin de manejar los leds de salida.

En primera instancia la funcin crea un buffer llamado BufferOUT. El mismo guardar todos los datos que se enviarn en el reporte de salida. Primero enviamos el comando correspondiente al control de salidas: 0x0A. Luego enviamos el dato que corresponde al cambio de estado del led 1 del entrenador USB: 0x10.
25

Para enviar el reporte de salida usamos la funcin explicada anteriormente: easyHID.Write. Como podemos ver, dentro de la funcin que enva el reporte de salida hay un parmetro que no hemos visto en detalle:

Controlador, se refiere al controlador de salida el cul se activa cuando el dispositivo est conectado al host. Como no sabemos cuando el dispositivo est o no conectado, hacemos uso de los mensajes que entrega Windows en la funcin:

Precisamente en el evento NOTIFY_PLUGGED es donde se detecta la coneccin de un dispositivo al host y se procesa el mensaje mediante la funcin:

En la clase principal creamos la variable global, controlador para poder acceder al handle en cualquier parte del programa.

Ahora agregaremos el cdigo necesario para poder activar el controlador de entrada/salida.

Con esto ya podemos enviar o recibir desde y hacia el dispositivo USB. Anteriormente habamos agregado cdigo al botn de la salida 1, por lo tanto ahora haremos lo mismo con los dems botones.

26

Ahora pulsaremos F5, conectaremos el dispositivo y cambiaremos el estado de cada uno de los 4 indicadores led que se encuentran en el entrenador. Al hacer clic en cada uno de los botones, la funcin enviar un mensaje de notificacin indicando el cambio de estado de los leds. Como lo muestra la Fig. n 24:

27

Para ver mejor como trabaja la aplicacin pueden ver el video: Prueba de funcionamiento N 1, anexado a la carpeta del manual. Al prximo control al cul nos enfocaremos sern las entradas digitales. Para esto tenemos que trabajar sobre la funcin: La misma responde al evento NOTIFY_READ, el cul se activa en cuanto hay datos procedentes del dispositivo para ser leidos. Vamos a agregar cdigo dentro de la funcin que nos permita indicar de forma grfica y textual si un pulsador del entrenador USB ha sido presionado.

28

Como se puede apreciar usamos la funcin easyHID.red para leer el reporte de entrada. Segn los datos que se reciben se activan los indicadores correspondientes y se entregan mensajes de confirmacin. Luego de agregar el cdigo que se muestra ms arriba conectamos el dispositivo USB y presionamos F5. Una vez que el dispositivo est conectado presionamos los 4 botones que tiene el entrenador y veremos como cambian de color los indicadores del programa mientras se reciben los mensajes de confirmacin. Para ver mejor como trabaja la aplicacin pueden ver el video: Prueba de funcionamiento N 2 anexado a la carpeta del manual.

Otro elemento presente en nuestra aplicacin, es el control de PWM. El mismo nos permite variar el ciclo de trabajo de 2 PWM implementados por software en el firmware. Para poder insertar cdigo en dichos controles, hacemos doble clic en las barras de desplazamiento con lo cul nos tendra que quedar las siguientes funciones dentro del cdigo principal:

En estas 2 funciones se toma el valor de las barras de desplazamiento y se enva al dispositivo para controlar el ciclo de trabajo de los PWM y poder variar el brillo de los leds PWM que se encuentran en el entrenador USB. Ambos PWM tienen una resolucin mxima de 8 bits. Esto se debe a que a mayor resolucin se necesita mayor velocidad de refresco; al utilizar PWM por software la seal inyectada a los leds puede ser inestable debido a la cantidad de procesos que se ejecutan dentro del programa principal del PIC.
29

En una posible actualizacin se podra usar PWM por hardware lo que nos dara ms resolucin sin perder estabilidad en la seal generada.

Para ver mejor como trabaja la aplicacin pueden ver el video: Prueba de funcionamiento N 3, anexado a la carpeta del manual. En este momento solo falta un control para programar: Las entradas analgicas. Para mostrar el valor que toma el CAD (convertidor analgico digital), tenemos 2 barras de progreso ADC1_Valor y ADC2_Valor. Las mismas muestran de forma grfica el valor de voltaje presente en los pines de las entradas analgicas. Ambas barras de progreso pueden tomar un valor mximo de 1024, correspondiente al valor mximo que puede tomar la lectura del CAD. Que tiene una resolucin mxima de 10 bits. En la prxima imagen vemos el cdigo agregado a la funcin lee _ dispositivo ().

Ahora conectamos el dispositivo, presionamos F5 y hacemos clic en conectar dispositivo. En este momento nos tendra que aparecer en la barra de progreso el valor de voltaje presente en los pines analgicos. Para poder ver mejor el efecto, variamos el valor de los potencimetros y veremos como cambia el valor mostrado en las barras. Para ver mejor como trabaja la aplicacin pueden ver el video: Prueba de funcionamiento N 4 anexado a la carpeta del manual. En este punto ya hemos visto todos los procesos que se realizan con el dispositivo conectado. Una vez que el dispositivo se desconecta, hay que cerrar la comunicacin con el controlador. Vamos a agregar cdigo a la funcin:

La misma acta en consecuencia cuando se ha desconectado el dispositivo del host.


30

Aadimos las siguientes sentencias de cdigo a la funcin:

Con este cdigo, cada vez que el dispositivo USB se desconecta del host, se desconectar del controlador y nos notificar el evento mediante un mensaje. Hay que agregar tambin la funcin easyHID.disconect () en el evento form_closed, ya que al cerrarse el programa no necesitaremos estar enlazados con el controlador. En el siguiente trozo de cdigo lo mostramos:

Ahora que ya tenemos todos los controles en funcionamiento, mejoraremos la esttica y aadiremos algunas funciones extras a la aplicacin.

Lo primero que haremos ser definir 2 funciones. Una de ellas habilitar los controles cuando conectemos el dispositivo y la otra desactivar los controles cuando lo desconectemos.

La primera funcin se activar en cuanto el dispositivo se haya conectado, por lo tanto ser llamada desde:

La segunda funcin se activar en cuanto iniciemos la aplicacin o el dispositivo se haya desconectado del host, por lo tanto ser llamada desde:

31

Ahora aadimos cdigo para ver su funcionamiento:

32

En este momento ya tenemos nuestra aplicacin funcional, por lo que procederemos a aadir los controles faltantes al formulario. Primero a travs de la herramienta MenuStrip, agregamos un men llamado opciones y otro llamado ayuda. El formulario tendra que quedar como muestra la Fig. n 25:

Dentro del men opciones creamos la funcin salir y dentro del men ayuda: - Acerca de HID Demo - Web del proyecto - Manual de usuario El men de ayuda es un men informativo para que el usuario se gue dentro del programa adems de presentar informacin relativa al autor, informacin de contacto, etc. Con lo anterior la apariencia de la aplicacin nos tiene que quedar como muestra la Fig. n 26 y 27:

33

Ahora comenzaremos a aadir cdigo para hacer funcionales dichos elementos. Primero que nada hacemos doble clic en Salir e introducimos el siguiente cdigo:

A travs de esta funcin, nos desconectamos del controlador y cerramos el programa. Podemos agregarle teclas de acceso rpido. Para esto modificamos el siguiente parmetro:

Parmetros
ShortCutKeys

Valor
Control+ S

Con esto el formulario nos queda como muestra la Fig. n 28:

Yndonos al men ayuda tenemos la primera funcin Acerca de HID Demo. Hacemos clic en ella y agregamos las siguientes sentencias.

Este cdigo mostrar una ventana informativa sobre el creador del programa, contacto, licencia, etc.
34

Podemos agregarle teclas de acceso rpido. Para esto modificamos el siguiente parmetro:

Parmetros
ShortCutKeys

Valor
F1

Si ejecutamos la aplicacin y presionamos F1, aparecer la siguiente ventana: Fig. n 29

Luego hacemos doble clic en Web del proyecto y agregamos el siguiente cdigo:

Para agregarle teclas de acceso rpido. Para esto modificamos el siguiente parmetro:

Parmetros
ShortCutKeys

Valor
Ctrl+W

Finalmente hacemos doble clic en Manual de usuario y agregamos el siguiente cdigo:

35

En este cdigo, trata de abrir el manual de usuario de la aplicacin. En caso de no poder, muestra un mensaje alternativo de advertencia como el que est a continuacin. Fig. n 30

Para agregarle teclas de acceso rpido, modificamos el siguiente parmetro:

Parmetros
ShortCutKeys

Valor
Ctrl+A

Con esto ya tenemos nuestro men creado y funcional. Ahora aadiremos de la barra de herramientas el elemento StatusStrip. Con esto el formulario tendra que quedar como muestra la Fig. n 31:

Dentro del elemento podemos ver un men desplegable all elegimos el control llamado StatusLabel y le modificamos el siguiente parmetro:

Parmetros
Text

Valor
hh:mm:ss

A travs de este control mostraremos la hora en formato: horas : minutos : segundos Para poder realizar esto aadimos un timer de la barra de herramientas y le cambiamos el siguiente parmetro:
36

Parmetros
Interval

Valor
1000

El valor parmetro interval nos indica la frecuencia con la cul el componente se actualiza, en este caso 1000 ms (mili segundos) o un segundo. Para poder obtener la hora hacemos doble clic sobre el timer y le agregamos el siguiente cdigo:

Y dentro del evento:

El siguiente cdigo:

Con esto la aplicacin ya muestra la hora una vez que se inicializa: Fig. n 32

37

Como podemos ver le hemos aadido algunos indicadores adicionales a los controles para mejorar el aspecto visual del mismo, como as tambin redimensionamos algunos controles. Un ltimo control funcional que tendremos que agregar a la aplicacin ser un ToolTip. Este control muestra informacin cuando se pasa el puntero del Mouse sobre el control asociado. Una vez que lo arrastramos desde la barra de herramientas, le aadimos el siguiente cdigo:

Finalmente lo que nos queda por hacer es aadirle un icono al programa y modificar la informacin de ensamblado para agregar informacin personal. Para este fin nos dirigiremos hacia: Fig. n 33

Dentro de la pestaa aplicacin tenemos que modificar algunos parmetros:


38

Fig. n 34

Podemos ver varias cosas entre las que destaco las siguientes: - Nombre de ensamblado y espacio de nombres: Aqu pondremos el nombre de la aplicacin. - Informacin de ensamblado: Informacin que se incrusta al programa compilado (.exe), respecto del autor, versin, fecha de ensamblado, revisin, etc. Fig. n 35

39

- Por ultimo el icono y manifiesto que seleccionaremos del icono agregado a la aplicacin previamente. Para ver como ha quedado la aplicacin podemos presionar F6 y generar el archivo ejecutable que estar en la carpeta release, como lo muestra la Fig. n 36:

En este punto hemos terminado con la aplicacin para la PC y nos queda nicamente explicar el cdigo del microcontrolador para terminar con la gua.

Introduccin al compilador CCS:


En este apartado no explicaremos como programar en C, sino como crear una aplicacin funcional a partir de conocimientos previos en programacin. Explicaremos los puntos clave a tener en cuenta con el firmware del microcontrolador. Como compilador utilizaremos el CCS v4.114, ya que ofrece una gran facilidad en el uso de las libreras USB. El entorno de trabajo del CCS permite compilar y tambin suministra una gran variedad de herramientas auxiliares. En la Fig. n 37, se muestran los distintos elementos bsicos del entorno de trabajo. Existen 2 formas de iniciar una sesin: abriendo un fichero de cdigo fuente o creando un proyecto.
40

Para abrir un fichero fuente directamente se realiza una pulsacin sobre el icono para el manejo de ficheros (Fig. n 38) y aparece un men donde podemos crear, abrir, guardar o cerrar ficheros. Con el comando New podemos crear un fichero fuente, un proyecto, un fichero RTF o un fichero de diagrama de flujo.

Con la opcin New > Source file, el programa pide el nombre del nuevo fichero y crea una nueva ventana en blanco donde podemos empezar a escribir, como lo muestra la Fig. n 39.

41

Una vez explicado esto, procederemos a crear nuestra aplicacin de control.

Programacin del firmware para el microcontrolador:


Lo primero que haremos ser cargar el firmware, que ya escrib, en el editor de CCS Fig. n 40.

42

Una vez que ya tenemos el archivo cargado, vamos bajando y vemos la primer sentencia de cdigo:

A travs de la misma introducimos en nuestro programa la definicin de registros internos del PIC18F2550, que es el microcontrolador usado en el entrenador USB. Con esto le decimos al compilador que trabajaremos con un PIC18 y que use el modo PCH (compilador para micros de 16 bits). Ms abajo tenemos la siguiente lnea de cdigo:

A travs del uso de esta directiva, le decimos al compilador que trabajaremos con el CAD (Convertidor analgico a digital) con 10 bits de resolucin y justificacin a la derecha (Los bits ms significativos del registro ADRESH, son ledos como 0).

Los fuses (o mejor dicho palabra de configuracin) son muy importantes ya que determinan muchos parmetros del microcontrolador. Los que se encuentran ordenados en la figura anterior tienen las siguientes funciones: NOMCLR: No usaremos el pin MCLR, utilizaremos reset por software. HSPLL: Utilizaremos un cristal de alta velocidad en conjunto con el PLL. NOWDT: No utilizaremos el perro guardin. NOPROTECT: No protegeremos la memoria contra lecturas. NOLVP: No habilitaremos la programacin con bajo voltaje. NODEBUG: No utilizamos cdigo para debug. USBDIV: Significa que el reloj del mdulo USB se tomar de la salida del PLL\2. En este caso 96Mhz \ 2 = 48Mhz (Frecuencia de trabajo). PLL5: Esto quiere decir que el prescaler dividir en 5 la frecuencia del oscilador principal para obtener los 4Mhz necesarios en la entrada del PLL. Como estamos usando un cristal de 20Mhz.20Mhz \ 5 = 4Mhz. CPUDIV1: La frecuencia del PLL se dividir en 2 para obtener la frecuencia de trabajo del CPU: 48Mhz. VREGEN: Habilitamos el regulador interno de 3.3v del mdulo USB. NOPBADEN: Todo el puerto B como entradas/salidas digitales.

Ahora ya tenemos la palabra de configuracin explicada, por lo que procederemos con la siguiente sentencia: Ac declaramos la frecuencia de trabajo para que el compilador pueda calcular los retardos en las funciones de delay.
43

Usando la directiva #include agregamos todas las libreras necesarias para gestionar la comunicacin USB. Por el momento explicaremos 2 de ellas: - APLICACIN_HID.h - Descriptor_easyHID.h En la primera guardamos todas las definiciones de hardware, constantes, declaracin y documentacin de funciones, etc.

A travs del uso de etiquetas #define le aadimos nombres a las entradas y salidas para poder facilitar la programacin y recordar donde se ubican los diferentes componentes.

Definimos el tamao que debe tener el edpoint de entrada y de salida, en este caso el valor 32 nos indica que recibir 32 bytes desde el host y transmitir 32 bytes hacia el host. Para dejar bien en claro el significado de endpoint, les dejo el siguiente enunciado:
"Los dispositivos (o mejor dicho, las funciones) tienen asociados unos canales lgicos unidireccionales (llamados pipes) que conectan al host (PC) controlador con una entidad lgica en el dispositivo (PIC) llamada endpoint. Los datos son enviados en paquetes de largo variable (potencia de 2). Tpicamente estos paquetes son de 64, 128 o ms bytes. Estos endpoints (y sus respectivos pipes) son numerados del 0 al 15 en cada direccin, por lo cual un dispositivo puede tener hasta 32 endpoints (16 de entrada y 16 de salida). La direccin se considera siempre desde el punto de vista del host controlador. As un endpoint de salida ser un canal que transmite datos desde el host controlador al dispositivo. Un endpoint solo puede tener una nica direccin. El endpoint 0 (en ambas direcciones) est reservado para el control del bus."

44

La cita anterior fue extrada del trabajo de grado que se encuentra en el siguiente link: http://pablohoffman.com/oscusb/doc/

Estas definiciones est ntimamente ligadas con las funciones de control que se encuentran en la aplicacin de Visual C# estudiada anteriormente. Esto lo veremos ms adelante.

Estos macros son usados para el control de las salidas digitales para no tener que usar las funciones predefinidas ms costosas de recordar. Ayudan al desarrollo del programa. Luego hay 2 funciones ms, pero su explicacin es redundante ya que estn muy bien documentadas en la librera. Siguiendo con el programa principal tenemos las siguientes funciones:

Estas 2 directivas nos permiten utilizar los puertos sin necesidad de configurarlos cada vez que se usan. Lo que si debemos tener en cuenta es configurar que pines sern entradas y que pines sern salidas usando las siguientes sentencias:

Una vez configurados los puertos pueden usarse libremente los que nos ahorra RAM y ROM dentro una vez que compilamos el programa.

45

Esta funcin ya se encuentra explicada en la librera, pero dentro de ella tiene una sentencia que no ha sido desarrollada.

Esta funcin se encuentra dentro de la librera: USB.c, lo que hace es esperar hasta que el host enumere el dispositivo y prender el LED verde. En caso de que no lo hiciera el dispositivo no puede comunicarse con la aplicacin de control y el LED rojo permanece encendido.

Esta funcin pertenece al usuario Palitroquez del foro TODOPIC. La misma configura correctamente el ADCON2 como se explica en la librera: APLICACIN_HID.h Adentrndonos en la funcin principal main (), tenemos las siguientes funciones:

A travs de estas sentencias configuramos correctamente el CAD.

Con estas 2 sentencias inicializamos los 2 PWM y apagamos los leds asociados.

Una funcin muy importante ya que inicializa el stack USB, conecta el dispositivo al host, habilita las interrupciones, etc. Trabaja en conjunto con USB stack; esta funcin asume que el USB est conectado siempre al host, por lo que mantiene al dispositivo permanentemente conectado.

46

Esta funcin inicializa el hardware USB, las interrupciones, etc. Trabaja en conjunto con USB_init (). En caso de usar USB_init_cs (), hay que llamarla peridicamente desde el main (), pero normalmente se llama una sola vez.

Esta funcin la utilizamos como indicador si el dispositivo est o no conectado al host. En caso de que no est enumerado el programa no avanza y no nos podemos comunicar con la PC. Ya dentro del bucle infinito que se muestra a continuacin, todas las funciones que se encuentren dentro del mismo se ejecutarn indefinidamente.

Aqu miramos el estado de la funcin usb_enumerated (), la misma nos indica si el dispositivo est o no conectado. En caso de que si lo est ejecuta las sentencias que se explicarn a continuacin:

Estas 2 funciones son idnticas y nos permiten controlar el ciclo de trabajo de ambos PWM. La variable ValorPWMx_H, corresponde al semiciclo positivo de la seal y la variable ValorPWMx_L, al semiciclo negativo. Modificando el valor de ambas variables segn el valor que se reciba de la PC, podemos modificar el ciclo de trabajo, por lo tanto la potencia aplicada a los leds PWM (modificamos el brillo de los mismos).

47

Estas 4 sentencias son idnticas, lo que hacen es ver el estado de los pulsadores y enviar guardar el valor en el buffer enva.

Ambos grupos de sentencias son iguales, lo que hacen es lo siguiente, enumerado para una mejor comprensin: Elegimos un canal de conversin. Esperamos 10us. Guardamos la parte alta de la conversin en la variable valor_adc_alta. Guardamos la parte baja de la conversin en la variable valor_adc_baja. Asignamos la parte alta al 4 bit del arreglo enva. Asignamos la parte baja al 5 bit del arreglo enva.

Esta funcin enva el arreglo de datos enva hacia el host para luego poder visualizar los datos en la aplicacin. La funcin tiene 4 parmetros que enumeraremos para un mejor entendimiento: 1 parmetro: endpoint usado, en este caso el endpoint 1. Para su mejor entendimiento remitirnos a la explicacin que est en la pg. 44. 2 parmetro: variable que contiene los datos a enviar, en este caso es el buffer enva. 3 parmetro: Tamao del arreglo que contiene los datos a enviar: 32. 4 parmetro: sincronismo de datos.

48

Al principio se ejecuta un bucle condicional, el mismo se fija, mediante la funcin que tiene asociada si hay datos en el endpoint indicado. En este caso dentro del parntesis hay indicado un 1, refirindose al endpoint 1. En caso de que haya datos provenientes del host para leer, los tomamos y guardamos usando la funcin usb_get_packet. La misma tiene 3 parmetros: 1 parmetro: endpoint usado. Usamos el endpoint 1. 2 parmetro: variable donde se guardarn los datos provenientes del host. 3 parmetro: tamao del paquete a recibir. Una vez tomados los datos del host los procesaremos como muestran las siguientes funciones:

Ac tenemos 2 bucles condicionales, primero si recibimos el comando: ACTIVA _ SALIDAS, vemos el primer byte del arreglo recibe. Segn sea el dato recibido, activamos el led en consecuencia. Para darnos una idea de como trabaja la aplicacin con el hardware vamos a poner la funcin:

49

Vemos que la funcin enva el comando para activar los leds y luego el dato correspondiente al led 1. Cuando el PIC los recibe, cambia el estado del led 1 como muestra la sentencia de cdigo:

Para el caso de los PWM se cumple lo mismo: Se recibe el comando de control, recibe el valor procedente de las barras de desplazamiento y lo guarda en las variables que contienen el ciclo de trabajo.

Con esto ya hemos visto tanto la aplicacin para la PC, como el firmware para el microcontrolador y estamos listos para poder crear nuestras propias aplicaciones a partir de la gua. Algo que habamos omitido hasta el momento es la explicacin del hardware utilizado. Aunque su utilizacin sea sencilla vale la pena detallar como est compuesto, adems es necesario nombrar los elementos que lo componen para un mejor entendimiento del mismo.

50

Entrenador USB v0.1:


Como elemento hardware para el desarrollo de esta gua usaremos un entrenador de bajo costo diseado para comprender el funcionamiento del puerto USB y posibles aplicaciones de control. El entrenador tambin puede ser usado para aprender a programar debido a que posee los perifricos bsicos que se usan en los entrenadores estudiantiles. Para tener una vista general del hardware utilizado, miremos la Fig. n 41.

En la imagen podemos ver la distribucin de todos los elementos de la placa. Un punto a tener en cuenta es el conector ICSP, que est especficamente diseado para usarlo con el PicKit2. En la Fig. n 42, vemos la distribucin de pines de dicho conector y la comparamos con el conector del PicKit2 de la Fig. n 43.

51

El nombre de cada pin es el siguiente: Pin 1: Vpp (Voltaje de programacin). Pin 2: Vdd (Voltaje de alimentacin: desde el programador). Pin 3: Gnd (Negativo o tierra). Pin 4: PGD (Seal de datos desde/hacia el programador). Pin 5: PGC (Seal de reloj desde/hacia el programador).

Como podemos ver es la misma distribucin de pines que el PicKit2:

Por ltimo podemos ver el diseo del circuito impreso y el esquema de nuestro entrenador USB en las Fig. n 44 y 45 respectivamente:

52

Con esto damos por terminada nuestra gua, espero les sirva. Un saludo !

53

54

55

Вам также может понравиться