Ejemplo del Protolo Usb

17
Contenido Objetivos: ............................................................................................................................................................... 3 Introducción ........................................................................................................................................................... 3 Marco Teórico ........................................................................................................................................................ 3 Desarrollo ............................................................................................................................................................... 9 Conclusiones ...................................................................................................................................................... 19 Bibliografía.......................................................................................................................................................... 19

description

PIC18F4550 y LabView

Transcript of Ejemplo del Protolo Usb

Page 1: Ejemplo del Protolo Usb

Contenido Objetivos: ............................................................................................................................................................... 3

Introducción ........................................................................................................................................................... 3

Marco Teórico ........................................................................................................................................................ 3

Desarrollo ............................................................................................................................................................... 9

Conclusiones ...................................................................................................................................................... 19

Bibliografía .......................................................................................................................................................... 19

Page 2: Ejemplo del Protolo Usb

Objetivos

Realizar lectura de un potenciómetro con un microcontrolador, para después hacer comunicación vía USB con la PC y así observar el valor de tensión del potenciómetro en la PC.

Introducción

El protocolo USB es el más común de encontrar en dispositivos comerciales, debido a su fácil manejo de hardware y compatibilidad dinámica. Es razón por el cual se considera necesario que se adquiera el conocimiento de como implementarlo en el compilador PICC con la computadora.

Marco Teórico

El Bus Serial Universal (USB, por sus siglas en inglés) fue desarrollado y estandarizado por un grupo de siete empresas dedicadas a la manufactura de computadoras y periféricos (IBM, Intel, Northern, Telecom, Compaq, Microsoft, Digital Equipment y Nec) en 1995 [10]. La idea era tomar todo lo relacionado al puerto y protocolo serial para mejorarlo con la tecnología del siglo XXI; buscando crear una tecnología que permitiera una actividad de bus de baja y alta velocidad de transmisión de datos, proporcionando un protocolo robusto, configuración automática de dispositivos y un bus serial al que fuera sencillo conectarse. El USB es un bus punto a punto: dado que el lugar de partida es el host (PC o hub), el destino es un periférico u otro hub. No hay más que un único host (PC) en una arquitectura USB. Cada host soporta solo un bus, cada conector en el bus representa un puerto USB por lo tanto sobre el bus puede haber varios conectores, pero solo existe una ruta y solo un dispositivo puede transmitir información a un tiempo. Los periféricos comparten un mismo bus. El protocolo se basa en el llamado paso de testigo (token). La computadora (o host) proporciona el testigo al periférico seleccionado y seguidamente, éste le devuelve el testigo en su respuesta. El desarrollo del protocolo USB representa un gran aumento en las velocidades de transmisión de datos, así como la instalación de los dispositivos “en caliente”, es decir, con este protocolo no se requiere de reiniciar los equipos cada vez que se conecta un dispositivo, lo cual lo hace más práctico y sencillo de utilizar comparado con los protocolos de conexio es de tipo serial (DB-9) o paralelo (DB-25), por lo que en la actualidad estos puertos ya no se encuentran presentes en equipos de computo modernos. A continuación se describen los aspectos esenciales de este protocolo:

A nivel eléctrico, el cable USB transfiere la señal y la alimentación sobre 4 hilos. En las

Page 3: Ejemplo del Protolo Usb

normas que regulan la versión 1.1 y 2.0 se distinguen dos tipos de conectores: • Tipo A, de forma rectangular es usado en dispositivos que no requieren demasiado ancho de banda (como teclado, mouse, memorias USB, entre otros.). • Tipo B, poseen una forma cuadrada y se utilizan principalmente para dispositivos de alta velocidad (como discos duros externos, quemadores externos, entre otros).

La distribución de los cables en los conectores es de la siguiente forma:

Suministrarla al dispositivo, sin embargo dependerá de éste último el consumo, pudiendo ser auto-alimentado (self powered) en caso de que el consumo de energía lo realice a través del puerto o con alimentación propia (como en el caso de la mayoría de las impresoras), omitiendo el uso de la alimentación proporcionada por el puerto. A nivel de señal: Los cables utilizados en la transmisión de los datos (D+ y D-) constituyen un par trenzado con una impedancia característica de 90 Ω a fin de reducir las interferencias y el ruido. Se debe vigilar que la extensión de los cables transmisores de datos no supere los 5 m. Las direcciones de los diferentes dispositivos conectados a través de un host y diversos hub’s están cifradas en 7 bits, por lo que 128 dispositivos (27) pueden estar conectados simultáneamente a un puerto de este tipo. En realidad, es recomendable reducir esta cantidad a 127 porque la dirección 0 es una dirección reservada. Por otra parte, es posible conectar hasta 5 concentradores o hub’s, por lo que, tomando en cuenta la longitud máxima de 5 metros del cable entre dos dispositivos, es posible crear una cadena de transmisión de datos de hasta 25 metros de longitud.

