You are on page 1of 21

PROYECTO 1

http://www.desarrollopic.com/tutoriales/proyecto-usbcon-pic-winxp/

PICtool v1.0
06/04/2011

Sera nuestro primer proyecto para comunicacin USB 2.0, utilizando como interfaz al
PIC18F2550, est diseado para correr bajo Windows XP e inferiores, tendr la finalidad de
introducirnos en el tema "Aplicaciones USB" y que a veces no sabemos cmo abordar, pues a
pesar de tanta informacin es difcil encontrar algo certero para explorar el tema, espero mis
amigos les sea de ayuda, como lo fue para m en su momento, no olviden preguntar o hacerme
llegar sus comentarios pues solo as aprendemos todos.
Este sencillo proyecto est diseado para recibir datos del puerto USB del PC, mediante los
cuales estaremos conmutando 4 salidas lgicas en 4 pines del PIC, el dato que estaremos
recibiendo es un paquete de 2 bytes, uno correspondiente al modo y otro al nmero de led a
conmutar, es decir:
1er byte, Si modo = "0" entonces entra a modo LED
2do byte, Si dato = "1 2 3 4", conmutar LED correspondiente
La idea central de funcionamiento es la siguiente:
PC <---> DRIVER XP <---> PIC18F2550
Por tal motivo los 3 elementos deben regirse por dos cdigos importantes para que exista
comunicacin y reconocimiento entre ellos: Product ID y Vendor ID.
Vendor ID: Este cdigo es la firma de alguna empresa para utilizar la comunicacin USB, y NO
debe ser cambiada. Microchip= 04D8.
Product ID: Este cdigo puede ser modificado por el usuario, para personalizar algn circuito en
particular.
El proyecto PICtool v1.0 fue desarrollado en 4 pasos importantes:
1.-Diagrama Electrnico (EAGLE)
2.-Edicion de Cdigo PIC18F2550 (CCS)
3.-Edicion de Driver Windows XP (Bloc de notas)
4.-Edicion de Interfaz Grfica (Visual C#)
A continuacin iremos explicando cada paso:

Paso 1
Utilizaremos un diagrama sencillo que sea fcil de armar en protoboard, manejaremos pocos
componentes, no es necesario llegar hasta el diseo en PCB, pues ms adelante con nuevos
proyectos iremos aadiendo ms componentes; por ende recomiendo que el armado se quede
en protoboard por ahora.
Aremos uso del software EAGLE 1.10.0 para disear el esquemtico de nuestro circuito en
cuestin.
Los materiales necesarios son:
1-Protoboard
1-PIC18F2550
1-Conector USB tipo B
1-Capacitor cermico 470nF
1-Capacitor cermico 100nF
2-Capacitores cermicos 22pF
1-Cristal 12MHz
1-Resistor 10K
4-Resitores 330
4-Leds 3mm
*Cable, pinzas etc.
Ver figura 1, correspondiente al diagrama electrnico:

Figura 1

Figura 2

Las caractersticas generales son:


-Utiliza un cristal de 12MHz
-Un capacitor de 100nF para evitar ruido
-Un capacitor de 470nF necesario en el pin Vusb
-Y las conexiones correspondientes a las 4 salidas lgicas, ver figura 2:
LED1= PORTC.1
LED2= PORTC.2
LED3= PORTC.6
LED4= PORTC.7
Para ir relacionando los pines del micro a lo mencionado ver figura 3.

Figura 3

Despus de haber aplicado el diagrama anterior, el armado del circuito en la protoboard debera
verse similar a la figura 4.

Figura 4

Paso 2
Para la edicin del cdigo a implementar al PIC18F2550 se utilizara el compilador PIC C Compiler
CCS, para trminos generales ser editado en "cdigo C", para ello utilizaremos 4 libreras
propias al compilador:
pic18f2550.h = Librera para utilizar dicho dispositivo con todas sus caractersticas en
hardware. Propia del compilador y no debe modificarse.
pic18_usb.h = Librera correspondiente al uso de la comunicacin USB para PIC18. Propia del
compilador y no debe modificarse.
usb.c = Librera para uso estndar de comunicacin USB. Propia del compilador y no debe
modificarse.
descriptor_USB.h = Librera que contiene la configuracin y descripcin general del dispositivo
a conectar. Librera de ejemplo que fue modificada para utilizar con este proyecto en particular,
ubicada en la carpeta de samples del compilador con el nombre de "usb_desc_scope.h", son 2
las partes modificadas (ver figura 5):
1-Vendor ID, VID= 04D8, cdigo correspondiente a la firma de Microchip para utilizar
comunicacin USB.
2.-Product ID, PID= 0090, cdigo cualquiera, escogido para este proyecto en particular y que
debe ser igual al de la Interfaz y Driver.
*Por lo tanto PIC, Driver e Interfaz deben tener el mismo VID y PID.

Figura 5

Retomando, la funcin principal del PIC es leer los dos bytes enviados desde el PC, en donde el
1er byte corresponde al modo y el 2do al nmero de led, entonces:
-El primer byte enviado corresponde al modo
MODO = 0x00, 1er byte
-El segundo byte corresponde al nmero de LED y pude ser cualquiera de los cdigos siguientes:
LED1 = 0x01, 2do byte
LED2 = 0x02, 2do byte
LED3 = 0x03, 2do byte
LED4 = 0x04, 2do byte
Apagar LED's = 0x05, 2do byte
El cdigo C bsico para la conmutacin de dichos leds es el siguiente:
>>>---------------------------------------------------------------------------------if (modo==0)
//El 1er byte corresponde al modo LED?
{
switch(dato)
// 2do byte para el led correspondiente
{
case 1: {output_toggle(LED1); break;}
case 2: {output_toggle(LED2); break;}
case 3: {output_toggle(LED3); break;}
case 4: {output_toggle(LED4); break;}
case 5: {LED_OFF(LED1); LED_OFF(LED2);
LED_OFF(LED3); LED_OFF(LED4);
break;}
}
}
-----------------------------------------------------------------------------------<<<
Como vern las instrucciones IF y SWITCH son bsicas del cdigo C, pero tambin hacemos uso
de una instruccin propia del CCS; "output_toggle", la cual nos permite cambiar el estado lgico
de una salida del PIC, es decir:
PORTC.1 = 0 --->output_toggle---> PORTC.1 = 1

PORTC.1 = 1 --->output_toggle---> PORTC.1 = 0


El cdigo completo se muestra a continuacin:
>>>-------------------------------------------------------------------------------------#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use
delay(clock=48000000)
#define USB_HID_DEVICE
FALSE
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK
#define USB_EP1_RX_SIZE 2
#include <pic18_usb.h>
#include "descriptor_USB.h"
#include <usb.c>
#define
#define
#define
#define

LED1
LED2
LED3
LED4

PIN_C1
PIN_C2
PIN_C6
PIN_C7

#define LED_ON output_high


#define LED_OFF output_low
#define modo
#define dato

datain[0]
datain[1]

void main(void)
{
int8 datain[2];
LED_OFF(LED1);
LED_OFF(LED2);
LED_OFF(LED3);
LED_OFF(LED4);
LED_ON(LED1);
LED_ON(LED4);
usb_init();
usb_task();
usb_wait_for_enumeration();
LED_OFF(LED1);
LED_OFF(LED4);
LED_ON(LED2);
LED_ON(LED3);
delay_ms(1000);
LED_OFF(LED2);
LED_OFF(LED3);

while (TRUE)
{
if(usb_enumerated())
{
if (usb_kbhit(1))
{
usb_get_packet(1, datain, 2);
if (modo==0)
{
switch(dato)
{
case 1: {output_toggle(LED1); break;}
case 2: {output_toggle(LED2); break;}
case 3: {output_toggle(LED3); break;}
case 4: {output_toggle(LED4); break;}
case 5: {LED_OFF(LED1); LED_OFF(LED2);
LED_OFF(LED3); LED_OFF(LED4);
break;}
}
}
}
}
}
}
----------------------------------------------------------------------------------->>>
*Ms adelante se proporcionaran todos los archivos relacionados a este proyecto: estn
comentados.
Compilando (CCS) el cdigo anterior se genera nuestro valioso .HEX, que podremos cargar a
nuestro PIC18F2550 con cualquier programador.

Paso 3
Microchip proporciona un DRIVER que corre bajo Windows XP, para comunicacin USB para la
familia PIC18, el cual puede descargarse desde su sitio web.
El nombre del Driver es MCHPUSB, y est compuesto por 5 elementos:
1.-Ioctls.h
2.-mchpusb.cat
3.-mchpusb.inf
4.-mchpusb.sys
5.-mchpusb64.sys
En nuestro caso nos interesa solo en "mchpusb.inf", se trata del archivo a modificar pues
contiene los cdigos VID y PID que necesitamos configurar.
De los 4 pasos este es el ms fcil, pues solo necesitamos modificar el cdigo PRODUCT ID =
PID, el valor para dicho cdigo ser 0090, el cdigo VID no ser necesario cambiarlo, pues es la
firma de Microchip para el uso de comunicaciones USB, el cual corresponde a 04D8, ya est
escrito por defecto en el INF.
En la Figura 6 puede verse la seccin a editar.

Figura 6

Una vez editada esta parte nuestro Driver estara listo para interactuar entre el PIC18F2550 y la
Interfaz de Visual C#.
Desde este punto si ya tenemos el hardware armado con el PIC programado; ya podemos
conectar el circuito a la pc e instalar el driver anteriormente editado.
Al conectar por primera vez el PICtool v1.0 nos aparece una ventana solicitando el driver,
direccionamos manualmente hasta donde se encuentra nuestro "Driver_PICtool", ver figura 7.

Figura 7

Aceptamos y esperamos a que se instale el driver, durante el proceso encendern los leds 1 y 4,
al completar la instalacin encendern los leds 2 y 3; durante un segundo y finalmente se
apagaran. Al final de la instalacin veremos en el pc una ventana como en la figura 8.

Figura 8

Ahora nuestro hardware y driver estn listos, pero aun no harn nada, pues hace falta la interfaz
grfica para mandar los dos bytes que necesita el hardware para conmutar las 4 salidas lgicas.

Paso 4
Editaremos una interfaz grafa sencilla utilizando el software Visual C# 2005, a travs de esta
controlaremos las 4 salidas lgicas en nuestro hardware, haremos uso de 5 botones; 4
correspondientes a las salidas lgicas y el 5to para poner a "cero" todas las salidas, entonces:
Boton1=
Boton2=
Boton3=
Boton4=
Boton5=

LED1, salida 1
LED2, salida 2
LED3, salida 3
LED4, salida 4
Poner a cero todo

Una vez que sabemos lo que necesitamos para nuestra interfaz; para interactuar con el
hardware, pasamos a un elemento importante, necesitamos un archivo .DLL para extraer
parmetros de control para la comunicacin USB, podremos aadir los cdigos VID y PID y as
asociar nuestros 3 elementos: PIC, DRIVER e INTERFAZ.
El elemento .DLL es indispensable, y tambin nos lo proporciona Microchip, el "mpusbapi.dll" nos
facilitara el manejo del puerto USB y no es necesario modificarlo, solo necesitamos aadirlo a la
hora de generar la aplicacin .EXE en Visual C#.
Abrimos Visual C# 2005, en archivo seleccionamos nuevo proyecto y a su vez seleccionar
"Aplicacin para Windows", a partir de aqu podemos nombrar y guardar el proyecto. Ver figura
9.

Figura 9

Al aceptar aparecer una pequea ventana a la que agregaremos 5 botones, los cuales
tomaremos del cuadro de herramientas del lado izquierdo de nuestra pantalla. Ver figura 10.

Figura 10

Al aadir un botn aparecer como "botn", que despus podremos cambiar a "LED1".
Hasta este punto debemos aclarar que para llamar en el cdigo C a cualquier botn debemos
llamarlo por su nombre y no con el texto, por ejemplo: El botn 1 tiene como ttulo "LED1", pero
se llama "led1".
El texto es el que puede ver el usuario en la interfaz, y el nombre es el utilizado para manipular
la accin del mismo por el programador.
Para ir creando el cdigo que necesitamos para cada botn iremos a la seccin de propiedades, y
seleccionamos "eventos", para cada botn escribiremos el nombre y la accin: led1_click, de
esta manera al dar enter; se ira creando automticamente una seccin de cdigo para cada
botn, ver figura 11.

Figura 11

Al generar un cdigo por cada botn, ya solo ara falta editar su accin, es decir; el contenido de
cada llave.
Por ejemplo, si nos enfocamos en el botn LED1, debemos escribir las instrucciones que manden
un byte de modo led y otro correspondiente al led, entonces:usbapi.ledPIC(0x01);
1er byte ledPIC = 0x00
2do byte = 0x01
Por lo que estaramos enviando desde la interfaz un paquete de 2 bytes, el hardware los recibir
y entender que debe conmutar el LED1. Ver figura 12.

Figura 12

Una vez editados todos los botones debemos agregar las siguientes lneas al principio del cdigo:
1-using System.Diagnostics; //Clase para abrir pgina web
2-PICtoolAPI usbapi = new PICtoolAPI();//para incluir acciones api
Ver figura 13.

Figura 13

Al guardar el proyecto, se genera un archivo con el nombre de "program.cs",cambiaremos de


nombre este archivo por "PICtoolAPI.cs", borraremos todo su contenido y pegaremos el
siguiente texto:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices; // Clase para importar DLL
using PVOID = System.IntPtr;
using DWORD = System.UInt32;
namespace PICtool
{
unsafe public class PICtoolAPI
{
#region Definicin de los Strings: EndPoint y VID_PID
string vid_pid_norm = "vid_04d8&pid_0090";
string out_pipe = "\\MCHP_EP1";
string in_pipe = "\\MCHP_EP1";
#endregion
#region Funciones importadas de la DLL: mpusbapi.dll
[DllImport("mpusbapi.dll")]
private static extern DWORD _MPUSBGetDLLVersion();
[DllImport("mpusbapi.dll")]
private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID);
[DllImport("mpusbapi.dll")]
private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP,
DWORD dwDir, DWORD dwReserved);
[DllImport("mpusbapi.dll")]
private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen,
DWORD* pLength, DWORD dwMilliseconds);
[DllImport("mpusbapi.dll")]

