Conectando Un PIC Al PC Con El USB
February 9, 2017 | Author: AMADEUS1230 | Category: N/A
Short Description
Download Conectando Un PIC Al PC Con El USB...
Description
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
Micros y más Micros. Giovanni Lafebre. Cuenca – Ecuador
' keep connection alive
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 15
Página 10 de
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 15
Página 11 de
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 15
Página 12 de
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 15
Página 13 de
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 15
Página 14 de
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 15
Página 15 de
View more...
Comments