Proyectos Pic y Usb

September 30, 2017 | Author: Horacio Bostico | Category: Computer File, Windows Xp, Computer Hardware, Usb, Window (Computing)
Share Embed Donate


Short Description

Descripción: proyecto de comunicacion de controladores pic por usb...

Description

PROYECTO 1 http://www.desarrollopic.com/tutoriales/proyecto-usbcon-pic-winxp/

PICtool v1.0 06/04/2011

Sera nuestro primer proyecto para comunicación USB 2.0, utilizando como interfaz al PIC18F2550, está diseñado para correr bajo Windows XP e inferiores, tendrá la finalidad de introducirnos en el tema "Aplicaciones USB" y que a veces no sabemos cómo abordar, pues a pesar de tanta información es difícil encontrar algo certero para explorar el tema, espero mis amigos les sea de ayuda, como lo fue para mí en su momento, no olviden preguntar o hacerme llegar sus comentarios pues solo así aprendemos todos. Este sencillo proyecto está diseñado para recibir datos del puerto USB del PC, mediante los cuales estaremos conmutando 4 salidas lógicas en 4 pines del PIC, el dato que estaremos recibiendo es un paquete de 2 bytes, uno correspondiente al modo y otro al número de led a conmutar, es decir: 1er byte, Si modo = "0" entonces entra a modo LED 2do byte, Si dato = "1 ó 2 ó 3 ó 4", conmutar LED correspondiente La idea central de funcionamiento es la siguiente: PC DRIVER XP PIC18F2550 Por tal motivo los 3 elementos deben regirse por dos códigos importantes para que exista comunicación y reconocimiento entre ellos: Product ID y Vendor ID. Vendor ID: Este código es la firma de alguna empresa para utilizar la comunicación USB, y NO debe ser cambiada. Microchip= 04D8. Product ID: Este código puede ser modificado por el usuario, para personalizar algún circuito en particular. El proyecto PICtool v1.0 fue desarrollado en 4 pasos importantes: 1.-Diagrama Electrónico (EAGLE) 2.-Edicion de Código PIC18F2550 (CCS) 3.-Edicion de Driver Windows XP (Bloc de notas) 4.-Edicion de Interfaz Gráfica (Visual C#) A continuación iremos explicando cada paso:

Paso 1 Utilizaremos un diagrama sencillo que sea fácil de armar en protoboard, manejaremos pocos componentes, no es necesario llegar hasta el diseño en PCB, pues más adelante con nuevos proyectos iremos añadiendo más componentes; por ende recomiendo que el armado se quede en protoboard por ahora. Aremos uso del software EAGLE 1.10.0 para diseñar el esquemático de nuestro circuito en cuestión. Los materiales necesarios son: 1-Protoboard 1-PIC18F2550 1-Conector USB tipo B 1-Capacitor cerámico 470nF 1-Capacitor cerámico 100nF 2-Capacitores cerámicos 22pF 1-Cristal 12MHz 1-Resistor 10K 4-Resitores 330 4-Leds 3mm *Cable, pinzas etc. Ver figura 1, correspondiente al diagrama electrónico:

Figura 1

Figura 2

Las características generales son: -Utiliza un cristal de 12MHz -Un capacitor de 100nF para evitar ruido -Un capacitor de 470nF necesario en el pin Vusb -Y las conexiones correspondientes a las 4 salidas lógicas, ver figura 2: LED1= PORTC.1 LED2= PORTC.2 LED3= PORTC.6 LED4= PORTC.7 Para ir relacionando los pines del micro a lo mencionado ver figura 3.

Figura 3

Después de haber aplicado el diagrama anterior, el armado del circuito en la protoboard debería verse similar a la figura 4.

Figura 4

Paso 2 Para la edición del código a implementar al PIC18F2550 se utilizara el compilador PIC C Compiler CCS, para términos generales será editado en "código C", para ello utilizaremos 4 librerías propias al compilador: pic18f2550.h = Librería para utilizar dicho dispositivo con todas sus características en hardware. Propia del compilador y no debe modificarse. pic18_usb.h = Librería correspondiente al uso de la comunicación USB para PIC18. Propia del compilador y no debe modificarse. usb.c = Librería para uso estándar de comunicación USB. Propia del compilador y no debe modificarse. descriptor_USB.h = Librería que contiene la configuración y descripción general del dispositivo a conectar. Librería de ejemplo que fue modificada para utilizar con este proyecto en particular, ubicada en la carpeta de samples del compilador con el nombre de "usb_desc_scope.h", son 2 las partes modificadas (ver figura 5): 1-Vendor ID, VID= 04D8, código correspondiente a la firma de Microchip para utilizar comunicación USB. 2.-Product ID, PID= 0090, código cualquiera, escogido para este proyecto en particular y que debe ser igual al de la Interfaz y Driver. *Por lo tanto PIC, Driver e Interfaz deben tener el mismo VID y PID.

Figura 5

Retomando, la función principal del PIC es leer los dos bytes enviados desde el PC, en donde el 1er byte corresponde al modo y el 2do al número de led, entonces: -El primer byte enviado corresponde al modo MODO = 0x00, 1er byte -El segundo byte corresponde al número de LED y pude ser cualquiera de los códigos siguientes: LED1 = 0x01, 2do byte LED2 = 0x02, 2do byte LED3 = 0x03, 2do byte LED4 = 0x04, 2do byte Apagar LED's = 0x05, 2do byte El código C básico para la conmutación de dichos leds es el siguiente: >>>---------------------------------------------------------------------------------if (modo==0) //El 1er byte corresponde al modo LED? { switch(dato) // 2do byte para el led correspondiente { case 1: {output_toggle(LED1); break;} case 2: {output_toggle(LED2); break;} case 3: {output_toggle(LED3); break;} case 4: {output_toggle(LED4); break;} case 5: {LED_OFF(LED1); LED_OFF(LED2); LED_OFF(LED3); LED_OFF(LED4); break;} } } ----------------------------------------------------------------------------------- PORTC.1 = 1

PORTC.1 = 1 --->output_toggle---> PORTC.1 = 0 El código completo se muestra a continuación: >>>-------------------------------------------------------------------------------------#include #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN #use delay(clock=48000000) #define USB_HID_DEVICE FALSE #define USB_EP1_RX_ENABLE USB_ENABLE_BULK #define USB_EP1_RX_SIZE 2 #include #include "descriptor_USB.h" #include #define #define #define #define

LED1 LED2 LED3 LED4

PIN_C1 PIN_C2 PIN_C6 PIN_C7

#define LED_ON output_high #define LED_OFF output_low #define modo #define dato

datain[0] datain[1]

void main(void) { int8 datain[2]; LED_OFF(LED1); LED_OFF(LED2); LED_OFF(LED3); LED_OFF(LED4); LED_ON(LED1); LED_ON(LED4); usb_init(); usb_task(); usb_wait_for_enumeration(); LED_OFF(LED1); LED_OFF(LED4); LED_ON(LED2); LED_ON(LED3); delay_ms(1000); LED_OFF(LED2); LED_OFF(LED3);

while (TRUE) { if(usb_enumerated()) { if (usb_kbhit(1)) { usb_get_packet(1, datain, 2); if (modo==0) { switch(dato) { case 1: {output_toggle(LED1); break;} case 2: {output_toggle(LED2); break;} case 3: {output_toggle(LED3); break;} case 4: {output_toggle(LED4); break;} case 5: {LED_OFF(LED1); LED_OFF(LED2); LED_OFF(LED3); LED_OFF(LED4); break;} } } } } } } ----------------------------------------------------------------------------------->>> *Más adelante se proporcionaran todos los archivos relacionados a este proyecto: están comentados. Compilando (CCS) el código anterior se genera nuestro valioso .HEX, que podremos cargar a nuestro PIC18F2550 con cualquier programador.

Paso 3 Microchip proporciona un DRIVER que corre bajo Windows XP, para comunicación USB para la familia PIC18, el cual puede descargarse desde su sitio web. El nombre del Driver es MCHPUSB, y está compuesto por 5 elementos: 1.-Ioctls.h 2.-mchpusb.cat 3.-mchpusb.inf 4.-mchpusb.sys 5.-mchpusb64.sys En nuestro caso nos interesa solo en "mchpusb.inf", se trata del archivo a modificar pues contiene los códigos VID y PID que necesitamos configurar. De los 4 pasos este es el más fácil, pues solo necesitamos modificar el código PRODUCT ID = PID, el valor para dicho código será 0090, el código VID no será necesario cambiarlo, pues es la firma de Microchip para el uso de comunicaciones USB, el cual corresponde a 04D8, ya está escrito por defecto en el INF. En la Figura 6 puede verse la sección a editar.

Figura 6

Una vez editada esta parte nuestro Driver estara listo para interactuar entre el PIC18F2550 y la Interfaz de Visual C#. Desde este punto si ya tenemos el hardware armado con el PIC programado; ya podemos conectar el circuito a la pc e instalar el driver anteriormente editado. Al conectar por primera vez el PICtool v1.0 nos aparece una ventana solicitando el driver, direccionamos manualmente hasta donde se encuentra nuestro "Driver_PICtool", ver figura 7.

Figura 7

Aceptamos y esperamos a que se instale el driver, durante el proceso encenderán los leds 1 y 4, al completar la instalación encenderán los leds 2 y 3; durante un segundo y finalmente se apagaran. Al final de la instalación veremos en el pc una ventana como en la figura 8.

Figura 8

Ahora nuestro hardware y driver están listos, pero aun no harán nada, pues hace falta la interfaz gráfica para mandar los dos bytes que necesita el hardware para conmutar las 4 salidas lógicas.

Paso 4 Editaremos una interfaz grafía sencilla utilizando el software Visual C# 2005, a través de esta controlaremos las 4 salidas lógicas en nuestro hardware, haremos uso de 5 botones; 4 correspondientes a las salidas lógicas y el 5to para poner a "cero" todas las salidas, entonces: Boton1= Boton2= Boton3= Boton4= Boton5=

LED1, salida 1 LED2, salida 2 LED3, salida 3 LED4, salida 4 Poner a cero todo

Una vez que sabemos lo que necesitamos para nuestra interfaz; para interactuar con el hardware, pasamos a un elemento importante, necesitamos un archivo .DLL para extraer parámetros de control para la comunicación USB, podremos añadir los códigos VID y PID y así asociar nuestros 3 elementos: PIC, DRIVER e INTERFAZ. El elemento .DLL es indispensable, y también nos lo proporciona Microchip, el "mpusbapi.dll" nos facilitara el manejo del puerto USB y no es necesario modificarlo, solo necesitamos añadirlo a la hora de generar la aplicación .EXE en Visual C#. Abrimos Visual C# 2005, en archivo seleccionamos nuevo proyecto y a su vez seleccionar "Aplicación para Windows", a partir de aquí podemos nombrar y guardar el proyecto. Ver figura 9.

Figura 9

Al aceptar aparecerá una pequeña ventana a la que agregaremos 5 botones, los cuales tomaremos del cuadro de herramientas del lado izquierdo de nuestra pantalla. Ver figura 10.

Figura 10

Al añadir un botón aparecerá como "botón", que después podremos cambiar a "LED1". Hasta este punto debemos aclarar que para llamar en el código C a cualquier botón debemos llamarlo por su nombre y no con el texto, por ejemplo: El botón 1 tiene como título "LED1", pero se llama "led1". El texto es el que puede ver el usuario en la interfaz, y el nombre es el utilizado para manipular la acción del mismo por el programador. Para ir creando el código que necesitamos para cada botón iremos a la sección de propiedades, y seleccionamos "eventos", para cada botón escribiremos el nombre y la acción: led1_click, de esta manera al dar enter; se ira creando automáticamente una sección de código para cada botón, ver figura 11.

Figura 11

Al generar un código por cada botón, ya solo ara falta editar su acción, es decir; el contenido de cada llave. Por ejemplo, si nos enfocamos en el botón LED1, debemos escribir las instrucciones que manden un byte de modo led y otro correspondiente al led, entonces:usbapi.ledPIC(0x01); 1er byte ledPIC = 0x00 2do byte = 0x01 Por lo que estaríamos enviando desde la interfaz un paquete de 2 bytes, el hardware los recibirá y entenderá que debe conmutar el LED1. Ver figura 12.

Figura 12

Una vez editados todos los botones debemos agregar las siguientes líneas al principio del código: 1-using System.Diagnostics; //Clase para abrir página web 2-PICtoolAPI usbapi = new PICtoolAPI();//para incluir acciones api Ver figura 13.

Figura 13

Al guardar el proyecto, se genera un archivo con el nombre de "program.cs",cambiaremos de nombre este archivo por "PICtoolAPI.cs", borraremos todo su contenido y pegaremos el siguiente texto: using System; using System.Collections.Generic; using System.Windows.Forms; using System.Runtime.InteropServices; // Clase para importar DLL using PVOID = System.IntPtr; using DWORD = System.UInt32; namespace PICtool { unsafe public class PICtoolAPI { #region Definición de los Strings: EndPoint y VID_PID string vid_pid_norm = "vid_04d8&pid_0090"; string out_pipe = "\\MCHP_EP1"; string in_pipe = "\\MCHP_EP1"; #endregion #region Funciones importadas de la DLL: mpusbapi.dll [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBGetDLLVersion(); [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID); [DllImport("mpusbapi.dll")] private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved); [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds); [DllImport("mpusbapi.dll")]

private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds); [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds); [DllImport("mpusbapi.dll")] private static extern bool _MPUSBClose(void* handle); #endregion void* myOutPipe; void* myInPipe; static void Main() { Application.EnableVisualStyles(); Application.Run(new PICtool()); } public void OpenPipes() { DWORD selection = 0; myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0); myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0); } public void ClosePipes() { _MPUSBClose(myOutPipe); _MPUSBClose(myInPipe); } private void SendPacket(byte* SendData, DWORD SendLength) { uint SendDelay = 1; DWORD SentDataLength; OpenPipes(); _MPUSBWrite(myOutPipe, (void*)SendData, SendLength, &SentDataLength, SendDelay); ClosePipes(); } private void ReceivePacket(byte* ReceiveData, DWORD* ReceiveLength) { uint ReceiveDelay = 1; DWORD ExpectedReceiveLength = *ReceiveLength; OpenPipes(); _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectedReceiveLength, ReceiveLength, ReceiveDelay); ClosePipes(); } public void ledPIC(uint led) { byte* send_buf = stackalloc byte[2]; send_buf[0] = 0x00; //Modo LED send_buf[1] = (byte)led; //Seleccionar LED SendPacket(send_buf, 2); //Enviar paquete }

} } En el archivo anterior modificamos dos cosas importantes: 1-Se añadió código referente al código VID y PID además de la extracción de algunos parámetros del archivo "mpusbapi.dll", recordemos que se trata de un archivo proporcionado por microchip para este tipo de aplicaciones. 2-Se agregó la función ledPIC, la cual nos ayuda a mandar los dos bytes cada que se presiona un botón de la interfaz. Ver figuras 14 y 15.

Figura 14

Figura 15

Ahora ya solo nos falta una cosa, guardar el archivo "mpusbapi.dll" dentro de la carpeta donde se guardó el proyecto PICtool creado en visual C# 2005, dar clic en "proyecto"-->clic en "agregar elemento existente" y direccionar la mpusbapi que guardamos anteriormente. Finalmente modificar una casilla en propiedades del proyecto; esto es que al momento de generar él .EXE nos jale los parámetros necesarios del mpusbapi, para eso debemos permitir "GENERAR" con código no seguro, ver figura 16.

Figura 16

FINALMENTE estamos listos para probar nuestro proyecto, ya solo debemos dar clic en GENERAR y listo!!. Suerte. En la sección de DESCARGAS podrán adquirir todos los archivos fuente de este proyecto, sin más por el momento espero sea de ayuda.

PROYECTO 2 http://www.desarrollopic.com/tutoriales/proyecto-usbcon-pic-win7-8/

PICtool v2.0 30/09/2013 Con los nuevos sistemas operativos de Windows(Vista, Win7, Win8); el driver de Microchip ya no es compatible, nos deja fuera de la máxima velocidad (12Mbs), resultando como únicos modos HID y CDC. Pero gracias al driver genérico WinUSB de Windows, retomaremos la comunicación USB 2.0 con la serie favorita de microntroladores PIC18Fxx5x, que traen el hardware para dicha comunicación, en modo "Custom Driver" devolviéndonos los 12Mbs, compatible con los nuevos sistemas en sus versiones de 32 y 64bits. El desarrollo es sencillo, utilizaremos el PIC18F2550 con un cristal de 20MHz, al igual que el proyecto anterior, constara de 4 salidas lógicas del puerto B, que activaremos y desactivaremos a voluntad desde la interfaz. Idea central: PC WinUSB(Vista, Win7, Win8) PIC18F2550 La organización USB de los nuevos sistemas de Windows ya no exige que Hardware, Driver e Interfaz contengan el mismo código VID y PID, hoy la identificación es por "Rutas". Sólo Hardware y Driver deben contener el mismo VID y PID, mientras que Driver e Interfaz la misma Ruta. Esto supone que pueden conectarse varios dispositivos con el mismo VID y PID al mismo PC, al instalarse de identifica a cada uno por su Ruta. El desarrollo consta de 4 pasos, que describiremos brevemente, la mayoría de las características ya estas explicadas(Proyecto 1): 1-Diagrama (EAGLE 6.4.0) 2-Firmware PIC18F2550 (CCS v4.140) 3-Driver WinUSB (Sin editar) 4-Interfaz Gráfica (VC# 2008 Express)

Paso 1 A continuación el diagrama electrónico(Figura 1). Materiales:

4-Resistores 330 ohms 1-Resistor 10K 1-Capacitor 100nF 1-Capacitor 470nF 2-Capacitores 22pF 1-Cristal 20MHz 1-Push button 4-LEDs std 1-Conector USB-B/H

Figura 1

LEDs conectados al PUERTO B(Figura 2): PORTB.5 = LED1 PORTB.4 = LED2 PORTB.3 = LED3 PORTB.2 = LED4

Figura 2

Paso 2 El Firmware del PIC18F2550 esta editado en CCS(Lenguaje C), el programa principal es relativamente sencillo, la verdadera magia está en la librería que es llamada para el uso de la

comunicación USB: "pic18_WinUSB.h", la cual contiene los códigos VID y PID, que deberán ser iguales al Driver, específicamente al archivo "*.inf", se recomienda no modificar esta librería. En caso de querer modificar el programa para una aplicación más completa, con tan sólo el programa principal bastara, por ejemplo: de requerir una mayor capacidad del buffer para recibir bytes.. Tan sólo hay que aumentar el tamaño del mismo(Figura 3).

Figura 3

CÓDIGO: El programa conmuta(1 ó 0) 4 pines del puerto B, según lo que reciba de la comunicación USB. #include #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN #use delay(clock=48000000) #use FAST_IO (B) #define #define #define #define #define

USB_HID_DEVICE FALSE USB_EP1_TX_ENABLE USB_ENABLE_BULK USB_EP1_RX_ENABLE USB_ENABLE_BULK USB_EP1_TX_SIZE 2 USB_EP1_RX_SIZE 2

#include #include "pic18_WinUSB.h" #include #define #define #define #define #define #define

led1 led2 led3 led4 pin_on pin_off

PIN_B5 PIN_B4 PIN_B3 PIN_B2 output_high output_low

void main(void) { int8 iBuff[2]; set_tris_b(0x00); delay_cycles(5);

pin_off(led1); pin_off(led2); pin_off(led3); pin_off(led4); usb_init(); usb_task(); usb_wait_for_enumeration(); while (TRUE) { if(usb_enumerated()) { if (usb_kbhit(1)) { usb_get_packet(1, iBuff, 2); if (iBuff[0] == 0) { if (iBuff[1] == 1) if (iBuff[1] == 2) if (iBuff[1] == 3) if (iBuff[1] == 4) }

output_toggle(led1); output_toggle(led2); output_toggle(led3); output_toggle(led4);

} } } } Aquí la parte importante de la librería "pic18_WinUSB.h", que contiene el VID y PID, y que deberá coincidir con la descripción(INF) del Driver (Figura 4).

Figura 4

Paso 3 El driver genérico "WinUSB" es proporcionado por Microsoft, al conectar por 1ra vez el Hardware; es necesario direccionar manualmente dicho driver, al hacerlo aparece por defecto un

mensaje indicando que puede ser peligroso instalarlo, le damos clic en aceptar y finalizamos la instalación. Con el Driver es importante resaltar 2 puntos: 1ro-El VID y PID del Driver son los mismos que contiene el Firmware del PIC18F2550(Figura 5).

Figura 5

2do-La "RUTA" del driver es la misma que contiene la Interfaz Gráfica(Figura 6).

Figura 6

Paso 4 La Interfaz Gráfica está diseñada con Visual C# 2008, lenguaje C, el código es muy parecido al Proyecto 1. Se trata de 4 botones que envían un paquete de 2byte cada uno: 1er byte= Modo (0x00) 2do byte= Led (0x01/0x02/0x03/0x04) El 1er byte no es de mucha utilidad en esta aplicación, pero lo será para aquellos que quieran agregar más funciones, por ejemplo: Modo 0x00=LEDs, 0x01=Relay, 0x02=CH1/ADC etc.

El 2do byte indica el LED a conmutar: LED1=0x01, LED2=0x02, LED3=0x03 y LED4=0x04 (Figura 7).

Figura 7

Ejemplo de código para un botón VC#(Figura 8):

Figura 8

Códigos fuente en la sección DESCARGAS, con el nombre de "PICtool v2.0", espero sea de ayuda, saludos.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF