desktop

USB y PIC 18F2550 Desarrollo de proyectos en ASM

Quiero avisar que no trabajo más con ASM, por lo tanto este hilo queda a manos de los demás usuarios. No abandono por desconocimiento, pero si por falta de tiempo. Por otro lado si voy a seguir haciendo soporte y de hecho estoy trabajando para poder terminar una nueva versión del manual para USB con C# y PIC18F14K50, utilizando las librerías genéricas de windows y CCS para PIC.

Saludos !
 
Hola amigo Moyano.
Espero no molestarte con esta pregunta, pero necesito saber, si tu sabes donde encuentro un driver para
usb pic que trabaje sin problemas en windowes 7, los que he bajado de aqui, no me han funcionado.
Ojala no este violando las normas del foro :confused:, gracias..:apreton:
 
En principio creareamos el archivo "USB_Defs.inc" en el que iran las definiciones necesarias para la creacion de nuestro descriptor HID:
Código:
;
;(c) L. Serrano [URL="http://www.analogicsensors.com"]www.analogicsensors.com[/URL]
;
;
;  Incluir este archivo en el archivo ASM del programa que realicemos.
;
 
#define ID_FABRICANTE       0x04D8    ;Microchip  04D8 
#define ID_PRODUCTO       0x000A    ;Familia PIC18
#define FABRICANTE 'w','w','w','.','a','n','a','l','o','g','i','c','s','e','n','s','o','r','s','.','c','o','m'
#define PRODUCTO 'L','E','D','-','U','S','B',' ','1','8','F','2','5','5','0'
#define N_SERIE '0','0','0','1'         ; El numero de serie del dispositivo 
#define bcdUSB                0x0110    ; USB Version 1.10  
                                        ; 0x0100 USB Version 1.00
                                        ; 0x0200 USB Version 2.00
#define bcdDevice             0x0100    ; Version de Nuestro Dispositivo      
#define ReportCountIn              8    ; Reporte de Entrada 8 campos
#define ReportCountOut             3    ; Reporte de Salida 3 campos
#define bMaxPacketSize             8    ; Maximo tamaño del paquete EP0: 8, 16, 32, o 64
                                        ; Para dispositivos Low Speed debe ser 8. 
#define wMaxPacketSize             8    ; Maximo tamaño del paquete para el EP
#define bMaxPower                 25    ; Consumo del dispositivo=2xbMaxPowermA=50mA
#define bInterval                 10    ; Intervavalo muestreo 10ms
 
;;;;;;;;; NO MODIFICAR  A PARTIR DE ESTE PUNTO  ;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#define NUM_CONFIGURATIONS         1       
#define NUM_INTERFACES             1
; tipos de descriptor standard
#define DEVICE                     1
#define CONFIGURATION              2
#define STRING                     3
#define INTERFACE                  4
#define ENDPOINT                   5
; tipo de descriptor de clase HID
#define HID                     0x21
#define REPORT                  0x22
#define PHYSICAL                0x23
; tipo reporte de clase HID
#define INPUT                   0x01
#define OUTPUT                  0x02
#define FEATURE                 0x03
; offsets desde el inicio del registro de datos de configuracion
#define bmRequestType           0x00
#define bRequest                0x01
#define wValue                  0x02
#define wValueHigh              0x03
#define wIndex                  0x04
#define wIndexHigh              0x05
#define wLength                 0x06
#define wLengthHigh             0x07

A continuación, crearemos el archivo del descriptor HID "Desc_HID.asm":
Código:
;
;(c) L. Serrano [URL="http://www.analogicsensors.com"]www.analogicsensors.com[/URL]
;
;
; Compilar este archivo con MPASM con la opción de generar archivo de código objeto.
;
 
#include "USB_Defs.inc"
Descriptor code
        global InicioDescriptor,Device,Configuration1
        global Report1,FinReport1
        global String0,String1,String2,String3
 
Device
InicioDescriptor
        db              0x12, DEVICE            ; bLength, bDescriptorType
        dw              bcdUSB                  ; bcdUSB (byte L), bcdUSB (byte H)   
        db              0x00, 0x00              ; bDeviceClass, bDeviceSubClass
        db              0x00, bMaxPacketSize    ; bDeviceProtocl, bMaxPacketSize
        dw              ID_FABRICANTE           ; idVendor (byte L), idVendor (byte H)
        dw              ID_PRODUCTO             ; idProduct (byte L), idProduct (byte H)
        dw              bcdDevice               ; bcdDevice (byte L), bcdDevice (byte H)
        db              0x01, 0x02              ; iManufacturer, iProduct
        db              0x03, NUM_CONFIGURATIONS; iSerialNumber, bNumConfigurations
Configuration1
        db              0x09, CONFIGURATION     ; bLength, bDescriptorType
        db              0x29, 0x00              ; wTotalLength (byte L), wTotalLength (byte H)
        db              NUM_INTERFACES, 0x01    ; bNumInterfaces, bConfigurationValue
        db              0x00, 0xA0              ; iConfiguration (none), bmAttributes
        db              bMaxPower, 0x09         ; bMaxPower*2=consumo dispositivo en mA, bLength(inicio Interface1) 
        db              INTERFACE, 0x00         ; bDescriptorType, bInterfaceNumber
        db              0x00, 0x02              ; bAlternateSetting, bNumEndpoints (excluyendo EP0)
        db              0x03, 0x00              ; bInterfaceClass (HID code), bInterfaceSubClass
        db              0x00, 0x00              ; bInterfaceProtocol, iInterface (none)
HID1
        db              0x09, HID               ; bLength, bDescriptorType
        db              0x01, 0x01              ; bcdHID (byte L), bcdHID (byte H)       
        db              0x00, 0x01              ; bCountryCode (none), bNumDescriptors
        db              REPORT,(FinReport1-Report1-1); bDescriptorType, wDescriptorLength (byte L)
        db              0x00, 0x07              ; wDescriptorLength (byte H) ,bLength(inicio Endpoint1)
        db              ENDPOINT, 0x81          ; bDescriptorType, bEndpointAddress (EP1 IN)
        db              0x03, low wMaxPacketSize; bmAttributes (Interrupt), wMaxPacketSize (byte L)
        db              high wMaxPacketSize, bInterval ; wMaxPacketSize (byte H), bInterval
Endpoint2
        db              0x07, ENDPOINT          ; bLength, bDescriptorType
        db              0x01, 0x03              ; bEndpointAddress (EP1 OUT), bmAttributes (Interrupt)
        dw              wMaxPacketSize          ; wMaxPacketSize (byte L), wMaxPacketSize (byte H)
        db              bInterval               ; bInterval
