PROYECTO
1http://www.desarrollopic.com/tutoriales/proyecto-usb-con-pic-winxp/
PICtool v1.006/04/2011Sera 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 LED2do byte, Si dato = "1 2 3 4",
conmutar LED correspondienteLa idea central de funcionamiento es la
siguiente:PC DRIVER XP PIC18F2550Por 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 1Utilizaremos 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-Protoboard1-PIC18F25501-Conector USB tipo
B1-Capacitor cermico 470nF1-Capacitor cermico 100nF2-Capacitores
cermicos 22pF1-Cristal 12MHz1-Resistor 10K4-Resitores 3304-Leds
3mm*Cable, pinzas etc.Ver figura 1, correspondiente al diagrama
electrnico:
Figura 1
Figura 2Las 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.1LED2= PORTC.2LED3=
PORTC.6LED4= PORTC.7Para ir relacionando los pines del micro a lo
mencionado ver figura 3.
Figura 3Despus de haber aplicado el diagrama anterior, el armado
del circuito en la protoboard debera verse similar a la figura
4.
Figura 4Paso 2Para 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 5Retomando, 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 modoMODO = 0x00, 1er byte-El segundo byte
corresponde al nmero de LED y pude ser cualquiera de los cdigos
siguientes:LED1 = 0x01, 2do byteLED2 = 0x02, 2do byteLED3 = 0x03,
2do byteLED4 = 0x04, 2do byteApagar LED's = 0x05, 2do byteEl 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;}
}}-----------------------------------------------------------------------------------output_toggle--->PORTC.1=
0El cdigo completo se muestra a
continuacin:>>>--------------------------------------------------------------------------------------#include
#fusesHSPLL,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
#include "descriptor_USB.h"#include #define LED1 PIN_C1#define LED2
PIN_C2#define LED3 PIN_C6#define LED4 PIN_C7#define LED_ON
output_high#define LED_OFF output_low#define modo datain[0]#define
dato 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 3Microchip 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 delDriver es MCHPUSB, y est compuesto por 5
elementos:1.-Ioctls.h2.-mchpusb.cat3.-mchpusb.inf4.-mchpusb.sys5.-mchpusb64.sysEn
nuestro caso nos interesa solo en"mchpusb.inf",se trata del archivo
a modificar pues contiene los cdigosVID y PIDque 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
ser0090, el cdigo VID no ser necesario cambiarlo, pues es la firma
de Microchip para el uso de comunicaciones USB, el cual corresponde
a04D8, ya est escrito por defecto en el INF.En la Figura 6 puede
verse la seccin a editar.
Figura 6Una 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 7Aceptamos 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 instalacinveremos en el pc
una ventana como en la figura 8.
Figura 8Ahora 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 4Editaremos 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= LED1, salida 1Boton2= LED2,
salida 2Boton3= LED3, salida 3Boton4= LED4, salida 4Boton5= Poner a
cero todoUna 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 9Al 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 10Al 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 darenter;se ira creando
automticamente una seccin de cdigo para cada botn, ver figura
11.
Figura 11Al 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 = 0x002do byte
= 0x01Por 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 12Una vez editados todos los botones debemos agregar las
siguientes lneas al principio del cdigo:1-using System.Diagnostics;
//Clase para abrir pgina web2-PICtoolAPI usbapi = new
PICtoolAPI();//para incluir acciones apiVer figura 13.
Figura 13Al 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 DLLusing 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 funcinledPIC, 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 15Ahora 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 16FINALMENTE estamos listospara 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
2http://www.desarrollopic.com/tutoriales/proyecto-usb-con-pic-win7-8/
PICtool v2.030/09/2013Con 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 modosHID y CDC.Pero gracias al driver
genricoWinUSBde 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) PIC18F2550La 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 1A continuacin el diagrama electrnico(Figura
1).Materiales:4-Resistores 330 ohms1-Resistor 10K1-Capacitor
100nF1-Capacitor 470nF2-Capacitores 22pF1-Cristal 20MHz1-Push
button4-LEDs std1-Conector USB-B/H
Figura 1LEDs conectados al PUERTO B(Figura 2):PORTB.5 =
LED1PORTB.4 = LED2PORTB.3 = LED3PORTB.2 = LED4
Figura 2Paso 2El 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 3CDIGO:El programa conmuta(1 0) 4 pines del puerto B,
segn lo que reciba de la comunicacin USB.#include #fuses
HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN#use
delay(clock=48000000)#use FAST_IO (B)#define USB_HID_DEVICE FALSE
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK #define USB_EP1_RX_ENABLE
USB_ENABLE_BULK #define USB_EP1_TX_SIZE 2 #define USB_EP1_RX_SIZE 2
#include #include "pic18_WinUSB.h" #include #define led1
PIN_B5#define led2 PIN_B4#define led3 PIN_B3#define led4
PIN_B2#define pin_on output_high#define pin_off output_lowvoid
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) output_toggle(led1); if
(iBuff[1] == 2) output_toggle(led2); if (iBuff[1] == 3)
output_toggle(led3); if (iBuff[1] == 4) 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 4Paso 3El 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 52do-La "RUTA" del driver es la misma que contiene la
Interfaz Grfica(Figura 6).
Figura 6Paso 4La 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 7Ejemplo de cdigo para un botn VC#(Figura 8):
Figura 8Cdigos fuente en la seccinDESCARGAS,con el nombre
de"PICtool v2.0", espero sea de ayuda, saludos.