Reporte_Global_USB_P5.pdf

March 15, 2018 | Author: Jose Juan Cisneros | Category: Usb, Library (Computing), Microcontroller, Electronics, Electrical Engineering
Share Embed Donate


Short Description

Download Reporte_Global_USB_P5.pdf...

Description

INSTITUTO POLITECNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA EN INGENIERÍA Y TECNOLOGÍAS AVANZADAS

Reporte Global de Servicio Social

Prestador Salas Albarrán Oscar

Carrera Ingeniería Mecatrónica

No. De Boleta 2005640114

Nombre del programa Estudio y desarrollo de aplicaciones basadas instrumentación virtual con LabVIEW®

Responsable de Servicio Social Ing. Ángel Pretelín Ricardez    

Índice  1.  Introducción............................................................................................................................ 1  2.  Objetivo .................................................................................................................................. 3  3.  ¿Qué es la instrumentación virtual? [3].................................................................................. 4  3.1 Elementos de un Instrumento Virtual................................................................................... 4  4.  Introducción a LabVIEW® [4], [5] ........................................................................................... 6  4.1 Creación y ejecución de un instrumento virtual en LabVIEW® [6], [7], [8] ........................ 10  4.2 Creación de SubVI’s [9] ..................................................................................................... 12  5.  Protocolo USB...................................................................................................................... 14  5.1 Versiones del protocolo [13] .............................................................................................. 15  5.2 Tipos de transferencia [12] ................................................................................................ 17  5.3 Enumeración [14]............................................................................................................... 18  5.4 El foro de implementadores USB ...................................................................................... 18  6.  Familia de microcontroladores PIC18FXX5X....................................................................... 19  6.1 El controlador USB [14] .................................................................................................... 19  6.2 Microcontrolador PIC18F4550 ........................................................................................... 20  7.  Bibliotecas dll [16] ............................................................................................................... 22  7.1 Estructura de una DLL de 32 bits [16] ............................................................................... 22  7.2 LabVIEW® y las bibliotecas de enlace dinámico [17]........................................................ 23  8.  Programación del PIC18F4550 ............................................................................................ 30  8.1 Firmware ............................................................................................................................ 30  8.2 Unidad de Control .............................................................................................................. 40  9.  Programación del Instrumento Virtual (VI) ........................................................................... 43  9.1 OpenUSB........................................................................................................................... 44  9.2 WriteUSB ........................................................................................................................... 57  9.3 ReadUSB ........................................................................................................................... 62  9.4 Close USB ......................................................................................................................... 67  9.5 Ejemplo de uso ................................................................................................................. 72  10. 

Trabajo futuro ................................................................................................................... 74 

11. 

Referencias ...................................................................................................................... 75 

12. 

ANEXO A. Terminología USB [22] ................................................................................... 77 

13. 

ANEXO B. Uso del PIC C Compiler ................................................................................. 78  I

14. 

ANEXO C. Instalación del MCHPFSUSB Framework v2.3 .............................................. 86 

15. 

ANEXO D. Código en lenguaje C utilizado en el PIC ....................................................... 91 

16. 

ANEXO E. Diagramas eléctricos ...................................................................................... 99 

15.1 Lista de Materiales........................................................................................................ 100  17. 

ANEXO F. Instalación de la tarjeta de adquisición ......................................................... 101 

 

II

1.

Introducción 

Durante los últimos años, los desarrollos tecnológicos han tenido un gran avance, poniendo a disposición de los consumidores equipos de cómputo con grandes capacidades de procesamiento, así como una gran capacidad de almacenaje de información y, por supuesto, velocidades de transferencia de datos cada vez más altas. Desde el punto de vista de la ingeniería, las mediciones y el análisis de datos son actividades de suma importancia, sin embargo existe una limitación al momento de efectuar cualquier medición: las características del instrumento de medición, las cuales limitan el tipo y características de las magnitudes físicas o datos que se desean medir. De manera paralela al ya mencionado desarrollo de los equipos de cómputo, se buscó la manera de integrar las altas capacidades de procesamiento y almacenaje con las actividades propias de la ingeniería, surgiendo de esta forma la Instrumentación Virtual. Esta nueva forma de realizar mediciones, ha terminado con la rigidez de los equipos de medición en los cuales era necesario conformarse con las características presentes de fábrica, para dar lugar a instrumentos al gusto del usuario. Una característica sobresaliente de esta nueva generación de instrumentos es que son capaces de evolucionar de acuerdo a las necesidades de medición del usuario con poco o nulo desembolso económico; Siendo la mayor inversión la hecha para adquirir las herramientas de desarrollo de los instrumentos virtuales. Lo que es más, los instrumentos virtuales son capaces de almacenar y analizar los datos dentro de sí mismos [1]. Una de las herramientas para el desarrollo de estos instrumentos virtuales, es LabVIEW®, el cual es un software desarrollado por National Instruments®. En el presente documento se muestra el desarrollo de un instrumento virtual capaz de realizar la adquisición y envío de datos entre una PC y un microcontrolador, a través del puerto USB, el cual se realizó dentro del programa de servicio social titulado “Estudio y desarrollo de aplicaciones basadas instrumentación virtual con LabVIEW®”. Se decidió realizar el proyecto utilizando el puerto USB, por sus grandes prestaciones y cualidades, algunas de las cuales se pueden observar en las siguientes tablas. Tabla No. 1. Configuración de diferentes tipos de protocolos de transmisión de datos [2].

BUS

Configuración1

Ethernet / LXI

Bueno

GPIB

Mejor

PCI

Mejor

Notas Configuración de la IP y subred Búsqueda en el bus por el instrumento Necesidad de apagar el equipo (PC) para detectar el instrumento

1

La evaluación se refiere a la facilidad con la que se configura el dispositivo para su uso con el BUS seleccionado.

1

PCI Express

Mejor

USB

La mejor

Necesidad de apagar el equipo (PC) para detectar el instrumento Autodetección y autoconfiguración del instrumento

Tabla No. 2.Comparación del ancho de banda para distintos protocolos[2].

BUS GPIB USB Ethernet / LXI PCI PCI Express

Ancho de banda ideal (MB/s) 1.8 (488.1) 8 (HS488) 60 (Hi-Speed USB) 12.5 (Fast) 125 (Gigabit) 132 250 (x1) 4000 (x16)

Distribución Compartido Compartido Compartido Compartido Dedicado por dispositivo y dirección

Como puede apreciarse, las características del protocolo USB, lo hacen un excelente candidato para efectuar la comunicación y transmisión de datos de un instrumento virtual, que es el objeto del presente proyecto. Para ello, se presenta en primer lugar el objetivo del proyecto, para enseguida mostrar una breve introducción al software LabVIEW®, al puerto USB y a las bibliotecas de enlace dinámico, las cuales son la parte central del proyecto. Una vez introducidos estos conceptos, se documenta la realización del instrumento virtual, así como la programación del firmware del microcontrolador y el programa a ejecutar por parte del mismo. Finalmente, se pueden encontrar los anexos del proyecto, que contienen información importante sobre el uso de las herramientas utilizadas, así como códigos y diagramas referentes al mismo.

2

2.

Objetivo 

El objetivo que se persigue con el programa de Servicio Social titulado “Estudio y desarrollo de aplicaciones basadas instrumentación virtual con LabVIEW®” es “Estudiar y desarrollar aplicaciones basadas en instrumentación virtual y que tengan una relación directa con las carreras cursadas en la UPIITA del IPN para poder sentar las bases de una línea de investigación”. En el caso del presente proyecto, se realizó un estudio del software LabVIEW® de National Instruments® como una herramienta para el desarrollo de instrumentos virtuales, para posteriormente desarrollar un instrumento capaz de realizar una comunicación de tipo bidireccional entre una computadora y un microcontrolador (PIC). Dicha comunicación se realizará empleando el puerto USB y la información se controlará a través de LabVIEW®.

3

3.

¿Qué es la instrumentación virtual? [3] 

El concepto de instrumentación virtual nace a partir del uso del computador personal (PC) como "instrumento" de medición de magnitudes o señales tales como temperatura, presión, caudal, etc. Es decir, el PC comienza a ser utilizado para realizar mediciones de fenómenos físicos representados en señales de corriente (Ej. 4-20mA) y/o voltaje (Ej. (0-5Vdc). Sin embargo, el concepto de "instrumentación virtual" va más allá de la simple medición de corriente o voltaje, sino que también involucra el procesamiento, análisis, almacenamiento, distribución y despliegue de los datos e información relacionados con la medición de una o varias señales específicas. Es decir, el instrumento virtual no se conforma con la adquisición de la señal, sino que también involucra la interfaz hombre-máquina, las funciones de análisis y procesamiento de señales, las rutinas de almacenamiento de datos y la comunicación con otros equipos. Veamos un ejemplo; el osciloscopio tradicional tiene una funcionalidad ya predefinida desde la fábrica donde lo diseñan, producen y ensamblan. Esto implica que la funcionalidad de este tipo de instrumento es definida por el fabricante del equipo, y no por el usuario mismo. El término "virtual" nace precisamente a partir del hecho de que cuando se utiliza el PC como "instrumento" es el usuario mismo quién, a través del software, define su funcionalidad y "apariencia" y por ello decimos que "virtualizamos" el instrumento, ya que su funcionalidad puede ser definida una y otra vez por el usuario y no por el fabricante. El instrumento virtual es definido entonces como una capa de software y hardware que se le agrega a un PC en tal forma que permite a los usuarios interactuar con la computadora como si estuviesen utilizando su propio instrumento electrónico "hecho a la medida".

3.1 Elementos de un Instrumento Virtual  Para construir un instrumento virtual, se requiere un PC, una tarjeta de adquisición de datos con acondicionamiento de señales (PCMCIA, ISA, XT, PCI, etc.) y el software apropiado, estos tres son los elementos clave en la conformación de un instrumento virtual, teniendo un chasis de acondicionamiento de señales como elemento opcional. Se dice que el "acondicionamiento de señales" es opcional, porque dependiendo de cada señal y/o aplicación, se puede o no requerir amplificación, atenuación, filtraje, aislamiento, etc. de cada señal. Si la señal está en el rango de los +/- 5Vdc y no se requiere de aislamiento o filtraje, la misma puede ser conectada directamente a la tarjeta de adquisición de datos. En el instrumento virtual, el software es la clave del sistema, a diferencia del instrumento tradicional, donde la clave es el hardware. Con el sistema indicado anteriormente, podríamos construir un osciloscopio "personalizado", con la interfaz gráfica que uno desee, agregándole inclusive más funcionalidad que cualquier instrumento comercial. Sin embargo, este mismo sistema puede también ser utilizado en la medición de temperatura, o en el control de arranque y paro de un motor. Es allí donde radica uno de los principales beneficios del instrumento 4

virtual, su flexibilidad. Este instrumento virtual no sólo permitiría visualizar la onda, sino que a la vez permite graficar su espectro de potencia en forma simultánea. ¿Podría hacer algo así con un instrumento convencional? Para finalizar, la siguiente tabla nos indica algunas de las principales diferencias entre el instrumento convencional o tradicional, y el instrumento virtual: Tabla No. 3. Tabla comparativa instrumento virtual vs tradicional [3].

Instrumento Tradicional                            Definido por el fabricante  Funcionalidad  específica,  con  conectividad limitada.  El hardware es la clave. 

Instrumento Virtual  Definido por el usuario  Funcionalidad  ilimitada,  orientado  a  aplicaciones, conectividad amplia.  El software es la clave 

Alto costo/función 

Bajo  costo/función,  variedad  de  funciones, reusable.  Arquitectura "cerrada"  Arquitectura "abierta".  Lenta  incorporación  de  nuevas  Rápida  incorporación  de  nuevas  tecnología.  tecnologías, gracias a la plataforma PC.  Bajas economías de escala, alto costo de  Altas economías de escala, bajos costos  mantenimiento.  de mantenimiento.  La flexibilidad, el bajo costo de mantenimiento, la reusabilidad, la personalización de cada instrumento, la rápida incorporación de nuevas tecnologías, el bajo costo por función, el bajo costo por canal, etc. son algunos de los muchos beneficios que ofrece la instrumentación virtual. La instrumentación virtual puede también ser implementada en equipos móviles (laptops), equipos distribuidos en campo (RS-485), equipos a distancia (conectados vía radio, Internet, etc.), o equipos industriales (NEMA 4X, etc.). Existe una tarjeta de adquisición de datos para casi cualquier bus o canal de comunicación en PC (ISA, PCI, USB, serial RS-232/485, paralelo EPP, PCMCIA, CompactPCI, PCI, etc.), y existe un driver para casi cualquier sistema operativo (WIN 3.1/95/NT, DOS, Unix, MAC OS, etc.), lo cual permite extender el uso de la instrumentación virtual a un mayor número de aplicaciones.

5

4.

Introducción a LabVIEW® [4], [5] 

LabVIEW®, acrónimo de Laboratory Virtual Instrument Engineering Workbench, es un lenguaje de programación gráfico que emplea iconos en lugar de líneas de texto para la creación de aplicaciones, el cual ha sido desarrollado por National Instruments®. A comparación de los programas basados en texto, donde las instrucciones determinan la ejecución del programa, en LabVIEW® el flujo de datos determina la ejecución del programa. Los programas desarrollados en LabVIEW® son llamados Instrumentos Virtuales (o VI’s por sus siglas en inglés). Su apariencia y operación puede emular el comportamiento de un instrumento físico como un osciloscopio o un multímetro. Un VI consta de tres componentes: + Panel Frontal: Sirve como interfaz con el usuario + Diagrama de Bloques: Contiene el código gráfico que define la funcionalidad del VI. + Paleta de conectores e iconos: Identifica la interfaz del VI y permite utilizarlo y conectarlo a otros VI’s

Panel Frontal Es la interfaz del usuario con el instrumento virtual. La siguiente figura muestra un ejemplo de este panel:

Figura 1. Aspecto del panel Frontal de LabVIEW®.

6

Se puede apreciar el aspecto del panel frontal, junto con la paleta de controles, que sirve para colocar los elementos que el usuario podrá manipular desde el panel frontal. Este panel puede contener dos tipos de iconos: Controles, como perillas, botones, interruptores, que permiten al usuario introducir información al programa e indicadores, tales como LED’s, gráficas, barras, que permiten mostrar información al usuario del VI. La paleta de controles

Figura 2. Paleta de controles.

Permite agregar al panel frontal los diferentes controles, indicadores o elementos decorativos necesarios para la realización y personalización del instrumento virtual. Aparece únicamente en el panel frontal. Para abrirla, basta con dar clic en el menú View y posteriormente seleccionar la opción Controls Palette.

Diagrama de Bloques Una vez que el usuario ha terminado de construir el panel frontal, se añade el código necesario para el correcto funcionamiento a través de este panel. El cuál tiene el aspecto mostrado en la siguiente figura:

7

Figura 3. Aspecto del diagrama de bloques de LabVIEW®.

En la figura anterior también puede verse la paleta de funciones, mediante la cual se pueden añadir diferentes funciones, desde matemáticas hasta de procesamiento de señales al instrumento virtual (VI). Para ello, se conectan los controles por medio de cables, utilizando la herramienta carrete. Paleta de funciones

Figura 4. Paleta de funciones.

Sirve para agregar las funciones o código al programa, el cual determinará el funcionamiento del instrumento virtual. Esta paleta únicamente aparece al trabajar en el diagrama de bloques. 8

Para abrir la paleta de funciones basta con dar clic en el menú View, y seleccionar la opción Functions Palette. Paleta de herramientas

Figura 5. Paleta de herramientas.

Aparece tanto en el diagrama de bloques como en el panel frontal. Contiene las herramientas necesarias para realizar el cableado de los elementos (iconos), así como para seleccionarlos, agregar texto o cambiar los colores de los mismos. Para abrirla se da clic en el menú View y se selecciona la opción Tools Palette. Los comandos de la paleta de herramientas son los siguientes:

Herramienta de operación. Nos permite modificar los valores o seleccionar texto de un control.

Herramienta de posicionamiento y redimensión. Nos permite seleccionar los objetos arrastrarlos a una posición deseada y modificar sus dimensiones.

Herramienta de etiquetado. Permite editar textos y crear etiquetas libres. La herramienta de etiquetado se convierte en cursor al crear etiquetas libres.

Herramienta de cableado. Enlaza los objetos del panel, mediante cableado.

Herramienta de menú. Despliega el menú rápido de opciones de cada objeto.

Herramienta de desplazamiento. Mueve la pantalla del panel en el que se encuentra trabajando.

Herramienta de punto de paro. Establece un punto de paro de ejecución para nuestro programa. 9

Herramienta de prueba. Muestra el flujo de nuestro programa.

Herramienta para copia de color. Coloca el color seleccionado en la pantalla en la paleta de color actual.

Herramienta para colorear. Permite cambiar el color de los elementos presentes tanto en el panel frontal, como en el diagrama de bloques, así como el color de fondo.

4.1 Creación y ejecución de un instrumento virtual en LabVIEW® [6], [7], [8]  Para la creación de los instrumentos virtuales en el entorno gráfico de programación ofrecido por LabVIEW®, se requiere la colocación de los elementos que permitirán la entrada y la salida de datos, entendidos estos como todos aquellos elementos que nos permitirán ingresar valores a nuestro instrumentos, así como los que nos permitirán visualizar el resultado de cualquier operación. Para ello, se emplea la paleta de controles dentro del panel frontal y se colocan los que se estimen necesarios. Cada vez que se coloca un nuevo objeto en el panel frontal, se coloca también y de forma automática una nueva terminal en el diagrama de bloques. Cada bloque colocado tanto en el diagrama de bloques como en el panel frontal proporciona información sobre el tipo de dato que maneja a través de su color, pudiendo ser naranja, verde, azul o algún otro. Una vez que se han colocado todos los controles e indicadores necesarios en el panel frontal, puede procederse a realizar la programación del instrumento desde el diagrama de bloques utilizando la paleta de funciones. Esta paleta nos permitirá colocar funciones de diferentes tipos, pudiendo ser matemáticas, booleanas, arreglo o estructuras conocidas en lenguajes de programación basados en texto como las sentencias for, while, etc. LabVIEW® permite incluso el uso de funciones basadas en lenguaje C y código de MATLAB. Cabe mencionar que es posible diferenciar por su aspecto los controles de los indicadores. Los controles tienen una flecha en el lado derecho y tienen un borde grueso. Por otro lado, los indicadores tienen una flecha en el lado izquierdo y un borde fino. Después de que se han colocado las funciones adecuadas en el diagrama de bloques, se unen éstas con los controles e indicadores previamente colocados haciendo uso de la herramienta de cableado. Es recomendable que al momento de realizar el cableado, se tome en cuenta el color de las terminales, de modo que se unan terminales del mismo tipo, por ejemplo, terminales naranjas (de tipo doble) con terminales naranjas. Existen ciertas reglas lógicas al momento de efectuar el cableado: Cada cable debe tener una (pero solo una) fuente (o control), y cada cable puede tener varios destinos (o indicadores). 10

En las siguientes imágenes se muestra un ejemplo de instrumento virtual, en el cual se toman datos de A y B y se pasan los valores a una función de adición y una función de resta. Los resultados de dichas operaciones se muestran en los indicadores apropiados.

Figura 6.Panel Frontal para realizar la suma y resta de A y B.

Figura 7. Diagrama de bloques para realizar la suma y resta de A y B.

Cuando ya se ha terminado de realizar el cableado de los diversos componentes del instrumento virtual, podemos ejecutarlo, para ello se utiliza la barra de herramientas de estado, presente tanto en el panel frontal como en el diagrama de bloques y de la cual a continuación se explicaran sus principales componentes.

Botón de ejecución (Run) Botón de ejecución continua (Continuous Run) Cancelación de ejecución (Abort Execution) Botón de pausa Botón de ejecución resaltada (disponible solo en el diagrama de bloques) 11

El resto de los botones de esta barra sirve para alinear, distribuir y dar tamaño a los elementos colocados, así como configurar el tipo y tamaño de fuente de las etiquetas utilizadas tanto en el panel frontal como en el diagrama de bloques, lo cual nos permitirá dar un mejor aspecto al instrumento. Para comprobar el funcionamiento del VI bastará con oprimir el botón de ejecución, en caso de que exista algún error, se mostrará una ventana con una pequeña descripción del mismo la cual permitirá corregirlo. En LabVIEW® se sigue un modelo de flujo de datos al momento de ejecutar los VI’s. Un nodo o función del diagrama de bloques se ejecuta cuando todas sus entradas están disponibles. Cuando se completa la ejecución en dicho nodo, suministra datos a sus terminales de salida, los cuales estarán disponibles en la entrada correspondiente si la hubiera.

4.2 Creación de SubVI’s [9]  LabVIEW® es un programa muy versátil que nos permite crear instrumentos virtuales que puedan ser llamados desde otros instrumentos, los cuales son llamados subVI’s. A estos subVI’s es posible definirles la configuración de sus terminales y crearles un icono personalizado, para ello basta con hacer doble click sobre el icono ubicado en la parte superior derecha del panel frontal, para poder ver el editor de iconos.

Figura 8. Ventana del Editor de Íconos

En esta ventana, podemos cambiar el aspecto del icono que distinguirá a los subVI’s creados. Pueden realizarse creaciones propias o importar imágenes desde cualquier archivo de imagen. 12

Para editar las terminales del subVI, es necesario dar click con el botón derecho del mouse y seleccionar la opción Show connector con ello el icono se transformará en un patrón, llamado Connector Pane, como el mostrado a continuación:

En el caso de que la configuración del conector no satisfaga los requerimientos del VI, es posible cambiarla, para ello se da un click derecho sobre el patrón mostrado y del menú mostrado se selecciona la opción Patterns.

Figura 9. Patrones disponibles para el conector del subVI

Cabe destacar que el número de terminales necesarias, corresponde al número total de controles e indicadores presentes en el subVI. Para finalizar la construcción del subVI, se conectan los controles y los indicadores al patrón de terminales seleccionado a través de la herramienta de cableado. Lo mostrado en esta Introducción a LabVIEW® son únicamente los conceptos básicos que se estiman necesarios para la realización del presente proyecto, sin embargo se recomienda consultar la ayuda y ejemplos proporcionados con el software para poder profundizar en el manejo del mismo.

13

5.

Protocolo USB 

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 [11]. 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 conexiones 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 normas que regulan la versión 1.1 y 2.0 se distinguen dos tipos de conectores [12]: • 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).  

Conector Tipo B

Conector Tipo A

14

La distribución de los cables en los conectores es de la siguiente forma [19]: Tabla No. 4. Distribución de los pines en los conectores USB

No. De Pin

Nombre

Descripción

1

VBUS

2

D-

Data-

3

D+

Data+

4

GND

Fuente de alimentación +5Vdc máx 100mA

Conexión a tierra (Ground)

El cable VBUS puede proporcionar una tensión nominal de 5 V de corriente directa para 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.

5.1 Versiones del protocolo [13]  Desde el surgimiento del USB en el año de 1995, se han desarrollado diferentes versiones del protocolo, las cuales se muestran a continuación. -

USB 1.0/1.1: Ofrece 2 modos de comunicación; de baja velocidad diseñado para periféricos “directos” (teclados, mouse, etc…) a una velocidad de 1.5 Mbps y la segunda, de alta velocidad, diseñada para otros tipos de periféricos (cámaras web, cámaras digitales, etc…) a una velocidad de 12Mbps. Los dispositivos fabricados con apego a este protocolo portan el siguiente logotipo:

15

-

USB 2.0: Se mejoro desde el protocolo anterior en su interfaz con respecto a la transferencia de datos, ya que llego a la cifra de 480Mbps, y fue diseñada para grandes transferencia de datos hacia los dispositivos (discos duros, pendrives, etc.) Su logotipo es el siguiente

La compatibilidad entre USB 1.0, 1.1 y 2.0 está garantizada. Sin embargo, el uso de un dispositivo USB 2.0 en un puerto USB de baja velocidad (1.0 ó 1.1) limitará la velocidad a un máximo de 12 Mbps. Además, es probable que el sistema operativo muestre un mensaje que indique que la velocidad será restringida.

-

WUSB (Wireless USB): Es una extensión del USB 2.0 con las capacidades de una transferencia inalámbrica, con una velocidad de 480Mbps al estar a menos de 3 metros de distancia y de 100 Mbps al estar a menos de 100 metros. Su logotipo es el siguiente.

-

USB On-The-Go: Siendo una mejora de la interfaz USB, permite elegir el estado de cada puerto USB, y es posible transferir los datos desde un puerto USB actuando como servidor hasta otro sin la necesidad de un ordenador, y también es posible cambiar en cualquier momento el perfil de servidor a dispositivo o viceversa. Su logotipo es el siguiente

-

USB 3.0: Aun en fase de prueba. Los desarrolladores de este protocolo prevén innovar al incluir la fibra óptica, lo cual elevara hasta 4.8 Gbps la tasa de transferencia, y de manera inalámbrica en forma de Wireless USB se planea lograr una transferencia de hasta 1 Gbps.

16

5.2 Tipos de transferencia [12]  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.

17

5.3 Enumeración [14]  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.

5.4 El foro de implementadores USB  Uno de los datos que debe conocer el host para poder enumerar correctamente a los dispositivos es el fabricante del dispositivo y el tipo o modelo de dispositivo conectado. Todos los dispositivos con conexión vía puerto USB cuentan con estos números, que se denominan Vendor ID (VID), y Product ID (PID), ambos son números hexadecimales, el primero de ellos define el fabricante del dispositivo y el segundo es exclusivo del modelo de dispositivo. Esto quiere decir que, por ejemplo, una cámara fabricada por cierta marca tendrá un determinado Product ID, mientras que una impresora fabricada por la misma compañía tendrá un Product ID distinto, aunque ambos dispositivos tendrán el mismo Vendor ID. Los números que identifican a cada productor (VID) son asignados por el foro de implementadores USB (USB-IF2), a los productores que forman parte de este foro, o a cualquier persona que cubra los costos administrativos establecidos. Cada productor que cuenta con su VID puede asignar a los dispositivos que produce un único PID. El objetivo de asignar los VID y PID es poder listar todos los números de identificación de los dispositivos en un archivo para que los sistemas operativos puedan identificar y enumerar adecuadamente los diversos dispositivos que se conecten en el host que ejecuta dicho sistema operativo.

2

Puede consultarse su página web en http://www.usb.org

18

6.

Familia de microcontroladores PIC18FXX5X 

Cuando se desarrolla una aplicación capaz de transmitir datos vía puerto USB, debe considerarse la presencia de un controlador USB, dicho controlador debe detectar y responder a las peticiones realizadas por el puerto, además de proporcionar datos por el bus y recibirlos. Un microcontrolador o un circuito integrado de aplicación específica (ASIC, por sus siglas en inglés) cumplen perfectamente con este cometido. En el mercado existen una gran variedad de chips capaces de realizar estas acciones. Las diferencias principales estriban en la cantidad de líneas de código necesarias para crear el firmware del dispositivo. El firmware, se refiere a la información contenida en el dispositivo que permite responder a las peticiones de información del host referente al VID, PID, velocidad, versión del protocolo, etc. Además de esto, debe considerarse la posibilidad de que el chip contenga una unidad de procesamiento (CPU) o por el contrario, que si se desea tener acceso a una unidad de este tipo, ésta tenga que conectarse de forma externa al chip.

6.1 El controlador USB  [14]  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

19

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.

6.2 Microcontrolador PIC18F4550  Todas las características previamente descritas podemos encontrarlas en una familia de chips, se trata de la familia de microcontroladores PIC18FXX5X de Microchip Technology, la cual incorpora un controlador USB capaz de trabajar a baja y alta velocidad. Para el desarrollo del presente proyecto, se selecciono el microcontrolador PIC18F4550, cuyas características principales se enlistan a continuación:

-

Memoria Flash programable de 32 Kbytes.

-

2048 bytes de memoria RAM

-

256 bytes de memoria EEPROM para datos

-

35 pines de entrada/salida programables distribuidos en cinco puertos (A,B,C,D,E)

-

Convertidor Analógico-Digital de 10 bits.

20

La siguiente figura muestra la disposición de las terminales del microcontrolador.

Figura 10. Disposición de pines del microcontrolador PIC18F4550 [15].

Para la comunicación vía USB los pines a utilizar serán el 23 (D-) y el 24 (D+).

21

7.

Bibliotecas  dll [16] 

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 de instalación de alguna aplicación. Tabla No. 5. Características de las dll.

Ventajas

Inconvenientes

Una función definida dentro de una DLL está disponible para cualquier aplicación Windows®.

Tienen que estar presentes en la carpeta del sistema antes de ser utilizadas

Se reduce el tamaño de las aplicaciones que utilizan la DLL por la reutilización de su código.

El tiempo de acceso a la DLL por parte de la aplicación que la usa es más lento.

Mejora en el tiempo de compilación y/o carga de la aplicación (debido al menor tamaño del código) Ahorro de espacio en disco. Las DLL’s son independientes de la aplicación

7.1 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. 22

Es importante conocer lo anterior debido a que LabVIEW® nos permite hacer uso de estas bibliotecas dinámicas como se muestra a continuación:

7.2 LabVIEW® y las bibliotecas de enlace dinámico [17]  LabVIEW® dentro de sus funciones, contiene un nodo para llamar a las bibliotecas de enlace dinámico (dll’s). Se accede a él desde la paleta de Funciones/Conectivity/Libraries & Executables/Call Library Function Node

Figura 11. Ubicación del Call Library Function Node en la paleta de funciones.

Call Library Function Node

Figura 12. Terminales del Call Library Function Node.

Permite realizar el llamado de una función contenida dentro de una dll de manera directa. El “Call Library Function Node”, soporta un amplio número de tipos de información y convenciones de llamado, además, es expandible y muestra los tipos de información para las entradas y salidas conectadas.

23

Descripción de las terminales del Call Library Node [18] path in: Identifica la ruta de la DLL que se desea llamar. Es necesario colocar una marca en la ruta especificada sobre el diagrama en el “Call Library Function dialog box” para esta entrada y que aparezca en el subpanel conector. Error in: Describe las condiciones del error que ocurren antes del VI o la función que se está ejecutando, el valor por defecto es sin error. Si un error ocurre antes de este VI o antes de que se ejecute la función, el VI pasa el valor de error in a error out. Param 1…n: son ejemplos de parámetros de entrada para la función de la biblioteca. Path out: regresa la ruta de la DLL. Se debe colocar una marca en la ruta especificada. Error out: contiene información del error. Si la entrada error in indica que un error ocurrió antes de que el VI o la función se ejecuten, error out contendrá la misma información del error. Return value: es un ejemplo del valor regresado por la función de la biblioteca. Param 1..n output: son ejemplos de los parámetros de salida de la función de la librería.

Cuadro de dialogo del Call Library Function Para configurar la función que llamaremos de la DLL, se utiliza el Call Library Function dialog box, para ello, es necesario colocar un Call Library Function Node y a continuación presionar doble click sobre él. Usar este cuadro de dialogo permite especificar la librería, la función, los parámetros, el valor regresado por la función, y la convención de llamado de la función o librería compartida. Una vez que se introducen los valores requeridos y se presiona el botón OK del cuadro de dialogo, LabVIEW® actualiza el objeto en el diagrama de bloques. El objeto refleja la configuración realizada, mostrando el número de terminales indicados, y la configuración de las terminales. En la siguiente figura se muestra el cuadro de dialogo y se explicará cómo funcionan sus elementos.

24

Figura 13. Cuadro de dialogo del Call Library Function Node (Pestaña Function).

Pestaña Function: Esta pestaña nos sirve para configurar la función que será llamada por el Call Library Function Node, contiene lo siguientes componentes:

-Library name or path: Especifica el nombre de la librería o ruta para la función que se esté llamando. Es posible introducir sólo el nombre de la librería si ésta se encuentra en la dirección de búsqueda del sistema, en caso contrario, será necesario introducir la ruta o dirección completa de la ubicación de la librería. -Specify path on diagram: Al activarlo, permite ingresar el nombre o la dirección de la librería desde el panel frontal a través de un control. -Function name: Especifica el nombre de la función que se está llamando. -Thread: Controla si se ejecuta sobre la interfaz de usuario o si es re-operado. El valor por defecto es Run in UI Thread. *Run in UI Thread: Controla si el objeto se ejecuta en la interfaz de usuario. *Run in any thread: Controla si el objeto es re-operado. Para utilizar esta función es necesario asegura que pueda hacer varas funciones simultáneamente. -Calling convention: Especificar la convención de llamado para la función, es decir, la forma en que será tratado el código. El valor por defecto es C. * stdcall (WINAPI)-Controla si el objeto usa el formato de llamado estándar de Windows. *C-Controla si el objeto usa la convención de llamado de tipo __cdecl. - Function prototype: Muestra el prototipo, o estructura, en C para la función.

Pestaña Parameters: En esta pestaña se configura los parámetros con los que se llamará a la función a través del Call Library Function Node. Es posible configurar la lista de parámetros 25

utilizando los botones que aparecen del lado derecho. Return type es un parámetro requerido que no se puede borrar.

Figura 14. Cuadro de dialogo del Call Library Function Node (pestaña Parameters).

Botones Add a parameter: Agrega un parámetro debajo del parámetro seleccionado de la lista de parámetros. Delete the selected parameter: Elimina el parámetro seleccionado de la lista de parámetros. Move the selected parameter up one: Mueve el parámetro seleccionado un nivel arriba en la lista de parámetros, lo cual modifica el orden de los parámetros en el Function prototype. Move the selected parameter down one: Mueve el parámetro seleccionado un nivel abajo en la lista de parámetros, lo cual modifica el orden de los parámetros en el Function prototype.

- Current parameter: Permite configurar el funcionamiento del parámetro seleccionado. *Name: Especifica el nombre del parámetro. *Type: Especifica el tipo de información del parámetro, pudiendo ser de tipo numérico, arreglo, cadena de caracteres, waveform, digital waveform, datos de tipo digital, controles ActiveX, etc. Cada tipo de dato mostrará diferentes propiedades que pueden ser modificadas, como la longitud, precisión, tamaños máximo y mínimo, etc.

26

Pestaña Callbacks: Se usa la ficha Callbacks para especificar la función a llamar en un tiempo predefinido. Las funciones permiten inicializaciones, actualizaciones, y/o limpieza de la información para la DLL o librería compartida a partir del Call Library Function Node que se esté configurando.

Figura 15. Cuadro de dialogo del Call Library Function Node (pestaña Callbacks).

