Está en la página 1de 15

Conectando un PIC al PC utilizando USB (con PBP y VB)

Conectando un PIC al PC utilizando USB.


Sin duda alguna a todos nos interesa andar al par de la tecnología, por eso en esta
ocasión escribo este pequeño articulo para indicar un poco como podemos conectar
nuestros circuitos con PIC a nuestro PC utilizando el puerto USB.

Las herramientas para esta aplicación son:

• PicBasic PRO
• EasyHID
• Visual Basic 6.0
• PIC con modulo USB (18F2455, 18F2550, 18F4455, 18F4550)

Las ventajas que ofrecen estas herramientas son la facilidad de utilizarlas, y se


facilita más aun el uso del USB con el EasyHID de mecanique, este es un wizard que
genera un programa base tanto para PIC como para PC.

El código para el PIC lo genera para PicBasic PRO y para Protón +, para el PC
genera código para Borland Delphi, Visual C++ y Visual Basic

Para tener esos códigos, solo tenemos que abrir el EasyHID, ya sea desde nuestro
Microcode Studio Plus (para las versiones soportadas) o directamente desde el
ejecutable, una ves que ejecutemos el programa se desplegara una ventana como la que
sigue:

Como esta no es una versión 100% libre tenemos ciertas restricciones que no son
la mayor cosa, como se muestra en la figura de arriba, solo podemos modificar el
nombre del producto, en mi caso puse TP-2550 que es el nombre de mi placa de
prototipos para USB. Si intentamos cambiar los otros parámetros el dispositivo no será

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 1 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

reconocido, una ves que escribamos el nombre para nuestro dispositivo, hacemos clic en
next, y veremos la siguiente pantalla:

En esta podemos ver el Vendor ID y el Product ID que como nos indican son
valores para distinguir los dispositivos, y son únicos en el mundo, así que para pruebas
nos sirve el que viene por defecto, luego hacemos clic en next, y veremos a pantalla
siguiente:

Como lo comente antes, el software no es 100% free y asi mismo si cambiamos


los valores que corresponden a lo que será la comunicación USB en sí no tendremos
errores al generar el código, pero si cuando estemos probando nuestra aplicación , asi

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 2 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

que también dejaremos los datos que estan por defecto, hacemos clic en next, para
continuar.

El paso final, que es seleccionar el nombre del proyecto, el directorio donde


queremos crearlo y los lenguajes para los cuales generará el codigo, tanto para PIC
como para PC:

Una ves que hemos configurado todo, hacemos clic en next y el wizard
empezará a hacer su trabajo, si todo se dio con éxito el codigo habrá sido generado y
veremos una pantalla como esta:

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 3 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Una ves que hemos hecho los pasos anteriores, estamos listos para abrir nuestro
programa, asi que ejecutamos nuestro MCSP y abrimos el archivo *.PBP.

Veremos que nuestro codigo generado es como se muestra a continuación:

DEFINE OSC 48
DEFINE LOADER_USED 1

USBBufferSizeMax con 8 ' maximum buffer size


USBBufferSizeTX con 8 ' input
USBBufferSizeRX con 8 ' output

' the USB buffer...


USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte

' ************************************************************
' * main program loop - remember, you must keep the USB *
' * connection alive with a call to USBService every couple *
' * of milliseconds or so... *
' ************************************************************
usbinit ' initialise USB...
ProgramStart:
gosub DoUSBIn
gosub DoUSBOut
goto ProgramStart

' ************************************************************
' * receive data from the USB bus *
' ************************************************************
DoUSBIn:
USBBufferCount = USBBufferSizeRX ' RX buffer size
USBService ' keep connection alive
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn ' read data, if available
return

' ************************************************************
' * wait for USB interface to attach *
' ************************************************************
DoUSBOut:
USBBufferCount = USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive
USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
return

La línea DEFINE LOADER_USED 1, no la utilizo, porque no utilizo


BOOTLOADER, asi que esta demás para mí, por lo que siempre la elimino.

Todo el codigo generado esta muy bien explicado, diciendo que hace cada línea
y cada subrutina, pero para recalcar, algo muy importante es la función:

USBService ' keep connection alive

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 4 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Y como se describe el los comentarios USBservice mantiene la comunicación


VIVA, por lo tanto hay que hacer un llamado a USBservice muy a menudo, les agrego
este texto tomado de la misma ayuda del EasyHID

The use interrupts for USB servicing option will generate device code that
will keep a USB connection alive using interrupts. Why would you want to
do this? When a HID device connects to a PC, it must ensure that the host
is periodically polled (or serviced). If the USB device does not poll the
host, the connection is lost. For example,

Example A

ServiceUSB()
High PORTD.0
Pause 1000
ServiceUSB()

In the above example, the time between each call to ServiceUSB() is about
1 second. This is far too long, so the device is dropped by the host. To stay
connected, the code would need to be modified like this

Example B

High PORTD.0
for index = 1 to 500 do
Pause 2
ServiceUSB()
end for

In the above example the connection is serviced every couple of


milliseconds, to keep the connection alive. Clearly, the requirements for
servicing a USB connection can be quite convoluted using the method
above. EasyHID can generate code to service the USB connection using
interrupts, making it easy to write code in the style of example A, rather
than example B. It should be noted that not all device code generators
support the use interrupts for USB servicing option.

Ellos mismos no saben explicar bien cual es el tiempo que se necesita para hacer
el llamado a USBservice, pero algo que puede llegar a ser útil para despreocuparnos un
poco por el, sería llamar a esa función en una interrupción de un timer, pero es
solamente mi punto de vista, eso llegan a ser gustos de los programadores y cada uno
tendrá que ver lo que mejor le parezca.

Otra cosa que hay que tomar en cuenta es que para poder compilar nuestro
codigo lo deberemos hacer con el MPASM, asi que deberemos tener instalado una
versión que soporte a los PIC’s con modulo USB y enlazarlo al MCSP, otra cosa para
recordar y para aquellos que no lo saben es que al compilar con el MPASM
necesitaremos que el archivo este guardado en un directorio no muy largo, sino
tendremos errores en la compilación por este motivo.

Podemos compilar el programa que nos genera el EasyHID para comprobar que
todas las configuraciones y los programas estan bien, esto es mejor hacerlo al inicio

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 5 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

antes de empezar a hacer nuestro código, para estar seguros que el código del EasyHID
se creo correctamente.

Si al compilar nuestro código no se produjo ningún tipo de error, estamos listos


para empezar a programar.

En este caso voy a hacer un ejemplo muy sencillo, se trata de enviar un dato de 8
bits desde el PC y ese valor representar en 8 leds, como mencione anteriormente, la
línea, DEFINE LOADER_USED 1, no la utilizo por lo que la suprimiré, lo único que
debemos agregar a nuestro programa para poder hacer el ejemplo que menciono es
configurar el puerto B como salida y dentro del programa principal (la etiqueta
ProgramStart) asignar el valor en el buffer al puerto B.

NOTA: la posición del buffer que utilizamos en VB debe ser menor en una a la posición
del buffer de VB, y la posición 0 no se puede utilizar ya que se utiliza para el reporte del
dispositivo, como bien nos indica en el ejemplo de VB:

BufferOut(0) = 0 ' first byte is always the report ID

Por lo tanto el código quedaría como se muestra a continuación y pondré de rojo el


código que añadí al código generado por el HID.
DEFINE OSC 48
DEFINE LOADER_USED 1 ‘borramos esta lìnea

USBBufferSizeMax con 8 ' maximum buffer size


USBBufferSizeTX con 8 ' input
USBBufferSizeRX con 8 ' output

' the USB buffer...


USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte

TRISB=0 'todo el puerto B como salida

' ************************************************************
' * main program loop - remember, you must keep the USB *
' * connection alive with a call to USBService every couple *
' * of milliseconds or so... *
' ************************************************************
usbinit ' initialise USB...
ProgramStart:
Gosub DoUSBIn ‘borramos esta línea
gosub DoUSBOut
PORTB = usbbuffer[7]
goto ProgramStart

' ************************************************************
' * receive data from the USB bus *
' ************************************************************
DoUSBIn:
USBBufferCount = USBBufferSizeRX ' RX buffer size
USBService ' keep connection alive
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn ' read data, if available
return

' ************************************************************
' * wait for USB interface to attach *
' ************************************************************
DoUSBOut:
USBBufferCount = USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive
USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
return

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 6 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Como se puede apreciar en el código, lo único que tuve que hacer es borrar dos
líneas y escribir dos más, por lo tanto es sumamente sencillo y no hay pierde, eso es lo
que corresponde a PBP, una ves que tengamos el código estamos listos para compilarlo,
basta con presionar F9, si ningún error se produjo durante la compilación el HEX se
creará con éxito.

