USB BULK : La mpusbapi.dll de Microchip
Para el PIC:
Puesto que MikroElectronica no tiene implementadas librerias para USB BULK(esperemos
Asi que tendras que instalar el compilador PICC. Si quieres modificar el programa, para los que aun no han tocado C sera una buena oportunidad para comenzar; el codigo es muy facil de seguir
(para mas detalles sobre las funciones utilizadas refierase a la ayuda de PICC)
En todo caso el .hex lo puedes cargar tal como esta en el PIC para probar que todo el proyecto funciona.
El proyecto para el PIC en PICC consta de 2 unidades USB_BULK.h y USB_BULK.c, el
observa un poco el descriptor y las notas para que puedas modificarlo a tu gusto.
Observa que las configuraciones para el relog de trabajo en la unidad USB_BULK.c se
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN #use delay(clock=48000000)
Si usas otro cristal por ejemplo uno de 20MHz, tendras que dividir la frecuencia entre 5(PLL5) para tener los 4MHz nesesarios para producir los 96MHz y luego los 48 que necesitamos.
Para la PC :
a)El Driver:
Hacemos uso del driver que nos provee Microchip. Para este ejemplo solo se ha modificado las secciones sobre el PID VID VendorName y ProductName. Tambien estoy incluyendo el driver original sin modificaciones, claro esta que para este ejemplo este ultimo no va a funcionar porque tiene asignados otros PID VID que no estan en el descriptor en el PIC ni en el codigo de Delphi.
Cuando ya tengas grabado el .hex en el PIC y a la hora de conectar el cable se te pedira que instales el driver, elige la carpeta 'MCHPUSB Driver v1.1.0.0' e instalas el driver..... ya esta.
Deberias tener en tu PC la MCHPFSUSB Framework v2.3 de Microchip; aqui tendras muchos ejemplos (USB : hid, mass storage, bulk, cdc(los famosos virtual ports),.etc), herramientas, las dll y driver con sus fuentes originales y mucho mas.
b)Delphi y la mpusbap.dll:
El programa en Delphi hace uso de la mpusbapi.dll. Esta dll en su version 1.0.0.0 como dije antes es un poco limitada. La mpusbapi.dll v1.1.0 agrega las siguientes nuevas funciones:
MPUSBGetDeviceDescriptor () , MPUSBGetConfigurationDescriptor(), MPUSBGetStringDescriptor(), y MPUSBSetConfiguration(); de las cuales la mas interesante es la funcion MPUSBGetStringDescriptor(),
que nos permite acceder a las cadenas del descriptor como ProducName y VendorName, se ve ahora lo limitada que era la version 1.0.0. ?
Esta dll no nos provee de algun evento para saber cuando el dispositivo USB ha sido insertado o removido asi es que usando el mensaje WM_DEVICECHANGE que Windows nos envia al insertar el
dispositivo o removerlo, y verificando por medio del VID y PID que se trata de nuestro dispositivo(al insertar un CD en la lectora tambien se recibe el mismo mensaje por ejemplo), es que podemos
saber cuando nuestro dispositivo USB ha sido insertado o removido.
Código Delphi [-]
procedure TForm1.USBEvent(var Msg: TMessage);
var
Instance : DWORD;
s : String;
begin
//solo estamos en capacidad de recibir el mensaje WM_DEVICECHANGE,
//aunque quisieramos recibir tambien DBT_DEVICEARRIVAL = $8000 y
//DBT_DEVICEREMOVECOMPLETE = $8004
inherited;
Instance:=0;
myOutPipe := MPUSBOpen(Instance, vid_pid, out_pipe, MP_WRITE, 0);
myInPipe := MPUSBOpen(Instance,vid_pid, in_pipe, MP_READ, 0);
if (MPUSBGetDeviceCount(vid_pid) <> 0) then
begin
EnviarButton.Enabled:=true;
s:=ProductName+' Insertado : '+TimeToStr(Now);
end;
if (MPUSBGetDeviceCount(vid_pid) = 0) then
begin
If (myOutPipe = INVALID_HANDLE_VALUE) and
(myInPipe = INVALID_HANDLE_VALUE) then
Begin
s := ProductName+' Removido : '+TimeToStr(Now);
EnviarButton.Enabled:=false;
myOutPipe := INVALID_HANDLE_VALUE;
myInPipe := INVALID_HANDLE_VALUE;
End
else
begin
EnviarButton.Enabled:=true;
s := ProductName+' Insertado : '+TimeToStr(Now);
end;
end;
if s <> '' then
//microchip definio asi la version:
//#define MPUSBAPI_VERSION 0x00010000L
Memo2.Lines.Add(s+' - mpusbapi.dll v'+
IntToHex(MPUSBGetDLLVersion,0));
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Msg : TMessage;
begin
myInPipe := INVALID_HANDLE_VALUE;
myOutPipe := INVALID_HANDLE_VALUE;
USBEvent(Msg);
end;
Al importar las funciones de la mpusbapi.dll v1.1.0 se debe tener cuidado en la indexacion de las funciones, sino es asi estas funciones produciran un error al querer llamarlas en tiempo de ejecucion.
Algo rapido:
1. grabar el .hex en el PIC
2. Al conectar el cable te pedira el driver, elije la carpeta 'MCHPUSB Driver v1.1.0.0' e instala el driver.
3. Ejecuta cualquiera de los .exe.
Estoy adjuntando los Help para la dll y las fuentes originales de la dll en C++ Builder, para quien quiera estudiarla un poco.
Project USB BULK con la mpusbapi.dll v1.0.0 y v1.1.0.zip
home cleaning (sábado, 20 enero 2018 05:34)
Cleanup Services Whitby: Certain cleanup procedures are certainly not implemented by simply many. Whenever they do recognize, then also they will often not manage to do the idea independently. Some dust are consequently stubborn who's won’t be free from with the standard cleaning course of action. But while using knowledge involving certified cleaners you can actually eradicate essentially the most difficult dust and dirt. Moreover, these are specialists throughout cleaningmould along with stains through the surface way too.
fenixariel (jueves, 16 octubre 2014 22:53)
Hola PepeGrillo, creo puede ser no he verificado, es que las pruebas se hicieron hace tiempo con XP, y en WIN7 la cosa ha cambiado un poquito.....voy a chequear.
PepeGrillo (miércoles, 15 octubre 2014 10:05)
Me da un problema al intalar el driver. Me dice que se ha encontrado el driver, pero que el hash para el archivo no está en el catálogo especificado. Alguna idea del problema. Saludos y gracias.
fenixariel (sábado, 04 mayo 2013 12:43)
http://delphiandpic.jimdo.com/delphi-usb-y-herramientas/usb-hid/la-mchid-dll/
Best Juicer (jueves, 02 mayo 2013 21:25)
I shared this on Myspace! My buddies will really want it!
fenixariel (lunes, 29 octubre 2012 15:33)
Tienes que escribir un poquito de codigo, no existen librerias para eso.....
Jorge Meza (lunes, 29 octubre 2012 15:14)
Fenixariel, te agradecería si me puedes indicar con cuál de las librerias puedo determinar que led está encendido con una rutina de delphi por ejemplo.Gracias
fenixariel (miércoles, 24 octubre 2012 23:01)
(Ver esquema en USB HID/la mcHID.dll)
SoWil (miércoles, 20 junio 2012)
Esquema para el Reloj de trabajo