Esta pestaña contiene los siguientes componentes: • Reserve (Reservado): Especifica la función a llamar y reserva tiempo para cada nodo y espacio de información específica de re-operación del VI. • Unreserve (Sin Reservar): Especifica la función a llamar sin reservar tiempo para cada nodo de espacio de información específica de re-operación del VI. Se usa esta llamada para guardar o analizar la información y llevar a cabo operaciones de limpieza. • Abort (Abortar): Especifica la función a llamar si se desea abortar un VI mientras el llamado a una DLL se encuentra en progreso. Si el Call Library Function Node se encuentra ejecutándose en el hilo UI, el proceso de abortar no es llamado. Se usa la llamada de abortar para guardar o analizar la información y llevar a cabo operaciones de limpieza. • Prototype for these procedures: Despliega el prototipo C para el proceso de llamada definido por el usuario. Cada función pasa por un parámetro de un puntero de datos específicos (InstanceDataPtr). Este parámetro permite inicializar y acceder a la información para cada instancia del Call Library Function Node que puede ser pasado a cualquier llamada de función de nodos.

27

Pestaña Error Checking: Se usa para especificar el nivel de revisión en el error para el Call Library Function Node.

Figura 16. Cuadro de dialogo del Call Library Function Node (pestaña Error Checking).

Esta pestaña contiene los siguientes componentes: • Nivel de Revisión del Error (Error Checking Level): Contiene las siguientes opciones. + Maximo (Maximum): Habilita el máximo nivel de revisión de error para la llamada. Si habilita el nivel máximo de revisión de error la llamada regresara un error si la convención de llamada que selecciono en la ficha de función no coincide con la convención de llamada que está usted llamando en la librería compartida o la DLL. El nivel máximo de revisión de error también regresa una advertencia si la función ha sido llamada en la librería compartida o la DLL escribe más allá del espacio reservado para la cadena o parámetro de arreglos. Esta opción reduce la velocidad de ejecución del programa a la vez que incrementa la memoria utilizada por la llamada. Por tanto, se recomienda seleccionar esta opción solo cuando se está corrigiendo la configuración del Call Library Function Node. + Predeterminado (Default): Habilita el nivel de revisión de error predeterminado para el Call Library Function Node. El nivel predeterminado permite a LabVIEW® recuperarse de excepciones que ocurren mientras se ejecuta la llamada a la librería compartida o a la DLL. + Deshabilitado (Disabled): Deshabilita la revisión de errores para el Call Library Function Node. Deshabilitando la revisión de errores para mejorar la velocidad de ejecución. De cualquier forma algunos errores pueden ocasionar paros irregulares de LabVIEW®. Antes de deshabilitar la revisión de error, asegúrese de que la función a la que se hace referencia no tenga excepciones.

28

En resumen, se puede considerar al Call Library Function Node como las salidas y entradas de una función, de las cuales es posible usar solo una o ambas terminales. En el caso de que no se desee que el nodo genere un valor de retorno (return value), la primera terminal quedará sin conectarse. Cada par de terminales corresponden a un parámetro en la lista de parámetros de la función en orden descendente. Se pasa o introduce un valor a la función al conectar en las terminales del lado izquierdo cualquier control o constante y se lee el valor del parámetro después de la función llamada, al conectar desde la terminal derecha del nodo.

Figura 17. Entradas y salidas del Call Library Function Node.

29

8.

Programación del PIC18F4550 

Como se ha mencionado previamente, se selecciono el microcontrolador PIC18F4550 para el desarrollo del proyecto. Para su programación, se empleó el software PIC C Compiler, en el Anexo B se muestra una breve explicación del uso del mismo. Los códigos generados pueden localizarse en el Anexo D, en esta sección únicamente se explican algunos aspectos relevantes relacionados con los códigos utilizados. En primer lugar, es necesario mencionar que se requiere de dos códigos. Uno de ellos, será utilizado como el firmware, por lo que habrá de guardarse con extensión *.h al momento de crearse. Este archivo contiene los descriptores del controlador USB, lo que permitirá al host establecer la comunicación. El código concentra los elementos requeridos por la norma USB 2.0. El segundo archivo requerido es el correspondiente a la unidad de procesamiento, y contendrá todas las rutinas o actividades que deberá realizar el microcontrolador. Este código se guardará con extensión *.c. Ambos archivos se agregaran a un proyecto en el software PIC C Compiler para generar el archivo hexadecimal (*.hex) que se grabará en el microcontrolador3.

8.1 Firmware  Se conoce con este nombre a todas aquellas instrucciones que forman parte del dispositivo y que le permiten establecer la comunicación con otro equipo, en este caso con el host. En el caso del microcontrolador a utilizar en el presente proyecto, el firmware se encuentra en el archivo que ha sido nombrado descriptores.h. Para la construcción de este código, se tomo como base el archivo usb_desc_scope.h, que se instala junto con el software PIC C Compiler y se encuentra localizado en la ruta C:\Program Files\PICC\Drivers. Dicho código es un ejemplo de la configuración de los descriptores necesarios para efectuar una transmisión de información de forma masiva (bulk). Para poder utilizar el archivo usb_desc_scope.h, es necesario conocer la función de cada una de las líneas de código que lo componen, lo que permitirá posteriormente modificarlas. En las siguientes páginas, se presentan fragmentos de código del archivo descriptores.h, y en seguida de los mismos la tabla correspondiente al descriptor mencionado, la cual ha sido tomada del Capítulo 9 de las especificaciones USB 2.04. La finalidad de presentar estas tablas es dar una guía al lector sobre los valores que pueden ser modificados en el archivo de descriptores dependiendo del tipo de dispositivo a desarrollar.

3

En el Anexo D se encuentra una guía para el uso del software y la creación de proyectos en el mismo.

4

Las especificaciones USB 2.0 pueden consultarse en el foro de implementadores USB (USB-IF) en su página web http://www.usb.org.

30

21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:   

   //Descripción de la configuración     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,           //Tamaño de datos que regresa está configuración           1,                                 //Número de interfaces soportadas por el dispositivo           0x01,                              //Identificador de esta configuración           0x00,                              //índice de la cadena que describe esta configuración           0xC0,                              //bit6=1: autoalimentado (self‐powered)           //bit5=1: activación remota           //bits 0‐4: reservados           //bit7=1           0x32,                              //energía máxima requerida por el puerto           //(maximum milliamperes/2)  (0x32 = 100mA) 

  Tabla No. 6. Descriptor estándar para la configuración del dispositivo (Tabla 9-10 Norma USB 2.0)

Offset

Campo

Tamaño

Valor

Descripción

0

bLength

1

Número

Tamaño de este descriptor en bytes.

1

bDescriptorType

1

Constante

Tipo de descriptor, de configuración.

2

wTotalLength

2

Número

4

bNumInterfaces

1

Número

5

bConfigurationValue

1

Número

6

iConfiguration

1

Índice

7

bmAttributes

1

Bitmap

Longitud total de los datos regresados por la configuración, incluyendo la longitud de todos los descriptores (configuración, interfaz,endpoint, etc.) Número de interfaces que soporta ésta configuración.  Valor con el que se seleccionará esta configuración. Índice de la cadena de caracteres del descriptor para esta configuración. Configuración: D7: Reservado (poner a 1) D6: Auto-Alimentación D5: Activación Remota D4...0: Reservados (poner a 0) El bit D7 está reservado y debe sr puesto a 1 por razones históricas. Una configuración del dispositivo que emplee corriente del bus y de una 31

fuente separada, reportará un valor diferente de cero para bMaxPower, para indicar la cantidad requerida de energía del bus al seleccionar D6 con el valor de uno.

8

bMaxPower

1

mA

Si la configuración del dispositivo soporta activación remota D5 debe ser puesto a uno. Consumo máximo de corriente del bus por parte del dispositivo USB para esta configuración cuando el dispositivo se encuentra en su mayor demanda de corriente. Se expresa en unidades de 2mA (ej. 50=100mA) NOTA: La configuración del dispositivo reporta si es alimentado por el bus o auto auto-alimentado. El status del dispositivo reporta si el dispositivo se encuentra actualmente auto-alimentado. Si un dispositivo se desconecta de su fuente de alimentación externa, se actualiza el status del dispositivo para indicar que se ha perdido la auto-alimentación. Los dispositivos no incrementan el flujo de corriente del bus más allá de lo indicado en esta configuración al perder su fuente de alimentación externa. Si el dispositivo puede continuar operando al ser desconectado de la alimentación externa, lo hará. Si el dispositivo no puede seguir operando, las operaciones que no pueda seguir soportando serán erróneas. El software del sistema USB puede determinar la causa de la falla checando el status y observando la perdida de la fuente de alimentación externa.

32

42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52: 

   //Descripción 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 

Tabla No. 7. Descriptor estándar para la interfaz del dispositivo (Tabla 9-12 Norma USB 2.0)

Offset

Campo

Tamaño

Valor

Descripción

0

bLength

1

Número

Tamaño de este descriptor en bytes.

1

bDescriptorType

1

Constante

Tipo de descriptor, de interfaz

2 3

bInterfaceNumber bAlternateSettings

1 1

Número Número

4

bNumEndpoints

1

Número

5

bInterfaceClass

1

Clase

Número de esta interfaz. Valor para seleccionar esta descripción alternativa de la interfaz identificada en el campo previo. Número de endpoits usados por esta interfaz, excluyendo el endpoint cero. Si este valor es cero, la interfaz utilizará la tubería de control predeterminada (Default Control Pipe) Código de clase asignado por el foro de implementadores USB (USB IF). El valor cero se encuentra reservado para futura estandarización. Si en este campo se selecciona FFH la clase de la interfaz es determinada por el fabricante.

6

bInterfaceSubClass

1

SubClase

Cualquier otro valor se encuentra reservado para uso del IF USB. Código de subclase, asignado por el USB IF. Este código depende del valor asignado en el campo anterior. Si el campo bInterfaceClass es puesto a cero, este campo también debe ser puesto a cero. Si el valor de bInterfaceClass, no es FFH, deberán usarse los valores 33

7

bInterfaceProtocol

1

Protocolo

asignados por el USB IF. Código de protocolo asignado por el USB IF. Este código depende de los valores asignados en los dos campos previos. Si este campo se pone a cero, el dispositivo no utiliza ninguna especificación de protocolo en esta interfaz.

8

iInterface

54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68: 

1

Índice

Si este campo se coloca con un valor de FFH, el dispositivo emplea una especificación de protocolo hecha por el fabricante para esta interfaz. Índice de la cadena de caracteres que describe esta interfaz.

//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  Tabla No. 8. Descriptor estándar para el endpoint (Tabla 9-13 Norma USB 2.0)

Offset

Campo

Tamaño

Valor

Descripción

0

bLength

1

Número

Tamaño del descriptor en bytes.

1

bDescriptorType

1

Constante

Tipo de descriptor, de endpoint.

2

bEndpointAdress

1

Endpoint

Dirección del endpoint en el dispositivo USB descrito. Las 34

direcciones se encuentran codificadas como sigue:

3

bmAttributes

1

Bitmap

Bit 3…0: Número de endpoint Bit 6…4: Reservado, poner a cero Bit 7: Dirección, este bit es ignorado si se trata de endpoints de control, la direcciones son: 0: Endpoint de salida 1: Endpoint de entrada Este campo describe los atributos del endpoint cuando se configura utilizando bConfigurationValue. Bits 1…0: Tipo de transferencia 00=Control 01=Síncrona 10=Masiva 11=Por interrupciones Si no se selecciona la transferencia síncrona, los bits 5…2 están reservados y deben ser puestos a cero, si la transferencia es síncrona se definen como se muestra: Bits 3…2: Tipo de sincronización 00:Sin sincronización 01:Asíncrona 10:Adaptativa 11=Síncrona Bits 5…4: Tipo de uso 00:Endpoint de datos 01:EP de retroalimentación 10:EP de retroalimentación de datos implícitos 11:Reservado

