# USB y PIC 18F2550 Desarrollo de proyectos en ASM



## Moyano Jonathan (Feb 16, 2010)

En esta ocación vengo para empezar a desarrollar entre todos una librería de USB usando el lenguaje ensamblador para la familia de microcontroladores PIC18FXX5X.
La razón de esto , es porque hay muchos usuarios que son expertos manejando ASM pero no saben utilizar bien el lenguaje C o lenguajes de alto nivel. También otra razón es que quiero que todos entendamos de una manera más profunda el funcionamiento del módulo USB de la familia microchip...y luego de esto poder "tratar" de implementar la comunicación USB en cualquier microcontrolador...
El desarrollo de este hilo se hará de forma parecida al https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/ pero todos los desarrollos al igual que los diferentes programas de ejemplos se harán en ASM.

Para empezar a trabajar con el puerto USB del microcontrolador veremos todos los registros del micro asociados con este periférico , su funcionamiento y luego poco a poco comenzaremos a confeccionar los primeros programas.

Bueno para empezar veremos donde están hubicados los pines D- y D+ ( correspondientes a las señales de datos del puerto USB en el PIC18F2550 y en el PIC18F4550) , asi como también los otros pines que intervienen en su funcionamiento.







[/URL]

*Breve descripción del funcionamiento del módulo USB:*
La familia de dispositivos PIC18FX455/X550 contiene una interfaz serie compatible con el SIE (serial interface engine o máquina con comunicación serie en español) USB “full-speed” (2.0) y “de poca velocidad” (1.0) que permite la comunicación rápida entre cualquier dispositivo USB y el microcontrolador PIC®.
El SIE puede interconectarse directamente al USB, utilizando el transmisor - receptor interno, o puede conectarse a través un transmisor-receptor externo. El PIC tiene un regulador interno de 3,3V para alimentar el transmisor-receptor interno en aplicaciones de 5V.
Se han incluido algunas características especiales en el hardware para mejorar el funcionamiento. Se proporciona memoria de puerto dual en la memoria de datos del dispositivo (RAM del USB) para tener acceso directo a la memoria desde el núcleo del microcontrolador y desde el SIE. También se proporcionan unos buffer para que el programador elija libremente el uso de la memoria dentro del espacio de la RAM del USB. Existe un puerto paralelo para transmitir grandes cantidades de datos (SSP), para esto se ha proporcionado la ayuda de transferencia ininterrumpida de volúmenes de datos grandes, por ejemplo datos síncronos, a los buffer de memoria externos.

Bueno ahora veremos en detalle como se comunica la SIE con el exterior y las diferentes opciones a nivel conexionado del USB con el exterior:





Antes que nada veremos las notas a las referencias 2 y 3 que están dentro de la inmágen. Aclarar que estas notas son importantes para no cometer equivocaciones a la hora de programar el código que lo configura.
entonces:

*Nota* 2:*Las pull - ups externas son opcionales , pero si queremos usarlas hay que desactivar las propias resistencias de pull - up internas que tiene el microcontrolador. La activación o desactivación de estas resistencias se hace mediante el bit *UPUEN*...que se verá más adelante.
*Nota* 3:*El regulador de voltaje de 3.3v, nos provee de tensión al módulo USB en aplicaciones de 3.3v. En caso de tener una fuente externa de 3.3v conectada a Vusb, tenemos que desactivar el módulo interno del regulador.

Vemos en la inmágen los diferentes pines que según configuración de la SIE , podemos usar un transceptor externo, el fin de este tutorial no es el estudio de los módulos externos , por lo que se verá muy superficialmente.

Algo ¡ Muy importante ! que tenemos que ver es el puente bidireccional entre la SIE y el SSP...este puente nos va a permitir el transporte a alta velocidad de grandes flujos de datos en modo sincrono, por lo que se estudiará también en su momento.
Ver la siguiente inmágen en donde se muestra dicho puente:




Espero les sirva ...después sigo  
	

	
	
		
		

		
		
	


	




*Estado y control del módulo USB:*
En total hay 22 registros para manejar las transacciones del USB. Los registros son:
• Registro de control del USB (*UCON*)
• Registro de configuración del USB (*UCFG*)
• Registro de estado de la transferencia del USB (*USTAT*)
• Registro de dirección de dispositivo USB (*UADDR*)
• Registros del número del frame (*UFRMH: UFRML*)
• Registros activadores de los Endpoints de 0 a 15 (*UEPN*)

El primer registro que estudiaremos será el UCON (registro de control del USB):
En la siguiente inmágen veremos como está constituido:




Este registro de control contiene los bits necesarios para determinar el comportamiento del bus durante las transferencias. El registro contiene los bits que gobiernan lo siguiente:

• Permiso del periférico principal del USB
• Reset de los punteros tipo ping-pong
• Control del modo al suspender
• Desactivar la transferencia de paquetes

El significado de los diferentes bits se muestra a continuación:

*BIT7:* Bit no implementado se lee como "0"
*BIT6:* El bit *PPBRST*, se encarga de controlar el estado del reset, cuando se utiliza el modo Doble - Buffering o modo Ping - Pong.Cuando se activa el bit *PPBRST*, todos los buffers Ping - Pong se fijan a los buffers intermedios. El bit *PPBRST*, tiene que borrarse por firmware.Este bit se ignora en los modos de buffer que no usen el buffer ping-pong.
*BIT5:* El bit *SE0*,se utiliza para indicar el estado del bus, si sólo se manda un cero.
Cuando se permite el módulo USB, este bit debe supervisarse para determinar si las líneas de datos han salido de una condición de single-ended cero (sólo se manda cero). Esto ayuda a distinguir el estado de ciclo inicial de la señal de reset del USB.
*BIT4:* El bit *PKTDIS*,es un flag que indica si el SIE ha inhabilitado la transmisión y la recepción de paquetes. Este lo bit activa el SIE cuando recibe un SETUP para permitir su procesamiento. Este bit no lo puede activar el microcontrolador, sólo borrar; al despejarlo el SIE continua la transmisión y/o recepción. Cualquier acontecimiento pendiente dentro del buffer intermedio todavía estará disponible, indicado dentro del registro USTAT en el buffer FIFO.
*BIT3:* El bit *USBEN*,la operación total del módulo USB se controla con este bit. Activar este bit setea el módulo y resetea todos los bits PPBI en el Buffer a ‘0’. Este bit también activa el regulador de tensión del chip y conecta las resistencias pull-up, si se permiten. Así, este bit puede utilizarse como una unión/separación al USB. Aunque se ignoran todos los estados y bits de control si este bit está borrado, el módulo necesita preconfigurarse antes de activar este bit.
*BIT2:* El bit *RESUME*,permite al periférico realizar un reinicio ejecutando la señal resume. Para generar un reinicio válido, por firmware se debe activar el RESUME durante 10ms y entonces borrar el bit.
*BIT1:* El bit *SUSPND*,coloca el módulo y soporte del circuito (es decir,regulador de tensión) en un modo de baja potencia. El reloj de entrada al SIE se desactiva. Este bit debe activarse por software dentro de la respuesta a una interrupción IDLEIF. Debe borrarse por firmware después de observar una interrupción ACTVIF. Cuando este bit está activo, sigue estando el dispositivo unido al bus pero las salidas del transmisor-receptor permanecen en reposo. La tensión en el pin VUSB puede variar dependiendo del valor de este bit. Activar este bit antes de un IDLEIF dará lugar a
comportamiento imprevisible del bus.
*Nota:*Cuando esté en el modo de suspensión, el bus del dispositivo USB se limita al *500μA* de corriente. Ésta es la corriente completa cedida por el dispositivo PIC y su circuito de soporte. Hay que tener cuidado de ceder la corriente mínima cuando el dispositivo entre en el modo de suspensión.
*BIT0:* Bit no implementado se lee como "0"

*Registro de configuración del USB:*
Antes de comunicarse con el USB, se tiene que configurar el módulo del hardware interno y/o externo. La mayor parte de la configuración se realiza con el registro *UCFG*. El regulador de tensión del USB se maneja con la configuración de los registros.
El registro *UFCG* contiene la mayor parte de los bits que dirigen el comportamiento del módulo USB. Éstos incluyen:

• Velocidad del bus (“Alta velocidad” vs “Baja velocidad”)
• Permiso de las resistencias pull-up del chip
• Permiso del transmisor del chip
• Uso del buffer ping-pong

El registro *UCFG* también contiene dos bits que ayudan a probar el módulo, eliminando errores y certificaciones del USB. La salida de control de estos bits permite el monitor de estado y generación de patrones “de ojo”.




*BIT 7: UTEYE:* Bit de permiso del test patrón “de ojo” del USB.
1 = prueba del patrón “de ojo” permitido.
0 = prueba del patrón “de ojo” inhabilitado.

*BIT 6: UOEMON:* Bit de permiso del monitor OE del USB.
1 = señal del UOE* activa; indica los intervalos durante los cuales las líneas D+/D- están conduciendo.
0 = señales del UOE* inactivas.

*BIT 4: UPUEN:* Bit de permiso del pull-up del chip.
1 = Pull-up del chip permitido (pull-up en D+ con FSEN=1 o en D- con FSEN=0).
0 = Pull-up del chip desactivado.

*BIT 3: UTRDIS:* Bit inhabilitador del transmisor del chip
1 = Transmisor del chip inhabilitado; la interfaz digital del transmisor permitida.
0 = transmisor del chip activo.

*BIT 2: FSEN:* Bit de permiso del Full-Speed.
1 = dispositivo Full-speed: controla los flancos del transmisor; requiere un reloj de 48MHz.
0 = dispositivo de poca velocidad: controla los flancos del transmisor; requiere un reloj de 6MHz.

*BIT 1-0 PPB1PB0:* Bits de configuración de los buffer ping-pong.
11 = buffers ping-pong permitidos en los End-Points 1 a 15.
10 = buffers ping-pong permitidos en todos los End-Points.
01 = buffer ping-pong permitido en los End-Points de salida 0.
00 = buffers ping-pong inhabilitados.

*Nota 1:* 
1: Si se activa UTRDIS, la señal UOE* estará activa independiente del ajuste del bit UOEMON.
2: Los bits UPUEN, UTRDIS y FSEN no deben cambiarse mientras el módulo USB esté permitido. Estos valores se deben preconfigurar antes de permitir el módulo.
3: Este bit solamente es válido cuando el transmisor del chip está activo (UTRDIS = 0); si no, se ignora.

*Nota 2:* La velocidad del USB, la transmisión y las pull-up deben configurase solamente durante la fase de activación del módulo. No se recomienda cambiar estos ajustes mientras que el módulo esté funcionando.

Viendo un poco el registro *UCFG*, en donde se encuentra el bit *UTEYE*, que es un bit de control de estado del USB que vigila los errores y es un generador de patrones.

Luego tenemos al bit *UOEMON*. Este bit nos muestra cuando las lineas D+ y D- están conduciendo y lo que estos valores representan según el siguiente cuadro:





Ahora tenemos 2 bit que trabajan de forma conjunta *FSEN* y *UPUEN*, según sea su configuración activarán o desactivarán las Resistencias Pull - Up internas del módulo USB o configuraran el módulo USB para trabajar a full - speed o slow - speed.

Veamos el circuito lógico que realiza estas acciones y una pequeña tabla donde se muestran las posibles configuraciones.






Luego tenemos *UTRDIS*, que habilita o deshabilita el transmisor del chip, en caso de que el bit sea 0 , activamos el transceptor y los pines C4 y C5 son usados para conectar el dispostivo USB.
En caso de que el bit sea seteado a 1 , el transceptor es desactivado y las lineas C4 y C5 quedan para poder ser usadas como entradas digitales unicamente.


Por último tenemos los bits de configuración *BIT 1-0 PPB1PB0:* que establecen la configuración del modo Ping - Pong.


----------



## Moyano Jonathan (Feb 17, 2010)

*Permiso de la salida del monitor del USB:*
El monitor del *USB OE** proporciona información de la operación del SIE si está escuchando el bus o está conduciendo por el bus. Esto se permite por defecto al usar un transmisor externo o cuando *UCFG<6>=1*. La supervisión del *USB OE** es útil para el eliminar errores del sistema inicial.
*Permiso del test patrón “de ojo”:*
Se genera una prueba automática al activar el bit *UCFG<7>* del patrón “de ojo”. La salida del patrón “de ojo” dependerá de los ajustes del módulo, significando que el usuario es el primer responsable de configurar los ajustes del reloj SIE, las resistencias pull-up y el modo transmisor. Además, el módulo tiene que estar permitido.
Una vez que se active *UTEYE*, el módulo emula un cambio a una recepción para transmitir el estado y comenzará a transmitir una secuencia de bits J-K-J-K (K-J-K-J en “velocidad completa”). La secuencia se repetirá indefinidamente mientras que el test patrón “de ojo” esté permitido.
Observar que este bit no se debe activar mientras que el módulo está conectado con un sistema real USB. Este modo de prueba se utiliza para ayudar con las verificaciones internas de las pruebas de certificación USB. Se utiliza para depurar los fallos obtenidos por el ruido de las señales que pueden afectar los flancos del sistema, uniones de impedancias mal hechas y proximidad a otros componentes. No comprueba correctamente la transición de un estado de recepción a uno de transmisión. Aunque el patrón de ojo no significa que se sustituya la prueba más compleja de certificación del USB, pero ayuda durante el primer test para eliminar errores del sistema.

*Regulador de voltaje interno:*
Los dispositivos PIC18FX455/X550 tienen un regulador incorporado 3,3V para proporcionar energía al transmisor interno y proporcionar una fuente para el pull-up interno y externo. Para que el regulador sea estable se necesita un condensador externo de 220nF (±20%). Cabe aclarar que se pueden colocar capacitores de mayor capacidad pero no es necesario ya que con 220nF (±20%) funciona correctamente.

*Nota:* La corriente de VUSB es suficiente para controlar un pull-up externo y el transmisor interno. El regulador se activa por defecto y puede inhabilitarse a través del bit de configuración *VREGEN*. Cuando está activo, la tensión es visible en el pin *VUSB*. Cuando el regulador está desactivado, se tiene que conectar una fuente de 3,3V al pin VUSB para alimentar el transmisor interno. Si el transmisor interno no se utiliza, VUSB tampoco se activa. VDD debe ser mayor que VUSB en cualquier momento, o igual con el regulador inhabilitado.


----------



## andresd0 (Feb 17, 2010)

siempre quise saber si era posible USB en asm, aca esta la respuesta a mi pregunta, lo seguire muy de cerca, Moyano Jonathan, espero parender mucho con tu inciativa, desde ya muchas gracias


----------



## elemos13 (Feb 21, 2010)

Yo opino lo mismo que Andrés salvo que ya e intentado bastante realizar la conexión USB en .asm pero con rotundos fracasos ya que solo e logrado que lo detecte la PC pero no e podido enviar y recibir ningún tipo de dato, y la verdad no se por que no me funciona pero estaré en seguimiento constante también para ver que se puede aportar y solucionar algunas dudas, por otra parte este es un excelente tema a tratar por que si no sabes programación de alto nivel (como es mi caso) el ensamblador es la opción para realizarlo gracias por el esfuerzo Moyano. Por cierto yo estoy manejando el pic 18F4550 pero creo que es muy similar al planteado aqui en el tema.

SALUDOS.


----------



## Moyano Jonathan (Feb 21, 2010)

elemos13 como andas ....yo voy a mostrar más o menos la arquitectura de los 2 micros ..pero las pruebas las voy a hacer en un PIC18F2550 , que es el único que tengo a mano con USB en este momento.


----------



## elemos13 (Feb 21, 2010)

Yo estoy con el 18F4550 nada mas por el momento solo tengo este para USB pero como lo comente solo e logrado que sea reconocido por la PC y no e logrado la trasferencia de datos de la PC al micro y viceversa me quedan bastantes dudas con los protocolos y los tan mencionados ping-pong buffers que pues no los entiendo todavía al 100% pero mas o menos se como funcionan eso y los firmware pues casi estoy empezando pero no estoy en cero. Adjunto los códigos que e venido desarrollado hasta el momento se que todavía falta mucho que trabajar en ellos pero de algo han de servir. Ambos solo inicializan al puerto USB, no me ha quedado claro y sigo descifrando las 4 tipos de transferencias centrándome un poco en la tranferencia bulk. Hasta descifrar otras pequeñas pero significativas dudas actualizo los .asm. 

SALUDOS.


----------



## Moyano Jonathan (Feb 22, 2010)

elemos13 voy a estudiar tus programas pero te faltan muchas configuraciones y todas las definiciones de los buffers de datos en el programa....igual lo voy a revisar por que con esto del USB en ASM recién empiezo y tengo que aprender muchas cosas todavía.


----------



## Moyano Jonathan (Feb 22, 2010)

Quería dar mis gracias a los administradores del foro por destacar este tema...perdón por no seguir subiendo info pero he tenido algunas materias que rendir estos días y no he tenido mucho tiempo...además de que cada tanto tengo que descansar un poco la mente y me desconecto del mundo...
sin nada mas para decir ..luego sigo con el tutorial.


----------



## Moyano Jonathan (Feb 25, 2010)

*Registro de estado del USB (USTAT):*

El registro de estado del USB divulga el estado de las transacciones dentro del *SIE*. Cuando el *SIE* publica una interrupción de transferencia completa por el USB, hay que leer *USTAT* para determinar el estado de la transferencia. *USTAT* contiene el número del Endpoint de la transferencia, dirección y valor del puntero del buffer pingpong (si está utilizado).

*Nota:* Los datos en el registro de estado del USB son válidos solamente cuando el flag de interrupción *TRNIF* está activo.

El registro *USTAT* es realmente una ventana legible de los cuatro bytes de estado *FIFO* mantenida por el *SIE*. Permite al microcontrolador procesar una transferencia mientras que *SIE* procesa los Endpoints adicionales. Cuando el *SIE* termina con un buffer de lectura o escritura de datos, actualiza el registro *USTAT*. Si se realiza otra transferencia USB antes de realizar una interrupción de transacción completa, el *SIE*almacenará el estado de la transferencia siguiente en el estado *FIFO*. Despejando el flag de la transferencia completa, *TRNIF*, provoca al *SIE *que avance el FIFO. Si los datos siguientes en el registro *FIFO* son válidos, el *SIE* inmediatamente reafirma la interrupción. Si no hay datos adicionales presentes, *TRNIF* seguirá borrado; los datos de *USTAT*puede que no sean correctos.

*Nota:* Si se recibe una petición de Endpoint mientras que el USTAT FIFO este lleno, el SIE publica automáticamente un NAK de nuevo al anfitrión.

En la siguiente figura mostramos la *FIFO*:





Ahora veremos que significan cada uno de los bits dentro del registro.





*BIT 7:* No implementado , legible como "0"

*BIT 6 al 3: ENDP3:ENDP0:* Bits de actividad del número codificado del último Endpoint (representa el número del BDT actualizado por la última transferencia del USB).
1111 = Endpoint 15
1110 = Endpoint 14
….
0001 = Endpoint 1
0000 = Endpoint 0

*BIT2: DIR:* Bit puntero de la última dirección BD.
                1 = la última transacción era de entrada.
                0 = la última transacción era de salida o de SETUP.
*BIT1 PPBI:* Bit puntero del puntero ping-pong BD*
                1 = la transacción pasada estaba al banco Odd de BD.
                0 = la transacción pasada estaba al banco Even de BD.
*NOTA:* Este bit es solamente válido para los Endpoints con registros Even y Odd BD disponibles.


----------



## sebitronic (Feb 25, 2010)

Muy buen aporte, hace rato que estoy diseñando un robot de sumo y andaba con ganas de usar el usb del PIC18F2550 que es el corazon del robot, en cuanto empiece a probar el USB del pic subo ejemplos.

 ¿Otra cosita, que le parece si empezamos entre todo (o los que se quieran unir) un hilo sobre la programacion del USB atraves de Visual Basic 2005 o 2008?


----------



## Lithiumrd (Feb 26, 2010)

Estoy bastante interesado en el tema y creo no ser el unico, espero poder aprender y colaborar en el post...


----------



## Moyano Jonathan (Feb 27, 2010)

*CONTROL DE LOS ENDPOINTS DEL USB:




*Las funciones de cada bit se dan a continuación:
*BIT 7 - 5:* No implementados, se leen como "0".

*BIT 4 EPHSHK:* Bit de permiso del protocolo de intercambio
1= Se permite el protocolo de intercambio del Endpoint.
0= Se inhabilita (utilizado con los Endpoints síncronos).

*BIT 3 EPCONDIS:* Bit bidireccional de control del Endpoint
*Si EPOUTEN=1 y EPINEN=1:*
1= Inhabilita las transferencias de control del Endpoint n; sólo permite las de entrada y las de salida.
0= Permite las transferencias de control (SETUP) y las de entrada y salida del Endpoint n.

*BIT2 EPOUTEN:* Bit de permiso de la salida del Endpoint.
1= La salida del Endpoint n permitida.
0= La salida del Endpoint n inhabilitada.

*BIT 1 EPINEN:* Bit de permiso de la entrada del Endpoint.
1= La entrada del Endpoint n permitida.
0= La entrada del Endpoint n inhabilitada.

*BIT 0 EPSTALL:* Bit de permiso de la parada del Endpoint*
1= Se puede parar el Endpoint n.
0= El Endpoint n no se puede parar.

*Nota 1:* Válido solamente si se permite el Endpoint n; si no, se ignora el bit.

