You are on page 1of 17

Contenido

Objetivos: ............................................................................................................................................................... 3
Introduccin ........................................................................................................................................................... 3
Marco Terico ........................................................................................................................................................ 3
Desarrollo ............................................................................................................................................................... 9
Conclusiones ...................................................................................................................................................... 19
Bibliografa .......................................................................................................................................................... 19

Objetivos

Realizar lectura de un potencimetro con un microcontrolador, para despus hacer


comunicacin va USB con la PC y as observar el valor de tensin del potencimetro
en la PC.

Introduccin
El protocolo USB es el ms comn de encontrar en dispositivos comerciales, debido a su
fcil manejo de hardware y compatibilidad dinmica. Es razn por el cual se considera
necesario que se adquiera el conocimiento de como implementarlo en el compilador PICC
con la computadora.

Marco Terico
El Bus Serial Universal (USB, por sus siglas en ingls) fue desarrollado y estandarizado por
un grupo de siete empresas dedicadas a la manufactura de computadoras y perifricos (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
tecnologa del siglo XXI; buscando crear una tecnologa que permitiera una actividad de bus
de baja y alta velocidad de transmisin de datos, proporcionando un protocolo robusto,
configuracin automtica de dispositivos y un bus serial al que fuera sencillo conectarse.
El USB es un bus punto a punto: dado que el lugar de partida es el host (PC o hub), el
destino es un perifrico u otro hub. No hay ms 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 informacin a un tiempo.
Los perifricos comparten un mismo bus. El protocolo se basa en el llamado paso de testigo
(token). La computadora (o host) proporciona el testigo al perifrico seleccionado y
seguidamente, ste le devuelve el testigo en su respuesta.
El desarrollo del protocolo USB representa un gran aumento en las velocidades de
transmisin de datos, as como la instalacin 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 ms prctico y sencillo de utilizar comparado con los protocolos de conexio es
de tipo serial (DB-9) o paralelo (DB-25), por lo que en la actualidad estos puertos ya no se
encuentran presentes en equipos de computo modernos.
A continuacin se describen los aspectos esenciales de este protocolo:
A nivel elctrico, el cable USB transfiere la seal y la alimentacin sobre 4 hilos. En las

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

La distribucin de los cables en los conectores es de la siguiente forma:

Suministrarla al dispositivo, sin embargo depender de ste ltimo el consumo, pudiendo ser
auto-alimentado (self powered) en caso de que el consumo de energa lo realice a travs del
puerto o con alimentacin propia (como en el caso de la mayora de las impresoras),
omitiendo el uso de la alimentacin proporcionada por el puerto.
A nivel de seal: Los cables utilizados en la transmisin de los datos (D+ y D-) constituyen un
par trenzado con una impedancia caracterstica de 90 a fin de reducir las interferencias y el
ruido. Se debe vigilar que la extensin de los cables transmisores de datos no supere los 5
m.
Las direcciones de los diferentes dispositivos conectados a travs de un host y diversos
hubs estn cifradas en 7 bits, por lo que 128 dispositivos (27) pueden estar conectados
simultneamente a un puerto de este tipo. En realidad, es recomendable reducir esta
cantidad a 127 porque la direccin 0 es una direccin reservada.
Por otra parte, es posible conectar hasta 5 concentradores o hubs, por lo que, tomando en
cuenta la longitud mxima de 5 metros del cable entre dos dispositivos, es posible crear una
cadena de transmisin de datos de hasta 25 metros de longitud.

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 perifrico en el momento de
conectarse al USB. Algunos drivers especficos pueden utilizar este enlace para transmitir su
propia informacin de control.Este enlace no tiene prdida de datos, puesto que los
dispositivos de deteccin de recuperacin de errores estn activos a nivel USB.
- Bulk (Masiva): Este modo se utiliza para la transmisin de importantes cantidades de
informacin. Como el tipo control, este enlace no tiene prdida de datos. Este tipo de
transferencia es til cuando la razn de transferencia no es crtica como por ejemplo, el envo
de un archivo a imprimir o la recepcin de datos desde un escner. En estas aplicaciones, la
transferencia es rpida, pero puede espera si fuera necesario. Solo los dispositivos de media
y alta velocidad utilizan este tipo de transferencia.
- Interrupt (Por interrupcin): modo utilizado para transmisiones de pequeos paquetes,
rpidos, orientados a percepciones humanas, como puede ser el ratn. Este tipo de
transferencia es para dispositivos que deben recibir atencin peridicamente y que no
requieren de alta velocidad en la transmisin 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 transmisin de audio o video
comprimido. Este tipo de transmisin funciona en tiempo real. Este es el modo de mayor
prioridad.
La transmisin de la voz es un ejemplo de esta aplicacin. Si sta no se transmite
correctamente, pueden llegar a orse parsitos (glich) y la aplicacin puede no procesar de
forma correcta la informacin.

Enumeracin
Antes de cualquier aplicacin se pueda comunicar con un dispositivo a travs 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 informacin entre el
dispositivo y el host. Este proceso incluye la asignacin de una direccin al dispositivo, leer
los descriptores del dispositivo, asignar y ejecutar el driver adecuado y seleccionar la
configuracin adecuada que especifique los requerimientos de energa del dispositivo, los
endpoints y algunas otras caractersticas.
Para que se ejecute la enumeracin, cuando el host detecta que se ha conectado un nuevo
dispositivo enva informacin solicitando la informacin antes mencionada, el dispositivo
entonces enva la respuesta a los requerimientos solicitados para establecer la
comunicacin.
Acto seguido se establecen las tuberas (pipes) para poder dar el canal adecuado a la
informacin, en este momento el dispositivo se encuentra listo para efectuar la trasmisin de
datos.
Desde la perspectiva del usuario, la enumeracin es un proceso completamente invisible y
automtico excepto tal vez por la aparicin de mensajes que anuncien la deteccin de un
nuevo dispositivo y cuando la configuracin ha sido exitosa. En algunas ocasiones durante el
primer uso, el usuario debe seleccionar el driver o especificar la ubicacin donde el host debe
localizar los archivos.
El controlador USB
Un controlador USB tpico contiene un transmisorreceptor USB, una interfaz serial, buffers,
registros de configuracin, estado y control para la comunicacin.
El transceptor
Proporciona una interfaz en hardware entre el conector USB del dispositivo y el circuito que
controla la comunicacin USB. El transceptor se encuentra tpicamente en el chip, pero
algunos controladores permiten la conexin 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 envo y recepcin de
datos, sin interpretarlos o utilizarlos, solamente enva 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

enviados. Para retener los datos a transmitir o recibidos, la mayora de los buffers cuentan
con una estructura de tipo FIFO (Primero en entrar, primero en salir).
Informacin de configuracin, estado y control
Los chips controladores de USB, tienen registros que son utilizados para almacenar
informacin 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 informacin sobre cmo se
deber de utilizar la interfaz para la transmisin y recepcin de datos. Debido a las
diferencias de configuracin entre chips o familias de chips, el firmware para el controlador
debe ser creado especficamente 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, tpicamente esta fuente es un
cristal oscilador, aunque en los dispositivos de baja velocidad puede utilizarse un resonador
cermico.
Componentes Adicionales
Adems 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 caractersticas adicionales, por ejemplo temporizadores,
contadores, etc.
Bibliotecas DLL
Una dll o biblioteca de enlace dinmico (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 aplicacin Windows, de hecho, se puede considerar que
Windows est construido sobre una gran cantidad de DLLs. La mayora de bibliotecas de
enlace dinmico se guardan en archivos que tienen extensin DLL, pero tambin 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 dinmico con extensin DLL y el resto, es que
las primeras se cargan porque el programa que las ha de utilizar lo pide a Windows y las
dems, en cambio, se cargan porque estn referenciadas en archivos de inicializacin de
Windows. Estas referencias pueden ser creadas por el propio Windows o por el programa
deinstalacin de alguna aplicacin.

Estructura de una DLL de 32 bits [16]


Una DLL se puede dividir, bsicamente, 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 funcin 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 funcin se llama DllEntryPoint.
Funciones: Son las funciones que contiene la DLL y que fueron declaradas por el
programador de la misma.

Desarrollo
Equipo Necesario
Computadora (con el Software MPLAB
IDE, IC-PROG o similar, compilador
C,LabView, Simulador de circuitos
electrnicos Proteus).
Programador tipo JDM o similar.

Material Necesario
Instrucciones del PIC 18]F4550 u
Capacitores
Puente H
Resistencias
Motor DC
Cristal de cuarzo de 4MZ
Cable de conexin USB

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

//Tamano de datos que regresa esta configuracion


1,
//Numero de interfaces soportadas por el dispositivo
0x01,
//Identificador de esta configuracion
0x00,
//indice de la cadena que describe esta configuracion
0xC0,
//bit6=1: autoalimentado (self]powered)
//bit5=1: activacion remota
//bits 0]4: reservados
//bit7=1
0x32,
//energia maxima requerida por el puerto
//(maximum milliamperes/2) (0x32 = 100mA)
//Descripcion de la interfaz
USB_DESC_INTERFACE_LEN, //longitud del descriptor
USB_DESC_INTERFACE_TYPE, //constante para INTERFACE (0x04)
0x00, //Nmero que define esta interfaz
0x00, //Seleccin alternativa de interfaz
2, //Numero de endpoints
0xFF, //Cdigo de clase
0xFF, //Cdigo de subclase
0xFF, //Cdigo de protocolo
0x00, //ndice de la cadena que
//describe esta configuracin
//Descripcin de endpoint de entrada
USB_DESC_ENDPOINT_LEN,
//longitud del descriptor
USB_DESC_ENDPOINT_TYPE,
//constante para ENDPOINT (0x05)
0x81,
//Nmero y direccin del Endpoint (0x81 = EP1 IN)
0x02,
//Tipo de transferencia
//0: control, 1: iso, 2: masiva, 3: interrupciones
USB_EP1_TX_SIZE, 0x00,
//Tamao mximo de paquete soportado
0x01,
//intervalo de polling en ms
//slo para transferencia con interrupciones
//Descripcin de endpoint de salida
USB_DESC_ENDPOINT_LEN,
//longitud del descriptor
USB_DESC_ENDPOINT_TYPE,
//constante para ENDPOINT (0x05)

0x01,
//Nmero y direccin 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,
//Tamao mximo de paquete soportado
0x01,
//intervalo de polling en ms
//slo para transferencia con interrupciones
};
#define USB_NUM_HID_INTERFACES 0
#define USB_MAX_NUM_INTERFACES 1
const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};
#if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
#error USB_TOTAL_CONFIG_LEN not defined correctly
#endif
//Descriptores del dispositivo
char const USB_DEVICE_DESC[] ={
USB_DESC_DEVICE_LEN, //Longitud del reporte
0x01, //Constante del dispositivo (0x01)
0x10,0x01, //Versin de USB (1.1)
0x00, //Cdigo de clase
0x00, //Cdigo de subclase
0x00, //Cdigo de protocolo
USB_MAX_EP0_PACKET_LENGTH,
//Tamao mximo de paquete para endpointt 0.
//(Baja Velocidad especifica 8)
0xd8,0x04, //vendor id (0x04D8 Microchip)
0x0b,0x00, //product id (0x000b PIC18 Family)
0x01,0x00, //Nmero de versin 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};
//Ubicacin 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, //Definicin de Microsoft para idioma ingles de EUA
//string 1
8, //Longitud de la cadena
USB_DESC_STRING_TYPE, //Tipo de descriptor: String
'U',0,
'S',0,
'B',0,
//string 2
24, //Longitud de la cadena
USB_DESC_STRING_TYPE, //Tipo de descriptor: String
'D',0,
'A',0,
'Q',0,
'_',0,
'L',0,
'a',0,
'b',0,
'V',0,
'I',0,
'E',0,
'W',0
};
#ENDIF