4

wMaxPacketSize

2

Número

El resto de los bits se encuentran reservados y deben ser puestos a cero. Tamaño máximo del paquete de datos que este endpoint es capaz de enviar o recibir cuando se selecciona esta configuración. Para endpoints síncronos, este valor es utilizado para reservar tiempo en el bus de acuerdo a la programación, 35

para cada dato del microframe. El puerto (tubería o pipe) puede utilizar menos ancho de banda que el reservado. Para todos los tipos de enpoint, los bits 10..0 especifican el tamaño máximo del paquete en bytes. Para los endpoints de alta velocidad síncronos y por interrupciones:

6

bInterval

1

Número

Bits 12..11 especifican el numero de transacciones adicionales por microframe: 00 = Ninguna (1 transacción por microframe) 01 = 1 adicional (2 transacciones por microframe) 10 = 2 adicionales (3 transacciones por microframe) 11 = Reservados Los bits 15..13 están reservados y deben ser puestos a cero. Intervalo para efectuar el polling del endpoint en las transferencias de datos. Se expresa en frames o microframes dependiendo de la velocidad de operación del dispositivo. Para endpoints de dispositivos de alta velocidad sincrónicos, este valor debe estar en el rango de 1 a 16. El valor bInterval, es usado como exponencial para el valor 2bInterval-1, por ejemplo, un valor bInterval de 4, significa un periodo de 8 (24-1). Para endpoints de dispositivos de baja velocidad con transmisión por interrupciones, el valor debe estar en el rango 1-255. Para endpoints de dispositivos de alta velocidad, el valor bInterval, es usado como exponencial para el valor 2bInterval-1, por ejemplo, un bInterval de 4, significa un periodo de 8 (24-1). Este valor debe estar entre 1 y 16.

36

98:  99:  100:  101:  102:  103:  104:  105:  106:  107:  108:  109:  110:  111:  112:  113:  114:  115: 

//Descriptores del dispositivo     char const USB_DEVICE_DESC[] ={           USB_DESC_DEVICE_LEN,          //Longitud del reporte           0x01,                //Constante de tipo de descriptor, 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 endpoint 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 

Tabla No. 9. Descriptor estándar para el dispositivo (Tabla 9-8 Norma USB 2.0)

Offset

Campo

Tamaño

Valor

Descripción

0

bLength

1

Número

Tamaño de este descriptor en bytes

1

bDescriptorType

1

Constante

Tipo de descriptor, de dispositivo

2

bcdUSB

2

BCD

4

bDeviceClass

1

Clase

Número de versión del protocolo USB en Binario Codificado Decimal. Este número identifica la versión con la que cumplen el dispositivo y sus descriptores. Código de clase, asignado por el USB IF. Si este campo es puesto a cero, cada interfaz dentro de la configuración especificará su propia información de clase y las distintas interfaces operaran de manera independiente. Si este campo tiene un valor entre 1 y FEH, el dispositivo soporta diferentes especificaciones de clase en distintas interfaces, las cuales no operaran de forma independiente. Este valor identifica la definición de clase utilizada para las interfaces agregadas. Si este campo tiene un valor de FFH, 37

5

6

bDeviceSubClass

bDeviceProtocol

1

1

Subclase

Protocolo

la clase del dispositivo es especificada por el fabricante. Código de subclase, asignado por el USB IF. Estos códigos dependen del valor asignado al campo bDeviceClass. Si dicho campo es puesto a cero, este campo también debe ser cero. Si el campo bDeviceClass no tiene el valor FFH, cualquier valor para este campo, deberá ser asignado por el USB IF. Código de protocolo asignado por el USB IF. Estos códigos dependen de los valores de bDeviceClass y bDeviceSubClass. Si el dispositivo soporta protocolos de clase específica este código identificará el protocolo a utilizar de acuerdo a la clase del dispositivo. Al poner este campo a cero, el dispositivo no utilizará protocolos específicos de clase.

7

bMaxPacketSize0

1

Número

8

idVendor

2

ID

10

idProduct

2

ID

12

bcdDevice

2

BCD

14

iManufacturer

1

Índice

15

iProduct

1

Índice

16

iSerialNumber

1

Índice

17

bNumConfigurations

1

Número

Si este campo tiene valor de FFH, el dispositivo utilizará protocolos especificados por el fabricante. Tamaño máximo del paquete de datos para el endpoint cero (los valores validos son 8, 16, 32 y 64) Identificador del fabricante, asignada por el USB IF. Identificador del producto, asignada por el fabricante Número de versión del dispositivo en formato Binario Codificado Decimal Índice de la cadena de caracteres que describe al fabricante del dispositivo. Índice de la cadena de caracteres que describe al producto Índice de la cadena de caracteres que describe el número de serie del dispositivo Número de posibles configuraciones del dispositivo.

38

123:  124:  125:  126:  127:  128:  129:  130:  131:  132:  133:  134:  135:  136:  137:  138:  139:  140:  141:  142:  143:  144:  145:  146:  147:  148: 

