Translate

domingo, 12 de abril de 2009

Acercamiento al uso del USB

Hablar sobre USB es algo complejo, pues no es tan sencillo como pareciera. A diferencia de la transmisión serie o la transmisión por USB es mas elaborada, desde la construcción de las tramas hasta los descriptores que le componen; además de los métodos de transferencia que existen dentro del mismo USB.

La comunicación USB esta basada de manera céntrica, donde el HOST en este caso nuestra computadora es quien controla y enumera los dispositivos USB que se conectan a ella. Para entender mas a fondo el protocolo USB recomiendo los libros de Jan Axelson que son excelentes en la descripcion de todos los elementos que se deben considerar al diseñar un sistema que maneje el USB. Existen términos como Enumeracion, EndPoint, Descriptor entre otros que no serán detallados a fondo pues su complejidad requieren mayor estudio y esto solo es un acercamiento.

Existen varios tipos de transferencias usadas con el USB siendo 3 las mas conocidas: Bulk, Interrupción y Asíncrona. En el mundo de los PICs las mas usadas son la BULK y la de Interrupción, mejor conocidas como CDC o HID respectivamente, básicamente se diferencian en la forma en que transmiten los datos hacia el host y en la forma en que los descriptores están construidos.

Para usar la comunicación USB con los PICs Microchip ha liberado una serie de microcontroladores que incluyen un modulo interno para trabajar con dicha protocolo, los PICs que cuentan con este modulo los podemos ver en este enlace. Hay que decir que microchip ha liberado de hace ya algún tiempo la nueva familia OTG la cual puede actuar como HOST embebido, pero esta clase no sera tratada en el blog.

En C18, tenemos un framework liberado por Microchip para poder trabajar con estos PICs, actualmente están en la Versión 2.3, pero nosotros usaremos para estos simples ejemplos la versión 1.3 ya que es mas facil de trabajar y editar. Lo primero que debemos hacer es entender como trabaja este framework -o STACK- de la Versión 1.3 y los archivos que contiene. Para una visión general del funcionamiento esta pagina es excelente. Ahí encontraran la descripción del sistema y los archivos que están en este stack. Es necesario que den una revisada para poder entender mejor lo que viene. Como la mayoría de los Stacks de Microchip son usados para sus placas de desarrollo es necesario editar y añadir códigos para que el firmware trabaje con nuestro PIC, en mi caso me basare en el hardware de la TP-2550, creada por mi amigo Giovanni Lafebre.

Manos a la Obra
Lo primero que vamos a hacer es descargar el Stack USB v1.3 de este enlace. Una vez instalado por default en C:\MCHPFSUSB. Abriremos el compilador y en menú project cargaremos el ejemplo de la carpeta FW\CDC\.

Usando CDC con el 18F2550
Como el hardware de la TP-2550 esta basado en el 18F2550, tendremos que editar algunas cosas -he decidido usar el CDC antes que el HID solo por gusto no por otra cosa-. Al abrir el archivo MCHPUSB.mcp podemos ver como esta construida la estructura de directorios:
Para este pequeño ejemplo nosotros vamos a trabajar solamente con los siguientes archivos: main.c, user.c, io_cfg.h y usbcfg.h. Hay que tener cuidado con el archivo del linker, en este caso rm18f4550.lkr; este archivo viene default para el 18F4550 es usado para poder cargar el bootloader que por default trae el C18, el bootloader facilita la programación del PIC si se desea prescindir de un programador y se puede hacer con la misma conexión USB del hardware. Si se desea usar el bootloader con el 18F2550 basta con editar el archivo lkr y sustituir la linea FILES p18f4550.lib por FILES p18f2550.lib. Si no se desea usar el bootloader se deberá quitar el archivo rm18F4550 y sustituirlo por 18F2550.lkr que se encuentra en la carpeta lkr del directorio de instalación de C18; además de que en el archivo main.c se deberá comentar la siguiente porción de código:

/** V E C T O R R E M A P P I N G *******************************************/
/*extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code*/



Añadiendo nuestro Hardware
Ahora para usar la TP2550 tendremos que agregar algunas lineas y empezaremos en el archivo io_cfg.h. Tendremos que localizar la linea donde nos indica descomentar y agregar nuestro Hardware por ahora solo agregue 8 Leds y 4 Switches.




Abriremos el archivo main.c y de igual forma localizamos la linea donde nos pide descomentar para añadir nuestros fuses yo añadi algunos:



Unas lineas mas abajo dentro de la funcion InitializeSystem vamos a añadir el siguiente código, pues de lo contrario nos dara un error al compilar. Solo nos sirve para inicializar en modo digital el PIC.



Ahora abrimos el archivo usbcfg.h y vamos a añadir lo siguiente:



Esto sirve para que identifique los pines de sensado para el USB aunque estan comentados porque usamos el mismo voltaje del USB es necesario definirlos, en caso de que se requiera una fuente externa se necesitara definir que pin sensara cuando el USB se conecte al PIC.

Por último y mas importante editaremos el archivo user.c, que es el archivo donde se ejecutaran las rutinas pertinentes a nuestro programa nosotros solo añadiremos que encienda un led al recibir del puerto serie el ascii 1 y cuando se presione un switch nos mande el estatus al terminal. Vamos añadir una variable llamada old_sw1 y el prototipo de función para cuando se presione el switch 1 de tal forma que una parte del código debe verse asi:



La funcion de ProcessIO la dejaremos así:



El código donde se realizan nuestra función sera el siguiente:



Y por último añadimos la función del boton apretado:



En la carpeta de user del directorio c:\MCHPFSUSB\fw\Cdc\ existen varios ejemplos para poder utilizar el USB en modo CDC con el 18F4550 pero son utiles si desean usar el 18F2550.

Finalmente dejo el video de la simulación del programa anterior.




Y como no debe faltar el video en fisico de ese programa, pero sin botones.

2 comentarios:

  1. felicidades por el blog...
    muy ilustrativo e interesante
    me ha ayudado bastante.

    ResponderEliminar
  2. Te felicito por el blog! me ha resultado de mucha ayuda. Lo que si, quisiera preguntarte por a aplicación que usas para enviar y leer datos ("serial comunicator"), me dirias donde puedo bajarla? muchas gracias. Mi mail es chito_rivas@hotmail.com.

    ResponderEliminar