Report1
        db              0x06, 0xA0              ;0x06, 0xA0, 0xFF Usage Page (Vendor Defined),
        db              0xFF, 0x09              ;0x09, 0x01       Usage ID (Vendor Defined) 
        db              0x01, 0xA1              ;0xA1, 0x01       Collection (Application)
        db              0x01, 0x09              ;0x09, 0x03       Usage ID (Vendor Defined)      ; El Reporte de Entrada
        db              0x03, 0x15              ;0x15, 0x00       Logical Minimum (0)
        db              0x00, 0x26              ;0x26, 0x00, 0xFF Logical Maximum (255)
        db              0xFF, 0x00              ;
        db              0x75, 0x08              ;0x75, 0x08       Report Size (8 bits),
        db              0x95, ReportCountIn     ;0x95, ReportCountIn Campos del Reporte(ReportCountIn campos de entrada),
        db              0x81, 0x02              ;0x81, 0x02       Input (Data, Variable, Absolute),
        db              0x09, 0x04              ;0x09, 0x04       Usage ID (Vendor Defined),     ; El Reporte de Salida
        db              0x15, 0x00              ;0x15, 0x00       Logical Minimum (0),
        db              0x26, 0xFF              ;0x26, 0x00, 0xFF Logical Maximum (255)
        db              0x00, 0x75              ;0x75, 0x08       Report Size (8 bits)
        db              0x08, 0x95              ;
        db              ReportCountOut, 0x91    ;0x95, ReportCountOut; Campos del Reporte (ReportCountOut campos de salida),
        db              0x02, 0x09              ;0x91, 0x02       Output (Data, Variable, Absolute)
        db              0x05, 0x15              ;0x09, 0x05       Usage ID (Vendor Defined)      ; El Reporte de Caracteristicas
        db              0x00, 0x26              ;0x15, 0x00       Logical Minimum (0)
        db              0xFF, 0x00              ;0x26, 0x00, 0xFF Logical Maximum (255)
        db              0x75, 0x08              ;0x75, 0x08       Report Size (8 bits),
        db              0x95, 0x00              ;0x95, 0x00       Campos del Reporte de caracteristicas,
        db              0xB1, 0x02              ;0xB1, 0x02       Feature (Data, Variable, Absolute),
        db              0xC0                    ;0xC0             End Collection
FinReport1
String0
        db              String1-String0, STRING ; bLength, bDescriptorType
                                                ; wLANGID[0] (byte L), wLANGID[0] (byte H)
        db              0x0A, 0x0C              ; Spanish
        db              0x09, 0x04              ; US-English
String1
        db              String2-String1, STRING ; bLength, bDescriptorType
        dw              FABRICANTE
String2
        db              String3-String2, STRING ; bLength, bDescriptorType
        dw              PRODUCTO
String3
        db              FinDescriptor-String3, STRING ; bLength, bDescriptorType
        dw              N_SERIE
FinDescriptor
        END
Con este último archivo posteriormente generaremos, con el compilador MPASM seleccionando la opción "Object File", el archivo 'Desc_HID.O'

El siguiente paso será compilar el archivo del programa "asm" en el que vayamos a hacer uso de las funciones USB.
Como ejemplo voy a utilizar un simple programa que mediante un botón enciende o apaga un LED.
El archivo del programa ejemplo será "LedUSB.asm":
Código:
;*************************************************************************
; (C) L.Serrano   [URL="http://www.analogicsensors.com"]www.analogicsensors.com[/URL]
; Este programa enciende o apaga un LED tras la solicitud del host a traves
; del puerto USB mediante un comando y una orden.
;      Cuando recibe el comando 1 seguido de la orden 255 enciende el LED
;      Cuando recibe el comando 1 seguido de la orden 0 apaga el LED
;
; El cristal de cuarzo utilizado en el oscilador es de 20 MHz
; El Reloj del sistema funcionara a 16MHZ
;*************************************************************************
          LIST P=18F2550,c=80
  Processor        18F2550
         Radix   DEC
  EXPAND
#include <p18F2550.inc>
 
; Configuración PIC
        config PLLDIV   = 5             ; cristal 20 Mhz
        config CPUDIV   = OSC3_PLL4 ; [Oscilador Primario/3] cpu 6,67Mhz  [96 MHz PLL/6] cpu 24MHz
        config USBDIV   = 2  ;La fuente de reloj USB viene desde los 96 MHz PLL/2
        config FOSC     = HSPLL_HS ; Oscilador HS, PLL habilitado, HS utilizado por USB
        config FCMEN    = OFF
        config IESO     = OFF
        config PWRT     = OFF
        config BOR      = ON
        config BORV     = 3
        config VREGEN   = ON  ; hablitita regulador de voltaje USB
        config WDT      = OFF
        config WDTPS    = 32768
        config MCLRE    = ON
        config LPT1OSC  = OFF
        config PBADEN   = OFF
        config CCP2MX   = ON
        config STVREN   = ON
        config LVP      = OFF
        config DEBUG    = OFF
        config XINST    = OFF
        config CP0      = OFF
        config CP1      = OFF
        config CP2      = OFF
        config CP3      = OFF
        config WRT3     = OFF
        config EBTR3    = OFF
        config CPB      = OFF
        config CPD      = OFF
        config WRT0     = OFF
        config WRT1     = OFF
        config WRT2     = OFF
        config WRTB     = OFF
        config WRTC     = OFF
        config WRTD     = OFF
        config EBTR0    = OFF
        config EBTR1    = OFF
        config EBTR2    = OFF
 
#include <usb_Defs.inc>
 
    GLOBAL MaxPacketSize
    EXTERN InitUSB, ServiceUSB,ConfiguraUSB,GetEP1, PutEP1
    EXTERN buffer_USB
 
#define semaforoTX   semaforos,0  
 
RAN_var_global    idata    
MaxPacketSize       db bMaxPacketSize
RAM_acs       udata_acs     
semaforos           res 1
PGM     code    0x0000
        goto    Programa        ; Vector Reset
        nop
        nop
 goto    $               ; Vector Interrupcion Alta Prioridad
        nop
        nop
        nop
        nop
        nop
        nop
        goto    $               ; Vector Interrupcion prioridad baja
 
;******************************************************************************
;******************************************************************************
Programa
        movlw   0x0F       
        ; Desactiva convertidor A/D
        movwf   ADCON1          ; todas la entradas digitales 
        movlw   0x07            ; Desactiva el modulo comparador
        movwf   CMCON           
        bcf     LATC,2          ; Por defecto el LED estara apagado
        bcf     TRISC,2         ; Pin 13 salida  LED
 
 