Cada uno de los 16 Endpoints bidireccionales posibles tiene un registro de control independiente, UEPn (donde ‘n’ representa el número del Endpoint). Cada registro tiene los mismos bits de control.
El bit *EPHSHK (UEPn<4>)* controla el protocolo de intercambio de los Endpoints; activar este bit permite el protocolo de intercambio del USB. Típicamente, este bit se setea siempre excepto al usar Endpoints síncronos.
El bit *EPCONDIS (UEPn<3>)* se utiliza para permitir o inhabilitar las operaciones de control del USB *(SETUP)* con Endpoint. Borrar este bit permite las transacciones SETUP. Observar que los bits *EPINEN y EPOUTEN* se deben activar para permitir las transacciones de entrada y de salida. Para el Endpoint 0, este bit debe estar siempre borrado por que las especificaciones del USB identifican el Endpoint 0 como el Endpoint de control por defecto.
El bit *EPOUTEN (UEPn<2>)* se utiliza para permitir o para inhabilitar las transacciones de salida del anfitrión. Activar este bit permite transacciones de salida. Semejantemente, el bit *EPINEN (UEPn<1>)* permite o inhabilita las transacciones de
entrada al anfitrión.
El bit *EPSTALL (UEPn<0>)* se utiliza para indicar la condición *STALL* para el Endpoint. Si se ejecuta una STALL en un Endpoint particular, el bit EPSTALL para ese Endpoint lo activará el SIE. Este bit permanece hasta que se borre por software o hasta que ocurra un reset del SIE.

*REGISTRO DE DIRECCIÓN DEL USB (UADDR):*
El registro de dirección del USB contiene la única dirección del USB que el periférico descifra cuando está activo. *UADDR* se pone a 00h cuando recibe un reset del USB, indicado por *URSTIF*, o con un reset al microcontrolador. La dirección del USB la tiene que escribir el microcontrolador durante la fase de setup del USB como parte del firmware del USB de la ayuda de microchip.

*REGISTROS DEL NÚMERO DEL FRAME DEL USB (UFRMH:UFRML):*
Los registros del número del frame contienen los 11bits del número del frame.
El byte de orden inferior está en *UFRML*, mientras que los tres bits de orden superior permanecen en *UFRMH*. El par de registros se actualizan con el número de frame actual cuando recibe un *SOF*. Para el microcontrolador, estos registros son sólo de lectura. El registro del número del frame se utiliza sobre todo para transferencias síncronas.


----------



## Meta (Mar 1, 2010)

Muy buen el aporte, están como para comérselos. Ya se pasará a PDF. Sigue así.

¿Realmente tienes intención de manejar el USB con ASM o es una broma?

Se que hay ejemplos desde la Web de microchip con ejemlos en C y ASM con USB 2.0.


----------



## soulmen (Mar 1, 2010)

una pregunta este pic funcionaria para leer datos de una memoria usb 
tengo un proyecto que necesito leer un archivo de una memoria y transmitirlo via inalambrica osea que no necesito escribir nada en la memoria solo leer y transmitir,
estube buscando en la red y este dispositivo me serviria se llama vdrive2 que seria mi segunda opcion.


----------



## Lithiumrd (Mar 1, 2010)

hasta donde se se puede solo hay que saber en que direccion de memoria esta la informacion, el tamaño y la velocidad a la que trabaja la memoria, y eso si HECHAR CODIGO


----------



## Moyano Jonathan (Mar 2, 2010)

Meta, si me he metido con USB en ASM aunque antes de entender todo a un 100% voy a tener que leer mucho ....y en inglés....hay 2 cosas que tengo en estudio en este momento y son las especificaciones del USB 1.0 y 2.0 asi como el libro USB complete 4º edition....con eso voy a tener las ideas más claras sobre el puerto USB...y desde ahí estaría en condiciones como para decirte "se sobre el puerto USB" ...este hilo se va a tratar de como hacer una aplicación básica de control con el puerto USB para que los que no programan en C puedan comunicar sus proyectos con este puerto.

Mi objetivo a futuro...es conseguir crear un firmware para dotar de USB a micros con menores capacidades como los PIC16F877A o PIC16F84A , esto no lo digo como algo de ciencia ficción sino como algo posible y que ya se ha hecho.


----------



## Meta (Mar 2, 2010)

Estás en forma. 

Te recuerdo que el PIC16F877A www.microchip.com no los fabrica, su sustituto es el 16F887 y es más barato y con mejores prestaciones. En cuanto al PIC16F84A, uno lo hizo con USB 1.1 y se pegó casi tres años, pero le funciona.

Me meteré con ASM y USB aunque tengo dificultades con el Inglés, jejeje. Voy a mirar ese libro  a ver si entiendo algo. La verdad que deberían sacar libros USB en español.

El que m ellama la atención es este libro que lelvo detrás de él desde el 2008 y no lo  he conseguido.

http://www.elektor.es/noticias/nuevo-libro-c-2008-y-net-para-ingenieros.979192.lynkx

Sigue así....


----------



## Moyano Jonathan (Mar 2, 2010)

*RAM DEL USB:*
Los datos del USB se mueven entre el núcleo del microcontrolador y el SIE a través de una memoria
conocida como USB RAM. Ésta es una memoria de puerto dual especial que está mapeada en la memoria normal de datos en los bancos de 4 a 7 (400h a 7FFh) para un total de 1kbyte.
El banco 4 (400h con 4FFh) se utiliza específicamente en el control del buffer del Endpoint, mientras que los bancos de 5 a 7 están disponibles para los datos del USB. Dependiendo del tipo de buffer que se utilice, los 8 bytes del banco 4 pueden estar disponibles para utilizarlos como buffer del USB.
Aunque la RAM del USB está disponible en el microcontrolador como memoria de datos, las secciones que está modificando el SIE no las puede usar el microcontrolador. Se utiliza un mecanismo de semáforos para determinar el acceso a un buffer en un momento dado.






*BUFFER DESCRIPTOR Y TABLA DEL BUFFER DESCRIPTOR:*

Los registros del banco 4 se utilizan específicamente para el control del buffer del Endpoint en una estructura conocida como *Tabla del Buffer descriptor (BDT)*. Esto proporciona un método flexible a los usuarios para construir y para controlar los Buffers
del Endpoint de varias longitudes y configuraciones. Los *BDT* se componen de los Buffers descriptores (BD) que se utilizan para definir y controlar los Buffers reales del Espacio de la RAM del USB. Cada BD, alternadamente, consiste en cuatro registros, donde n representa uno de los 64 BDs
posibles (gama de 0 a 63):

• *BDnSTAT:* Registro de estado de BD
• *BDnCNT:* Registro del byte de cuenta de BD
• *BDnADRL:* Registro bajo de la dirección de BD
• *BDnADRH:* Registro alto de la dirección de BD

*BDs* ocurre siempre como bloque de cuatro bytes en la secuencia,
BDnSTAT:BDnCNT:BDnADRL:BDnADRH. La dirección de BDnSTAT es siempre una compensación de (4n-1) (en hexadecimal) de 400h, con n como el número del Buffer descriptor.

Dependiendo de la configuración del buffering utilizada, hay 32, 33 ó 64 sistemas de Buffer descriptores. El BDT debe ser por lo menos 8 bytes de largo. Esto se debe a que la especificación del USB asigna que por mandato debe tener cada dispositivo el Endpoint0 configurado como entrada y salida en la disposición inicial. Dependiendo del Endpoint y de la configuración buffering, el BDT puede ser de 256 bytes de largo.
Aunque se puede creer que los buffers descriptores y los registros de dirección son registros de funciones especiales que no están mapeados en hardware, como lo están los SFRs convencionales en el banco 15 del microcontrolador. Si el Endpoint correspondiente a un BD particular no está permitido, sus registros no se utilizan. En vez de aparecer como direcciones no implementadas, aparecen como RAM disponible. Solamente cuando un Endpoint está permitido, activando el bit UEPn<1>, se consigue que la memoria de esas direcciones funcione como BD. Como los registros BD tienen cualquier dirección en la memoria de datos en un reset, también tienen un valor
indeterminado.
Un sistema particular de los registros BD son solamente válidos si el Endpoint correspondiente está permitido usando el registro UEPn. Todos los registros BD están disponibles en la RAM del USB. El BD para cada Endpoint debe configurarse antes de permitirlo.

Meta te digo que el inglés no es lo mio pero eso no me detiene..


----------



## soulmen (Mar 2, 2010)

hola respecto a mi comentario anterior 
vi que la familia de pic 24f puede ser utilizado como host y descarge el microchip application libraries v2010-02-09
trae un ejemplo de como leer un *.txt de la memoria si quieren les paso el codigo para que lo vean y de paso me quiten algunas dudas


----------



## Moyano Jonathan (Mar 3, 2010)

Hola soulmen ! Si el ejemplo está en ASM para PIC24f ponelo pero si está en C30 por favor ponelo en un hilo aparte ...por que este tema es solo para USB en ASM.
Un saludo !


----------



## soulmen (Mar 3, 2010)

esta en c30 creo voy a buscar un hilo parecido gracias


----------



## jjfonsecaz (Mar 3, 2010)

Excelente aporte Moyano Jonathan.

Por alla del 2003 queria hacer una aplicacion con usb y pics, por desgracia muchas cosas se conjuntaron y jamas pude conseguir mi objetivo. Pero nunca es tarde y se agradece el aporte.
Ahora entendere las bases del USB.
Una pregunta que espero no sea adelantada por lo que se a descrito hasta el momento: por esas fechas que hice mi primer intento se requeria de hacer el driver para el S.O. por lo que tuve que conseguir el DDK de Microsoft, ¿es necesario o se puede omitir este paso? ya que la verdad nunca logre entender o conseguir un manual que me ayudara a usar este paquete.
Si alguien considera necesario, puedo hacer una ISO del mismo y subirlo, solo que me ayude ya que desconozco la forma de hacerlo.

Saludos


----------



## Moyano Jonathan (Mar 3, 2010)

No ahora todos los drivers están desarrollados para poder usar el USB del PIC. Además en este tutorial al principio por lo menos se usará protocolo HID por lo que no vas a necesitar drivers especiales.


----------



## Moyano Jonathan (Mar 4, 2010)

*EJEMPLO DE UN BUFFER DESCRIPTOR:





**ESTADO Y CONFIGURACIÓN DE LOS BD:*
Los Buffer descriptores no sólo definen el tamaño de un Buffer Endpoint, sino también determina su configuración y control. La mayor parte de la configuración se hace con el registro de estado del *BD*, *BDnSTAT*. Cada *BD* tiene su propio registro correspondientemente numerado *BDnSTAT*.
No como otros registros de control, la configuración de los bits del registro *BDnSTAT* depende del contexto. Hay dos configuraciones distintas, dependiendo de si el microcontrolador o el módulo del USB está modificando el BD y Buffer en un momento dado. Solamente se comparten tres definiciones de bit entre los dos.


----------



## Moyano Jonathan (Mar 6, 2010)