Por ltimo, se tiene se realiza el programa para el microncontrolador, como tambin el


software que se ejecuta en la PC para hacer la comunicacin USB. El programa del
microcontrolador adquiere la tensin que proporciona el potencimetro mediante el canal
ADC, mandando lo obtenido a la PC va USB. Tambin la PC puede mandar bits en estado
altos y bajos, siendo estos dirigidos al puerto B, mandando estados altos o bajos en el
microcontrolador. El cdigo se muestra a continuacin:
#include <18F4550.h> //Libreria con las instrucciones del PIC
#device adc=8
//Configuracin del reloj
#FUSES HSPLL
#FUSES PLL5
#FUSES USBDIV
#FUSES CPUDIV1
#FUSES NOWDT,NOPROTECT,NOLVP,NODEBUG,VREGEN
//Fin de configuracin de los fuses
#use delay(clock=48000000) //Definimos la frecuencia del oscilador
#define USB_HID_DEVICE FALSE
//deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK
//Habilitamos EP1(EndPoint1) de entrada para transferencias masivas (bulk)

#define USB_EP1_RX_ENABLE USB_ENABLE_BULK


//Habilitamos EP1(EndPoint1) de salida para transferencias masivas (bulk)
#define USB_EP1_TX_SIZE 8
//Tamao del buffer para el endpoint de transferencias
#define USB_EP1_RX_SIZE 8
//Tamao del buffer para el endpoint de recepcin
#include <pic18_usb.h>
//Driver para la familia Microchip PIC18Fxx5x
#include <Descriptores.h>
//Configuracin del USB y los descriptores para este dispositivo
#include <usb.c>
//Libreria con las instrucciones para el manejo del puerto USB
#define LEDV PIN_C0 //Se definen los pines que se ocuparn
#define LEDR PIN_C1 //los LED's indicadores
#define Enciende output_high // as como las instrucciones
#define Apaga output_low // para encenderlos y apagarlos
//Se definen variables para cada una de las posiciones
//de la variable recbuf, la cual es un arreglo de 8 elementos
#define B0 recbuf[0]
#define B1 recbuf[1]
#define B2 recbuf[2]
#define B3 recbuf[3]
#define B4 recbuf[4]
#define B5 recbuf[5]
#define B6 recbuf[6]
#define B7 recbuf[7]
//Se define un nombre para cada uno de los pines del puerto B
#define BIT0 PIN_B0
#define BIT1 PIN_B1
#define BIT2 PIN_B2
#define BIT3 PIN_B3
#define BIT4 PIN_B4
#define BIT5 PIN_B5
#define BIT6 PIN_B6
#define BIT7 PIN_B7

int8 pot1;
//Rutina principal
void main(void) {
int1 recbuf[8]; //Se declaran las variables donde seran
int1 envia[8]; //almacenados los datos a enviar y recibir
//ambas sern de 8 bits

Apaga(LEDV); //encendemos led rojo hasta que se


Enciende(LEDR); //enumere el dispositivo
setup_adc_ports(AN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
usb_init(); //se inicializa el puerto USB
usb_task(); //se habilita el periferico
usb_wait_for_enumeration();
//la ejecucin del cdigo se detiene en este punto hasta que
//el dispositivo haya sido enumerado por el host, una vez
//que esto ocurra el programa continua su ejecucin
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 comunicacin desde el PIC a la PC (host):
Dependiendo del estado de las entradas (1 0) se almacena su
valor en la variable enva, la cual es un arreglo de 8 bits
*/
set_adc_channel(0);//Habilitacin canal0
delay_us(20);//tiempo de retardo para iniciar lectura
pot1=read_adc();//Lectura canal0
envia=pot1;
usb_put_packet(1, envia,8, USB_DTS_TOGGLE);
/*Se envia la variable "envia", la cual tiene un tamao de
8 bits, por el endpoint 1 */
//Para efectuar la comunicacin desde la PC (host) al PIC
if (usb_kbhit(1)) {
//si el endpoint de entrada contiene datos provenientes del host el
//programa continua su ejecucin, de lo contrario salta esta seccin
usb_get_packet(1,recbuf,8);
/*Se recibe la informacin 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
{Apaga(BIT5);}
if(B6 == 1)
{Enciende(BIT6); }
else
{Apaga(BIT6);}
if(B7 == 1)
{Enciende(BIT7); }
else
{Apaga(BIT7);}
}
}
}
}
} //Fin del programa

Abrir Puerto

Lectura

Escritura de datos

Cerrar Puerto

Programa General

Interfaz

You might also like