Tutoriales

PIC + USB para principiantes

Este tutorial ofrece una guía rápida para implementar una conexión vía USB de un PIC18F con un equipo Windows XP o Windows 7, funcionando bajo un programa compilado con Visual C# 2008 y la librería mpusbapi.dll otorgada por Microchip. Está basado en las guías de J1M de Hobbypic, Picmanía de Redpic y emplea el Enumerador USB de Pedro Palitroquez.

Importante:
Este tutorial ya es obsoleto. Puedes optar por leer el más reciente con XC8 gratuito por parte de Microchip: PIC - Puerto serial por USB CDC.

Fuentes del Tutorial:

- J1M PicUSB en Hobbypic
Sitio web no disponible
- Picmanía by RedPic - El USB Desencadenado
http://picmania.garcia-cuervo.net/usb_0_desencadenado.php
- Automatización de datos Enumeración USB por Pedro Palitroquez
http://www.todopic.com.ar/foros/index.php?topic=20047.0


Requerimientos de software:


- Visual C# 2008 Express Edition
(Descarga gratuita oficial desde Microsoft)
- CCS Compiler
Link al sitio del compilador

- Enumerador USB de Palitroquez
(Descarga)
- Paquete de archivos de ejemplo
(Descarga)

Para entender mejor el protocolo USB y todos sus secretos y detalles conseguí el excelente libro USB Complete de la escritora Jan Axelson. Te recomiendo que lo compres si quieres desarrollar tus propias aplicaciones y dispositivos USB personalizados y no usar ejemplos genéricos como éste jeje. La cuarta edición viene actualizada con la última versión USB 3.0 que funciona hasta 5Gbps.