Page 4: Ejemplo del Protolo Usb

El enlace virtual (pipe) puede ser de cuatro tipos: - Control: Modo utilizado para realizar configuraciones; existe siempre sobre el Punto Terminal 0 (EndPoint 0). Todos los dispositivos USB deben soportar este tipo de transferencia. Los datos de control sirven para configurar el periférico en el momento de conectarse al USB. Algunos drivers específicos pueden utilizar este enlace para transmitir su propia información de control.Este enlace no tiene pérdida de datos, puesto que los dispositivos de detección de recuperación de errores están activos a nivel USB. - Bulk (Masiva): Este modo se utiliza para la transmisión de importantes cantidades de información. Como el tipo control, este enlace no tiene pérdida de datos. Este tipo de transferencia es útil cuando la razón de transferencia no es crítica como por ejemplo, el envío de un archivo a imprimir o la recepción de datos desde un escáner. En estas aplicaciones, la transferencia es rápida, pero puede espera si fuera necesario. Solo los dispositivos de media y alta velocidad utilizan este tipo de transferencia. - Interrupt (Por interrupción): modo utilizado para transmisiones de pequeños paquetes, rápidos, orientados a percepciones humanas, como puede ser el ratón. Este tipo de transferencia es para dispositivos que deben recibir atención periódicamente y que no requieren de alta velocidad en la transmisión de datos. El tiempo de respuesta puede ser inferior al valor especificado por la interfaz. - Isochronous o Flujo en tiempo real: modo utilizado para la transmisión de audio o video comprimido. Este tipo de transmisión funciona en tiempo real. Este es el modo de mayor prioridad. La transmisión de la voz es un ejemplo de esta aplicación. Si ésta no se transmite correctamente, pueden llegar a oírse parásitos (glich) y la aplicación puede no procesar de forma correcta la información.

Page 5: Ejemplo del Protolo Usb

Enumeración Antes de cualquier aplicación se pueda comunicar con un dispositivo a través del puerto USB, el host necesita aprender sobre el dispositivo para comunicarse de la forma adecuada. Para poder llevar a cabo estas tareas se requiere de un intercambio de información entre el dispositivo y el host. Este proceso incluye la asignación de una dirección al dispositivo, leer los descriptores del dispositivo, asignar y ejecutar el driver adecuado y seleccionar la configuración adecuada que especifique los requerimientos de energía del dispositivo, los endpoints y algunas otras características. Para que se ejecute la enumeración, cuando el host detecta que se ha conectado un nuevo dispositivo envía información solicitando la información antes mencionada, el dispositivo entonces envía la respuesta a los requerimientos solicitados para establecer la comunicación. Acto seguido se establecen las tuberías (pipes) para poder dar el canal adecuado a la información, en este momento el dispositivo se encuentra listo para efectuar la trasmisión de datos. Desde la perspectiva del usuario, la enumeración es un proceso completamente invisible y automático excepto tal vez por la aparición de mensajes que anuncien la detección de un nuevo dispositivo y cuando la configuración ha sido exitosa. En algunas ocasiones durante el primer uso, el usuario debe seleccionar el driver o especificar la ubicación donde el host debe localizar los archivos. El controlador USB Un controlador USB típico contiene un transmisor–receptor USB, una interfaz serial, buffers, registros de configuración, estado y control para la comunicación. El transceptor Proporciona una interfaz en hardware entre el conector USB del dispositivo y el circuito que controla la comunicación USB. El transceptor se encuentra típicamente en el chip, pero algunos controladores permiten la conexión hacia un transceptor externo. Interfaz Serial Los circuitos que enlazan el transceptor y el host, forman una unidad llamada interfaz serial. Esta interfaz serial es la encargada de manejar las transacciones de envío y recepción de datos, sin interpretarlos o utilizarlos, solamente envía cualquier dato disponible y almacena cualquier dato entrante en las localidades disponibles. Buffers Los controladores USB utilizan los buffers para almacenar los datos conforme se van recibiendo y para almacenar de igual manera los datos que se encuentran listos para ser

Page 6: Ejemplo del Protolo Usb