*Propiedades del Buffer:*
Los Buffers y su BDs los comparten la CPU y el módulo del USB, se utiliza un semáforo para distinguir el BD y los Buffers asociados en memoria que se permiten actualizar.
Esto se logra con el bit* UOWN (BDnSTAT<7>)*. *UOWN* es el único bit compartido entre las dos configuraciones BDnSTAT.
Cuando *UOWN* está borrado, la entrada de BD la dirige por el núcleo del microcontrolador. Cuando se activa el bit *UOWN*, la entrada del BD y la memoria del Buffer los controla por el periférico USB. El núcleo no debe modificar el BD o su Buffer correspondiente en este momento. Observar que el núcleo del microcontrolador puede leer *BDnSTAT* mientras que el SIE controla el Buffer y viceversa.
Los Buffer descriptores tienen varios significados dependiendo de la fuente de actualización del registro. Antes de poner en sus manos el periférico del USB, *el usuario puede configurar las operaciones básicas del periférico con los bits BDnSTAT*. Durante este tiempo, el byte de control de la cuenta y los registros de direccionamiento del Buffer también pueden fijarse.
Cuando se activa *UOWN*, el usuario puede depender de los valores escritos en los BDs. El SIE actualiza el BDs cuanto es necesario, sobrescribiendo los valores originales del BD. El registro BDnSTAT lo actualiza el SIE con el PID; la cuenta de la transferencia, BDnCNT, se actualiza también.
El byte BDnSTAT del BDT debe ser el último byte que se actualice al prepararse para armar un Endpoint. *El SIE borrará el bit UOWN cuando se termine una transacción*. La única excepción es cuando KEN y/o BSTALL están permitidos.
No existe ningún mecanismo por hardware para bloquear el acceso cuando se setea el bit UOWN. Así, puede ocurrir un comportamiento inesperado si el microcontrolador intenta modificar la memoria cuando el SIE lo posee.
Semejantemente, leyendo tal memoria se pueden obtener datos inexactos hasta que el periférico USB devuelve la propiedad al microcontrolador.

*Registro BDnSTAT (modo CPU):*
*Cuando UOWN=0*, el núcleo del microcontrolador posee BD. En este punto, los otros siete bits del registro toman las funciones de control.
El bit, *KEN (BDnSTAT<5>)*, determina si un BD permanece activo. Si se setea el bit, una vez que el bit UOWN esté activo, seguirá controlado el SIE independiente de la actividad del Endpoint. Esto previene a la FIFO USTAT de actualizarse, así como activar la interrupción de transacción completa para el Endpoint. Esta característica se debe permitir solamente cuando el puerto paralelo se selecciona como canal de entradasalida de datos en lugar de la RAM del USB.
El bit inhabilita el incremento de la dirección, *INCDIS (BDnSTAT<4>)*, que controla el direccionamiento automático por incremento del SIE. Activar INCDIS inhabilita el auto incremento de la dirección del Buffer por el SIE para cada byte transmitido o recibido. Esta característica sólo se tiene que utilizar con el puerto paralelo, donde cada byte de datos se procesa a/desde la misma posición de memoria.
El bit de permiso de la sincronización de palabras, *DTSEN (BDnSTAT<3>)*, se encarga de comprobar la paridad de los datos. Activar *DTSEN* permite la sincronización con el SIE. Cuando está permitido, comprueba la paridad del paquete de los datos contra el valor de *DTS (BDnSTAT<6>)*. Si un paquete llega con una sincronización incorrecta, los datos se ignoran. No se escriben en la RAM del USB y el flag de interrupción de transferencia completa del USB no se activará. Sin embargo, el SIE enviará un ACK al anfitrión para reconocer el recibo.
El bit del buffer de parada,* BSTALL (BDnSTAT<2>)*, proporciona ayuda en el control de las transferencias, generalmente una parada en el Endpoint 0. También proporciona ayuda con los comandos SET_FEATURE/CLEAR_FEATURE; típicamente, paradas continuas en cualquier Endpoint con excepción del Endpoint de control por defecto.
El bit BSTALL también permite las paradas del Buffer. Activar BSTALL hace que el SIE devuelva un STALL al anfitrión si el símbolo recibido utilizaría el BD en esa localización. Cuando se activa el bit EPSTALL en el registro de control correspondiente UEPn se genera una interrupción STALL cuando se manda la STALL al anfitrión. El bit UOWN activado y el BDs no se cambia a menos que se reciba un SETUP. En este caso, la condición de la STALL se borra y la propiedad del BD se devuelve al núcleo
del microcontrolador.
Los bits *BD9:BD8 (BDnSTAT<1:0>)* guardan los dos dígitos más significativos del byte de la cuenta del SIE; los 8 dígitos más bajos se almacenan en el registro correspondiente BDnCNT.


----------



## mecatrodatos (Mar 6, 2010)

Amigo excelente informacion, un gran aporte y muy interesante


----------



## elemos13 (Mar 7, 2010)

