Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ESCUELA DE INGENIERÍA
MAESTRÍA EN MECATRÓNICA
PRESENTAN:
ING. JULIO ALEJANDRO LUGO JIMÉNEZ ING. GABRIEL JESÚS POOL BALAM
PARA LA MATERIA:
SENSORES Y ACTUADORES
PROFESOR:
MC. PEDRO NAJERA GARCIA
MÉRIDA, YUCATÁN A 28 DE JUNIO DE 2008
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 2 / 15
ANTECEDENTES
1. LA ARQUITECTURA DEL PUERTO USB
A pesar de que el puerto USB nos ofrece Fig. 2 HUB USB
más ventajas que sus predecesores, su
complejidad para implementarlo es enorme,
ya que su funcionamiento está basado en
protocolos de software.
Sólo puede haber un Host en el bus que
Fig. 3 Múltiple velocidad en un BUS
maneja a todos los componentes conectados
como se indica en la figura 1. El cable que típicamente es usado no es
largo, debido a la velocidad de transferencia
y tiene la estructura mostrada en la figura 4.
Sus terminales son del tipo diferencial y
consta de 4 hilos.
Fig. 4 Cable USB
La arquitectura USB comprende cuatro
tipos básicos de transferencia de datos:
Fig. 1 Topología del BUS • Control Transfers: Es usado para
configurar un dispositivo al momento de que
El hub es un elemento plug and play en
se conecta. Los datos entregados pueden
la estructura USB (Figura 2) y es un perderse.
concentrador al cual, se le pueden agregar
más dispositivos USB, incluyendo otro hub. • Bulk Data Transfers: Entrega el dato por
volumen, el ancho de banda puede variar. Es
La velocidad de transferencia depende usado en escáner ó cámaras. La ráfaga de
de la velocidad del HUB que se esté datos es secuencial.
utilizando. Ver figura 3. Las velocidades
típicas son: 480Mb /s en high speed, 12Mb/s • Interrupt Data Transfers: Used for timely
full‐speed y 1.5Mb/s en Low‐speed. but reliable delivery of data, for example,
characters or coordinates with human‐
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 3 / 15
perceptible echo or feedback response usar (endpoints), VID&PID, nombre y serie
characteristics. del producto que se conecta para que el host
identifique al driver y pueda instalarlo con el
• Isochronous Data Transfers: Occupy a fin de que el dispositivo pueda formar las
prenegotiated amount of USB bandwidth “pipes” ó túneles para su comunicación con
with a prenegotiated delivery latency. (Also el host (ver figura 5).
called streaming real time transfers).
Aunque el PIC no puede funcionar como
host, ya que se requiere de una gran
capacidad de manejo de datos para
administrar a cada componente del BUS, es
suficiente que se pueda administrar como un
“device”, para esto se requiere
“memorizarle” los protocolos necesarios
Fig 5. Flujo de comunicación USB
para enlazarse al host.
2. LA MPUSBAPI.DLL DE MICROCHIP
Estos protocolos se le llaman
descriptores y sirve para informarle al host Para una mayor facilidad de desarrollo
todo lo necesario para que pueda de aplicaciones basadas en el bus USB,
administrarlo. Microchip ha creado un archivo dll en el que
proporciona las funciones de acceso al
Recordemos que los PICs de la serie puerto USB con un microcontrolador de la
18Fxx5x tienen tres modos de familia PIC18Fxx5x. Para un funcionamiento
funcionamiento: correcto, se necesita el driver mchpusb.sys.
1. USB Human Interface Device Este driver sirve tanto para Visual Basic
(HID): Velocidad Baja, no como para Visual C, entre otros.
requiere driver.
Revisando ejemplos, y la ayuda que
2. USB Communication Device trae incluida sobre el manejo de la dll se
Class (CDC): Velocidad Media, verifica que el modo de abrir la pipe es el
requiere driver. Crea un Puerto siguiente:
Serie Virtual.
Primero se identifica si hay un
3. USB Custom Driver: Velocidad dispositivo con el nombre VID&PID
Alta, requiere driver. Este es el conectado a la PC con la instrucción:
modo que usa WinUSB (para (*MPUSBGetDeviceCount)(PCHAR
windows vista) y el mpusbapi pVID_PID )
(windows 2000 y posterior).
La variable pVID&PID, es una entrada de
Dentro de los protocolos hay que cadena de caracteres que da como
especificar el tipo de transferencia de datos a resultado el número de dispositivos
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 4 / 15
conectados al Host, que tienen asignado MPUSBGetDeviceCount devolverá un ‘1’. Al
el mismo pVID&PID. llamar la función tiene que haber un
mecanismo que intente llamar MPUSOpen()
Seguidamente con la instrucción desde 0 hasta MAX_NUM_MPUSB_DEV. Se
tiene que contar el número de llamadas
(*MPUSBOpen)
exitosas. Cuando este número sea igual al
(DWORD instance, // Input
número devuelto por
PCHAR pVID_PID, // Input MPUSBGetDeviceCount, hay que dejar de
hacer las llamadas porque no puede haber
PCHAR pEP, // Input más dispositivos con el mismo VID_PID.
DWORD dwDir, // Input pVID_PID: Input: String que contiene el
PID&VID del dispositivo objetivo. El formato
DWORD dwReserved); // Input <Future Use> es “vid_xxxx&pid_yyyy”. Donde xxxx es el
valor del VID y el yyyy el del PID, los dos en
Esta instrucción devuelve el acceso al pipe hexadecimal. Ejemplo: Si un dispositivo tiene
del Endpoint con el VID_PID asignado. Todas un VID=0x04d8 y un PID=0x000b, el string de
las pipes se abren con el atributo entrada es: “vid_0x04d8&pid_0x000b”.
FILE_FLAG_OVERLAPPED contenida en la
DLL, ésto permite que MPUSBRead, pEP: Input: String con el número del
MPUSBWrite y MPUSBReadInt tengan un Endpoint que se va a abrir. El formato es
valor de time‐out. “\\MCHP_EPz” o “\MCHP_EPz” dependiendo
Nota: el valor del time‐out no tiene sentido del lenguaje de programación. Donde z es el
en una pipe síncrona. número del Endpoint en decimal. Ejemplo:
“\\MCHP_EP1” o “\MCHP_EP1” Este
instance: Input: Un número de dispositivo argumento puede ser NULL (nulo) para crear
para abrir. Normalmente, se utiliza primero lazos con Endpoints de funciones no
la llamada de MPUSBGetDeviceCount para específicas. Las funciones específicas que
saber cuantos dispositivos hay. utilizan éste parámetro son: MPUSBRead,
MPUSBWrite, MPUSBReadInt.
Es importante entender que el driver
lo comparten distintos dispositivos. El Nota: Para utilizar MPUSBReadInt(), el
número devuelto por el formato de pEP tiene que ser
MPUSBGetDeviceCount tiene que ser igual o “\\MCHP_EPz_ASYNC”. Esta opción sólo está
menor que el número de todos los disponible para un Endpoint interrupción IN.
dispositivos actualmente conectados y La pipe de datos abierta con “_ASYNC” debe
usando el driver genérico. Ejemplo: Si hay almacenar datos con el intervalo
tres dispositivos con los siguientes PID_VID especificado en el Endpoint descriptor con
conectados: un máximo de 100 recepciones. Cualquier
otro dato recibido después de llenar el buffer
¢ Dispositivo tipo 0, VID 0x04d8, PID 0x0001 del driver se ignora. La aplicación del usuario
¢ Dispositivo tipo 1, VID 0x04d8, PID 0x0002 tiene que llamar MPUSBReadInt() a menudo
¢ Dispositivo tipo 2, VID 0x04d8, PID 0x0003 sin superar el máximo de 100.
y el dispositivo que nos interesa tiene dwDir: Especifica la dirección del Endpoint:
VID=0x04d8 y PID=0x0002 el
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 5 / 15
PVOID pData, // Input
handle: Input: Identifica la pipe del
Endpoint que se va a leer. La pipe unida DWORD dwLen, // Input
tiene que crearse con el atributo de acceso
PDWORD pLength, // Output
MP_READ. En conclusión, “handle” es el
número de pipe que nos arrojó la DWORD dwMilliseconds); // Input
instrucción anterior con dwDir=1.
pData: Output: Puntero al buffer que handle: Input: Identifica la pipe del
recibe el dato leído de la pipe. El formato Endpoint que se va a escribir. La pipe unida
del dato es un arreglo de N bytes, donde N tiene que crearse con el atributo de acceso
es el número de bytes que maneja el MP_WRITE. En conclusión, “handle” es el
“device” en el arreglo que envía a la PC,
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 6 / 15
número de pipe que nos arrojó la El formato típico de la instrucción es:
instrucción anterior con dwDir=0. MPUSBClose (myOutPipe)
pData: Input: Puntero al buffer que
contiene los datos que se van a escribir en Existen otras dos instrucciones que no se
la pipe. El formato del dato es un arreglo implementaron en éste desarrollo, pero es
de N bytes, donde N es el número de bytes necesario conocerlos, éstas son:
que maneja el “device” en el arreglo que
recibe de la PC, generalmente se declara al MPUSBGETDLLVERSION(VOID)
inicio del programa en el PIC.
Lee el nivel de revisión del MPUSAPI.dll. Esta
función devuelve la versión del código de la
dwLen: Input: Especifica el número de
dll en formato hexadecimal de 32bits, no
bytes que se van a escribir en la pipe.
realiza nada con el puerto USB.
pLenght: Output: Puntero que proporciona El formato típico de la instrucción es:
el número de bytes que se escriben al
MPUSBGetDLLVersion()
llamar esta función. MPUSBWrite pone
este valor a cero antes de cualquier lectura MPUSBREADINT(HANDLE, PDATA, DWLEN,
o de chequear un error. PLENGTH, DWMILLISECONDS)
dwMilliseconds: Input: Especifica el handle: Input: Identifica la pipe del Endpoint
intervalo de time‐out en milisegundos. La que se va a leer. La pipe unida tiene que
función vuelve si transcurre el intervalo crearse con el atributo de acceso MP_READ.
aunque no se complete la operación. Si
dwMilliseconds=0, la función comprueba pData: Output: Puntero al buffer que recibe
los datos de la pipe y vuelve el dato leído de la pipe.
inmediatamente. Si dwMilliseconds es
infinito, el intervalo de time‐out nunca dwLen: Input: Especifica el número de bytes
termina. que hay que leer de la pipe.
El formato típico de la instrucción es: pLenght: Output: Puntero al número de
MPUSBWrite(myOutPipe, bytes leídos. MPUSBRead pone este valor a
cero antes de cualquier lectura o de
VarPtr(SendData(0)), bytes, VarPtr(bytes),
chequear un error.
1000)
dwMilliseconds: Input: Especifica el intervalo
Por ultimo, se requiere cerrar las
de time‐out en milisegundos. La función
pipes, porque después de usarlos caducan, vuelve si transcurre el intervalo aunque no se
ya no es posible leer / escribir de nuevo. Para complete la operación. Si dwMilliseconds=0,
cerrarlos basta ejecutar la instrucción: la función comprueba los datos de la pipe y
(*MPUSBClose)(HANDLE handle); de donde vuelve inmediatamente. Si dwMilliseconds es
handle: Input: Identifica la pipe del infinito, el intervalo de time‐out nunca
termina.
Endpoint que se va a cerrar.
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 7 / 15
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 8 / 15
apartado 3. Pruebas finales y correcciones en
éste documento.
Se sugiere que al descomprimir el
archivo del driver se instale en C:\Archivos
de Programa\ para que el driver quede en:
C:\Archivos de Programa\ Microchip
Solutions\USB Tools\MCHPUSB Custom
Driver\MCHPUSB Driver\Release ya que al
ejecutar la aplicación del LabVIEW se tomará
como referencia ésa dirección.
Por parte del Hardware, el mismo
compilador trae en la ayuda un diagrama
esquemático para conectar al PIC
dispositivos adicionales como teclado,
display genéricos de dos líneas y gráficos, el
puerto serie, usb, I2C, etc.
Si todo es correcto debemos de observar
en el administrador de dispositivos un nuevo
hardware que se agregó tal como se muestra
en la figura 6.
En propiedades del dispositivo instalado
se puede observar el número PID&VID que
se configuró en el PIC tal como se muestra en
la figura 7, para esto no olvide sustituir en el
descriptor las 3 líneas que se comentan en
el código del programa que se anexa al final
de éste documento.
Una vez configurado el hardware, se
programó el PIC, modificando los Fig. 7 En propiedades del PIC instalado
descriptores para que se puedan hacer en la PC se observa el número de PID&VID
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 9 / 15
Existen tres métodos:
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 10 / 15
a. Identificar el número de dispositivos vid_04d8&pid_000b, según las instrucciones
conectados con el PID&VID y ubicar el que de uso del mpusbapi.dll tenemos que
corresponde al hardware de su desarrollo. declararla como string, y la misma función
Formato: proporciona una salida en formato numérico.
long _MPUSBGetDeviceCount(CStr vid_pid)
De donde: Fig. 8. Función Call Library Function Node
vista en el block diagram
vid_pid = vid_04d8&pid_000b
Para iniciar la programación en
LabVIEW se requiere estar en la ventana del
block diagram de LabVIEW presione el botón
derecho del mouse y en el menú que sale a
continuación presione los siguientes
submenús connectivity Î libraries &
executables Î y déle un click a Call Library
Function Node y se mostrará un pequeño
bloque como se muestra en la figura 8. Déle
doble clic en la parte amarilla y saldrá un Fig. 9. Configuración de parámetros de la
menú de configuración como se muestra en Función Call Library Function Node.
la figura 9. Presione la carpeta y proporcione
la dirección donde se instaló la dll de Conociendo esto pasos, en la misma
Microchip (Si Ud lo instaló en la dirección ventana de la figura 9 presione la flecha de
sugerida anteriormente queda en menú en el campo Function Name (que
“C:\Archivos de programa\Microchip apunta hacia abajo) y escoja la función
Solutions\USB Tools\MCHPUSB Custom MPUSBGetDeviceCount como se muestra en
Driver\Mpusbapi\Dll\Borland_C” e la figura 10, seguidamente presione la
inmediatamente cargará la dll. Al presionar la pestaña “parameters” en la parte superior de
flecha de menú en el campo de Function la ventana y aparecerá otro menú como se
Name (que apunta hacia abajo) podrá muestra en la figura 11. En los campos que
observar TODAS las funciones que la dll aparecerán a continuación llénelos como
admite, solamente tiene que anexar las sigue:
variables y acondicionar el tipo de entrada.
Name: use el que trae de manera
Recuerde que se va a implementar la predeterminada ó un nombre que pueda
primera instrucción MPUSBGetDeviceCount identificar fácilmente a la variable type:
el cual nos proporciona como resultado el Presione la flecha de opciones y seleccione
número de dispositivos conectados a la PC numeric, Data type: Use el que trae de
con el PID&VID que se va a llamar, en éste manera predeterminada, presione el botón
caso el PID&VID que se quiere llamar es
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 11 / 15
marcado como + y se agregará otra variable manera similar a lo descrito anteriormente y
a configurar como sigue: quedará implementada su función.
Name: Ponga el nombre que Ud desee en el
campo Name (se sugiere un nombre que
pueda identificar fácilmente a la variable)
type: string, String Format: se sugiere dejar la
que trae de manera predeterminada (C string
Pointer), Minimun size: se sugiere dejar la
que trae de manera predeterminada (en
blanco), presione el botón OK y la función ya
está configurada.
Ahora cree una constante, escriba Fig. 10. Configurando la función
vid_04d8&pid_000b en su interior y conecte MPUSBGetDeviceCount de mpusbapi.dll
al pin marcado PID&VID del bloque que
acaba de configurar y el resultado que nos
proporcione ésta función ya está lista para
usarse!!!
Los demás parámetros se configuran
de manera similar a lo descrito
anteriormente es importante llegar hasta el
paso (f), sólo hay que tener en cuenta lo
siguiente:
Para la función MPUSBOpen, que
Fig. 10 Configurando la función de salida de
traen una leyenda Long al inicio, se requiere
MPUSBGetDeviceCount de mpusbapi.dll
configurar de igual manera que la instrucción
que se acaba de explicar, para los que traen
la leyenda Void al inicio se configura de la
siguiente manera:
Llame a la Función Call Library Function Node
y escríbale la dirección de la dll, presione el
menú del campo Function Name y seleccione
la función a utilizar (MPUSBWrite,
MPUSBRead ó MPUSBClose) presione la
pestaña de parámeters y deje el parámetro
Function Name con los valores que trae de
Fig. 11 Agregando parámetros de la función
manera predeterminada y sólo agregue los
MPUSBGetDeviceCount de mpusbapi.dll
demás parámetros que necesita la dll de
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 12 / 15
b. Abra la pipe para leer (si no desea leer
puede omitir éste paso).
Formato:
Fig. 13 Configuración del arreglo de 1X64
long _MPUSBOpen(long instance, CStr bytes de 8 bits que se envia/recibe del PIC
VID_PID, CStr EP, long dwDir, long
desde LabVIEW
dwReserved)
De donde:
De donde:
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 13 / 15
Handle corresponde al Número que se Recuerde que se debe abrir una “pipe” a la
obtiene como resultado de la instrucción vez (hay que usar dos veces ésta instrucción),
MPUSBOpen con dwDir = 0, data = es la una vez con dwDir=1 para abrir la pipe para
información que envía el PIC en un vector de leer y con dwDir=0 para abrir la pipe para
64 bytes, dwlen = 64, length = 64, escribir al PIC, el resultado que nos arroja
dwMiliseconds = 200. ésta instrucción es el número de pipe que
nos asigna el sistema operativo.
e. Escriba los datos de la pipe (solamente si
la pipe está abierta) Formato:: No olvide seguir la secuencia de apertura y
cierre de la “pipe” con una “structura” del
void _MPUSBWrite(long Handle, unsigned tipo “Flat sequence” para su ejecución en
char *data, long dwlen, long *length, long secuencia. El código implementado en
dwMilliseconds) labVIEW <<DAQ.vi >> puede solicitarlo a los
De donde: siguientes correos electrónicos:
gpoolb@hotmail.com, lugojim@gmail.com
Handle = Número obtenido como resultado
de la instrucción MPUSBOpen con dwDir = 1, Una vez enlazado con el PIC, los
data = es la información que se envía al PIC datos pueden fluir las veces que sea
en un vector de 64 bytes, dwlen = 64, length necesario de un sentido a otro y
= 64, dwMiliseconds = 200. manipularlos como se desee, ya que se tiene
el completo control del software del PIC (por
f. Cierre la(s) pipe(s) abierta(s), ya que una parte del Compilador C) y en la PC (por parte
vez usados, éstos caducan. Recordemos que del LabVIEW). Asegúrese que la dll quede
si se abren 2 pipes, ambas hay que cerrarlas. instalado en:
Formato: C:\Archivos de programa \Microchip
Solutions\USB Tools\MCHPUSB Custom
void _MPUSBClose(long Handle);
Driver\Mpusbapi\Dll
De donde:
3. Pruebas finales y correcciones.
Handle = Número obtenido como resultado
Para el enlace con la PC por USB es muy
de la instrucción MPUSBOpen con dwDir = 0
importante conectar el capacitor (C4) de
Y para la última “pipe”, Formato: 0.1uF como se indica en el diagrama, ya que,
si se omite generará un error al momento del
void _MPUSBClose(long Handle); enlace. También es muy importante habilitar
el fusible VREGEN para que Vusb sea
De donde:
activado.
Handle = Número que porporciona como
Es importante considerar la función del
resultado de la instrucción MPUSBOpen con
PLL del PIC ya que de acuerdo al valor de la
dwDir = 1
frecuencia del cristal depende el valor de la
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 14 / 15
Integración de PIC18Fxx5x de Microchip™ con LabVIEW™ 8.2 de National Instruments™ 15 / 15
DAQ
Código de programa
/////////////////////////////////////////////////////////////////////////
//// DAQ.c ////
//// ////
//// Este ejemplo muestra como desarrollar un sencillo dispositivo ////
//// USB con el PIC18F2550 (para la serie 18Fxx5x) ////
//// los drivers que se requiere para éste dispositivo son los que ////
//// proporciona Microchip en su pagina web, y se basan en protocolo ////
//// USB_ENABLE_BULK su XTAL es de 12Mhz. ////
//// ////
//// ////
//// Cuando el dispositivo sea conectado al PC, saldrá el asistente ////
//// para la instalación del driver. Se instala el driver ////
//// que nos proporciona Microchip. ////
//// ////
//// Al aplicar energia al PIC se enciende el LED en RB6 y hasta ////
//// que el dispositivo halla sido configurado por la PC via puerto ////
//// USB se encende el Led en RB7. El PIC muestra el dato que le ////
//// envia la PC en el vector [0] e inmediatamente el PIC le ////
//// responde con el valor del puerto A almacenado en el vector [1]. ////
//// Sólo si la PC le envia un dato al PIC éste enviará el dato del ////
//// puerto A ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// Realizado con el compilador CCS PCWH 3.227 ////
//// Este programa fue desarrollado para estimular el uso del ////
//// puerto USB y desarrollar tarjetas de adquisición económicas ////
//// por Ing. Gabriel Pool y Ing. Julio Lugo para proyecto de ////
//// materia Sensores y Actuadores impartida por el profesor ////
//// M.C. Pedro Nájera ////
//// (Universidad Modelo en Mérida, Yucatán, México) en Junio 2008 ////
//// Este programa es de uso libre siempre y cuando que contenga ////
//// esta leyenda y nos agradaría recibir las mejoras que Ud ////
//// amablemente nos envie a estos correos: gpoolb@hotmail.com ////
//// y lugojim@gmail.com ////
//// ////
/////////////////////////////////////////////////////////////////////////
#include <18F2455.h>
//#device ADC=10 //Descomente ésta opción en caso de
usar el ADC a 10bits
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN,MCLR,NOPBADEN
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines. For dynamic configuration of the CCS Library
// for your application several defines need to be made. See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las
directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN
bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT
bulk/interrupt transfers
#define USB_EP1_TX_SIZE 64 //size to allocate for the tx
endpoint 1 buffer
Página 1
DAQ
#define USB_EP1_RX_SIZE 64 //size to allocate for the rx
endpoint 1 buffer
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here. If you are
// not using connection sense, comment out this line. Without connection
// sense you will not know if the device gets disconnected.
// (connection sense should look like this:
// 100k
// VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
// |
// +----/\/\/\/\/\-----GND
// 100k
// (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2 //CCS 18F4550 development kit has optional
conection sense pin
/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries. See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's
PIC USB driver
#include <usb_desc_scope.h> //descriptors del Pic USB
#include <usb.c> //handles usb setup tokens and get
descriptor reports
/////////////////////////////////////////////////////////////////////////////
/* IMPORTANTE: No olvidar sustituir en la sección start device descriptors (aprox
en la linea 132)
al descriptor ubicado en C:\Archivos de
programa\PICC\Drivers\usb_desc_scope.h
lo siguiente:
0xD8,0x04, //vendor id (0x04D8 is Microchip)
0x0B,0x00, //product id
0x01,0x00, //device release number
Página 2
DAQ
int8 dato[64];
void main(void) {
LED_ON(LEDV); //encendemos led en RB6 para
indicar presencia de energia
LED_OFF(LEDR);
usb_init(); // inicializamos el USB
usb_task(); // habilita periferico usb e
interrupciones
usb_wait_for_enumeration(); // esperamos hasta que el PicUSB
sea configurado por el host
LED_OFF(LEDV);
LED_ON(LEDR); // encendemos led en RB7 al
establecer contacto con la PC
TRISA = 0x0FF; // Se declara el puerto A como
entradas
TRISB = 0x00; // Se declara el puerto B como
salidas
ADCON1 = 0x0F; // Se configura al ADC para
entradas digitales
CMCON = 0x07; // Se configuran los comparadores
para entradas digitales
while (TRUE)
{
if(usb_enumerated()) // si el Pic está configurado via
USB
{
if (usb_kbhit(1)) // si el endpoint de salida
contiene datos del host
{
usb_get_packet(1, dato, 64); // cojemos el paquete de tamaño
8bytes del EP1 y almacenamos en dato
portb = dato[0]; // Se muestra al byte completo en
el puerto B
dato[1] = porta; // Se lee el puerto A y se almacena
en el vector
usb_put_packet(1, dato, 64, USB_DTS_TOGGLE); //y enviamos el mismo
paquete de tamaño 64bytes del EP1 al PC
}
}
}
}
Página 3
5 4 3 2 1
SALIDAS
+5V
D D
+5V
D1 D2 D3 D4 D5 D6 D7 D8
R1 R2 R1 R2 R2 R2
10K 10K 10K 10K 10K 10K C5
0.1uF
20
R4 R5 R4 R5 R4 R5 R4 R5
2 150 150 150 150 150 150 150 150
VDD
RA0 RA0
RA1 3 RA1
RA2 4 RA2
RA3 5 RA3
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
RA4 6 RA4/T0CKI/C1OUT/RCV
RA5 7 RA5/SS RC6/TX/CK 17
RC7/RX/DT/SDO 18
+5V R6 R7 11
10K 100 RC0/T1OSO/T13CKI
C 1 MCLR/VPP/RE3 RC2 13 C
USB
OSC2/CLKO/RA6
2 RB5 26 RB5 RC4/D-/VM 15 2
3 27 RB6 RC5/D+/VP 16 3
4 28 RB7 4
OSC1/CLKI
5 RB6 VUSB 14
C4
RB7
0.1uF
GND
GND
ICSP
10
19
9
B
8 B
X1
12 MHz
RA0
RA1
RA2
RA3
RA4
RA5
J3 C7 C8
+5V +12V 22pF 22pF
POWER SUPPLY
S1 S1 S1 S1 S1 S1
4 SW SW SW SW SW SW
3
2
1
C2
2200uF C1 ENTRADAS
1000uF