;******************************************************************************
        #define USBSPEED   0    ; 0 -> LOW-SPEED   1 -> FULL-SPEED
        #define PULL_UP    8    ; 4 -> no utiliza resistecias internas pull-up  8 -> si
        movlw   USBSPEED
        addlw   PULL_UP
        call    InitUSB         ; Inicializa los registros USB y SIE(maquina
                                ; de comunicacion serie)
        call    ConfiguraUSB    ; Espera hasta que finalice configuracion USB
 
        clrf    semaforos       ; No se puede enviar al Host 
BucleInfinito
        btfsc   semaforoTX      ; Si On puede Transmitir hacia el Host
        call    Envia_al_Host   ; Devolvemos al Host el Comando recibido y el estado actual del LED
        btfsc   semaforoTX
        bcf     semaforoTX      ; Si esta On lo pone Off
        call    Recibe_del_Host ; Recibe datos desde el Host       
        movf    buffer_USB,W
        xorlw   1               ; El comando recibido es el comando 1 ?
        bz      LED_s           ; Si el Comando recibido es el 1 enciende o apaga el LED
        bra     BucleInfinito
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LED_s
        call    enciede_apaga   ; Enciende o apaga  el LED
        bra     BucleInfinito
enciede_apaga        
        movf    buffer_USB+1,W  ; Lee la orden recibida del host
        andlw   255   
        bz      apagaLED        
enciendeLED 
        bsf LATC,2         ; Enciende el LED
        movlw   .255
        movwf   buffer_USB+1    ; Ponemos en el buffer USB el estado encendido del LED
        bsf     semaforoTX      ; Para dar permiso de TX al Host
        return      
apagaLED    
        bcf LATC,2         ; Apaga el LED    
        movlw   .0
        movwf   buffer_USB+1    ; Ponemos en el buffer USB el estado apagado del LED
        bsf     semaforoTX      ; Para dar permiso de TX al Host
        return
;Envia buffer_USB al host
Envia_al_Host
        call    ServiceUSB      ; Solicitud de servicio USB
        movlw   8               ; Numero de bytes a enviar al host    
        call    PutEP1          ; Envia W bytes de nuestro buffer al Host.
        btfss   STATUS,C        ; Si C datos enviados con exito
        bra     Envia_al_Host 
        return      
;Espera hasta que se hayan recibido datos del host
Recibe_del_Host
        call    ServiceUSB      ; Solicitud de servicio USB      
        call    GetEP1          ; Recibe bytes del Host en buffer_USB. W contiene el numero de 
                                ; bytes recibidos del Host.
        btfss   STATUS,C        ; Si C datos obtenidos con exito
        bra     Recibe_del_Host 
        return
     END

Igualmente, con el compilador MPASM seleccionando la opción "Object File", generaremos el archivo "LedUSB.O"

El ultimo paso será generar el archivo "LedUSB.hex" utilizando el programa enlazador "mplink" de Microchip.
Para ello deberiamos enlazar los archivos "LedUSB.o", "Desc_HID.O" y el archivo objeto que contiene las funciones USB.


Bueno, como veo que el hilo va algo lento voy a aportar un Descriptor USB para que podáis ir estudiándolo,
y que posteriormente podríamos incluirlo en nuestros programas ASM:

Código:
;
;(c) L. Serrano [URL="http://www.analogicsensors.com/"]www.analogicsensors.com[/URL]
;
;
;Incluir este archivo en el archivo ASM del programa que realicemos.
;
 
;Variables Globales que deben ser declaradas como externas, EXTERN,
; en el archivo ASM del programa que realicemos.
GLOBAL InicioDescriptor,Device,Configuration1
GLOBAL Report1,FinReport1,String0,String1,String2,String3
 
#define ID_FABRICANTE 0x04D8 ;Microchip 04D8 
#define ID_PRODUCTO 0x000A ;Familia PIC18
#define FABRICANTE 'w','w','w','.','a','n','a','l','o','g','i','c','s','e','n','s','o','r','s','.','c','o','m'
#define PRODUCTO 'U','S','B',' ','1','8','F','2','5','5','0'
#define N_SERIE '0','0','0','1'
#define NUM_CONFIGURATIONS 1
#define NUM_INTERFACES 1
#define bcdUSB 0x0200 ; USB Version 2.0 
#define bcdDevice 0x0100 ; Version de Nuestro Dispositivo 
#define ReportCountIn 8 ; Reporte de Entrada 8 campos
#define ReportCountOut 3 ; Reporte de Salida 3 campos
#define bMaxPacketSize 8 ; Maximo tamaño del paquete EP0: 8, 16, 32, o 64
#define wMaxPacketSize 8 ; Maximo tamaño del paquete para el EP
#define bMaxPower 25 ; Consumo del dispositivo=2*bMaxPower=50mA
#define bInterval 10 ; Intervavalo muestreo 10ms
; tipos de descriptor standard
#define DEVICE 1
#define CONFIGURATION 2
#define STRING 3
#define INTERFACE 4
#define ENDPOINT 5
; tipo de descriptor de clase HID
#define HID 0x21
#define REPORT 0x22
#define PHYSICAL 0x23
; tipo reporte de clase HID
#define INPUT 0x01
#define OUTPUT 0x02
#define FEATURE 0x03
; offsets desde el inicio del registro de datos de configuracion
#define bmRequestType 0x00
#define bRequest 0x01
#define wValue 0x02
#define wValueHigh 0x03
#define wIndex 0x04
#define wIndexHigh 0x05
#define wLength 0x06
#define wLengthHigh 0x07
 