enviados. Para retener los datos a transmitir o recibidos, la mayoría de los buffers cuentan con una estructura de tipo FIFO (Primero en entrar, primero en salir). Información de configuración, estado y control Los chips controladores de USB, tienen registros que son utilizados para almacenar información referente al tipo de endpoint utilizados, el numero de bytes a recibir, el numero de bytes a enviar, el estado del dispositivo y en general, cualquier información sobre cómo se deberá de utilizar la interfaz para la transmisión y recepción de datos. Debido a las diferencias de configuración entre chips o familias de chips, el firmware para el controlador debe ser creado específicamente para cada uno de ellos, ya sea para chip o bien para una familia de éstos. Reloj Las comunicaciones USB requieren de una fuente de tiempos, típicamente esta fuente es un cristal oscilador, aunque en los dispositivos de baja velocidad puede utilizarse un resonador cerámico. Componentes Adicionales Además de los componentes de la interfaz USB antes descritos, muchos dispositivos incluyen una unidad de procesamiento, memoria de programa y de datos, interfaces de entrada y salida así como características adicionales, por ejemplo temporizadores, contadores, etc. Bibliotecas DLL Una dll o biblioteca de enlace dinámico (Dynamic Linking Library), es un archivo que contiene funciones y/o recursos (mapas de bits, definiciones de fuentes, etc.) que pueden ser llamados desde cualquier aplicación Windows, de hecho, se puede considerar que Windows® está construido sobre una gran cantidad de DLL’s. La mayoría de bibliotecas de enlace dinámico se guardan en archivos que tienen extensión DLL, pero también pueden ser guardados en archivos con extensiones EXE (ejecutable), DRV (controlador de dispositivo) y FON (fuente de Windows®). La diferencia entre las bibliotecas de enlace dinámico con extensión DLL y el resto, es que las primeras se cargan porque el programa que las ha de utilizar lo pide a Windows® y las demás, en cambio, se cargan porque están referenciadas en archivos de inicialización de Windows®. Estas referencias pueden ser creadas por el propio Windows® o por el programa deinstalación de alguna aplicación.

Page 7: Ejemplo del Protolo Usb

Estructura de una DLL de 32 bits [16] Una DLL se puede dividir, básicamente, en tres partes: •Archivo de cabecera: Contendrá todas las declaraciones y/o definiciones (de variables, funciones, etc.) que use la DLL. •Punto de entrada y salida: Es la función principal de la DLL, y es la que se encarga de cargar la DLL (cuando se vaya a usar) y descargarla de la memoria (cuando se deje de usar). Dicha función se llama DllEntryPoint. •Funciones: Son las funciones que contiene la DLL y que fueron declaradas por el

programador de la misma.

Page 8: Ejemplo del Protolo Usb

Desarrollo Equipo Necesario

Computadora (con el Software MPLAB IDE, IC-PROG o similar, compilador C,LabView, Simulador de circuitos electrónicos “Proteus”).

Programador tipo JDM o similar.

Material Necesario

Instrucciones del PIC 18]F4550 u

Capacitores

Puente H

Resistencias

Motor DC

Cristal de cuarzo de 4MZ

Cable de conexión USB

El primer paso es instalar las librerías de la página de Microchip, donde contienen las DLL’s para que el dispositivo que en este caso es un microcontrolador. El framework a instalar debe ser de versión V2.3 o superior, llamado MCHPSUSB. Ya con esto, se agrega el siguiente código con extensión “.h” para que al momento de programar de compilar el programa en para el PIC a usar, incluya las librerías propias de USB. //// Descriptores.h //// //// //// //// En este archivo se configuran los elementos descriptores del //// //// PIC, como son el VID y el PID para el correcto funcionamiento //// //// del dispositivo. Ademas se configuro el nombre con el que el //// //// dispositivo sera reconocido por la PC. //// //// //// //// Esta configuracion se basa en los parametros indicados //// //// en la norma USB 2.0 //// //// //// ///////////////////////////////////////////////////////////////////////// #IFNDEF __USB_DESCRIPTORS__ #DEFINE __USB_DESCRIPTORS__ #include <usb.h> //Se incluye la libreria con las directivas USB #DEFINE USB_TOTAL_CONFIG_LEN 32 //Longitud=config+interface+class+endpoint //Descripcion de la configuracion char const USB_CONFIG_DESC[] = { USB_DESC_CONFIG_LEN, //longitud del descriptor USB_DESC_CONFIG_TYPE, //constante para CONFIGURATION (0x02) USB_TOTAL_CONFIG_LEN,0,

Page 9: Ejemplo del Protolo Usb

//Tamano de datos que regresa esta configuracion 1, //Numero de interfaces soportadas por el dispositivo 0x01, //Identificador de esta configuracion 0x00, //indice de la cadena que describe esta configuracion 0xC0, //bit6=1: autoalimentado (self•]powered) //bit5=1: activacion remota //bits 0•]4: reservados //bit7=1 0x32, //energia maxima requerida por el puerto //(maximum milliamperes/2) (0x32 = 100mA) //Descripcion de la interfaz USB_DESC_INTERFACE_LEN, //longitud del descriptor USB_DESC_INTERFACE_TYPE, //constante para INTERFACE (0x04) 0x00, //Número que define esta interfaz 0x00, //Selección alternativa de interfaz 2, //Numero de endpoints 0xFF, //Código de clase 0xFF, //Código de subclase 0xFF, //Código de protocolo 0x00, //índice de la cadena que //describe esta configuración //Descripción de endpoint de entrada USB_DESC_ENDPOINT_LEN, //longitud del descriptor USB_DESC_ENDPOINT_TYPE, //constante para ENDPOINT (0x05) 0x81, //Número y dirección del Endpoint (0x81 = EP1 IN) 0x02, //Tipo de transferencia //0: control, 1: iso, 2: masiva, 3: interrupciones USB_EP1_TX_SIZE, 0x00, //Tamaño máximo de paquete soportado 0x01, //intervalo de polling en ms //sólo para transferencia con interrupciones //Descripción de endpoint de salida USB_DESC_ENDPOINT_LEN, //longitud del descriptor USB_DESC_ENDPOINT_TYPE, //constante para ENDPOINT (0x05)

Page 10: Ejemplo del Protolo Usb

0x01, //Número y dirección del Endpoint (0x01 = EP1 OUT) 0x02, //Tipo de transferencia //0 is control, 1 is iso, 2 is bulk, 3 is interrupt USB_EP1_RX_SIZE, 0x00, //Tamaño máximo de paquete soportado 0x01, //intervalo de polling en ms //sólo para transferencia con interrupciones }; #define USB_NUM_HID_INTERFACES 0 #define USB_MAX_NUM_INTERFACES 1 const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1}; #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN) #error USB_TOTAL_CONFIG_LEN not defined correctly #endif //Descriptores del dispositivo char const USB_DEVICE_DESC[] ={ USB_DESC_DEVICE_LEN, //Longitud del reporte 0x01, //Constante del dispositivo (0x01) 0x10,0x01, //Versión de USB (1.1) 0x00, //Código de clase 0x00, //Código de subclase 0x00, //Código de protocolo USB_MAX_EP0_PACKET_LENGTH, //Tamaño máximo de paquete para endpointt 0. //(Baja Velocidad especifica 8) 0xd8,0x04, //vendor id (0x04D8 Microchip) 0x0b,0x00, //product id (0x000b PIC18 Family) 0x01,0x00, //Número de versión del dispositivo 0x01, //Indice de cadena del productor 0x02, //Indice de cadena del producto 0x00, //Indice de cadena del numero de serie USB_NUM_CONFIGURATIONS //Numero de posibles configuraciones }; const char USB_STRING_DESC_OFFSET[]={0, 4, 12}; //Ubicación del inicio de las cadenas #define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET) char const USB_STRING_DESC[]={ //string 0 4, //Longitud de la cadena

Page 11: Ejemplo del Protolo Usb

USB_DESC_STRING_TYPE, //Tipo de descriptor: String 0x0a,0x08, //Definición de Microsoft para idioma ingles de EUA //string 1 8, //Longitud de la cadena USB_DESC_STRING_TYPE, //Tipo de descriptor: String 'U',0, 'S',0, 'B',0, //string 2 24, //Longitud de la cadena USB_DESC_STRING_TYPE, //Tipo de descriptor: String 'D',0, 'A',0, 'Q',0, '_',0, 'L',0, 'a',0, 'b',0, 'V',0, 'I',0, 'E',0, 'W',0 }; #ENDIF Por último, se tiene se realiza el programa para el microncontrolador, como también el software que se ejecuta en la PC para hacer la comunicación USB. El programa del microcontrolador adquiere la tensión que proporciona el potenciómetro mediante el canal ADC, mandando lo obtenido a la PC vía USB. También la PC puede mandar bits en estado altos y bajos, siendo estos dirigidos al puerto B, mandando estados altos o bajos en el microcontrolador. El código se muestra a continuación: #include <18F4550.h> //Libreria con las instrucciones del PIC #device adc=8 //Configuración del reloj #FUSES HSPLL #FUSES PLL5 #FUSES USBDIV #FUSES CPUDIV1 #FUSES NOWDT,NOPROTECT,NOLVP,NODEBUG,VREGEN //Fin de configuración de los fuses #use delay(clock=48000000) //Definimos la frecuencia del oscilador #define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID #define USB_EP1_TX_ENABLE USB_ENABLE_BULK //Habilitamos EP1(EndPoint1) de entrada para transferencias masivas (bulk)

Page 12: Ejemplo del Protolo Usb

#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //Habilitamos EP1(EndPoint1) de salida para transferencias masivas (bulk) #define USB_EP1_TX_SIZE 8 //Tamaño del buffer para el endpoint de transferencias #define USB_EP1_RX_SIZE 8 //Tamaño del buffer para el endpoint de recepción #include <pic18_usb.h> //Driver para la familia Microchip PIC18Fxx5x #include <Descriptores.h> //Configuración del USB y los descriptores para este dispositivo #include <usb.c> //Libreria con las instrucciones para el manejo del puerto USB #define LEDV PIN_C0 //Se definen los pines que se ocuparán #define LEDR PIN_C1 //los LED's indicadores #define Enciende output_high // así como las instrucciones #define Apaga output_low // para encenderlos y apagarlos //Se definen variables para cada una de las posiciones //de la variable recbuf, la cual es un arreglo de 8 elementos #define B0 recbuf[0] #define B1 recbuf[1] #define B2 recbuf[2] #define B3 recbuf[3] #define B4 recbuf[4] #define B5 recbuf[5] #define B6 recbuf[6] #define B7 recbuf[7] //Se define un nombre para cada uno de los pines del puerto B #define BIT0 PIN_B0 #define BIT1 PIN_B1 #define BIT2 PIN_B2 #define BIT3 PIN_B3 #define BIT4 PIN_B4 #define BIT5 PIN_B5 #define BIT6 PIN_B6 #define BIT7 PIN_B7 int8 pot1; //Rutina principal void main(void) { int1 recbuf[8]; //Se declaran las variables donde seran int1 envia[8]; //almacenados los datos a enviar y recibir //ambas serán de 8 bits

Page 13: Ejemplo del Protolo Usb

Apaga(LEDV); //encendemos led rojo hasta que se Enciende(LEDR); //enumere el dispositivo setup_adc_ports(AN0|VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); usb_init(); //se inicializa el puerto USB usb_task(); //se habilita el periferico usb_wait_for_enumeration(); //la ejecución del código se detiene en este punto hasta que //el dispositivo haya sido enumerado por el host, una vez //que esto ocurra el programa continua su ejecución while (TRUE) //Esta rutina será efectuada incondicionalmente { if(usb_enumerated()) //si el dispositivo ha sido enumerado Apaga(LEDR); //se apaga el LED indicador rojo y se Enciende(LEDV); //enciende el LED verde { while (true){ /*Una vez encendidos los indicadores se ejecuta este ciclo de manera incondicional Para la comunicación desde el PIC a la PC (host): Dependiendo del estado de las entradas (1 ó 0) se almacena su valor en la variable envía, la cual es un arreglo de 8 bits */ set_adc_channel(0);//Habilitación canal0 delay_us(20);//tiempo de retardo para iniciar lectura pot1=read_adc();//Lectura canal0 envia=pot1; usb_put_packet(1, envia,8, USB_DTS_TOGGLE); /*Se envia la variable "envia", la cual tiene un tamaño de 8 bits, por el endpoint 1 */ //Para efectuar la comunicación desde la PC (host) al PIC if (usb_kbhit(1)) { //si el endpoint de entrada contiene datos provenientes del host el //programa continua su ejecución, de lo contrario salta esta sección usb_get_packet(1,recbuf,8); /*Se recibe la información y se almacena en la variable recbuf que es de tipo arreglo, cada una de las posiciones corresponde a cada uno de los bits del puerto B*/ if(B0 == 1) Enciende(BIT0); else Apaga(BIT0);

Page 14: Ejemplo del Protolo Usb

if(B1 == 1) Enciende(BIT1); else Apaga(BIT1); if(B2 == 1) {Enciende(BIT2); } else {Apaga(BIT2);} if(B3 == 1) {Enciende(BIT3); } else {Apaga(BIT3);} if(B4 == 1) {Enciende(BIT4); } else {Apaga(BIT4);} if(B5 == 1) {Enciende(BIT5); } else {Apaga(BIT5);} if(B6 == 1) {Enciende(BIT6); } else {Apaga(BIT6);} if(B7 == 1) {Enciende(BIT7); } else {Apaga(BIT7);} } } } } } //Fin del programa

Page 15: Ejemplo del Protolo Usb

Abrir Puerto

Lectura

Page 16: Ejemplo del Protolo Usb

Escritura de datos

Cerrar Puerto

Page 17: Ejemplo del Protolo Usb

Programa General

Interfaz