private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen,
DWORD* pLength, DWORD dwMilliseconds);
[DllImport("mpusbapi.dll")]
private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD
dwLen, DWORD* pLength, DWORD dwMilliseconds);
[DllImport("mpusbapi.dll")]
private static extern bool _MPUSBClose(void* handle);
#endregion
void* myOutPipe;
void* myInPipe;
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new PICtool());
}
public void OpenPipes()
{
DWORD selection = 0;
myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0);
myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0);
}
public void ClosePipes()
{
_MPUSBClose(myOutPipe);
_MPUSBClose(myInPipe);
}
private void SendPacket(byte* SendData, DWORD SendLength)
{
uint SendDelay = 1;
DWORD SentDataLength;
OpenPipes();
_MPUSBWrite(myOutPipe, (void*)SendData, SendLength, &SentDataLength,
SendDelay);
ClosePipes();
}
private void ReceivePacket(byte* ReceiveData, DWORD* ReceiveLength)
{
uint ReceiveDelay = 1;
DWORD ExpectedReceiveLength = *ReceiveLength;
OpenPipes();
_MPUSBRead(myInPipe, (void*)ReceiveData, ExpectedReceiveLength, ReceiveLength,
ReceiveDelay);
ClosePipes();
}
public void ledPIC(uint led)
{
byte* send_buf = stackalloc byte[2];
send_buf[0] = 0x00;
//Modo LED
send_buf[1] = (byte)led; //Seleccionar LED
SendPacket(send_buf, 2); //Enviar paquete
}

}
}
En el archivo anterior modificamos dos cosas importantes:
1-Se aadi cdigo referente al cdigo VID y PID adems de la extraccin de algunos
parmetros del archivo "mpusbapi.dll", recordemos que se trata de un archivo proporcionado
por microchip para este tipo de aplicaciones.
2-Se agreg la funcin ledPIC, la cual nos ayuda a mandar los dos bytes cada que se presiona
un botn de la interfaz.
Ver figuras 14 y 15.

Figura 14

Figura 15

Ahora ya solo nos falta una cosa, guardar el archivo "mpusbapi.dll" dentro de la carpeta donde
se guard el proyecto PICtool creado en visual C# 2005, dar clic en "proyecto"-->clic en
"agregar elemento existente" y direccionar la mpusbapi que guardamos anteriormente.
Finalmente modificar una casilla en propiedades del proyecto; esto es que al momento de
generar l .EXE nos jale los parmetros necesarios del mpusbapi, para eso debemos permitir
"GENERAR" con cdigo no seguro, ver figura 16.

Figura 16

FINALMENTE estamos listos para probar nuestro proyecto, ya solo debemos dar clic en
GENERAR y listo!!. Suerte.
En la seccin de DESCARGAS podrn adquirir todos los archivos fuente de este
proyecto, sin ms por el momento espero sea de ayuda.

PROYECTO 2
http://www.desarrollopic.com/tutoriales/proyecto-usbcon-pic-win7-8/

PICtool v2.0
30/09/2013
Con los nuevos sistemas operativos de Windows(Vista, Win7, Win8); el driver de Microchip ya no
es compatible, nos deja fuera de la mxima velocidad (12Mbs), resultando como nicos
modos HID y CDC.
Pero gracias al driver genrico WinUSB de Windows, retomaremos la comunicacin USB 2.0 con
la serie favorita de microntroladores PIC18Fxx5x, que traen el hardware para dicha
comunicacin, en modo "Custom Driver" devolvindonos los 12Mbs, compatible con los nuevos
sistemas en sus versiones de 32 y 64bits.
El desarrollo es sencillo, utilizaremos el PIC18F2550 con un cristal de 20MHz, al igual que el
proyecto anterior, constara de 4 salidas lgicas del puerto B, que activaremos y desactivaremos
a voluntad desde la interfaz.
Idea central:
PC <--> WinUSB(Vista, Win7, Win8) <--> PIC18F2550
La organizacin USB de los nuevos sistemas de Windows ya no exige que Hardware, Driver e
Interfaz contengan el mismo cdigo VID y PID, hoy la identificacin es por "Rutas".
Slo Hardware y Driver deben contener el mismo VID y PID, mientras que Driver e Interfaz la
misma Ruta.
Esto supone que pueden conectarse varios dispositivos con el mismo VID y PID al mismo PC, al
instalarse de identifica a cada uno por su Ruta.
El desarrollo consta de 4 pasos, que describiremos brevemente, la mayora de las caractersticas
ya estas explicadas(Proyecto 1):
1-Diagrama (EAGLE 6.4.0)
2-Firmware PIC18F2550 (CCS v4.140)
3-Driver WinUSB (Sin editar)
4-Interfaz Grfica (VC# 2008 Express)

Paso 1
A continuacin el diagrama electrnico(Figura 1).
Materiales:

4-Resistores 330 ohms


1-Resistor 10K
1-Capacitor 100nF
1-Capacitor 470nF
2-Capacitores 22pF
1-Cristal 20MHz
1-Push button
4-LEDs std
1-Conector USB-B/H

Figura 1

LEDs conectados al PUERTO B(Figura 2):


PORTB.5 = LED1
PORTB.4 = LED2
PORTB.3 = LED3
PORTB.2 = LED4

Figura 2

Paso 2
El Firmware del PIC18F2550 esta editado en CCS(Lenguaje C), el programa principal es
relativamente sencillo, la verdadera magia est en la librera que es llamada para el uso de la

comunicacin USB: "pic18_WinUSB.h", la cual contiene los cdigos VID y PID, que debern ser
iguales al Driver, especficamente al archivo "*.inf", se recomienda no modificar esta librera.
En caso de querer modificar el programa para una aplicacin ms completa, con tan slo el
programa principal bastara, por ejemplo: de requerir una mayor capacidad del buffer para recibir
bytes.. Tan slo hay que aumentar el tamao del mismo(Figura 3).

Figura 3

CDIGO:
El programa conmuta(1 0) 4 pines del puerto B, segn lo que reciba de la comunicacin USB.
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use
delay(clock=48000000)
#use
FAST_IO (B)
#define
#define
#define
#define
#define

USB_HID_DEVICE
FALSE
USB_EP1_TX_ENABLE USB_ENABLE_BULK
USB_EP1_RX_ENABLE USB_ENABLE_BULK
USB_EP1_TX_SIZE 2
USB_EP1_RX_SIZE 2

#include <pic18_usb.h>
#include "pic18_WinUSB.h"
#include <usb.c>
#define
#define
#define
#define
#define
#define

led1
led2
led3
led4
pin_on
pin_off

PIN_B5
PIN_B4
PIN_B3
PIN_B2
output_high
output_low

void main(void) {
int8 iBuff[2];
set_tris_b(0x00);
delay_cycles(5);

pin_off(led1);
pin_off(led2);
pin_off(led3);
pin_off(led4);
usb_init();
usb_task();
usb_wait_for_enumeration();
while (TRUE)
{
if(usb_enumerated())
{
if (usb_kbhit(1))
{
usb_get_packet(1, iBuff, 2);
if (iBuff[0] == 0)
{
if (iBuff[1] == 1)
if (iBuff[1] == 2)
if (iBuff[1] == 3)
if (iBuff[1] == 4)
}

output_toggle(led1);
output_toggle(led2);
output_toggle(led3);
output_toggle(led4);

}
}
}
}
Aqu la parte importante de la librera "pic18_WinUSB.h", que contiene el VID y PID, y que
deber coincidir con la descripcin(INF) del Driver (Figura 4).

Figura 4

Paso 3
El driver genrico "WinUSB" es proporcionado por Microsoft, al conectar por 1ra vez el
Hardware; es necesario direccionar manualmente dicho driver, al hacerlo aparece por defecto un

mensaje indicando que puede ser peligroso instalarlo, le damos clic en aceptar y finalizamos la
instalacin.
Con el Driver es importante resaltar 2 puntos:
1ro-El VID y PID del Driver son los mismos que contiene el Firmware del PIC18F2550(Figura 5).

Figura 5

2do-La "RUTA" del driver es la misma que contiene la Interfaz Grfica(Figura 6).

Figura 6

Paso 4
La Interfaz Grfica est diseada con Visual C# 2008, lenguaje C, el cdigo es muy parecido al
Proyecto 1.
Se trata de 4 botones que envan un paquete de 2byte cada uno:
1er byte= Modo (0x00)
2do byte= Led (0x01/0x02/0x03/0x04)
El 1er byte no es de mucha utilidad en esta aplicacin, pero lo ser para aquellos que quieran
agregar ms funciones, por ejemplo: Modo 0x00=LEDs, 0x01=Relay, 0x02=CH1/ADC etc.

El 2do byte indica el LED a conmutar: LED1=0x01, LED2=0x02, LED3=0x03 y LED4=0x04


(Figura 7).

Figura 7

Ejemplo de cdigo para un botn VC#(Figura 8):

Figura 8

Cdigos fuente en la seccin DESCARGAS, con el nombre de "PICtool v2.0", espero sea de
ayuda, saludos.

You might also like