DescriptorDevice code
InicioDescriptor
Device 
db 0x12, DEVICE ; bLength, bDescriptorType
dw bcdUSB ; bcdUSB (byte L), bcdUSB (byte H) 
db 0x00, 0x00 ; bDeviceClass, bDeviceSubClass
db 0x00, bMaxPacketSize ; bDeviceProtocl, bMaxPacketSize
dw ID_FABRICANTE ; idVendor (byte L), idVendor (byte H)
dw ID_PRODUCTO ; idProduct (byte L), idProduct (byte H)
dw bcdDevice ; bcdDevice (byte L), bcdDevice (byte H)
db 0x01, 0x02 ; iManufacturer, iProduct
db 0x03, NUM_CONFIGURATIONS; iSerialNumber, bNumConfigurations
Configuration1 
db 0x09, CONFIGURATION ; bLength, bDescriptorType
db 0x29, 0x00 ; wTotalLength (byte L), wTotalLength (byte H)
db NUM_INTERFACES, 0x01 ; bNumInterfaces, bConfigurationValue
db 0x00, 0xA0 ; iConfiguration (none), bmAttributes
db bMaxPower, 0x09 ; bMaxPower*2=consumo dispositivo en mA, bLength(inicio Interface1) 
db INTERFACE, 0x00 ; bDescriptorType, bInterfaceNumber
db 0x00, 0x02 ; bAlternateSetting, bNumEndpoints (excluyendo EP0)
db 0x03, 0x00 ; bInterfaceClass (HID code), bInterfaceSubClass
db 0x00, 0x00 ; bInterfaceProtocol, iInterface (none)
HID1
db 0x09, HID ; bLength, bDescriptorType
db 0x01, 0x01 ; bcdHID (byte L), bcdHID (byte H) 
db 0x00, 0x01 ; bCountryCode (none), bNumDescriptors
db REPORT,(FinReport1-Report1-1); bDescriptorType, wDescriptorLength (byte L)
db 0x00, 0x07; wDescriptorLength (byte H) ,bLength(inicio Endpoint1)
db ENDPOINT, 0x81 ; bDescriptorType, bEndpointAddress (EP1 IN)
db 0x03, low wMaxPacketSize; bmAttributes (Interrupt), wMaxPacketSize (byte L)
db high wMaxPacketSize, bInterval ; wMaxPacketSize (byte H), bInterval
Endpoint2
db 0x07, ENDPOINT ; bLength, bDescriptorType
db 0x01, 0x03 ; bEndpointAddress (EP1 OUT), bmAttributes (Interrupt)
dw wMaxPacketSize ; wMaxPacketSize (byte L), wMaxPacketSize (byte H)
db bInterval ; bInterval
Report1
db 0x06, 0xA0 ;0x06, 0xA0, 0xFF Usage Page (Vendor Defined),
db 0xFF, 0x09 ;0x09, 0x01 Usage ID (Vendor Defined) 
db 0x01, 0xA1 ;0xA1, 0x01 Collection (Application)
db 0x01, 0x09 ;0x09, 0x03 Usage ID (Vendor Defined) ; El Reporte de Entrada
db 0x03, 0x15 ;0x15, 0x00 Logical Minimum (0)
db 0x00, 0x26 ;0x26, 0x00, 0xFF Logical Maximum (255)
db 0xFF, 0x00 ;
db 0x75, 0x08 ;0x75, 0x08 Report Size (8 bits),
db 0x95, ReportCountIn ;0x95, ReportCountIn Campos del Reporte(ReportCountIn campos de entrada),
db 0x81, 0x02 ;0x81, 0x02 Input (Data, Variable, Absolute),
db 0x09, 0x04 ;0x09, 0x04 Usage ID (Vendor Defined), ; El Reporte de Salida
db 0x15, 0x00 ;0x15, 0x00 Logical Minimum (0),
db 0x26, 0xFF ;0x26, 0x00, 0xFF Logical Maximum (255)
db 0x00, 0x75 ;0x75, 0x08 Report Size (8 bits)
db 0x08, 0x95 ;
db ReportCountOut, 0x91 ;0x95, ReportCountOut; Campos del Reporte (ReportCountOut campos de salida),
db 0x02, 0x09 ;0x91, 0x02 Output (Data, Variable, Absolute)
db 0x05, 0x15 ;0x09, 0x05 Usage ID (Vendor Defined) ; El Reporte de Caracteristicas
db 0x00, 0x26 ;0x15, 0x00 Logical Minimum (0)
db 0xFF, 0x00 ;0x26, 0x00, 0xFF Logical Maximum (255)
db 0x75, 0x08 ;0x75, 0x08 Report Size (8 bits),
db 0x95, 0x00 ;0x95, 0x00 Campos del Reporte de caracteristicas,
db 0xB1, 0x02 ;0xB1, 0x02 Feature (Data, Variable, Absolute),
db 0xC0 ;0xC0 End Collection
FinReport1
String0 
db String1-String0, STRING ; bLength, bDescriptorType
; wLANGID[0] (byte L), wLANGID[0] (byte H)
db 0x0A, 0x0C ; Spanish
db 0x09, 0x04 ; US-English
String1 
db String2-String1, STRING ; bLength, bDescriptorType
dw FABRICANTE
String2 
db String3-String2, STRING ; bLength, bDescriptorType
dw PRODUCTO
String3 
db FinDescriptor-String3, STRING ; bLength, bDescriptorType
dw N_SERIE
FinDescriptor 
END
 
Última edición:
El esquema del circuito para probar el programa "LedUSB" con el PIC18F2550 será este:
Esquema.jpg




En la siguiente fotografía se puede ver una implementación del mismo:

LedUSBProto.jpg
 
Para interactuar, desde un ordenador, con el circuito anterior debemos utilizar una aplicación como la que en este caso la he realizado en Visual Basic 5.
La aplicación necesitará la DLL "mcHID.dll" que se puede encontrar en internet.
La aplicación la he podido comprobar satisfactoriamente tanto con "Windows XP" como con la edición "Windows 7 Starter".
Los archivos fuente son:

Archivo "FormMain.FRM"
Código:
VERSION 5.00
Begin VB.Form MainForm 
   BorderStyle     =   3  'Fixed Dialog
   Caption         =   "LED USB"
   ClientHeight    =   3960
   ClientLeft      =   180
   ClientTop       =   1290
   ClientWidth     =   7920
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   264
   ScaleMode       =   3  'Píxel
   ScaleWidth      =   528
   ShowInTaskbar   =   0   'False
   Begin VB.Frame Frame1 
      Height          =   855
      Left            =   120
      TabIndex        =   3
      Top             =   120
      Width           =   7695
      Begin VB.TextBox Text1 
         Alignment       =   2  'Center
         BackColor       =   &H8000000B&
         BeginProperty Font 
            Name            =   "MS Sans Serif"
            Size            =   9.75
            Charset         =   0
            Weight          =   700
            Underline       =   0   'False
            Italic          =   0   'False
            Strikethrough   =   0   'False
         EndProperty
         Height          =   375
         Left            =   120
         Locked          =   -1  'True
         TabIndex        =   9
         Text            =   "Esperando conexión USB HID....."
         Top             =   240
         Width           =   4095
      End
      Begin VB.Label Label8 
         Caption         =   "PID: "
         Height          =   195
         Left            =   6480
         TabIndex        =   8
         Top             =   120
         Width           =   975
      End
      Begin VB.Label Label7 
         Caption         =   "VID: "
         Height          =   195
         Left            =   4440
         TabIndex        =   7
         Top             =   120
         Width           =   975
      End
      Begin VB.Label Label4 
         Caption         =   "Fabricante"
         Height          =   195
         Left            =   4440
         TabIndex        =   6
         Top             =   360
         Width           =   2175
      End
      Begin VB.Label Label6 
         Caption         =   "N/S: "
         Height          =   195
         Left            =   6480
         TabIndex        =   5
         Top             =   600
         Width           =   855
      End
      Begin VB.Label Label5 
         Caption         =   "Producto"
         Height          =   195
         Left            =   4440
         TabIndex        =   4
         Top             =   600
         Width           =   1935
      End
   End
   Begin VB.Frame Frame3 
      Caption         =   "Control del LED"
      Height          =   2415
      Left            =   1920
      TabIndex        =   1
      Top             =   1200
      Width           =   4335
      Begin VB.CommandButton EncenderApagarLED 
         Caption         =   "Encender LED"
         Height          =   615
         Left            =   1680
         TabIndex        =   2
         Top             =   960
         Width           =   1095
      End
   End
   Begin VB.Label Label1 
      Caption         =   "Label1"
      Height          =   495
      Left            =   3360
      TabIndex        =   0
      Top             =   1800
      Width           =   1215
   End
End
Attribute VB_Name = "MainForm"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
' Luis Serrano
' [URL="http://www.analogicsensors.com'"]www.analogicsensors.com'[/URL] Programa para comunicación con dispositivo HID USB(con PIC 18F2550)
' IDs de fabricante y de producto
Private Const VendorID = &H4D8   'Microchip
Private Const ProductID = &HA    'Familia 18X
Private Const CMD1 = 1 ' Comando Encendido/Apagado LED
' Buffers de lectura y escritura
Private Const BufferInSize = 8
Private Const BufferOutSize = 8
Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte
'Otras variables
Dim Fabricante As String * 255
Dim Producto As String * 255
Dim N_Serie As String * 255
Dim LenString As Long
Dim CMD As Byte  ' Buestro comando a enviar al PIC
 
Private Sub EncenderApagarLED_Click()
  CMD = CMD1
  BufferOut(1) = CMD
  If EncenderApagarLED.Caption = "Encender LED" Then
    BufferOut(2) = 255  'Enciende el LED
  Else
     BufferOut(2) = 0  'Apaga el LED
  End If
  '  BufferOut(3)   mo es necesario para este comando
  hidWriteEx VendorID, ProductID, BufferOut(0)
End Sub
' Al iniciar el programa y cargarse el formulario conecta
' con el dispositivo la DLL mcHID.dll
Private Sub Form_Load()
  EncenderApagarLED.Enabled = False
  Conecta_mcHID (Me.hwnd)
End Sub
' Al terminar el programa, desconecta de la DLL mcHID.dll
Private Sub Form_Unload(Cancel As Integer)
  BufferOut(1) = 0
  hidWriteEx VendorID, ProductID, BufferOut(0)
  Desconecta_mcHID
End Sub
' Un dispositivo USB HID se ha conectado.
Public Sub Conectado(ByVal pHandle As Long)
  ' Comprobamos si es nuestro dispositivo USB HID(PIC 18F2550)
  If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
    Text1.Text = "Conectado a dispositivo USB HID ==>": Text1.BackColor = &HFF00&: Text1.ForeColor = &H80000012
    LenString = 255
    hidGetVendorName pHandle, Fabricante, LenString
    Label4.Caption = Fabricante
    hidGetProductName pHandle, Producto, LenString
    Label5.Caption = Producto
    hidGetSerialNumber pHandle, N_Serie, LenString
    Label6.Caption = "N/S: " + N_Serie
    Label7.Caption = "VID: " & VendorID
    Label8.Caption = "PID: " & ProductID
    EncenderApagarLED.Enabled = True
    BufferOut(1) = 0
    hidWriteEx VendorID, ProductID, BufferOut(0)
   End If
End Sub
' Un dispositivo USB HID se ha desconectado.
Public Sub Desconectado(ByVal pHandle As Long)
  ' Comprobamos si es nuestro dispositivo USB HID(PIC 18F2550)
  If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
    Text1.Text = "DISPOSITIVO DESCONECTADO": Text1.BackColor = &HFF&: Text1.ForeColor = &HFFFF&
    EncenderApagarLED.Enabled = False
    Label4.Caption = ""
    Label5.Caption = ""
    Label6.Caption = ""
    Label7.Caption = ""
    Label8.Caption = ""
  End If
End Sub
' Cada vez que se se conecta o desconecta algun dispositivos USB HID se
' procesa este procdimiento.
Public Sub Conectado_Desconectado()
  Dim DeviceHandle As Long
  ' Obtenemos el gestor de nuestro dispositivo.
  ' Asigna un flag de notificación a TRUE  para recibir un mensaje
  ' de lectura de notificación cuando existen datos para leer leer.
  DeviceHandle = hidGetHandle(VendorID, ProductID)
  hidSetReadNotify DeviceHandle, True
End Sub
' Cuando hay datos procedentes del dispositivo USB HID(PIC 18F2550)
' se procesa este procedimiento.
Public Sub Datos_para_Leer(ByVal pHandle As Long)
     If hidRead(pHandle, BufferIn(0)) Then
        CMD = BufferIn(1)
        If CMD = CMD1 Then
           ' El primer byte del buffer es el de ID de reporte
           ' Los bytes restantes son datos enviados por la aplicación del PIC
           If BufferIn(2) = 255 Then
              Frame3.Caption = "LED encendido"
              EncenderApagarLED.Caption = "Apagar LED"
           Else
              Frame3.Caption = "LED apagado"
              EncenderApagarLED.Caption = "Encender LED"
           End If
        End If
    End If
End Sub

Archivo "mcHIDInterface.bas"
Código:
Attribute VB_Name = "HIDDLLInterface"
Option Explicit
' Declaraciones de las funciones de la DLL mcHID.dll
' Conecta a la DLL mcHID.dll
Declare Function hidConnect Lib "mcHID.dll" Alias "Connect" (ByVal pHostWin As Long) As Boolean
' Desconecta de la DLL mcHID.dll
Declare Function hidDisconnect Lib "mcHID.dll" Alias "Disconnect" () As Boolean
' Coge un gestor  por medio de un indice suministrado
Declare Function hidGetItem Lib "mcHID.dll" Alias "GetItem" (ByVal pIndex As Long) As Long
' Devuelve el numero total de dispositivos HID disponibles
Declare Function hidGetItemCount Lib "mcHID.dll" Alias "GetItemCount" () As Long
' Lee un reporte de un dispositivo HID
Declare Function hidRead Lib "mcHID.dll" Alias "Read" (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
' Envia un reporte al dispositivo HID
Declare Function hidWrite Lib "mcHID.dll" Alias "Write" (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
' Lee un reporte de un dispositivo HID
Declare Function hidReadEx Lib "mcHID.dll" Alias "ReadEx" (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
' Envia un reporte al dispositivo HID
Declare Function hidWriteEx Lib "mcHID.dll" Alias "WriteEx" (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
' Coge un gestor  por medio de un fabricante y producto suministrados
Declare Function hidGetHandle Lib "mcHID.dll" Alias "GetHandle" (ByVal pVendorID As Long, ByVal pProductID As Long) As Long
' Devuelve el ID del fabricante
Declare Function hidGetVendorID Lib "mcHID.dll" Alias "GetVendorID" (ByVal pHandle As Long) As Long
' Devuelve el ID del producto
Declare Function hidGetProductID Lib "mcHID.dll" Alias "GetProductID" (ByVal pHandle As Long) As Long
' Devuelve el numero de versión
Declare Function hidGetVersion Lib "mcHID.dll" Alias "GetVersion" (ByVal pHandle As Long) As Long
' Devuelve el nombre del fabricante
Declare Function hidGetVendorName Lib "mcHID.dll" Alias "GetVendorName" (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
' Devuelve el nombre del producto
Declare Function hidGetProductName Lib "mcHID.dll" Alias "GetProductName" (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
' Devuelve el numero de serie del producto
Declare Function hidGetSerialNumber Lib "mcHID.dll" Alias "GetSerialNumber" (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
' Devuelve el tamaño del buffer de entrada(reporte)
Declare Function hidGetInputReportLength Lib "mcHID.dll" Alias "GetInputReportLength" (ByVal pHandle As Long) As Long
' Devuelve el tamaño del buffer de salida(reporte)
Declare Function hidGetOutputReportLength Lib "mcHID.dll" Alias "GetOutputReportLength" (ByVal pHandle As Long) As Long
' Habilita la notificacion de eventos
Declare Sub hidSetReadNotify Lib "mcHID.dll" Alias "SetReadNotify" (ByVal pHandle As Long, ByVal pValue As Boolean)
' Informa si la notificacion de eventos esta habilitada
Declare Function hidIsReadNotifyEnabled Lib "mcHID.dll" Alias "IsReadNotifyEnabled" (ByVal pHandle As Long) As Boolean
' Informa si un disposito HID esta disponible
Declare Function hidIsAvailable Lib "mcHID.dll" Alias "IsAvailable" (ByVal pVendorID As Long, ByVal pProductID As Long) As Boolean
' Declaraciones para windows API  - Usadas para configuración de mensajes...
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
' Constantes windows API
Private Const WM_APP = 32768
Private Const GWL_WNDPROC = -4
' Constantes de mensaje HID
Private Const WM_HID_EVENT = WM_APP + 200
Private Const NOTIFY_PLUGGED = 1
Private Const NOTIFY_UNPLUGGED = 2
Private Const NOTIFY_CHANGED = 3
Private Const NOTIFY_READ = 4
' Variables locales
Private FPrevWinProc As Long    ' Handle del procedimiento previo de Windows
Private FWinHandle As Long      ' Handle al mensaje Windows
' Setea un enganche "windows hook" para recibir notificación
' de mensajes desde el HID controller DLL -luego se conecta
' al controlador
Public Function Conecta_mcHID(ByVal pHostWin As Long) As Boolean
   FWinHandle = pHostWin
   Conecta_mcHID = hidConnect(FWinHandle)
   FPrevWinProc = SetWindowLong(FWinHandle, GWL_WNDPROC, AddressOf WinProc)
End Function
' Desconecta de la DLL mcHID.dll
Public Function Desconecta_mcHID() As Boolean
   Desconecta_mcHID = hidDisconnect
   SetWindowLong FWinHandle, GWL_WNDPROC, FPrevWinProc
End Function
' Esta funcion se procesa cuando se produce alguno de estos 4 eventos
Private Function WinProc(ByVal pHWnd As Long, ByVal pMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If pMsg = WM_HID_EVENT Then
    Select Case wParam
      ' Un dispositivo USB HID se ha conectado.
      Case Is = NOTIFY_PLUGGED
        MainForm.Conectado (lParam)
      ' El dispositivo USB HID se ha desconectado
      Case Is = NOTIFY_UNPLUGGED
        MainForm.Desconectado (lParam)
      ' Cambio en el estado de conexion(conectado/desconectado o viceversa)
      Case Is = NOTIFY_CHANGED
        MainForm.Conectado_Desconectado
      ' El dispositivo USB HID ha enviado un reporte
      ' por tanto tenemos datos disponibles para leer
      ' procedentes del dispositivo USB HID
      Case Is = NOTIFY_READ
        MainForm.Datos_para_Leer (lParam)
      End Select
   End If
   WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)
End Function
 
En las imágenes siguientes puede apreciarse como quedaría la aplicación que comunica con nuestro dispositivo USB HID:

LEDUSB_APP_1.jpg



LEDUSB_APP_2.jpg



En la imagen anterior puede apreciarse que el VID que muestra es el 1240, este es el VID de la firma Microchip en formato decimal(0x04D8 en hexadecimal)



LEDUSB_APP_3.jpg
 
¡Gracias!

Gran parte de la información para realizar este proyecto la he obtenido de este hilo y de las aportaciones que has hecho en el.

Cuando disponga de tiempo publicaré el archivo "LedUSB.hex" y cuando haya depurado más la pila USB publicaré también la pila y las instrucciones para poder encadenar programas realizados en ASM.

Saludos!


Te ha quedado excelente el ejemplo, saludos !
 
Dejo el contenido del archivo LedUSB.hex por si alguien desea realizar el circuito. El condensador C3 en el esquema tiene el valor de 100nF, cuando en realidad su valor es de 220nF.
Código:
:020000040000FA
:100000000EEF00F00000000004EF00F00000000020
:1000100000000000000000000CEF00F00F0EC16EA9
:10002000070EB46E8B949494000E080F4EEC00F003
:1000300072EC05F0006A00B036EC00F000B0009001
:100040003EEC00F00150010A01E0F5D729EC00F088
:10005000F2D70250FF0B05E08B84FF0E026E00808A
:1000600012008B94000E026E0080120070EC00F003
:10007000080E4BEC05F0D8A0F9D7120070EC00F098
:0A0080001FEC05F0D8A0FAD712001B
:06008A000100C20B0000A2
:080090008200000001000000E5
:080098006F6A1200E0CF81F055
:1000A000696A686A6F6AE8B06F840000E8B66F88B2
:1000B00000006D6A6D866DA65AEF00F000016E6B50
:1000C000716B796B010EE8CF6FF0E8CF70F0FF0E27
:1000D000E8CF72F06DBA6AEF00F081C0E0FF120065
:1000E000E0CF81F068A205D00F016A6B81C0E0FF0C
:1000F000120068AC02D0689C120068A803D068980F
:100100006D82120068A406D06D92689468B485EF81
:1001100000F0120068AA02D0689A120068A029D0E4
:1001200000016E6B6896689668966896820EE8CFB6
:1001300001F4800EE8CF02F4040EE8CF03F4880E39
:10014000E8CF00F4880EE8CF06F4040EE8CF07F4F9
:10015000080EE8CF04F40F016E6B686A160E706F1C
:10016000FF0E6B6F0001010E796F010EE8CF6FF08B
:10017000120068A61200040EEA6E6CCFE9FF0001BF
:10018000EECF61F0EECF62F0EECF63F0EECF64F031
:100190006CCF78F0689600016D6B61C0E8FF3C0B96
:1001A000E8CF60F0340E00016019D8A4DCEF00F055
:1001B000FCEC00F0ECEF00F0240E6019D8A4E5EFA1
:1001C00000F060EC04F0ECEF00F0040E6019D8A42D
:1001D000F8EF00F096EC04F000016DA11200820E21
:1001E000E8CF01F4840EE8CF04F4E8CF00F4120065
:1001F00017EC05F0ECEF00F064C0EAFF63C0E9FF24
:10020000EECF65F0EECF66F0EECF67F0EECF68F0A0
:10021000EECF69F0EECF6AF0EECF6BF0EECF6CF080
:10022000820EE8CF01F4E8CF04F465C0E8FF210AAC
:1002300002E0880E01D0C80EE8CF00F46D98FF0EE2
:10024000E8CF72F065C0E8FF600BE8CF60F0000E09
:100250006019D8A42FEF01F042EC01F01200200E3B
:100260006019D8A437EF01F0D6EC03F01200400E6D
:100270006019D8A43FEF01F05DEC04F0120017EC18
:1002800005F0120066C060F0000E6019D8A44CEFB3
:1002900001F09FEC01F01200010E6019D8A454EF98
:1002A00001F046EC02F01200030E6019D8A45CEFD6
:1002B00001F046EC02F01200050E6019D8A464EFBC
:1002C00001F0B1EC02F01200060E6019D8A46CEF38
:1002D00001F0C1EC02F01200070E6019D8A474EF0F
:1002E00001F0CEEC03F01200080E6019D8A47CEFE8
:1002F00001F074EC03F01200090E6019D8A484EF29
:1003000001F081EC03F012000A0E6019D8A48CEF02
:1003100001F0A6EC03F012000B0E6019D8A494EFC4
:1003200001F0BDEC03F012000C0E6019D8A49CEF94
:1003300001F0D1EC03F0120000016D81120065C0E4
:10034000E8FF1F0B606F000E6019D8A4ABEF01F03F
:10035000BEEC01F01200010E6019D8A4B3EF01F059
:10036000CCEC01F01200020E6019D8A4BBEF01F032
:10037000F9EC01F0120017EC05F0120007C4EAFFD7
:1003800006C4E9FF6FC0EEFFEF6A020EE8CF05F486
:10039000C80EE8CF04F4120079C060F0020E6019B4
:1003A000D8A4D6EF01F0E1EC01F01200030E6019C1
:1003B000D8A4DEEF01F0E4EC01F0120000016D8141
:1003C000120017EC05F012000001010E0001695D3A
:1003D0000DE207C4EAFF06C4E9FFEE6AEF6A020E07
:1003E000E8CF05F4C80EE8CF04F4120017EC05F0CE
:1003F000120079C060F0020E6019D8A403EF02F079
:100400000EEC02F01200030E6019D8A40BEF02F0FC
:1004100027EC02F0120017EC05F0120069C0E8FFAB
:100420000F0B12E107C4EAFF06C4E9FF010E0F013A
:1004300070A1000EEE6EEF6A0401020EE8CF05F423
:10044000C80EE8CF04F4120017EC05F0120007C440
:10045000EAFF06C4E9FF0F0EE26E700EE16E69C09E
:10046000E8FF0F0BE3B405D0E3B203D017EC05F0BF
:100470001200000EE3A0010EEE6EEF6A0401020E00
:10048000E8CF05F4C80EE8CF04F4120065C0E8FF19
:100490001F0B606F000E6019D8A452EF02F05DECE4
:1004A00002F01200020E6019D8A45AEF02F06FECAD
:1004B00002F0120017EC05F0120067C060F0010EA8
:1004C000601903E017EC05F0120000016F8366C0AD
:1004D000E8FF0108D8B46F931AEC05F0120079C058
:1004E000E8FFE8CF60F0020E6019D8A47BEF02F0BD
:1004F00086EC02F01200030E6019D8A483EF02F01C
:1005000097EC02F0120017EC05F0120069C0E8FF4A
:100510000F0B0AE10F01709166C0E8FF0108D8A433
:1005200070811AEC05F0120017EC05F012000F0EA6
:10053000EA6E700EE96E69C0E8FF0F0BE926D8B0CD
:10054000EA2AEFB405D0EFB203D017EC05F01200A1
:10055000EF9066C0E8FF0108D8A4EF801AEC05F020
:100560001200000167AF03D017EC05F01200050E72
:10057000E8CF72F067C0E8FFE8CF73F01AEC05F03F
:10058000120060C072F068C060F0010E6019D8A45B
:10059000CDEF02F0F0EC02F01200020E6019D8A4C8
:1005A000D5EF02F0F9EC02F01200030E6019D8A4A6
:1005B000DDEF02F021EC03F01200210E6019D8A447
:1005C000E5EF02F04DEC03F01200220E6019D8A402
:1005D000EDEF02F05FEC03F0120017EC05F01200F3
:1005E000F60EF608746F08EC05F0756F13EC03F067
:1005F000120000016D9167C0E8FF000811E16DB1C4
:100600001200F60E0808020FE8CF74F008EC05F0AF
:10061000E8CF75F0020E0001745F13EC03F01200D6
:1006200017EC05F012006CC0E8FF000807E175C088
:10063000E8FF00016B5D02E26BC075F0E4EC04F0D2
:10064000120000016D9167C060F00001000E60199A
:100650000CE0010E60190CE0020E60190CE0030EB4
:1006600060190CE017EC05F01200F60E620809D0D4
:10067000F60E680806D0F60E980803D0F60EB808F5
:1006800000D000016DB11200E8CF74F008EC05F065
:10069000E8CF75F013EC03F0120000016D9167C014
:1006A000E8FF000809E1E8CF74F008EC05F0E8CFB6
:1006B00075F013EC03F0120017EC05F012000001C6
:1006C0006D9167C0E8FF00080CE1320E6208E80691
:1006D000E8CF75F0F60E3208E8CF74F013EC03F0B3
:1006E000120017EC05F0120007C4EAFF06C4E9FF88
:1006F0006EC0EFFF010EE8CF05F4C80EE8CF04F49A
:10070000120067C0E8FF01081EE167C0E8FFE8CFFC
:100710006EF0030EE8CF79F00401820E096F900E9F
:100720000A6F040E0B6FC80E086F820E0D6F980EC5
:100730000E6F040E0F6F480E0C6F1E0E0F01716FBF
:100740001AEC05F0120017EC05F0120079C0E8FF72
:10075000030A10E0010E0001695D0CE207C4EAFF24
:1007600006C4E9FFEF6A010EE8CF05F4C80EE8CF32
:1007700004F4120017EC05F0120079C0E8FF030A38
:100780000AE1010E0001695D06E26751000A03E11A
:100790001AEC05F0120017EC05F0120017EC05F04A
:1007A000120017EC05F000016D81120066C060F0C8
:1007B000010E6019D8A4E0EF03F00BEC04F0120076
:1007C000090E6019D8A4E8EF03F035EC04F012002C
:1007D000030E6019D8A4F0EF03F039EC04F0120016
:1007E0000B0E6019D8A4F8EF03F046EC04F01200E9
:1007F000020E6019D8A400EF04F04BEC04F01200D4
:100800000A0E6019D8A408EF04F058EC04F01200A6
:1008100017EC05F0120068C0E8FF606E010E601969
:1008200006E0030E601912E017EC05F0120007C491
:10083000EAFF06C4E9FF7CC0EEFF7DC0EFFF020EB9
:10084000E8CF05F4C80EE8CF04F4120007C4EAFFAD
:1008500006C4E9FF7AC0EEFF7BC0EFFF020EE8CFCF
:1008600005F4C80EE8CF04F41200726F68C07EF081
:10087000120007C4EAFF06C4E9FF70C0EFFF010ED3
:10088000E8CF05F4C80EE8CF04F4120067C070F09A
:100890001AEC05F0120007C4EAFF06C4E9FF71C0B4
:1008A000EFFF010EE8CF05F4C80EE8CF04F4120004
:1008B00067C071F01AEC05F0120017EC05F0120099
:1008C00078C0E8FF180B606F000E6019D8B474EFA1
:1008D00004F0080E6019D8B494EF04F0100E6019FB
:1008E000D8B495EF04F0120072C0E8FF606F050EF7
:1008F0006019D8A47FEF04F085EC04F01200060E16
:100900006019D8B491EC04F0120073C06EFF000AB5
:1009100004E1010EE8CF79F01200020EE8CF79F081
:100920001200E4EC04F012001200120078C0E8FF9C
:10093000180B606F000E6019D8A4A2EF04F0B0ECA1
:1009400004F01200080E6019D8A4AAEF04F0E2EC3B
:1009500004F01200100E6019D8B4E3EC04F0120099
:1009600072C060F0090E6019D8B4C0EC04F0820EB9
:10097000E8CF01F4880EE8CF00F41AEC05F012007D
:10098000FF0EE8CF72F001C4E8FF02080CE103C4D7
:10099000EAFF02C4E9FF7EC060F0020E601906E0C3
:1009A000030E60190AE017EC05F01200EE50E8CFD4
:1009B0007CF0EF50E8CF7DF01200EECF7AF0EFCF71
:1009C0007BF01200120012000001080E755D04E2B7
:1009D000FF0E726F755101D0080E755F776FE8CF0B
:1009E00005F407C4EAFF06C4E9FF0001010E766FB3
:1009F0007651775D06E308EC05F0EE6E742B762BEE
:100A0000F7D70401400E0419400B8809046F120047
:100A1000000EF86E0A0EF76EF60E00017425D8B0BF
:100A2000F72AD8B4F82AF66E0800F5501200000133
:100A30006D8112000401056BC80E046F1200E0CF37
:100A400081F0040108BF23D009C47FF009C480F0FD
:100A500009510DE00BC4EAFF0AC4E9FF000EE26E83
:100A6000010EE16E0001EECFE6FF7F2FFCD708C438
:100A7000E8FF400B400A8809E8CF08F4820EE8CF6F
:100A800009F480C0E8FF81C0E0FFD880120081C077
:100A9000E0FFD8901200E0CF81F0E8CF7FF00401B2
:100AA0000CBF1CD07FC00DF40D510DE00FC4EAFF48
:100AB0000EC4E9FF000EE26E010EE16E0001E6CF0A
:100AC000EEFF7F2FFCD70CC4E8FF400B400A8809DB
:100AD000E8CF0CF481C0E0FFD880120081C0E0FFB5
:100AE000D890120070EC00F079C0E8FF0308D8A499
:060AF00072EF05F0120098
:0A0AF6001201100100000008D804EE
:100B00000A0000010102030109022900010100A0FD
:100B10002509040000020300000009210101000171
:100B2000222F0007058103080010070501030800B4
:100B3000100006A0FF0901A1010903150026FF000E
:100B40007508950881020904150026FF00750895AF
:100B50000391020905150026FF0075089500B102F2
:100B6000C00006030A0C0904300377007700770001
:100B70002E0061006E0061006C006F00670069006C
:100B80006300730065006E0073006F0072007300F5
:100B90002E0063006F006D0020034C0045004400F0
:100BA0002D0055005300420020003100380046005F
:100BB00032003500350030000A03300030003000CC
:020BC000310002
:010BC200082A
:020000040030CA
:01000000F40B
:010001003EC0
:01000200FFFE
:01000300FEFE
:01000500F901
:010006009B5E
:01000800FFF8
:01000900FFF7
:01000A00FFF6
:01000B00FFF5
:01000C00FFF4
:00000001FF
 
home. datacomm.ch /str/usbolo.asm

Para los que les guste batallar con ensamblador, es un bootloader con comunicación CDC al ordenador, lo modifique y pude hacer varias cosas. ;)
 
el codigo esta bien? por que e envia un erro de compilacion dice que dalta sub o function y me lo indica en esta seccion

' Al iniciar el programa y cargarse el formulario conecta
' con el dispositivo la DLL mcHID.dll
Private Sub Form_Load() <--------------- esto lo pone en amarillo
EncenderApagarLED.Enabled = False
Conecta_mcHID (Me.hWnd)
End Sub


y el mcHID.dll en donde se instala?


de ante mano muchas gracias buen foro mucha informacion valiosa
 
Última edición:
El código compila sin ningún errores con VB5 ¿Que compilador estas utilizando?

El archivo mcHID.dll debes situarlo en la misma carpeta de la aplicación.


Salu2.


el codigo esta bien? por que e envia un erro de compilacion dice que dalta sub o function y me lo indica en esta seccion

' Al iniciar el programa y cargarse el formulario conecta
' con el dispositivo la DLL mcHID.dll
Private Sub Form_Load() <--------------- esto lo pone en amarillo
EncenderApagarLED.Enabled = False
Conecta_mcHID (Me.hWnd)
End Sub


y el mcHID.dll en donde se instala?


de ante mano muchas gracias buen foro mucha informacion valiosa
 
Atrás
Arriba