char const USB_STRING_DESC[]={     //string 0           4, //Longitud de la cadena           USB_DESC_STRING_TYPE, //Tipo de descriptor: String           0x0a,0x08,   //Definición de Microsoft para idioma español de México     //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  }; 

Estas últimas líneas permiten configurar los nombres que aparecerán en el host al momento de instalar el dispositivo en el host, como se muestra en la siguiente figura.

Figura 18. Cadena de caracteres mostrada al instalar el dispositivo.

Para realizar la configuración del string o cadena de caracteres, se debe considerar lo mostrado en la siguiente tabla.

39

Tabla No. 10. Descripción de la cadena de caracteres (Tabla 9-15 Norma USB 2.0)

Offset

Campo

Tamaño

Valor

Descripción

0

bLength

1

N+2

Tamaño de este descriptor en bytes

1

bDescriptorType

1

Constante

2 … N

wLANGID[0] … wLANGID[x]

2 … 2

Número … Número

Tipo de descriptor, cadena de caracteres Código de lenguaje 0 … Código de lenguaje x

En esta tabla a partir de la posición 2, se debe utilizar el código de lenguaje o LANGID (Language Identifier) establecido por el foro de implementadores USB (USB-IF), dicho código puede consultarse en el listado publicado por el USB-IF en la página web http://www.usb.org/developers/docs/USB_LANGIDs.pdf. Para calcular los números que se deberán colocar en las líneas 129 y 135, se cuenta el número de letras y de ceros que contiene la cadena de caracteres y al número resultante se suma el valor de dos correspondientes a la suma de uno del inicio y uno final de la cadena. Por ejemplo, para la cadena 1, cuyo contenido es “USB”, la cuenta será de tres, uno por cada letra, más los tres ceros, mas uno del inicio y uno del final, dando como resultado una longitud de 8.

8.2 Unidad de Control  El código desarrollado para la unidad de control, permitirá efectuar las operaciones de lectura y escritura de datos desde y hacia el PIC. El archivo que contiene dichas operaciones se nombró LectoEscr.c, del cual se explica a continuación la forma de configurar el reloj, lo cual se localiza en las siguientes líneas de código:

15:  16:  17:  18:  19: 

//Configuración del reloj  #FUSES HSPLL  #FUSES PLL5  #FUSES USBDIV  #FUSES CPUDIV1 

Para el correcto funcionamiento del módulo USB del PIC, es necesario contar con una señal de reloj con una frecuencia de 48MHz, sin embargo, el cristal a utilizar es de 20MHz por lo que deberán configurarse los distintos divisores de frecuencia con los que cuenta el microcontrolador. La palabra de configuración HSPLL, sirve para indicar que se trabaja con un cristal de alta velocidad (mayor de 4 MHz). Con PLL5, indicamos que la frecuencia de entrada deberá ser dividida entre 5, obteniendo una frecuencia de 4MHz, la cuál es requerida por el microcontrolador para obtener una nueva frecuencia de 96MHz, esta nueva frecuencia pasa por 40

otro bloque interno del PIC, el cual la divide entre dos, obteniendo los 48MHz necesarios para el USB. Finalmente se utiliza USBDIV, para seleccionar la señal proveniente de los bloques anteriores. La configuración anterior únicamente afecta al reloj para el uso del USB, aún es necesario configurar el reloj que utilizará la unidad de control para la ejecución de las instrucciones del programa, para ello se utiliza CPUDIV1, lo cual divide la señal de 96MHz entre dos, dando una señal de 48MHz, que será la que se utilizará también para la ejecución del programa. Es importante mencionar que el valor de CPUDIV1 es de cero para efectuar la división entre dos, sin embargo el compilador utilizado nombra las variables CPUDIV1, CPUDIV2, CPUDIV3 y CPUDIV4, las cuales corresponden a los valores de cero, uno, dos y tres respectivamente. En la Tabla No. 11 se muestran diferentes configuraciones de los divisores de frecuencia para el cristal utilizado, además se presenta resaltada la configuración seleccionada. Después de la tabla, se puede observar una imagen mostrando la configuración del reloj seleccionada, resaltando con una línea en color rojo el camino seguido por la señal de reloj.

Tabla No. 11. Configuración del reloj para el microcontrolador [15].

Frecuencia del oscilador de entrada 20 MHz

División PLL

Modo de reloj

División de reloj para e

÷5 (100)

HS, EC, ECIO

Ninguna (00) ÷2 (01) ÷3 (10) ÷4 (11) ÷2 (00) ÷3 (01) ÷4 (10) ÷6 (11)

HSPLL, ECPLL, ECPIO

Frecuencia de reloj para el Microcontrolador 20 MHz 10 MHz 6.67 MHz 5 MHz 48 MHz 32 MHz 24 MHz 16 MHz

41

Figura 19. Configuración de los divisores para obtener una señal de 48MHz a partir de un cristal de 20MHz.

En lo que respecta al resto del código, se encuentra ampliamente comentado en el anexo correspondiente.

42

9.

Programación del Instrumento Virtual (VI) 

Para poder implementar la comunicación de la PC al PIC y viceversa, utilizando LabVIEW® y el puerto USB, se crearon subVI’s, que permitieran realizar las acciones necesarias para establecer la comunicación. La realización de estos VI’s está basada en el uso del Call Library Function Node y una biblioteca de enlace dinámico (dll). La dll para efectuar la comunicación se obtiene del sitio web de Microchip®, descargando e instalando el paquete MCHPFSUSB Framework v2.35, para mayor información sobre la instalación de este paquete, consultar el anexo correspondiente. Dicha dll contiene las siguientes funciones para el manejo del puerto USB: •

MPUSBGetDeviceCount



MPUSBOpen



MPUSBRead



MPUSBWrite



MPUSBReadInt



MPUSBClose



MPUSBGetDeviceDescriptor



MPUSBGetConfigurationDescriptor



MPUSBGetStringDescriptor



MPUSBSetConfiguration

Para llevar a cabo la comunicación deseada, se requiere realizar la apertura del puerto USB para establecer el pipe, así como el envío y recepción de información de forma masiva desde el host hacia el dispositivo y viceversa, además, es necesario efectuar el cierre del pipe y del puerto al momento de terminar la comunicación. Para efectuar estas operaciones únicamente son necesarias las funciones MPUSBGetDeviceCount, MPUSBOpen, MPUSBRead, MPUSBWrite, MPUSBClose, las cuales se configurarán dentro de los subVI’s creados a través del Call Library Function Node. En el desarrollo del proyecto, se crearon cuatro subVI’s, los cuales llevan por nombre OpenUSB.vi, WriteUSB.vi, ReadUSB.vi y CloseUSB.vi, para cada uno de ellos se creó un ícono que permita identificarlo y usarlo posteriormente en otro instrumento virtual. La forma en que se configuró cada uno de estos SubVI’s se muestra en las siguientes páginas.

5

Para descargarlo, dirigirse a la siguiente URL: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2651¶m=en534494

43

9.1 OpenUSB 

Figura 20. Ícono del SubVI

Este SubVI consiste en una secuencia que permite monitorear la presencia de un dispositivo USB determinado, de acuerdo a sus valores de VID y PID. Su construcción (panel frontal y diagrama de bloques) se muestra en las siguientes figuras:

Figura 21. Panel frontal del SubVI OpenUSB.

44

Figura 22. Diagrama de bloques del SubVI OpenUSB.

45

El diagrama de bloques está formado por una secuencia de tres frames, a continuación se explican los parámetros necesarios dentro de cada uno de los mismos. Primer frame:

Figura 23. Primer frame del diagrama de bloques del SubVI OpenUSB.

Permite localizar al dispositivo USB con el Product ID y Vendor ID señalados, en este caso, el VID 04d8 corresponde a Microchip®, mientras que el PID 000b corresponde a la familia PIC18. Dentro del bloque Call Library Function Node, se hace referencia a la función MPUSBGetDeviceCount. Esta función, regresa el número de dispositivos que concuerdan con el PID y VID especificado. La estructura de la función es la siguiente: DWORD MPUSBGetDeviceCount (PCHAR pVID_PID) Donde, DWORD, representa un número entero sin signo de 32 bits y PCHAR, un apuntador a una cadena de caracteres. Los parámetros del Call Library Function Node, se configuran como se muestra a continuación:

46

Figura 24. Configuración de la función MPUSBGetDeviceCount dentro del Call Library Function Node

La ruta o path, corresponde al directorio de instalación del paquete MCHPFSUSB Framework v2.3 de Microchip ®, la cual comúnmente es la que se muestra en la imagen. En la opción Function name, se selecciona MPUSBGetDeviceCount, que es la función a utilizar. Posteriormente, se selecciona la pestaña Parameters y se configura como se muestra a continuación:

47

Figura 25. Configuración de los parámetros de la función MPUSBGetDeviceCount.

En esta pestaña, se agregan los parámetros con el botón . El nombre para este parámetro será vid_pid_norm y deberá ser tratado como una constante, los valores relativos al tipo de dato y formato, pueden consultarse en la imagen. Una vez configurada la función, se realizan las conexiones con los elementos correspondientes al frame. El funcionamiento es el siguiente: El frame ejecutará el ciclo while hasta que el dispositivo buscado, cuyos datos de PID y VID se encuentran en la cadena de caracteres, sea encontrado, utilizando para ello la función USBGetDeviceCount de la biblioteca dll, la cual regresa el número de dispositivos encontrados con el VID y PID especificados, este valor se compara y si es diferente de cero, se detiene el ciclo while y se ejecuta el siguiente frame. En caso de que no se encuentre ningún dispositivo, el ciclo se ejecuta de manera infinita.

48

Segundo frame:

Figura 26. Segundo frame del diagrama de bloques del SubVI OpenUSB.

En este frame se configura y abre el puerto, estableciendo un pipe, o tubería, para poder efectuar la comunicación desde la PC al PIC volviendo a hacer uso del Call Library Function Node y la función MPUSBOpen de la librería dll. La estructura de la función es: DWORD MPUSBOPEN (DWORD selection, PCHAR pVID_PID_norm, PCHAR end_point, DWORD dir, DWORD res);

La función se configura en el VI como se muestra a continuación:

49

Figura 27. Configuración de la función MPUSBOpen dentro del Call Library Function Node.

Una vez seleccionada la ruta de la librería y la función a utilizar (MPUSBOpen), se configuran los parámetros como se muestra a continuación: La primera vez que abramos la pestaña Parameters, encontraremos que ya incluye un parámetro llamado return type.

50

Figura 28. Configuración de los parámetros de la función MPUSBOpen.

Al parámetro return type será necesario cambiarle el nombre por handle y configurarlo como se muestra en la siguiente figura:

Figura 29. Configuración del parámetro handle de la función MPUSBOpen.

51

Una vez configurado este parámetro, se procede a agregar los parámetros restantes como se muestra en las siguientes imágenes:

Figura 30. Configuración del parámetro selection de la función MPUSBOpen.

Figura 31. Configuración del parámetro vid_pid_norm de la función MPUSBOpen.

52

Figura 32. Configuración del parámetro end_point de la función MPUSBOpen.

Figura 33. Configuración del parámetro dir de la función MPUSBOpen.

53

Figura 34. Configuración del parámetro res de la función MPUSBOpen.

Una vez configurada la función de la biblioteca, se realizan las conexiones mostradas, cableando a cada una de los terminales los elementos siguientes: selection: El valor para este parámetro es una constante de tipo numérico de valor cero. Dicho valor corresponde a la numeración que asigna la función USBGetDeviceCount a cada uno de los dispositivos, siendo el valor cero el asignado al primer dispositivo con el VID y PID especificado. vid_pid_norm: Corresponden a los valores de VID y PID del dispositivo que se desea manejar, debe ser un dato de tipo cadena de caracteres (string) y debe tener el formato “vid_xxxx&pid_yyyy”, donde xxxx representa el valor de VID, mientras que yyyy representa el valor de PID, ambos en número hexadecimal. end_point: Consiste en una cadena de caracteres, string, conteniendo el número del endpoint que se desea abrir. El formato que debe tener es “\\MCHP_EPz”, donde z representa el número mencionado, en este caso, se trata del endpoint 1. dir: Establece la dirección de la comunicación y por tanto el tipo de pipe que se abrirá, ya sea inpipe u outpipe. Un valor de cero corresponde a la dirección host al dispositivo, mientras que un valor de uno, sirve para establecer la dirección del dispositivo al host. res: Este parámetro se encuentra reservado para futuras actualizaciones de la librería dll. OutPipe (handle): Este valor es el valor que devuelve la función invocada a través del handle, el cual servirá para establecer el pipe, o tubería por el cual se llevará a cabo la transmisión de los datos. El OutPipe se emplea para realizar la comunicación desde el host hacia el dispositivo. 54

Tercer frame:

Figura 35. Tercer frame del diagrama de bloques del SubVI OpenUSB.

En este frame se realiza la configuración y apertura del puerto para poder efectuar la comunicación desde el PIC a la PC, haciendo uso del Call Library Function Node y la función MPUSBOpen de la librería dll. La estructura de la función es la misma que el frame anterior: DWORD MPUSBOPEN (DWORD selection, PCHAR pVID_PID_norm, PCHAR end_point, DWORD dir, DWORD res);

La configuración de la función en este frame, es similar a la realizada en el frame anterior, únicamente cambiando el valor del parámetro dwdir por 1, además, es necesario cambiar el nombre de la variable de retorno de la función por InPipe, esto para poder hacer uso de este valor más adelante al momento de efectuar la lectura de datos desde el PIC.

55

Figura 36. Configuración de los parámetros de la función MPUSBOpen.

56

9.2 WriteUSB 

Figura 37. Ícono del SubVI.

Este VI permite realizar la escritura de datos desde el host (PC) hacia el dispositivo (PIC). A continuación se presentan el panel frontal y el diagrama de bloques que componen este SubVI.

Figura 38. Panel Frontal del SubVI WriteUSB.

57

Figura 39. Diagrama de bloques del SubVI WriteUSB.

Para el funcionamiento de este VI, se hace uso de la función MPUSBWrite, cuya estructura y configuración dentro del Call Library Function Node se muestran enseguida.

DWORD MPUSBWrite (HANDLE OutPipe, PVOID SendData, DWORD SendLenght, PDWORD DataLenght, DWORD SendDelay);

58

Figura 40. Configuración de la función MPUSBWrite dentro del Call Library Function Node.

Figura 41. Configuración del parámetro OutPipe de la función MPUSBWrite.

59

Figura 42. Configuración del parámetro SendData de la función MPUSBWrite.

Figura 43. Configuración del parámetro SendLength de la función MPUSBWrite.

60

Figura 44. Configuración del parámetro DataLength de la función MPUSBWrite.

Figura 45. Configuración del parámetro SendDelay de la función MPUSBWrite.

61

9.3 ReadUSB 

Figura 46. Ícono del SubVI.

Este VI permite llevar a cabo la lectura de los datos enviados por el dispositivo (PIC). Su construcción, panel frontal y diagrama de bloques, se muestran a continuación.

Figura 47. Panel Frontal del SubVI ReadUSB.

62

Figura 48. Diagrama de Bloques del SubVI ReadUSB.

Para este VI se utiliza la función MPUSBRead, su estructura y la configuración de sus parámetros en el Call Library Function Node, se presenta a continuación:

DWORD MPUSBRead ExpectedReceiveLenght,

(HANDLE InPipe, PVOID ReceiveData, DWORD PDWORD ReceiveLenght, DWORD ReceiveDelay)

63

Figura 49. Configuración de la función MPUSBRead dentro del Call Library Function Node.

Figura 50. Configuración del parámetro InPipe de la función MPUSBRead.

64

Figura 51. Configuración del parámetro ReceiveData de la función MPUSBRead.

Figura 52. Configuración del parámetro ExpectedReceiveLength de la función MPUSBRead.

65

Figura 53. Configuración del parámetro ReceiveLength de la función MPUSBRead.

Figura 54. Configuración del parámetro ReceiveDelay de la función MPUSBRead.

66

9.4 Close USB 

Figura 55. Ícono del SubVI.

Este subVI permitirá llevar a cabo el cierre del puerto USB, concretamente de los pipes establecidos al abrirlo. A continuación se presentan el panel frontal y el diagrama a bloques.

Figura 56. Panel Frontal del SubVI CloseUSB.

67

Figura 57. Diagrama de Bloques del SubVI CloseUSB.

El diagrama de bloques, se encuentra formado por una secuencia de tres frames, los cuales se describen a continuación.

Primer Frame:

Figura 58. Primer frame del SubVI CloseUSB.

Este frame se encarga de poner la salida de datos a nivel bajo, enviando una cadena de ceros. La configuración del Call Library Function Node, es idéntica a la utilizada en el subVI llamado WriteUSB, solamente se agrega la cadena de caracteres en lugar de los controles. 68

Segundo Frame:

Figura 59. Segundo frame del SubVI Close USB.

Se encarga de cerrar el pipe de salida, para ello se emplea la función MPUSBClose, cuya estructura y configuración se muestran en seguida. DWORD MPUSBClose (Handle OutPipe)

Figura 60. Configuración de la función MPUSBClose dentro del Call Library Function Node.

69

Figura 61. Configuración de los parámetros de la función MPUSBClose.

Tercer Frame:

Figura 62. Tercer frame del SubVI CloseUSB.

70

En este frame se lleva a cabo el cierre del pipe de entrada, utilizando la misma función que el frame anterior, pero cambiando el nombre del parámetro.

Figura 63. Configuración de los parámetros dentro de la función MPUSBClose.

Los demás elementos presentes en este frame, corresponden a la lógica necesaria para mostrar apagado el LED indicador del estado del dispositivo USB.

71

9.5  Ejemplo de uso  En las siguientes imágenes se muestra una forma de conectar los SubVI’s anteriores a fin de poder efectuar las operaciones de lectura y escritura.

Figura 64. Panel Frontal del ejemplo de uso de los SubVI’s desarrollados.

72

Diagrama de bloques:

Figura 65. Diagrama de Bloques del ejemplo de uso de los SubVI’s desarrollados.

Con este instrumento virtual, es posible llevar a cabo la lectura y escritura de datos desde y hacia la tarjeta de adquisición basada en el PIC18F4550.

73

10.

Trabajo futuro 

Una vez lograda la comunicación entre la PC y el PIC a través del puerto USB, se propone la utilización de todas las características que ofrece el microcontrolador, como son el convertidor analógico-digital, el modulo comparador, y el módulo PWM. Dichas características permitirían la conexión de sensores con salidas analógicas a la tarjeta de adquisición y de ésta a la PC a través del puerto USB, con la finalidad de analizar la información en LabVIEW®. Otra aplicación, relacionada con el módulo PWM, es el control de motores, a través de modulación por ancho de pulso (PWM), la cual puede ser manejada desde LabVIEW® enviando el valor de los ciclos de trabajo por el puerto USB a la tarjeta de adquisición y ésta conectada a un driver para motor como pudiera ser el circuito integrado L293. Por otro lado, el desarrollo de este proyecto se enfocó al uso del protocolo USB de forma general, tomando las especificaciones de la norma USB 2.0, sin embargo, puede realizarse más adelante una transmisión de datos utilizando las especificaciones USB Test and Measurement Class, las cuales permitirán utilizar la herramienta VISA de National Instruments. En general, con la tarjeta generada con este proyecto, pueden llevarse a cabo las rutinas que se ejecutan en cualquier microcontrolador, con la ventaja de realizar la programación en el entorno gráfico de LabVIEW®, en lugar de ensamblador, basic o C. También se elimina el tener que usar un programador que permita llevar la rutina escrita a la memoria del microcontrolador y finalmente, es posible aprovechar todas las funciones y herramientas de LabVIEW® para efectuar el análisis de los datos obtenidos, poniendo en práctica, de esta forma, los principios de la instrumentación virtual.

74

11.

Referencias 

[1] LabVIEW® based Advanced Instrumentation Systems S. Sumathi, P. Surekha Springer Berlin Heidelberg 2007 [2] Comparación de Buses de Instrumentos para Pruebas Automatizadas: PCI, PCI Express, PXI, PXI Express, GPIB,USB, y Ethernet/LXI M. en C. Carlos Martínez Simposios Técnicos NI, 2007 URL: ftp://ftp.ni.com/pub/branches/latam/Comparacion%20de%20Buses%20de%20Instrumentos.pdf [3] ¿Qué es la instrumentación virtual? National Instruments Latinoamérica URL: http://digital.ni.com/worldwide/latam.nsf/web/all/01E4BFF8EC93532086256B6000669953 [4] Introduction to LabVIEW® Chapter 1, LabVIEW® Fundamentals National Instruments Agosto, 2007 [5] LabVIEW® Enviroment Chapter 3, LabVIEW® Fundamentals National Instruments Agosto, 2007 [6] Building the Front Panel Chapter 4, LabVIEW® Fundamentals National Instruments Agosto, 2007 [7] Bulding the Block Diagram Chapter 5, LabVIEW® Fundamentals National Instruments Agosto, 2007 [8] Running and Debugging VI’s Chapter 6, LabVIEW® Fundamentals National Instruments Agosto, 2007 [9] Creating VI’s and SubVI’s Chapter 7, LabVIEW® Fundamentals National Instruments Agosto, 2007 [10] Universal Serial Bus Wikipedia, la enciclopedia libre URL: http://es.wikipedia.org/wiki/Bus_de_Serie_Universal 75

[11] USB Design by Example John Hyde 1st Edition Intel Press [12] Universal Serial Bus System Architecture Don Anderson Addison Wesley [13] El bus USB, Características Generales URL: http://usuarios.lycos.es/kurganz/caracteristicas.html [14] USB Complete. Everything you need to develop custom USB peripherals Jack Axelson Third Edition Lakeview Research   [15] PIC18F2455/2550/4455/4550 Data Sheet Microchip Technology Inc. 2007 [16] What is a DLL? Microsoft Corporation URL: support.microsoft.com/kb/815065 [17] Using External Code in LabVIEW® National Instruments Julio 2000 Part. Number: 370109A-01 [18] LabVIEW® 8.2 Help National Instruments Agosto 2006 Part. Number: 371361B-01 [19] Universal Serial Bus Specification. Revision 2.0 USB Implementors Forum Abril 27, 2000 [20] C Compiler Reference Manual Version 4 Custom Computer Services Inc. Agosto, 2007 [21] USB Application Design Center http://www.microchip.com [22] Protocolo USB (Universal Serial Bus) Autor: Eric López Perez En URL: http:// www.i-micro.com/pdf/articulos/usb.pdf 76

12.

ANEXO A. Terminología USB [22] 

-

Host: Dispositivo maestro que inicia la comunicación.

-

Hub: Dispositivo que contiene uno o más conectores o conexiones internas hacia otros dispositivos USB, el cual habilita la comunicación entre el host y diversos dispositivos. Cada conector representa un puerto USB.

-

Dispositivo compuesto: Es aquel dispositivo con múltiples interfaces independientes. Cada una tiene una dirección sobre el bus pero cada interface puede tener un diferente driver en el host.

-

Driver: Se trata de un programa que habilita las instrucciones necesarias para poderse comunicar con el dispositivo. Cada dispositivo sobre el bus debe tener un driver, algunos periféricos utilizan los drivers que proporciona el sistema operativo Windows®.

-

Puntos terminales (Endpoints): Es una localidad específica dentro del dispositivo. El endpoint es un buffer que almacena múltiples bytes, típicamente es un bloque de la memoria de datos o un registro dentro del microcontrolador. Todos los dispositivos deben soportar el punto terminal 0. Este punto terminal es el que recibe todo el control y las peticiones de estado durante la enumeración.

-

Tuberías (Pipes): Es un enlace virtual entre el host (la PC) y el dispositivo USB, este enlace configura los parámetros asociados con el ancho de banda y el tipo de transferencia a utilizar (Control, Bulk, Isocrona o Interrupt); dirección del flujo de datos y el máximo y/o mínimo tamaño de los paquetes/buffers. Cada enlace está caracterizado por su banda de paso (Token), su tipo de servicio, el número de punto terminal (End Point) y el tamaño de los paquetes. Estos enlaces se definen y crean durante la inicialización del USB. Siempre existe un enlace virtual 0 que permite tener acceso a la información de configuración del periférico USB (estado, control e información). La norma USB define 2 tipos de enlaces virtuales (pipe); stream y message. • Stream Pipes: Se trata de un flujo sin formato USB definido, esto significa que se puede enviar cualquier tipo de dato. Este tipo de pipe soporta las transferencias bulk, isochronous, e interrupt. Además tanto el host como el dispositivo USB pueden fungir como controladores del proceso. • Message Pipes: este tipo de enlace virtual si tiene un formato USB definido y solo puede soportar la transferencia Control.

77

13.

ANEXO B. Uso del PIC C Compiler 

El compilador utilizado para el desarrollo del proyecto, se llama PIC C Compiler, el cual es desarrollado por la empresa Custom Computer Services Inc. En la página web de dicha empresa (www.ccsinfo.com), puede descargarse una versión de prueba o comprarse la versión más actual del software. Este compilador presenta diversas características, entre las cuales podemos destacar la inclusión de operadores de lenguaje C estándar, librerías para acceder a registros específicos del PIC, además de ser un ambiente integrado de desarrollo (IDE). En este anexo se explica la forma de construir un nuevo proyecto para la realización del programa a grabar en el PIC. Una vez instalado el compilador en el escritorio aparecerá, si seleccionamos dicha opción durante la instalación, el siguiente icono: 

Figura 66. Ícono del compilador mostrado en el escritorio.

En el caso de que no hayamos seleccionado la instalación de un icono de acceso directo en el escritorio, podemos acceder al compilador desde el menú inicio>Todos los programas>PIC C > PIC C Compiler. Una vez hecho esto, se abrirá la ventana del compilador, que es como se muestra en la siguiente figura. 

78

Figura 67. Aspecto de la ventana del compilador “PIC C Compiler”.

79

Para iniciar, se debe crear el archivo fuente, que contendrá el código a grabar, para ello es necesario dirigirse al menú archivo, a través del icono , seleccionar el submenú nuevo (New) y posteriormente seleccionar archivo fuente (Source File). 

Figura 68. Procedimiento para crear un nuevo archivo fuente.

Una vez hecho esto, se abrirá el siguiente cuadro de dialogo que nos pedirá seleccionar la ubicación y el nombre del archivo.

80

Figura 69. Cuadro de dialogo para especificar la ubicación del archivo fuente a crear. 

Una vez realizado este procedimiento, aparece una nueva hoja de trabajo, con el nombre del archivo, como ejemplo, se muestra la siguiente figura, donde el nombre del archivo seleccionado es USB.c. 

Figura 70. Ejemplo del nombre del archivo fuente creado.

81

En este momento podemos comenzar a editar el código fuente del programa a grabar en el PIC. Una vez que se ha capturado el código necesario, es necesario crear un nuevo proyecto para poder compilarlo y generar el archivo hexadecimal (*.hex) necesario para cargar el programa. Para la creación de un proyecto se selecciona el menú Project, y en la cinta de opciones, se elige la opción Crear (Create).

Figura 71. Procedimiento para la creación de un nuevo proyecto.

Al hacer click en esta opción, aparecerá el siguiente cuadro de dialogo, pidiendo que se indique el archivo con el código fuente que se desea grabar en el PIC, en nuestro ejemplo, seleccionaremos el archivo USB.c que es archivo previamente creado.

Figura 72. Selección del archivo fuente para el proyecto a crear.

82

Una vez seleccionado el archivo fuente, aparece el siguiente cuadro de dialogo que nos permitirá elegir el tipo o modelo de PIC que deseamos programar. Por defecto, el programa nombra el proyecto con el mismo nombre del archivo fuente, solo que con extensión *.pjt, la ubicación donde es guardado es la misma de donde se selecciono el archivo fuente, aunque ambas opciones pueden ser modificadas al hacer click en el botón marcado con tres puntos mostrado.

Figura 73. Especificación del PIC a usar y la ubicación y nombre del proyecto a crear.

Toda vez que se ha creado el proyecto, es necesario asegurarse que estamos trabajando en el proyecto que se quiere, para ello se posiciona el cursor sobre la pestaña proyecto (Project) ubicada en el lado izquierdo de la ventana del programa y se agrega el proyecto haciendo click en el signo +.

83

Figura 74. Procedimiento para agregar un proyecto al compilador.

Esto abrirá un nuevo cuadro de dialogo del cual se seleccionará el proyecto con el cual se quiere trabajar. En caso de que dentro de la pestaña Projects se encuentre un proyecto distinto al que deseamos trabajar, bastara con seleccionarlo y dar click en el botón con el signo menos para eliminar el proyecto de la pestaña. Sí la pestaña Project no se encuentre disponible en el lado izquierdo de la ventana, se deberá activar desde el menú View, seleccionando la opción mostrada.

Figura 75. Procedimiento para hacer visible la pestaña Project.

Una vez que se ha terminado de editar el código, de crear el proyecto y agregarlo a la lista de proyectos, es posible compilarlo, para ello se selecciona el menú Compile y se elige la opción Compile.

Figura 76. Procedimiento para compilar el proyecto creado.

Al dar click en este botón, aparece el siguiente cuadro que muestra el progreso de la compilación, al final del cual aparecerá la barra de estado que nos indicará si el código se ha 84

compilado de manera exitosa o si por el contrario existen errores y advertencias, las cuales se indicaran por el número de la línea de código donde existe dicho error.

Figura 77. Pantalla de estado de la compilación.

85

14.

ANEXO C. Instalación del MCHPFSUSB Framework v2.3 

El framework proporcionado por Microchip®, incluye entre otros elementos la biblioteca de enlace dinámico (dll) necesaria para comunicar la PC con el PIC vía USB y LabVIEW® así como el driver necesario para la instalación del dispositivo (PIC). Al momento de la realización de este proyecto, la versión más actual del framework es la 2.3, la cual trabaja adecuadamente con los sistemas operativos Windows XP® y Windows Vista®, sin embargo, es conveniente ingresar al sitio web de Microchip en busca de cualquier actualización. Antes de llevar a cabo la instalación, es necesario descargar el software (framework), para ello, se accede a la página web de Microchip®, www.microchip.com, y en la opción Wired Connectivity seleccionar USB, esto nos llevará al USB Application Design Center (Centro de Desarrollo de Aplicaciones USB), donde seleccionaremos la opción Software & Tools y dentro de la página web buscamos la versión más reciente, la cual descargaremos a nuestra PC. Una vez descargado el paquete de instalación del framework procedemos a instalarlo, para ello ejecutamos el instalador previamente descargado.

Figura 78. Ícono del instalador del framework.

Una vez hecho lo anterior, se mostrará un cuadro de dialogo pidiendo que aceptemos o rechacemos los términos de la licencia.

86

Figura 79. Acuerdo de licencia del framework de Microchip®.

Una vez aceptados los términos de la licencia, se mostrará la pantalla de bienvenida

Figura 80. Pantalla de bienvenida del instalador del framework de Microchip®.

87

La siguiente ventana nos permitirá cambiar la ubicación donde se instalará el framework, es importante recordar dicha ubicación, ya que será utilizada posteriormente.

Figura 81. Cuadro de dialogo para seleccionar el directorio de instalación del framework de Microchip®.

A continuación podemos elegir la realización de copias de seguridad de los archivos que sean reemplazados durante el proceso de instalación, así como su ubicación.

Figura 82. Cuadro de dialogo que permite la creación de copias de seguridad al momento de la instalación.

88

Al seleccionar siguiente (Next), veremos una pantalla de confirmación.

Figura 83. Cuadro de dialogo para comenzar la instalación del framework de Microchip®.

La siguiente pantalla que veremos nos mostrará el proceso de instalación.

Figura 84. Cuadro de dialogo mostrando el proceso de la instalación del framework de Microchip ®.

89

Finalmente, la última pantalla nos permitirá abrir archivos relacionados con la instalación.

Figura 85. Cuadro de dialogo de confirmación de la instalación del framework de Microchip®.

Una vez realizado este procedimiento, contamos con la biblioteca de enlace dinámico (dll) para poder realizar el instrumento virtual. En caso de cambiar la ubicación de instalación por defecto, será necesario recordarla, pues posteriormente se utilizará al momento de instalar el driver del dispositivo.

90

15.

1:  2:  3:  4:  5:  6:  7:  8:  9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43: 

ANEXO D. Código en lenguaje C utilizado en el PIC 

///////////////////////////////////////////////////////////////////////////  ////                            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. Además se configuró el nombre con el que el    ////  //// dispositivo será reconocido por la PC.                                             ////  ////                                                                                                                 ////  //// Esta configuración se basa en los parametros indicados             ////  //// en la norma USB 2.0                                                                           ////  ////                                                                                                                ////  /////////////////////////////////////////////////////////////////////////  #IFNDEF __USB_DESCRIPTORS__  #DEFINE __USB_DESCRIPTORS__    #include  //Se incluye la librería con las directivas USB       #DEFINE USB_TOTAL_CONFIG_LEN      32      //Longitud=config+interface+class+endpoint       //Descripción de la configuración     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,           //Tamaño de datos que regresa está configuración           1,                                 //Número de interfaces soportadas por el dispositivo           0x01,                              //Identificador de esta configuración           0x00,                              //índice de la cadena que describe esta configuración           0xC0,                              //bit6=1: autoalimentado (self‐powered)           //bit5=1: activación remota           //bits 0‐4: reservados           //bit7=1           0x32,                              //energía máxima requerida por el puerto           //(maximum milliamperes/2)  (0x32 = 100mA)       //Descripción de la interfaz           USB_DESC_INTERFACE_LEN,    //longitud del descriptor  91

44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91: 

         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)           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    92