Se incluyen ejemplos USB de PICs con Basic y C y las librerías y funciones para leer los datos desde Visual Studio 2008 (Basic o C#).

El libro es enviado desde E.U. y llega a la puerta de tu casa desde Amazon... no debe faltar en tu biblioteca personal.

 


Creando la aplicación bajo Visual C# 2008

- Crear un nuevo proyecto
- Seleccionar Windows Forms Application
- Guardar el proyecto nuevo
- Copiar los archivos mpusbapi.dll y PicUSBAPI.cs a la carpeta del proyecto
- En el explorador de soluciones dar click derecho y elegir Agregar, Elemento Existente
- Agregar los archivos mpusbapi.dll y PicUSBAPI.cs
- En el código de la ventana principal (Form1.cs) copiar el nombre que viene en namespace
- Abrir el archivo PicUSBAPI.cs y en namespace reemplazar el nombre con el copiado. Esto vincula los archivos .cs en el mismo proyecto.
- El código de la librería mpusbapi.dll contiene apuntadores que a c# no le gusta compilar. Permitir la compilación del código unsafe, ir a Proyecto, Propiedades, Generar, Permitir código no seguro. Debes activar esta opción en modo Debug y Release si piensas compilar el programa para que corra sin tener Visual C# instalado (modo release).

Para enviar datos al PIC deberás usar el método:
private void SendPacket(byte* SendData, DWORD SendLength)

Para recibir datos desde el PIC deberá usarse el método:
private void ReceivePacket(byte* ReceiveData, DWORD *ReceiveLength)

En el archivo PicUSBAPI.cs el compañero J1M de Hobbypic implementó ejemplos de datos que se envían y reciben hacia el PIC. Dales una checada y verás que es fácil implementar tus propios métodos. Es recomendable que los implementes en la misma clase PicUSBAPI.

Cuando el PIC es conectado a la PC se reporta con Windows con varios datos, pero sobresalen dos, el Vendor ID y el Product ID. El VID y PID de nuestro PIC contendrá los datos 04D8h y 0011h respectivamente, según se ve en el archivo PicUSBAPI.cs. Es recomendable no cambiar el Vendor ID ya que Microchip permite el uso de este ID de forma gratuita. Si se utiliza un VID diferente, hay que registrarlo en www.usb.org y pedir permiso para emplearlo. El PID puede ser modificado sin problema alguno. Ambas modificaciones han de hacerse en la variable vid_pid_norm del archivo.

Posteriormente en el código de la ventana principal (Form1.cs) hay que instanciar un objeto de la clase PicUSBAPI para poder hacer los envíos y recepciones hacia el PIC. La instancia se hace de forma sencilla:

//Instancia un objeto de la clase PicUSBAPI
PicUSBAPI usbapi = new PicUSBAPI();


Para llamar métodos de la clase PicUSBAPI solo los aplicas sobre el objeto creado:

//Ordena al PIC que ponga su puerto B a 0x00
usbapi.Puerto(0x00);




Creando el programa del PIC18F2550 de Microchip en CCS

El programa del pic se compone de dos archivos, el .c que es el principal y usb_desc_scope.h que es un archivo cabecera generado por el software de Pedro Palitroquez, el Enumerador USB.

Para generar este archivo hay que ejecutar el software de Palitroquez e introducir los datos con los que queremos que el PIC se presente ante Windows. El VID deberá permanecer como 04D8h como habíamos mencionado anteriormente y el PID deberá coincidir con el ingresado en PicUSBAPI.cs de VC#.

Todos los demás datos puedes personalizarlos a tu gusto, incluso puedes agregar un icono personalizado para que aparezca en el administrador de dispositivos representando a tu PIC.



El archivo usb_desc_scope.h deberá guardarse en la misma carpeta en donde guardes el archivo principal .c que se cargará en el pic. El archivo mchpusb.inf deberá guardarse en la carpeta Driver Windows junto con el icono que hayas elegido. Es el que ayudará a Windows a reconocer al PIC18 como parte del hardware de la PC.

Una vez teniendo el archivo .inf y el archivo .h generados hay que compilar la aplicación para el PIC. Puedes usar el archivo PicUSB.c como ejemplo. Hay que incluir los archivos siguientes en la compilación:

#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "usb_desc_scope.h" //Configuración del USB por Enumerador Palitroquez
#include <usb.c> //handles usb setup tokens and get descriptor reports


Es importante poner con comillas "usb_desc_scope.h" ya que si se pone con <> incluirá el ejemplo de CCS en vez de nuestro driver personalizado.

La descripción de las funciones USB es como sigue:

usb_init(); //inicializa el USB
usb_task(); //habilita periférico usb e interrupciones
usb_wait_for_enumeration(); //espera hasta que el PicUSB sea configurado por Windows
usb_enumerated(); //Entrega un 1 si el pic ya fue detectado por Windows
usb_kbhit(1); //Vale 1 si el endpoint de recepción contiene datos del host
usb_get_packet(1, recibe, 3); //toma el paquete de tamaño 3bytes del EP1 y almacena en recibe
usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //envía el paquete de tamaño 1byte del EP1 a la PC


Una vez que hayas editado tu programa puedes compilarlo. Graba tu pic con tu programador favorito y conecta las terminales como sigue.



El diagrama está basado en el empleado por J1M en Hobbypic, pero solo muestra las conexiones básicas del PIC, tú deberás conectar los dispositivos que hayas incluido en tu programa en CCS. En el programa de ejemplo PicUSB.c se empleó un display BCD de ánodo común conectado al puerto B y un potenciómetro conectado a RA0.

Las terminales del ejemplo para el ánodo común han de conectarse de la siguiente forma:

RB0 - a
RB1 - b
RB2 - c
RB3 - d
RB4 - e
RB5 - f
RB6 - g
RB7 - punto (que indica cuando el pic ya fue detectado por Windows)

El voltaje de alimentación podrá ser entregado completamente por el puerto USB y deberás limitar el consumo del pic y su circuitería extra a 100mA. Si requieres más corriente de alimentación deberás modificar la siguiente línea en el archivo usb_desc_scope.h.

0x32, //maximum bus power required (maximum milliamperes/2) (0x32 = 100mA)



Conexión al puerto USB e instalación del driver con Windows XP

Al conectar por primera vez el PIC, Windows pedirá que se instalen los drivers. Solo hay que apuntarle la ruta de la carpeta Driver Windows del paquete de ejemplo o la ruta en la que se guardó el .inf generado con el Enumerador.

Puesta a prueba del programa en VC#

Ahora al probar el programa ejemplo se controla la salida del puerto B y se lee el valor del ADC mostrándolo en pantalla.


Si quieres usar un cristal diferente a 12MHz o correr el PIC a una velocidad menor a 48MHz (12MIPS) puedes leer el tutorial de Picmanía en este link:

http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz

Gracias a J1M, Redpic y Palitroquez por publicar sus tutoriales.

Instalación bajo Windows 7

Afortunadamente el driver que el Enumerador de Palitroquez genera es compatible al 100% con Windows 7. Incluso el icono predeterminado que se muestra en Windows XP y no se mostraba en Windows Vista ya se muestra en Windows 7.

NOTA: Si usas Windows 7 a 64 bits debes actualizar la librería mpusbapi.dll para que el programa funcione correctamente. La última versión al momento de escribir esto es el USB Framework 2.7a.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en547784

A continuación se muestra una serie de imágenes que detallan la instalación del driver bajo Windows 7.