Con esto estamos listos para cargar el HEX a nuestro PIC, y como viene siendo
costumbre utilizo mi GTP USB + y winpic800, en el winpic800 me parece mas facil
configurar el Oscilador para el pic, en mi caso utilizo un cristal de 12Mhz, y hay que
hacer la división correcta para que el pic trabaje a 48Mhz.

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 7 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Hecho ese pequeño cambio podemos ya programar nuestro microcontrolador,


una ves que lo hayamos programado, dejamos por ahora de lado lo que respecta al pic
para hacer nuestra aplicación en Visual Basic.

Como en el caso de PBP el EasyHID nos genera un código en VB muy


entendible y en líneas con comentarios nos dice que es lo que hace cada parte e incluso
donde podemos agregar nuestro código, dicho código es el que muestro a continuación:

' vendor and product IDs


Private Const VendorID = 6017
Private Const ProductID = 2000

' read and write buffers


Private Const BufferInSize = 8
Private Const BufferOutSize = 8
Dim BufferIn(0 To BufferInSize)
Dim BufferOut(0 To BufferOutSize)

' ****************************************************************
' when the form loads, connect to the HID controller - pass
' the form window handle so that you can receive notification
' events...
'*****************************************************************
Private Sub Form_Load()
' do not remove!
ConnectToHID (Me.hwnd)
End Sub

'*****************************************************************
' disconnect from the HID controller...
'*****************************************************************
Private Sub Form_Unload(Cancel As Integer)
DisconnectFromHID
End Sub

'*****************************************************************
' a HID device has been plugged in...
'*****************************************************************
Public Sub OnPlugged(ByVal pHandle As Long)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) =
ProductID Then
' ** YOUR CODE HERE **
End If
End Sub

Esta parte del código es la que esta dentro del formulario, es la parte que nos
sirve, ya que en un modulo hace las llamadas a las funciones, cosa que no nos interesa
mucho.

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 8 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Esta es la parte más fácil, ya que creo que mucha gente tiene más conocimientos
sobre Visual Basic que sobre PBP.

De la misma manera que para el código en PBP, cambiare el código agregado


por mí para esta aplicación:

Option Explicit
Dim DatoSalida, B0, B1, B2, B3, B4, B5, B6, B7 As Byte
' vendor and product IDs
Private Const VendorID = 6017
Private Const ProductID = 2000

' read and write buffers


Private Const BufferInSize = 8
Private Const BufferOutSize = 8
Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte

' ****************************************************************
' when the form loads, connect to the HID controller - pass
' the form window handle so that you can receive notification
' events...
'*****************************************************************
Private Sub Form_Load()
B7 = 0: B6 = 0: B5 = 0: B4 = 0: B3 = 0: B2 = 0: B1 = 0: B0 = 0
' do not remove!
ConnectToHID (Me.hwnd)
End Sub

'*****************************************************************
' disconnect from the HID controller...
'*****************************************************************
Private Sub Form_Unload(Cancel As Integer)
BufferOut(8) = 0
hidWriteEx VendorID, ProductID, BufferOut(0)
DisconnectFromHID
End Sub

'*****************************************************************
' a HID device has been plugged in...
'*****************************************************************
Public Sub OnPlugged(ByVal pHandle As Long)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) =
ProductID Then
' ** YOUR CODE HERE **
End If
End Sub

'*****************************************************************
' a HID device has been unplugged...

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 9 de 15
Conectando un PIC al PC utilizando USB (con PBP y VB)

'*****************************************************************
Public Sub OnUnplugged(ByVal pHandle As Long)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) =
ProductID Then
' ** YOUR CODE HERE **
End If
End Sub

'*****************************************************************
' controller changed notification - called
' after ALL HID devices are plugged or unplugged
'*****************************************************************
Public Sub OnChanged()
Dim DeviceHandle As Long

' get the handle of the device we are interested in, then set
' its read notify flag to true - this ensures you get a read
' notification message when there is some data to read...
DeviceHandle = hidGetHandle(VendorID, ProductID)
hidSetReadNotify DeviceHandle, True
End Sub

'*****************************************************************
' on read event...
'*****************************************************************
Public Sub OnRead(ByVal pHandle As Long)

' read the data (don't forget, pass the whole array)...
If hidRead(pHandle, BufferIn(0)) Then
' ** YOUR CODE HERE **
' first byte is the report ID, e.g. BufferIn(0)
' the other bytes are the data from the microcontrolller...
End If
End Sub

'*****************************************************************
' this is how you write some data...
'*****************************************************************
Public Sub WriteSomeData()
BufferOut(0) = 0 ' first by is always the report ID
BufferOut(1) = 10 ' first data item, etc etc

' write the data (don't forget, pass the whole array)...
hidWriteEx VendorID, ProductID, BufferOut(0)
End Sub

Private Sub Image1_Click()


If B3 = 1 Then
B3 = 0

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 10 de
15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Shape1.FillColor = &H4000&
Else
B3 = 1
Shape1.FillColor = &HFF00&
End If
End Sub

Private Sub Image2_Click()


If B2 = 1 Then
B2 = 0
Shape2.FillColor = &H4000&
Else
B2 = 1
Shape2.FillColor = &HFF00&
End If
End Sub

Private Sub Image3_Click()


If B1 = 1 Then
B1 = 0
Shape3.FillColor = &H4000&
Else
B1 = 1
Shape3.FillColor = &HFF00&
End If
End Sub

Private Sub Image4_Click()


If B0 = 1 Then
B0 = 0
Shape4.FillColor = &H4000&
Else
B0 = 1
Shape4.FillColor = &HFF00&
End If
End Sub

Private Sub Image5_Click()


If B7 = 1 Then
B7 = 0
Shape5.FillColor = &H40&
Else
B7 = 1
Shape5.FillColor = &HFF&
End If
End Sub

Private Sub Image6_Click()


If B6 = 1 Then

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 11 de
15
Conectando un PIC al PC utilizando USB (con PBP y VB)

B6 = 0
Shape6.FillColor = &H40&
Else
B6 = 1
Shape6.FillColor = &HFF&
End If
End Sub

Private Sub Image7_Click()


If B5 = 1 Then
B5 = 0
Shape7.FillColor = &H40&
Else
B5 = 1
Shape7.FillColor = &HFF&
End If
End Sub

Private Sub Image8_Click()


If B4 = 1 Then
B4 = 0
Shape8.FillColor = &H40&
Else
B4 = 1
Shape8.FillColor = &HFF&
End If
End Sub

Private Sub Timer1_Timer()


Text1.Text = B7 & B6 & B5 & B4 & B3 & B2 & B1 & B0
DatoSalida = BinADec(Val(Text1.Text))
BufferOut(8) = DatoSalida
hidWriteEx VendorID, ProductID, BufferOut(0)
End Sub

Como se puede observar y como lo comente antes, el subíndice de BufferOut


debe ser mayor en 1 con respecto a la de VB, y para enviar el dato debemos utilizar la
línea:

hidWriteEx VendorID, ProductID, BufferOut(0)

Que escribirá el valor en el buffer de salida.

Con esto ya estamos listos para conectar nuestro hardware al PC, no es necesario
que nuestra aplicación de VB este abierta, una ves que conectemos nuestro dispositivo
al PC lo reconocerá e instalara automáticamente el driver asociando nuestro circuito a
un Dispositivo de Interfaz Humana (HID)

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 12 de
15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Como lo comente, no es necesario hacer nada luego de que conectamos el dispositivo,


Windows lo reconoce y lo configura dejándolo listo para utilizar, podemos comprobar
que el dispositivo se instalo bien mirando en el administrador de dispositivos el nuevo
hardware que instalamos y que se lo describe de la siguiente manera:

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 13 de
15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Cuando tengamos todo esto listo, ya podemos abrir nuestra aplicación en Visual
Basic para comunicarlo con nuestro circuito.

Para el ejemplo que propuse hice la siguiente presentacion:

Son 8 leds que van conectados al Puerto B del Pic 18F2550, los puse en esa
forma porque los tengo distribuidos así en mi placa.

A continuación les dejo una fotografía del ejemplo funcionando:

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 14 de
15
Conectando un PIC al PC utilizando USB (con PBP y VB)

Por ultimo, aunque seria una de las primeras cosas que deberían hacer, el
diagrama para el ejemplo:

Con esta pequeña introducción, estaremos listos para hacer proyectos mas
complicados con USB y las herramientas que estamos utilizando. Cualquier duda
sugerencia o comentario por favor hacerlo en el guestbook de mi página web:

www.freewebs.com/glafebre

Micros y más Micros.


Giovanni Lafebre. Cuenca – Ecuador Página 15 de
15

También podría gustarte