92:  93:  94:  95:  96:  97:  98:  99:  100:  101:  102:  103:  104:  105:  106:  107:  108:  109:  110:  111:  112:  113:  114:  115:  116:  117:  118:  119:  120:  121:  122:  123:  124:  125:  126:  127:  128:  129:  130:  131:  132:  133:  134:  135:  136:  137:  138:  139: 

   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           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,  93

140:  141:  142:  143:  144:  145:  146:  147:  148:  149: 

         '_',0,           'L',0,           'a',0,           'b',0,           'V',0,           'I',0,           'E',0,           'W',0  };  #ENDIF 

Unidad de procesamiento  Este código lleva por título LectoEscr.c y contiene todas las actividades y configuraciones necesarias para llevar a cabo la comunicación.

1:  2:  3:  4:  5:  6:  7:  8:  9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26: 

/////////////////////////////////////////////////////////////////////////  ////                            LectoEscr.c                                                                ////  ////                                                                                                                ////  //// Este archivo contiene las rutinas y configuración necesaria      ////  //// para el funcionamiento del PIC, con este código se leen los      ////  //// valores de las entradas del microcontrolador y se envían,        ////  //// también se reciben los datos enviados por la PC y se colocan  ////  //// en las salidas.                                                                                      ////  //// Esta configuración se basa en los parametros indicados           ////  //// en la norma USB 2.0                                                                         ////  ////                                                                                                               ////  ////////////////////////////////////////////////////////////////////////    #include    //Libreria con las instrucciones del PIC  //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  94