oye amigo moyano estoy tratando de simular en proteus los distintos codigos que estoy generando pero sin tener exito mi pregunta es ¿se puede simular o no el puerto usb del micro 18f4550? y la otra es cuando configuras los BD`s es nesesario todos o solo uno de ellos. Espero no incomodar pero sera de gran ayuda por que el codigo si se simula en MPlab que es el que ocupo para este tipo de programacion, pero quiero ver si es factible hacerlo en el proteus dado que eso de estar grabando y borrando el micro muy seguido se me hace muy trbajoso y ademas para cuidar la integridad del micro por no dañarlo por tantas veces que lo e grabado.

SALUDOS


----------



## COSMICO (Mar 8, 2010)

Hola Moyano.
Esta parte del usb en asm, tambien esta interesante
y en el lenguaje que siempre manejo...claro que ahy vamos tambien con ccs
Gracias por este nuevo y gran aporte.


----------



## Moyano Jonathan (Mar 9, 2010)

http://pe.ece.olin.edu/ece/projects.html
http://www.moty22.co.uk/usbadc/usb_adc.php
http://www.florian-leitner.de/index.php/2007/08/03/hid-usb-driver-library/


----------



## Moyano Jonathan (Mar 11, 2010)

*EFECTO DEL BIT DTSEN EN LA RECEPCIÓN DE PAQUETES PARES/IMPARES (DATA0/DATA1):*




*BDnSTAT: REGISTRO DEL ESTADO DEL BUFFER DESCRIPTOR n (BD0STAT HASTA BD63STAT), MODO CPU (LOS DATOS SE ESCRIBEN AL LADO):




**BIT 7 UOWN:* Bit de posesión del USB(1)
                          0 = El núcleo del microcontrolador posee el BD y su Buffer correspondiente.
*BIT 6 DTS:* Bit de sincronización de los datos(2)
                          1 = Paquete de datos 1.
                          0 = Paquete de datos 0.
*BIT 5 KEN:* Bit de permiso de la subsistencia de BD.
                          1 = USB guardará el BD indefinidamente una vez que UOWN se active
                                (requerido en la configuración de los Endpoint del SPP).
                          0 = USB guardará el último símbolo procesado.
*BIT 4 INCDIS:* Bit de inhabilitación del incremento de la dirección
                          1 = El incremento de la dirección inhabilitado (requerido en la configuración de los  
                          Endpoint del SPP).
                          0 = Incremento de la dirección permitido.
*BIT 3 DTSEN:* Bit de permiso de la sincronización.
                          1 = Sincronización de los datos permitida; los paquetes de los datos con valor  
                          incorrecto de la sinc. se ignoran excepto un SETUP, que se acepta.
                          0 = ninguna sincronización de los datos.
*BIT 2 BSTALL:* Bit de permiso de paradas en el Buffer.
                          1 = Parada del Buffer permitida; el protocolo de la STALL publica si se recibe un 
                          símbolo que utilizaría el BD en la localización dada (UOWN se activa, el resto sin 
                          cambios).
                          0 = parada del Buffer inhabilitado.
*BIT 1-0 BC9:BC8:* Bits del byte de cuenta 9 y 8.
                             Los bits de cuenta del byte representan el número de bytes que se transmitirán 
                             con un símbolo IN o recibidos durante un símbolo OUT. Junto con BC<7:0>, las  
                             cuentas de byte válidas son 0-1023.
*Nota 1:*Este bit debe inicializarlo el usuario con el valor deseado antes de permitir el módulo USB.
*Nota 2:*Se ignora este bit a menos que DTSEN = 1.

*Registros BDnSTAT (modo SIE):*
Cuando los BDs y su Buffer los gobierna el SIE, la mayoría de los bits de BDnSTAT toman distintos significados. Al activarse UOWN, cualquier dato o ajuste de control escritos por el usuario se sobrescriben con datos del SIE.
El registro BDnSTAT lo actualiza el SIE con el identificador del paquete (PID) se almacena en BDnSTAT<5:3>. Se actualiza la cuenta de la transferencia en el registro BDnCNT correspondiente. Los valores que desbordan el registro de 8 bits se transportan a los dos dígitos más significativos de la cuenta, almacenados en BDnSTAT<1:0>.
*
BDnSTAT: REGISTRO DE ESTADO DEL BUFFER DESCRIPTOR n (BD0STAT A BD63STAT), MODO SIE (DATOS DEVUELTOS POR EL LADO DEL MICROCONTROLADOR):





**BIT 7 UOWN:* Bit de posesión del USB.
                      1= El SIE gobierna el BD y el buffer correspondiente.
*BIT 5-2 PID3ID0:* Bits identificadores del paquete. El valor recibido del símbolo PID de la  
                                      última transferencia (sólo IN, OUT o SETUP).
*BIT 1-0 BC9:BC8:* Bits del byte de cuenta 9 y 8.
                             Esto bits los actualiza el SIE para reflejar al número de bytes recibidos en una  
                             transferencia OUT y el número de bytes transmitidos en una IN.
*
BYTE DE CUENTA DE BD:*
El byte de cuenta representa el número total de bytes que se transmitirán durante una IN. Después de la transferencia IN, el SIE devolverá el número de bytes enviados al anfitrión.
Para una transferencia OUT, el byte de cuenta representa número máximo de los bytes que se pueden recibir y almacenar en la RAM del USB. Después de una transferencia OUT, el SIE devolverá el número real de bytes recibidos. Si este número excede el byte de cuenta correspondiente, el paquete de datos se rechazará y se generará un protocolo de intercambio NAK. Cuando sucede esto, el byte de cuenta no se actualiza.
El byte de cuenta de 10 bits se distribuye sobre dos registros. Los 8 bits más bajos de la cuenta residen en el registro BDnCNT. Los dos altos en BDnSTAT<1:0>. Esto representa una gama válida para el byte de 0 a 1023.

*VALIDACIÓN DE LA DIRECCIÓN DE BD:*

El par de registros de dirección de BD contiene la dirección de comienzo de la RAM para el Buffer del Endpoint correspondiente. Para que una localización que comienza en el Endpoint sea válida, debe estar en la gama de la RAM del USB, 400h a 7FFh. No hay ningún mecanismo por hardware para comprobar la dirección del BD.
Si el valor de la dirección de BD no señala a una dirección de la RAM del USB, o si señala a una dirección dentro del Buffer de otro Endpoint, es probable que se pierdan los datos o que se sobrescriban. Semejantemente, solapando un Buffer de recepción (Endpoint de salida) con una localización de BD en uso se obtienen resultados inesperados. Cuando se desarrollan aplicaciones USB, el usuario puede incluir software para validar las direcciones en el código.

*
BUFFERING PING-PONG:*
Un Endpoint se define para tener un Buffer ping-pong cuando tiene dos sistemas de entradas de BD: un sistema para una transferencia par y otro para una transferencia impar. Esto permite a la CPU procesar un BD mientras que el SIE procesa el otro BD.
El doble buffering BD, permite un rendimiento de procesamiento máximo del/al USB.
El módulo USB apoya cuatro modos de operación:
• Ninguna ayuda del ping-pong
• Ayuda del Buffer del ping-pong del OUT Endpoint 0 solamente
• Ayuda del Buffer del ping-pong para todas los Endpoints
• Ayuda del Buffer del ping-pong para el resto de los Endpoints excepto el 0
Los ajustes del Buffer ping-pong se configuran con los bits PPB1PB0 en el registro UCFG.
El módulo USB no pierde de vista el puntero ping-pong de cada Endpoint.
Todos los punteros están reseteados inicialmente al BD par cuando se activa el módulo.
Al terminar una transacción (SIE borra UOWN), el puntero se une al BD impar. Al terminar la transacción siguiente, el puntero se une de nuevo al BD par y así sucesivamente.
El estado par/impar de la transacción realizada se almacena en el bit PBI del registro USTAT. El usuario puede resetear todos los punteros ping-pong al par con el bit PPBRST.
Cada BD tiene una relación fija con un Endpoint particular, dependiendo de la configuración del buffering. Esta relación significa también que pueden aparecer vacíos en las BDT si los Endpoints no se activan contiguamente. Esto significa en teoría, que los BDs de los Endpoints desactivados podían utilizarse como espacio de Buffer. En la práctica, los usuarios deben evitar usar tales espacios en el BDT a menos que el método de validar direcciones de BD esté en ejecución.

*TABLAS DEL BUFFER DESCIPTOR MAPEADAS PARA LOS MODOS DE LOS BUFFER:






**ASIGNACIÓN DE LOS BUFFERS DESCRIPTORES A LOS DIFERENTES MODOS DE BUFFERING:





*


----------



## Moyano Jonathan (Mar 15, 2010)

*SUMARIO DE LOS REGISTROS DE LOS BDT DEL USB:




**Nota 1:* En los registros de los BD, la n es un valor de 0 a 63. Los 64 registros son semejantes. Todos tienen valores indeterminados en los reset.
*Nota 2:* Del bit 5 al 2 del BDnSTAT lo utiliza el SIE para devolver los valores PID3ID0 una vez el registro haya cambiado al SIE (Activar el bit UOWN). *Cuando los registros estén bajo el control del SIE, los valores de KEN, DTSEN, INCDIS y BSTALL no tienen validez*.
*Nota 3:* Antes de activar el bit UOWN, los bits 5 al 2 del BDnSTAT configuran KEN, DTSEN, INCDIS y BSTALL.
*Nota 4:* Se ignora este bit a menos que DTSEN=1.

*INTERRUPCIONES DEL USB:*
El módulo USB puede generar condiciones de interrupción múltiples. Para acomodar todas estas fuentes de interrupción, el módulo proporciona su propia lógica de estructura de interrupción, similar a la del microcontrolador. Las interrupciones del USB se activan con un sistema de registros de control y registradas con un sistema separado de flags. Todas las fuentes se concentran en una sola petición de interrupción del USB, *USBIF (PIR2<5>).*
Hay dos capas de registros de interrupción en el módulo USB. *El nivel superior consiste en todas las interrupciones de estado del USB*; éstos se permiten y se señalan por medio de un flag en los registros *UIE y UIR*, respectivamente. *El segundo nivel consiste en las condiciones de error del USB*, se permiten y señalan por medio de un flag en los *registros UEIR y UEIE.* Ninguna condición de interrupción en estos provoca la activación del flag de interrupción por error del USB (UERRIF) en el nivel superior.
Las interrupciones se pueden utilizar para detectar acontecimientos rutinarios en una transacción USB.

*LÓGICA DE LA INTERRUPCIÓN DEL USB:




**EJEMPLO DE LOS EVENTOS TRANSACCIÓN E INTERRUPCIÓN:




**Nota 1:* La transferencia de control mostrada es sólo un ejemplo que muestra los eventos que ocurren en cada transacción. El control típico de la transferencia se puede extender a varios frames.
*REGISTRO DE ESTADO DE LAS INTERRUPCIONES DEL USB (UIR):*
El registro de estado de las interrupciones del USB contiene los flags para el estado de cada fuente de interrupción. Cada una de estas interrupciones tiene un bit de permiso en el registro UIE correspondiente. Todos los flags de estado del USB se suman para generar el flag de interrupción USBIF para el túnel de interrupción del micro.
*Una vez que el SIE active un bit de interrupción, se tiene que borrar por software escribiendo un ‘0’.* Los flags se pueden activar por software para ayudar en la búsqueda de errores del firmware.




*BIT 7:* No implementado, se lee como "0"

*BIT 6 SOFIF:* Bit de interrupción del símbolo START-OF-FRAME.
1= START-OF-FRAME recibido por el SIE.
0= Ningún START-OF-FRAME recibido por el SIE.

*BIT 5 STALLIF:* Bit de interrupción del protocolo de STALL.
1= Protocolo de STALL enviado por el SIE.
0= Protocolo de intercambio STALL no se ha enviado.

*BIT 4 IDLEIF:* Bit de interrupción detector de reposo(1).
1= Reposo detectado (estado de reposo de 3ms o más).
0= Ninguna condición de reposo detectada.

*BIT 3 TRNIF:* Bit de interrupción de transacción completa(2).
1= Transacción pendiente completa; leer el registro USTAT para información del Endpoint.
0= Transacción pendiente no completada o no hay.

*BIT 2 ACTVIF:* Bit de interrupción de detección de la actividad del bus(3).
1= Actividad detectada en las líneas D+/D-.
0= Ninguna actividad detectada en las líneas D+/DBIT.

*BIT 1 UERRIF:* Bit de interrupción de la condición de error del USB(4).
1= Ha ocurrido una condición de error desenmascarada.
0= No ha ocurrido ninguna condición de error.

*BIT 0 URSTIF:* Bit de interrupción de reset del USB.
1= Ha ocurrido un reset en el USB, 00h se carga en el registro UADDR.
0= No ha ocurrido ningún reset del USB.

*Nota 1:* Una vez que se detecte un estado de reposo, el usuario puede colocar al módulo USB en este modo.
*Nota 2:* Borrar este bit hará avanzar la USTAT FIFO (válido solamente con los símbolos IN, OUT y SETUP).
*Nota 3:* Este bit es desenmascarado al detectar un acontecimiento de interrupción UIDLE.
*Nota 4:* Solamente las condiciones de error permitidas a través del registro UEIE activarán este bit. Este bit es bit de estado y no lo puede modificar el usuario.

*Bit de interrupción de detección de la actividad del bus (ACTVIF):*
El bit ACTVIF no se puede ser borrar inmediatamente después de despertar al módulo USB del modo reposo o cuando se suspende. Se necesita un retraso para sincronizar el estado interno del hardware antes de que el bit ACTVIF pueda borrarse por firmware. Borrar el bit ACTVIF antes de sincronizar el hardware puede que no cause efecto. Además, si el módulo USB utiliza una fuente de reloj de 96MHz PLL,después se borra el bit SUSPND, el módulo del USB puede ser operacional inmediatamente mientras que espera los 96MHz PLL.

*BORRADO DEL BIT ACTVIF (UIR<2>):*

*Ensamblador:*
BCF UCON, SUSPND
LOOP:
       BTFSS UIR, ACTVIF
       BRA DONE
       BCF UIR, ACTVIF
       BRA LOOP
DONE:

*REGISTRO DE PERMISO DE LAS INTERRUPCIONES (UIE):*
El registro de permiso de la interrupción del USB contiene los bits de permiso del estado de las fuentes de interrupción USB. No fijar ninguno de estos bits permitirá la interrupción elegida en el registro UIR.
Los valores en este registro afectan solamente la propagación de una condición de interrupción a la lógica de interrupción del microcontrolador. Los flags todavía están activados por su condición de interrupción, permite que sean interrogados y se mantienen sin realmente la interrupción.


----------



## diego_z (Mar 18, 2010)

muy bien yona , te cuento que encontre unos programas para usb pero tienen mescla con c y deje de entenderlos , con este post pienso que voy a aclarar mis dudas que son un monton , metele plomo nomas


----------



## Moyano Jonathan (Mar 18, 2010)

lo que voy a hacer acá es puro ASM...para que todos veamos el funcionamiento desde 0 de lo que es el USB en esta línea de PIC. Pero aún falta para terminar la teoría y después de a poco hay que ir entendiendo las diferentes funciones de control para finalizar con la escritura de una librería macro que podamos usar todos en nuestros proyectos.


----------



## foso (Mar 23, 2010)

Ya que vamos a lo básico en programación del firmware (assembler) también estaría bueno poner el algoritmo del host en forma general en vez de usar lenguaje de Visual Basic. Si bien es un lenguaje fácil hay gente que le gustaría utilizar otro. Como C o C# , etc.


----------



## jjfonsecaz (Mar 23, 2010)

Apoyo la sugerencia del compañero foso. Y me pongo como voluntario para ir construyendo una interface con C. Mas sin embargo surge el problema del driver, si alguien tiene algo de info ojala y nos pueda apoyar.

Saludos.


----------



## Moyano Jonathan (Mar 24, 2010)

también voy a poner eso...aunque tengo que estudiar más el programa por parte del host..


----------



## Diego T (Mar 31, 2010)

Hola Gente.
Moyano sos un capo, les comento que logre sacarle todas las macros a un ej quedo 100% asm, aunque a algunas rutinas todavía no las entiendo bien.
Si les interesa se los paso, tambien tengo codigo en VB6 para el host


----------



## Moyano Jonathan (Abr 1, 2010)

yo estoy en lo mismo ...toda la semana pasada y la anterior a esa me quedé sin PC por que se me rompio. Ahora desde la semana que viene sigo con el tema que se me quedó medio dormido. Estaría bueno diego que pusieras lo que has podido sacar en limpio.


----------



## Diego T (Abr 2, 2010)

Bueno les comento a este proyecto no solo le saque las macros, también le desactive las entradas analógicas que usaba en el original, quedo como un eco le envías un dato, setea la salida PWM (portc 2 poner un led) y te lo devuelve
También les dejo el soft original que tiene el circuito y el código fuente para el host


----------



## Moyano Jonathan (Abr 2, 2010)

exelente proyecto ...lo vi y está muy completo...en cuanto termine con la teoría nos ponemos de cabeza a desarrollar nuestra propia librería USB.


----------



## Meta (Abr 6, 2010)

Van tomando forma. Felicidades. ¿Habrá manuales?


----------



## Moyano Jonathan (Abr 6, 2010)

lo de asm formara parte del manual de USB como complemento a la programación en C..


----------



## Moyano Jonathan (Abr 9, 2010)

*BIT 7          :* No implementado , se lee como '0'.

*BIT 6 SOFIE:* Bit de permiso de la interrupción del START-OF-FRAME.
   1 = interrupción permitida 
   0 = interrupción inhabilitada 
*BIT 5 STALLIE:* Bit de permiso de la interrupción del protocolo STALL.
   1 = interrupción permitida 
   0 = interrupción inhabilitada 
*BIT 4 IDLEIE:* Bit de permiso de la interrupción de reposo.
   1 = interrupción permitida 
   0 = interrupción inhabilitada 
*BIT 3 TRNIE*: Bit de permiso de la interrupción de transacción completa. 
   1 = interrupción permitida 
   0 = interrupción inhabilitada 
*BIT 2 ACTVIE:* Bit de permiso de la interrupción de detección de la actividad del bus.
   1 = interrupción permitida 
   0 = interrupción inhabilitada 
*BIT 1 UERRIE:* Bit de permiso de la interrupción de error del USB. 
   1 = interrupción permitida 
   0 = interrupción inhabilitada 
*BIT 0 URSTIE:* Bit de permiso de la interrupción del reset del USB. 
   1 = interrupción permitida 
   0 = interrupción inhabilitada 

*REGISTRO DE ESTADO  DE LAS INTERRUPCIONES POR ERROR DEL USB (UEIR):*
El registro de estado de las interrupciones de error del USB contiene los flags para cada fuente de error del periférico USB. Cada una de estas fuentes se controla con el bit de permiso de interrupción correspondiente del registro UEIE. Todas los flags de error de USB se suman para generar el flag de interrupción de error del USB (UERRIF) en el nivel superior de la lógica de interrupción. 
Cada bit de error se activa cuando se detecta la condición de interrupción. Así, la interrupción normalmente no corresponde con el final de un símbolo que se acaba de procesar. 
Una vez que un bit de interrupción haya activado el SIE, tiene que borrarse por software escribiendo un ‘0’.






*BIT 7 BTSEF:* Flag de error del bit mercancía. 
   1= Error detectado. 
   0= No se ha detectado error. 
*BIT 4 BTOEF:* Flag de error de espera en el procesamiento del bus. 
   1= error detectado (han llegado más de 16bits de reposo antes de un EOP). 
   0= error no detectado.
*BIT 3 DFN8EF:* Flag de error del tamaño de los datos. 
   1= error detectado (no era un número entero de bytes). 
   0= error no detectado. 
*BIT 2 CRC16EF:* Flag de fallo CRC16 
   1= error detectado. 
   0= error no detectado. 
*BIT 1 CRC5EF:* Flag de error del anfitrión CRC5. 
   1= error detectado (paquete simbólico rechazado).
   0= error no detectado. 
*BIT 0 PIDEF:* Flag de prueba de fallo de PID. 
   1= error detectado. 
   0= error no detectado. 

*REGISTRO DE PERMISO  DE LAS INTERRUPCIONES DE ERROR (UEIE): *

El registro de permiso de las interrupciones de error (UEIE) contiene los bits de activación para cada fuente de interrupción de error del USB. Activando cualquiera de estos bits se activa la fuente de la interrupción respectiva. Como el registro UIE, los bits activos sólo afectan la propagación de la 
condición de la interrupción. Los flags se activan cuando se cumplen sus condiciones. 





*BIT 7 BTSEF:* Bit de permiso de interrupción del error del bit mercancía. 
   1= Interrupción permitida. 
   0= Interrupción no permitida. 
*BIT 4 BTOEF:* Bit de permiso de interrupción del error de espera en el procesamiento del bus. 
   1= Interrupción permitida. 
   0= Interrupción no permitida. 
*BIT 3 DFN8EF:* Bit de permiso de interrupción del error del tamaño de los datos. 
   1= Interrupción permitida. 
   0= Interrupción no permitida. 
*BIT 2 CRC16EF:* Bit de permiso de interrupción del fallo CRC16. 
   1= Interrupción permitida. 
   0= Interrupción no permitida. 
*BIT 1 CRC5EF:* Bit de permiso de interrupción del error del anfitrión CRC5. 
   1= Interrupción permitida. 
   0= Interrupción no permitida. 
*BIT 0 PIDEF:* Bit de permiso de interrupción del prueba de fallo de PID. 
   1= Interrupción permitida. 
   0= Interrupción no permitida.


----------



## Moyano Jonathan (Abr 15, 2010)

*MODOS DE ENERGÍA DEL USB:*
Las aplicaciones USB tendrán diferentes  requisitos y configuración de energía.
Los casos más comunes son los presentados aquí.
*SÓLO ENERGÍA EN EL BUS:




*En modo de sólo energía en el bus. Es el método más simple de energía para el dispositivo.
*SÓLO SELF-POWER:




*En modo sólo SELF-POWER, el uso del USB proporciona su propia energía, con la energía muy pequeña cedida por el USB. Observar que indica cuando el USB ha estado conectado.
*ENERGÍA DUAL CON DOMINANCIA SELF-POWER:




*Algunas aplicaciones necesitan una opción con dos energías. La aplicación utiliza la fuente de energía
interna como primaria, pero cambia a la energía del USB cuando no se dispone de una fuente lineal.

*Nota:* Los usuarios deben tener presente los límites de energía del USB. Según
la especificación del USB 2.0, no puede exceder 100mA en un dispositivo de baja
potencia ó 500mA en uno de alta.

*STREAMING PARALLEL PORT (SPP):*
El puerto paralelo (SPP) es una ruta alternativa de los datos además de la RAM del USB. Usando el SPP, un Endpoint se puede configurar para enviar o para recibir datos directamente del hardware externo.
Este método presenta posibilidades de diseño donde el microcontrolador actúa como encargado de los datos, permitiendo al SPP pasar bloques grandes de datos sin que el micro regule lo que procesa realmente. Un ejemplo de aplicación puede incluir un sistema de adquisición de datos, donde los datos fluyen de una FIFO externa a través del USB al ordenador. En este caso, el control del Endpoint lo realiza el microcontrolador y los movimientos de datos en bruto se procesan externamente.
El SPP se permite como puerto de un Endpoint del USB a través del BD asociado al Endpoint. El Endpoint tiene que activarse de la siguiente manera:
1. Activar BDnADRL:BDnADRH direccionado a FFFFh.
2. Activar KEN (BDnSTAT<5>) par que el SIE controle el Buffer.
3. Activar INCDIS (BDnSTAT<4>) para inhabilitar el incremento de dirección automático.

*Nota 1:* Si un Endpoint se configura para utilizar el SPP, el módulo SPP debe configurarse para utilizar el módulo USB. Si no, puede ocurrir una operación inesperada.
*Nota 2:* Además, si un Endpoint se configura para utilizar el SPP, el tipo de transferencia de datos de ese Endpoint debe ser síncrona.

*OSCILADOR:*
El módulo USB necesita una señal específica de reloj. En operaciones fullspeed, el reloj tiene que ser de 48MHz. El microcontrolador y los periféricos no tienen porque tener la misma frecuencia de reloj o la misma fuente.
*REGISTROS ASOCIADOS A LAS OPERACIONES DEL MÓDULO USB:




**Leyenda:* = las localizaciones no están implementadas. Las celdas sombreadas
no se utilizan con el módulo USB.
*Nota 1:* Esta tabla incluye solamente las localizaciones SFRs mapeadas en el banco 15 de la memoria de datos. Los registros de los BD, que están mapeados en el banco 4 y no son SFRs verdaderos, están en la tabla 17-5.

*DESCRIPCIÓN DEL USB:*
Esta sección presenta algunos conceptos básicos del USB e información útil necesaria para diseñar un dispositivo USB. Así, se anima al lector que refiera a las especificaciones del USB para más información (www.usb.org). Si estás muy al corriente de los detalles de USB, entonces ésta sección sirve como recuerdo básico, de alto nivel del USB.

*ESQUEMA DE CAPAS:*
La funcionalidad del dispositivo del USB se estructura en un esquema de capas.
Cada nivel se asocia a un nivel funcional dentro del dispositivo. La capa más alta, con excepción del dispositivo, es la de configuración. Un dispositivo puede tener configuraciones múltiples. Por ejemplo, un dispositivo particular puede tener requisitos de energía múltiples basados en Self-Power o modos de energía sólo del bus.
Para cada configuración, puede haber múltiple interfaces. Cada interfaz podía apoyar un modo particular de esa configuración.
Debajo del interfaz están los Endpoints. Los datos se mueven directamente a este nivel. Puede haber 16 Endpoints bidireccionales. El Endpoint 0 es siempre el Endpoint de control por defecto; cuando el dispositivo está en el bus, el Endpoint 0 debe estar disponible para configurarlo.


----------



## FRYCK (May 6, 2010)

Muy  bueno  tu proyecto moyano   sigue adelante


----------



## Moyano Jonathan (May 7, 2010)

Está medio parado pero dentro de poco sigo..


----------



## juanma2468 (May 21, 2010)

Moyano Jonathan la data que estas dando es muy pero muy valiosa para muchas de las personas que se interesan por manejar cosas por USB.
Actualmente estoy con la idea de desarrollar un circuito capas de extrer fotos de una webcam con PIC para utilizarla como camara de video sin tener que depender de una PC, y enviar la imagen a un TV o monitor.
Gracias a tu informacion voy a poder entender y comprender el funcionamiento del modulo USB que utiliza el PIC, y con el poder manejar la camara.
Si te intreza el proyecto podriamos desarrollarlo juntos y aprender del mismo.
Desde ya muchas gracias por tu aporte tan valioso para la comunidad.


----------



## misterlee (May 21, 2010)

Disculpa la pregunta pero me podrias explicar de manera sencilla como esta eso del pic 18fxxx y el puerto USB yo he trabajado solo con el pic 16f84 y 16f628 y 12f508 pero me gustaria saber que es eso del USB y que podria hacer con el , se que es una pregunta chafa pero me interesaria saber que es eso, gracias , buen dia


----------



## unmonje (Dic 13, 2010)

Moyano Jonathan dijo:


> Hola soulmen ! Si el ejemplo está en ASM para PIC24f ponelo pero si está en C30 por favor ponelo en un hilo aparte ...por que este tema es solo para USB en ASM.
> Un saludo !




Hola Moyano....a pesar de que este hilo tiene mas de 6 meses de inactividad,he leido largamente 
los tòpicos buscando mi pregunta al asunto que es la siguiente y pido disculpa si se me paso por alto.
Para mi todo el tema PIC es claro ,incluso en USB,por tanto esperaba de tu parte que hablaras de  lo que para mi es de lo mas importante y que me impedia hacer algun desarrollo en USB y es el siguiente :
Todo muy lindo respecto de la PIC y su puerto USB....el tema es cuando lo quieres conectar a ALGO...del otro lado.
Uno supone que la aplicacion mas directa y lògica es ...una PC.
Ahi aparece el TEMA...DRIVERs , junto con Libreria para sist. Operativos ,derechos intelectuales y -know how-, acceder a -info-  de estructuras y compatibilidad en protocolos ,mas las herramientas de implementaciòn ,casi todas con derecho de copia....
Me perdì de algo ? Esa parte ya la tienes solucionada ?
Quiero decir ,para hacerlo fàcil...enchufas tu -aparatito-  en una con XP y....?
Donde està la -info- pùblica , del protocolo de atenciòn ?
La estructura del bloque de datos ?
Que libreria del sist operativo -atiende- los puertos ?
Como indusco al sist.operativo a que dispare  -mi programa residente- que -atiende- la aplicaciòn de mi interfaz USB,cualquiera que esta fuese ? (supongamos,enviar datos de un voltimetro )
El sistema operatico XP ademas, ante una conexiòn de este tipo ,pide el codigo VENDOR,referente al fabricante de la electronica y software asociado para darle curso.
Esa parte , hay que PIRATEARLA para que sea posible , segun entiendo.
si respondes continuo....


....un saludo.


----------



## Moyano Jonathan (Dic 13, 2010)

Este tema lo he dejado de lado para cuando tenga mas tiempo para encararlo por que el estudio que hay que hacer es intensivo....ya tengo la info pero está todo en inglés y tengo que pedir algunos permisos de sus autores..por que parte la he extraido de trabajos ajenos...lo que he podido realizar yo es el control de dispositivos USB pero trabajando en C


----------



## Meta (Dic 13, 2010)

juanma2468 dijo:


> Moyano Jonathan la data que estas dando es muy pero muy valiosa para muchas de las personas que se interesan por manejar cosas por USB.
> Actualmente estoy con la idea de desarrollar un circuito capas de extrer fotos de una webcam con PIC para utilizarla como camara de video sin tener que depender de una PC, y enviar la imagen a un TV o monitor.
> Gracias a tu informacion voy a poder entender y comprender el funcionamiento del modulo USB que utiliza el PIC, y con el poder manejar la camara.
> Si te intreza el proyecto podriamos desarrollarlo juntos y aprender del mismo.
> Desde ya muchas gracias por tu aporte tan valioso para la comunidad.



Tratamiento de sonudo están los dsPIC. Para tratamiento e Audio/Vídeo se usa los PIC32.


----------



## ByAxel (Dic 13, 2010)

Los PIC18 con USB no pueden trabajar como host, por lo tanto no se le pueden conectar otros dispositivos como memorias usb, cámaras usb, etc. Para eso se necesita de los PIC32 o superiores.
Solo eso...

chauuu y éxitos...


----------



## unmonje (Dic 13, 2010)

ByAxel dijo:


> Los PIC18 con USB no pueden trabajar como host, por lo tanto no se le pueden conectar otros dispositivos como memorias usb, cámaras usb, etc. Para eso se necesita de los PIC32 o superiores.
> Solo eso...
> 
> chauuu y éxitos...



No se a quien respondias , pero si era a mi, te digo que es claro que estas PICs, no funcionan como HOST , sino como clientes de una hipotètica red.
Puedo conectar a esta RED de un MICRO  de 32 bits., pero a menudo la comunicacion se justifica como comunicante a distancia  de los elementos y en USB, el cable no supera los 3 metros.
Asi que nos queda solo la posibilidad de transferencia a -otro - entorno de dichos -datos-.
Es dificil pensar que la info dentro del micro 32 bit, pueda ser muy ùtil, ya que lo que la potencia, es la posibilidad de transferir a la -NUBE- mundial de datos a traves de protocolos unversales con derecho a copia casi todos ellos.
Tal vez la soluciòn sea....LINUX,que es un remedo invertido del sistema UNIX de los unversitarios Yankees!!!
..y    ahi ...me prendo !!!! Saludos.


----------



## Meta (Dic 13, 2010)

Si es para transferencias de un punto a otro, mejor redes o RF.


----------



## gaston547 (Dic 27, 2010)

Gente,estoy siguiendo el hilo de este tutorial,ya que necesito comunicar un pic por usb con un pc.
El proyecto es enviar un valor de voltaje que se ha capturado en el conversor ad y un nombre asociado,por ejemplo "voltaje1" "6".
La limitacion mas grande que tengo es que no entiendo ni j de lenguaje C y solo se hacer el firmware en ASM.
Alguien podria aportarme algo mas en el hilo del tutorial como para poder empezar con algo en la practica?.
He estado googleando y no hay practicamente nada para asm.


----------



## Moyano Jonathan (Dic 27, 2010)

Es que el problema está en que hay que desarrollar prácticamente desde o, hay algunos ejemplos en la red en asm para comunicar el PIC mediante HID...pero entenderlos es un muy complejo si no sabes como funciona estructuralmente el USB.


----------



## leviatan systems (Dic 29, 2010)

he hecho varios proyectos con el ftdi y me comunico con la computadora por medio de este que es por usb, no se si les sirva de algo, en ese caso se como hacerlo y es muy sencillo


----------



## unmonje (Dic 29, 2010)

leviatan systems dijo:


> he hecho varios proyectos con el ftdi y me comunico con la computadora por medio de este que es por usb, no se si les sirva de algo, en ese caso se como hacerlo y es muy sencillo




Podrias ser mas especifico ?
el FTDI....es un producto hecho por terceros ?


----------



## J2C (Dic 29, 2010)

Unmonje

Se debe referir al FT232BM que convierte USB en RS232. Totalmente fuera de lo que es este thread.

Saludos, JuanKa.-


----------



## Moyano Jonathan (Dic 29, 2010)

Ya tengo algo de documentación como para empezar, espero poder seguir pronto. En este momento me estoy yendo de vacaciones y no voy a tener mi pc a mano...espero poder seguir aportando al hilo que se va a poner interesante...pero tengan paciencia todo lo que respecta al USB en si...es muy complicado y largo de entender ..por eso no he tenido tiempo de ponerme al 100%


----------



## leviatan systems (Dic 29, 2010)

yo utilizo este: http://www.sparkfun.com/products/718
va conectado a los pines segun sea el pic que utilize, en este caso para el P18F2550 se ocuparian el pin 17 y 18 unicamente ademas de poner la referencia del GND y ya el dato que llega al pic se guarda en el bufer y lo leemos como un registro y para mandar datos por el bufer de salida y listo, en mexico esta a $250.00mx si es un proyecto simple ps si resulta caro pero para un proyecto robusto conviene el gasto ademas de tener mas pines libres para explotar mas al uControlador


----------



## Moyano Jonathan (Dic 30, 2010)

Lo que desarrolla este hilo es el protocolo USB en su nivel más bajo usando ASM con el PIC18F2550. En caso de querer desarrollar otra tecnología por favor abran un hilo nuevo.}
Saludos.


----------



## proteus7 (Ene 9, 2011)

que onda moyano he visto tu manual que es de 77 paginas

mi pregunta es:  la lo terminaste o todavia sigue en proceso

porque el manual que tego que es de tu autoria se queda en :

Aquí comienza la explicación de las funciones de la librería USB.C
  hasta ahi te quedaste?
de antemano gracias por tu respuesta


----------



## Moyano Jonathan (Ene 9, 2011)

El manual está en proceso de revisión ya que hay muchas cosas relevantes en cuanto a la estructura de funcionamiento del USB del PIC18F2550. Debido a esto no salieron más actualizaciones.
Si quieres ver más con respecto al USB , pasa a mirar las últimas páginas de : https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/


----------



## nitai (Ene 9, 2011)

Hola Moyano Jonathan, se agradece enormemente tu aporte. Como no tengo grandes conocimientos en USB, y no se si corresponde tratarlo en este hilo, no puedo encontrar informacion de como programar el USB de la PC en leguage C comun para comunicarla con el USB del PIC, siempre tome los datos del puerto serie a traves de la funcione de C inport(obviamente programando antes el UART, por ejemplo cuando queria comunicarlo con el PIC16F877), pero en USB estoy perdido. En este hilo mas adelante trataras el tema.
Muy bueno y gracias nuevamente.


----------



## Moyano Jonathan (Ene 10, 2011)

Hola nitai, como estás. En este hilo no se trata esa temática, vas a tener que dirijirte hacia el hilo : https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/


----------



## nitai (Ene 10, 2011)

Muchisimas gracias Jonathan. suerte.


----------



## jorge andrada (Ene 14, 2011)

hola yo quiero aprender a programar el pic con usb en assembler, no me gusta C por algun motivo que no se cual no lo puedo asimilar al lenguaje C y lo odio, no se porque.
en cambio al assembler le tengo afecto, jeej
esto mismo me llevo a aprender microcontroladores freescale de motorola, que los programo en assembler porque yo antes pensaba que a pic solo lo programabas en C.
al ver esto me alegro y quisiera aprenderlo al pic en assembler y en especial a manejar el puerto usb que estoy necesitando.    desde ya muchas gracias.... y saludos a todos.


----------



## Moyano Jonathan (Ene 14, 2011)

En eso estoy , te digo que el ASM es mucho más complejo que el C , pero estará la explicación de ASM para USB así como el manual correspondiente.


----------



## andres53016 (Mar 9, 2011)

Felicitaciones Moyano muy buen aporte, yo estoy interesado tambien en programar en assembler este pic, la parte de interfaz en la pc por si quieren hacer un proyecto, yo tengo pensada hacerla en python, pero solo bajo linux por que no voy a pagar la licencia de los otros SO


----------



## Cesiir (Mar 13, 2011)

hola, necesito ayuda pero no se dónde acudir, entrego mi proyecto esta semana. Consta de un radar de velocidad, un radar de tramo, son 2 barreras infrarrojas que activan y paran un contandor de tiempo. pues resulta que cuando efectuo esas operaciones y calculo el tiempo, algunas veces funciona perfectamente el programa y lo muestro por el LCD. el problema es que reseteo con el clear, o aago la fuente de alimentación y el programa no funciona correctamente, es como si guardara algunos valores anteriores en alguna memoria, lo que hace que me dé cálculos desorbitados.
No se si el problema estará en los fuses o en que...
Si alguien sabe algo, o donde puedo acudir, o si necesitais pongo mi programa. Graciass


----------



## Moyano Jonathan (Mar 14, 2011)

Cesiir dijo:


> hola, necesito ayuda pero no se dónde acudir, entrego mi proyecto esta semana. Consta de un radar de velocidad, un radar de tramo, son 2 barreras infrarrojas que activan y paran un contandor de tiempo. pues resulta que cuando efectuo esas operaciones y calculo el tiempo, algunas veces funciona perfectamente el programa y lo muestro por el LCD. el problema es que reseteo con el clear, o aago la fuente de alimentación y el programa no funciona correctamente, es como si guardara algunos valores anteriores en alguna memoria, lo que hace que me dé cálculos desorbitados.
> No se si el problema estará en los fuses o en que...
> Si alguien sabe algo, o donde puedo acudir, o si necesitais pongo mi programa. Graciass



Disculpa pero no es un mensaje que valla con el tema del hilo..por favor busca en el foro i/o abri un hilo propio.


----------



## Cesiir (Mar 14, 2011)

Muchas Gracias Moyano por tu ayuda.


----------



## crian (Mar 16, 2011)

Soy nuevo en la programacion de PIC18F4550 pero el tutorial sobre el puerto USB en assembler aclara muchas dudas sobre el protocolo aunque por cuestiones de tiempo preferí pasar a compilar en CCS en C.

Muy buen aporte gracias


----------



## danyferchu (May 11, 2011)

Hola Moyano, muy bueno lo tuyo ya me  quedaron los ojos chiquitos de tanto leer, espero q puedas seguir con este maravilloso foro y pronto puedas hacer una guia para los menos entendido en el tema


----------



## Moyano Jonathan (May 11, 2011)

> Soy nuevo en la programacion de PIC18F4550 pero el tutorial sobre el puerto USB en assembler aclara muchas dudas sobre el protocolo aunque por cuestiones de tiempo preferí pasar a compilar en CCS en C.
> 
> Muy buen aporte gracias



Gracias por comentar.



> Hola Moyano, muy bueno lo tuyo ya me quedaron los ojos chiquitos de tanto leer, espero q puedas seguir con este maravilloso foro y pronto puedas hacer una guia para los menos entendido en el tema



En cuanto tenga tiempo libre lo sigo...no está abandonado el proyecto.


----------



## danyferchu (May 12, 2011)

che estube leyendo en el otro foro tuyo el precio del 18f2550, yo pensaba q aqui en tucuman eran ladrones por cobrarme $39 pero hay en mendoza y cordoba se pasan 

Fuerza master los principiantes esperamos ansioso tus avances. dejo un link con un ejemplo q anda (yo lo probe) y esta bastante bueno para ir aprendiendo
http://www.moty22.co.uk/usb_counter.php


----------



## Moyano Jonathan (May 12, 2011)

> yo pensaba q aqui en tucuman eran ladrones por cobrarme $39 pero hay en mendoza y cordoba se pasan



Por $39 está bien...es el valor real del componente.....acá en mendoza $60 (



> Fuerza master los principiantes esperamos ansioso tus avances. dejo un link con un ejemplo q anda (yo lo probe) y esta bastante bueno para ir aprendiendo
> http://www.moty22.co.uk/usb_counter.php



Yo uso las mismas librerías que el programador de esa página...la idea es explicar como funcionan.

un saludo !


----------



## Meta (May 14, 2011)

Hola:

Al conectar el PIC18F al USB puede salir el mensaje "dispositivo desconocido". En una pequeña EEPROM se puede guardar un nombre que puede ser este:

Hola mundo.

En vez del dispositivo desconocido.

¿Alguien sabe hacer eso?

Saludo.


----------



## Moyano Jonathan (May 14, 2011)

> Al conectar el PIC18F al USB puede salir el mensaje "dispositivo desconocido".



Esto quiere decir que no se ha detectado al dispositivo. Cuando un dispositivo USB es conectado al host, el mismo lo enumera y muestra un string identificatorio que nos indica nos indica el fabricante, información del dispositivo,etc.

Lo que podés guardar en la EEPROM es el string de identificación y luego con una pequeña función leer la memoria cuando conectamos el dispositivo a la PC.


----------



## Meta (May 14, 2011)

Sí, sólo te falta eso.

Saludo.


----------



## danyferchu (May 14, 2011)

Moyano Jonathan dijo:


> Esto quiere decir que no se ha detectado al dispositivo. Cuando un dispositivo USB es conectado al host, el mismo lo enumera y muestra un string identificatorio que nos indica nos indica el fabricante, información del dispositivo,etc.
> 
> Lo que podés guardar en la EEPROM es el string de identificación y luego con una pequeña función leer la memoria cuando conectamos el dispositivo a la PC.



talvez al master  de Meta le quedo claro pero seria muy interesante q nos enseñes como se hace ese string de identificación 
un saludo master


----------



## Moyano Jonathan (May 14, 2011)

En el manual voy a explicarlo todo , lo que pasa es que no he tenido tiempo para ponerme...la facultad me tiene atado de las manos...solo puedo brindar ayuda en el foro no he tenido tiempo para aportar nada. Espero entiendan.


----------



## Meta (May 15, 2011)

No se preocuope, cuando puedas poco a poco vas investigando.

Recuerdo ver un circuito sobre 8 salidas a relés y 8 entradas digitales sin LCD, solo indicaciones por Led con un 16F876 y un FTD para hacer conversión COM--USB en aquel entonces.

Tenía una EEPROM muy pequeña y era alguna de esta. Sólo contenía el nombre del dispositivo, si le quitas físicamente esa EEPROM, funcionaba igual el circuito, lo único que te aparece mensaje dispositivo desconocido y nada más.

Poco a poco vas investigando, ya llegará los resultados con tus pruebas.


----------



## massieu11 (Jul 4, 2011)

juanma2468 dijo:


> Moyano Jonathan la data que estas dando es muy pero muy valiosa para muchas de las personas que se interesan por manejar cosas por USB.
> Actualmente estoy con la idea de desarrollar un circuito capas de extrer fotos de una webcam con PIC para utilizarla como camara de video sin tener que depender de una PC, y enviar la imagen a un TV o monitor.
> Gracias a tu informacion voy a poder entender y comprender el funcionamiento del modulo USB que utiliza el PIC, y con el poder manejar la camara.
> Si te intreza el proyecto podriamos desarrollarlo juntos y aprender del mismo.
> Desde ya muchas gracias por tu aporte tan valioso para la comunidad.



Aunque para eso vas a necesitar un PIC con capacidad de Host


----------



## joselo27 (Ene 3, 2012)

excelente aporte,.,. estoy estudiando ello, cualquier avance que logre se los daré a conocer

gracias por su iniciativa,.


----------



## emersonmayon (Ene 13, 2012)

oe  la  programacion donde esta ?¿


----------



## Moyano Jonathan (Ene 13, 2012)

> oe la programacion donde esta ?¿


 
Todo el desarrollo de la programación quedó relegada para un estudio más profundo...ya que hay que estudiar todo el protocolo desde 0 para poder hacer un desarrollo conciso de lo que es el puerto USB. Debido a esto todo el desglose del tema USB con ASM ha quedado en stand by hasta que yo adquiera un conocimiento más profundo ...o ...hasta que otro pueda desarrollarlo por decirlo de alguna manera...más profesional y enfocado.


----------



## emersonmayon (Ene 13, 2012)

holas  muchachos del foro les  felicito por sus  respuestas que hacen..
bueno  mi pregunta  es lo siguente 
estoy realizando un proyectos con pic18f4550 puerto usb hasta por momentos ya lo hice el firmware en ccs , quiero simular con proteus y labview entonces  no se como configurar  o nose segun que  lei un foro tenemos que configuarar el virtual usb, donde  puedo conseguir o descargar una  mano por favor  muchachos graciasssssssss


----------



## Moyano Jonathan (Ene 14, 2012)

> holas muchachos del foro les felicito por sus respuestas que hacen..
> bueno mi pregunta es lo siguente
> estoy realizando un proyectos con pic18f4550 puerto usb hasta por momentos ya lo hice el firmware en ccs , quiero simular con proteus y labview entonces no se como configurar o nose segun que lei un foro tenemos que configuarar el virtual usb, donde puedo conseguir o descargar una mano por favor muchachos graciasssssssss


 
Es cuestión de que le cargues el firmware en el microcontrolador desde el proteus y listo...el simulador se encargará del resto. Igual si necesitas algo más detallado podrías buscar en internet como se configura...hay muchos tutoriales.


----------



## nietzche (Feb 7, 2012)

Pues no se si hallan visto, aqui podemos sacarle jugo para programar USB en ASM, que contrario a lo que muchos dicen, conozco a personas que lo han hecho, incluso pueden hacer FFT y programar pic18/24 y DSPIC en ASM, lo dejo para que vean que onda.

http://pe.ece.olin.edu/ece/projects.html


----------



## AG-1 (Feb 12, 2012)

nietzche dijo:


> Pues no se si hallan visto, aqui podemos sacarle jugo para programar USB en ASM, que contrario a lo que muchos dicen, conozco a personas que lo han hecho, incluso pueden hacer FFT y programar pic18/24 y DSPIC en ASM, lo dejo para que vean que onda.
> 
> http://pe.ece.olin.edu/ece/projects.html




¡Si memoria y velocidad quieres ganar, en ensamblador has de programar!


----------



## nietzche (Feb 14, 2012)

AG-1 dijo:


> ¡Si memoria y velocidad quieres ganar, en ensamblador has de programar!


No entiendo eso ????


----------



## dannyy (Feb 14, 2012)

amigo Moyano Jonathan por favor podrias sacar un tutorial sobre como manejar los glcd's con ASM ya que los lenguajes de nivel alto solo pueden hacer eso mas no el ASM:enfadado:


----------



## nietzche (Feb 15, 2012)

Perdon ?
Pero si el C es sacado del ASM
Yo estoy trabajando ahorita en una GLCD 160x80 Touch, resistiva, con un PIC18F4550, primero voy a configurarlo para modo texto y despues le metere graficos, todo en ASM, se ve dificil pero no lo es tanto; cuando le avance mas si quieres te digo como le hise.


----------



## Meta (Feb 15, 2012)

nietzche dijo:


> No entiendo eso ????



Te está diciendo que el ensamblador ASM es más eficiente, rápido y ahorra más memoria.


----------



## COSMICO (Feb 15, 2012)

Meta tiene razòn.
Me consta..


----------



## and322 (Sep 11, 2012)

Seguimos esperadote *Jonathan.*

Felicitaciones por el post.

Andres.


----------



## Moyano Jonathan (Sep 11, 2012)

> Seguimos esperadote Jonathan.
> 
> Felicitaciones por el post.
> 
> Andres.



Por ahora no tengo tiempo, igual si necesitas más te invito a que colabores con la investigación 
para poder ampliar lo que ya está expuesto.

Saludos !


----------



## AG-1 (May 6, 2013)

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) 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
```


----------



## Moyano Jonathan (May 6, 2013)

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 !


----------



## COSMICO (May 6, 2013)

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 , gracias..


----------



## Moyano Jonathan (May 6, 2013)

easyHID trabaja sin problemas en windows 7, pero podés usar la librería HID.dll de windows, lo que pasa es que esta última es un poco más compleja de usar.


----------



## COSMICO (May 6, 2013)

Gracias amigo, le dare una ojeada.
Saludo cordial.


----------



## AG-1 (May 26, 2013)

En principio creareamos el archivo "USB_Defs.inc" en el que iran las definiciones necesarias para la creacion de nuestro descriptor HID:

```
;
;(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) 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) 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.




AG-1 dijo:


> 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:
> 
> 
> ...


----------



## AG-1 (May 28, 2013)

El esquema del circuito para probar el programa "LedUSB" con el PIC18F2550 será este:








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


----------



## AG-1 (May 29, 2013)

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"

```
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"

```
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
```


----------



## AG-1 (May 30, 2013)

En las imágenes siguientes puede apreciarse como quedaría la aplicación que comunica con nuestro dispositivo USB HID:













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)


----------



## Moyano Jonathan (May 30, 2013)

Te ha quedado excelente el ejemplo, saludos !


----------



## AG-1 (Jun 3, 2013)

¡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! 




Moyano Jonathan dijo:


> Te ha quedado excelente el ejemplo, saludos !


----------



## AG-1 (Jun 12, 2013)

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.

```
: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
```


----------



## alexboy (Ene 12, 2014)

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.


----------



## fenixdy (Ene 21, 2014)

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


----------



## AG-1 (Ene 22, 2014)

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.




fenixdy dijo:


> 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
> ...


----------

