Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• PicBasic PRO
• EasyHID
• Visual Basic 6.0
• PIC con modulo USB (18F2455, 18F2550, 18F4455, 18F4550)
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á
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:
que también dejaremos los datos que estan por defecto, hacemos clic en next, para
continuar.
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:
Una ves que hemos hecho los pasos anteriores, estamos listos para abrir nuestro
programa, asi que ejecutamos nuestro MCSP y abrimos el archivo *.PBP.
DEFINE OSC 48
DEFINE LOADER_USED 1
' ************************************************************
' * 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
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:
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
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
antes de empezar a hacer nuestro código, para estar seguros que el código del EasyHID
se creo correctamente.
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:
' ************************************************************
' * 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
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.
' ****************************************************************
' 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.
Esta es la parte más fácil, ya que creo que mucha gente tiene más conocimientos
sobre Visual Basic que sobre PBP.
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
' ****************************************************************
' 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...
'*****************************************************************
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
Shape1.FillColor = &H4000&
Else
B3 = 1
Shape1.FillColor = &HFF00&
End If
End Sub
B6 = 0
Shape6.FillColor = &H40&
Else
B6 = 1
Shape6.FillColor = &HFF&
End If
End Sub
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)
Cuando tengamos todo esto listo, ya podemos abrir nuestra aplicación en Visual
Basic para comunicarlo con nuestro circuito.
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.
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