27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74: 

#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK     //Habilitamos EP1(EndPoint1) de entrada para transferencias masivas (bulk)  #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        //Driver para la familia Microchip PIC18Fxx5x  #include     //Configuración del USB y los descriptores para este dispositivo  #include              //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    //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  95

75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99:  100:  101:  102:  103:  104:  105:  106:  107:  108:  109:  110:  111:  112:  113:  114:  115:  116:  117:  118:  119:  120:  121:  122: 

     Apaga(LEDV);           //encendemos led rojo hasta que se     Enciende(LEDR);      //enumere el dispositivo       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           */              if(input(PIN_D0))              {envia[0]=1;}              else              {envia[0]=0;}              if(input(PIN_D1))              {envia[1]=1;}              else              {envia[1]=0;}              if(input(PIN_D2))              {envia[2]=1;}              else              {envia[2]=0;}              if(input(PIN_D3))              {envia[3]=1;}              else              {envia[3]=0;}              if(input(PIN_D4))              {envia[4]=1;}              else              {envia[4]=0;}               if(input(PIN_D5))              {envia[5]=1;}              else              {envia[5]=0;}               if(input(PIN_D6))  96

123:  124:  125:  126:  127:  128:  129:  130:  131:  132:  133:  134:  135:  136:  137:  138:  139:  140:  141:  142:  143:  144:  145:  146:  147:  148:  149:  150:  151:  152:  153:  154:  155:  156:  157:  158:  159:  160:  161:  162:  163:  164:  165:  166:  167:  168:  169:  170: 

            {envia[6]=1;}              else              {envia[6]=0;}               if(input(PIN_D7))              {envia[7]=1;}              else              {envia[7]=0;}                             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);                      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  97

171:  172:  173:  174:  175:  176:  177:  178:  179:  180:  181:  182:  183:  184:  185:  186: 

            {Apaga(BIT5);}                         if(B6 == 1)              {Enciende(BIT6); }                          else              {Apaga(BIT6);}                         if(B7 == 1)              {Enciende(BIT7); }                          else              {Apaga(BIT7);}                }            }           }        }     } //Fin del programa 

98

16.

ANEXO E. Diagramas eléctricos 

Para llevar a cabo las operaciones requeridas, se utilizó el circuito mostrado a continuación:

Figura 86. Diagrama eléctrico de la tarjeta de adquisición de datos.

99

15.1  Lista de Materiales  Receptáculo USB tipo B para circuito impreso C1: Capacitor 100nF C2 y C3: Capacitores de 22pF CN1, CN2, CN3, CN4, CN5 y CN6: Conectores chicos de tres tornillos D1: LED Verde D2: LED Rojo IC1: Microcontrolador PIC18F4550 R1: Resistencia de 1kΩ R2 y R3: Resistencias de 330Ω RP1: 8 Resistencias de 1kΩ X1: Cristal de cuarzo de 20MHz

100

17.

ANEXO F. Instalación de la tarjeta de adquisición 

Para instalar la tarjeta de adquisición de datos, es necesario conectarla con un cable USB a la PC, una vez realizado esto, es necesario especificar la ubicación del driver necesario para poder utilizarla, este proceso solo se realiza la primera vez que se conecta el dispositivo. A continuación se presenta el proceso de instalación necesario para los sistemas operativos Windows XP® y Windows Vista ®. Windows Vista® Una vez conectada la tarjeta, aparecerá el siguiente cuadro de dialogo, del cual debe seleccionarse la opción recomendada: “Buscar e instalar el software del controlador”. Nótese que el nombre del dispositivo es el que nosotros asignamos al momento de realizar el programa en lenguaje C para el PIC.

Figura 87. Cuadro de dialogo mostrado al conectar el dispositivo por primera vez.

Al hacer click en la opción señalada, aparecerá el siguiente globo en pantalla

Figura 88. Notificación de instalación de dispositivo.

Es conveniente dar click en el globo para ver el estado de la instalación, después de algunos segundos, veremos el siguiente cuadro de dialogo y seleccionamos el botón mostrado. 101

Figura 89. Cuadro de dialogo mostrado durante la instalación del dispositivo.

Del nuevo cuadro de dialogo mostrado, seleccionaremos la opción avanzada “Buscar software de controlador en el equipo”

Figura 90. Cuadro de dialogo para realizar la búsqueda del controlador del dispositivo.

102

Hecho esto, daremos click en el botón Examinar del cuadro de dialogo mostrado

Figura 91. Cuadro de dialogo donde se especifica la ubicación del controlador del dispositivo.

Se mostrará el cuadro de dialogo que permitirá seleccionar la ubicación del driver, para ello, seleccionaremos la carpeta mostrada en la imagen, que se encuentra dentro de la carpeta Microchip Solutions, que es donde se instala por defecto el framework proporcionado por Microchip®. Una vez seleccionada la carpeta, daremos click en el botón Aceptar.

103

Figura 92. Ubicación del controlador del dispositivo.

El siguiente cuadro de dialogo nos pedirá la confirmación de la ubicación del driver.

104

Figura 93. Cuadro de dialogo mostrando la ubicación del controlador del sispositivo.

Finalmente, las siguientes ventanas muestran el proceso de instalación del driver y la confirmación de que éste ha sido instalado correctamente.

Figura 94. Pantalla mostrando el proceso de instalación del dispositivo.

105

Figura 95. Notificación de instalación de dispositivo en Windows Vista.

Figura 96. Notificación de instalación correcta del dispositivo en Windows Vista.

En este momento se cuenta con el driver necesario para poder trabajar con el dispositivo desde LabVIEW®.

106

Windows XP® En este sistema operativo, aparece el siguiente globo al conectar el dispositivo por primera vez, después de ello es necesario elegir la ubicación del driver necesario, la cual es la misma que la mostrada anteriormente para el caso de Windows Vista ®.

Figura 97. Globo de información mostrado en Windows XP al conectar la tarjeta.

La versión 2.3 del framework proporcionado por Microchip, que es la utilizada en este proyecto, es compatible completamente con ambas versiones del sistema operativo Windows®.

107

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF