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)