You are on page 1of 70

Reportes de Temas Avanzados Practicas serial - USB 06/12/2010 INDICE

INTRODUCCION AL LABVIEW Y MIKROC........................................................2 Practica 1 Prueba de Eco Comunicación serial...................................................3 Práctica 2 Convertidor analógico digital de 1 canal a 10 bits mediante puerto serie......................................................................................................................7 Práctica 3 Convertidor analógico digital de 3 canales 8 bits con comunicación por puerto serie...................................................................................................10 Práctica 4 Prueba de eco USB...........................................................................14 Práctica 5 Prueba de eco USB por medio de LabView......................................29 Práctica 6 Convertidor analógico digital 1 canal, 8 bits por USB.......................34 Práctica 7 Convertidor analógico digital 1 canal, 10 bits por USB.....................40 Práctica 8. Convertidor analógico digital de 3 canales a 8 bits..........................46 Práctica 9. Convertidor analógico digital 1 canal, 10 bits con filtro....................53 Práctica 10. Convertidor analógico digital 3 canales con guardado de datos.. .56 Práctica 11. Control de motor reversible............................................................59 Práctica 12. Medición de un potenciómetro y de un generador de funciones por medio de la tarjeta USB-6008............................................................................65 Práctica 13. Frecuencímetro..............................................................................67 Práctica 14. Control de un sensor de temperatura con indicador de correo electrónico...........................................................................................................69

INTRODUCCION AL LABVIEW Y MIKROC
El LabView es un lenguaje de programación de alto nivel, de tipo gráfico, y enfocado al uso en instrumentación. Pero como lenguaje de programación, debido a que cuenta con todas las estructuras, puede ser usado para elaborar cualquier algoritmo que se desee, en cualquier aplicación, como en análisis, telemática, juegos, manejo de textos, etc. Cada programa realizado en LabView será llamado Instrumento Virtual (VI), el cual como cualesquier otro ocupa espacio en la memoria del computador. MikroC PRO para PIC es un compilador de C para microcontroladores PIC de microchip. Esta diseñado para el desarrollo, construcción y depuración de aplicaciones integradas basadas en el PIC.

2

Practica 1 Prueba de Eco Comunicación serial
Objetivo: Construir nuestro primer circuito con el PIC18F4550 para lograr la comunicación serial por medio de labview y mikroC. Introduccion La comunicación serial consiste en el envío de un bit de información de manera secuencial, ésto es, un bit a la vez y a un ritmo acordado entre el emisior y el receptor. La comunicación serial en computadores ha seguido los estándares definidos en 1969 por el RS-232 (Recommended Standard 232) que establece niveles de voltaje, velocidad de transmisión de los datos, etc. Por ejemplo, este protocolo establece un nivel de -12v como un uno lógico y un nivel de voltaje de +12v como un cero lógico (por su parte, los microcontroladores emplean por lo general 5v como un uno lógico y 0v como un cero lógico). Existen en la actualidad diferentes ejemplos de puertos que comunican información de manera serial (un bit a la vez). El conocido como “puerto serial” ha sido gradualmente reemplazado por el puerto USB (Universal Serial Bus) que permite mayor versatilidad en la conexión de múltiples dispositivos. Aunque en naturaleza serial, no suele referenciarse de esta manera ya que sigue sus propios estándares y no los establecidos por el RS-232. La mayoría de los microcontroladores, entre ellos los de Microchip, poseen un puerto de comunicación serial. Para comunicarse con los computadores personales actuales que poseen únicamente puerto USB requieren de un dispositivo “traductor”. Material: Protoboard. Capacitores de 22 microfaradios Capacitores de 22 picofaradios Max232 Conector DB9 PIC18F4550 Leds Resistencias de 330 ohms 8 3 1 8 1 4 2 1 1

while (1) { //inicializamos UART a 9600 bps //espera por UART para estabilizar //PORTB como salidas //apagamos todo el puerto //fin del ciclo 4 . void main () { UART1_Init(9600).Push button Resistencia 10 kilo ohms Cristal 8Mhz Cable para protoboard. Delay_ms(100). 1 1 1 Diagrama: Código de programación: char uart_rd. PORTB = 0. TRISB = 0.

} } } Programacion en Labview: //se envia dato por el UART //leemos el dato recibido 5 .if (UART1_Data_Ready()) { //checamos si el dato es recibido uart_rd = UART1_Read(). UART1_Write(uart_rd). PORTB = uart_rd.

Conclusion: En esta práctica comenzamos a usar un nuevo PIC programando en un lenguaje avanzado como el C. Viendo el resultado en el control de encendido en el puertoB. 6 . usando como interfaz Labview logrando la comunicación serial entre el pic y la computadora.

Introducción: Un conversor (o convertidor) analógico-digital (CAD). 7 . (o también ADC del inglés "Analog-to-Digital Converter") es un dispositivo electrónico capaz de convertir una entrada analógica de voltaje en un valor binario. unsigned int temp_res. uart_rd2. Utilizando los conocimientos de la práctica anterior realizar la conversión analógica digital de 10 bits trasmitiendo los datos por comunicación serial usando programación en C y Labview. se conecta a la entrada del dispositivo y se somete a un muestreo a una velocidad fija. Se utiliza en equipos electrónicos como ordenadores. que varía de forma continua en el tiempo. La señal analógica. Diagrama: Código en C char uart_rd1. obteniéndose así una señal digital a la salida del mismo. Material: En esta práctica seguiremos utilizando el circuito anterior agregando los siguientes dispositivos Potenciómetro 10 K y 2 Leds.Práctica 2 Convertidor analógico digital de 1 canal a 10 bits mediante puerto serie. Objetivo. uart_wr2. unsigned int uart_wr1. grabadores de sonido y de vídeo. y equipos de telecomunicaciones.

uart_rd2 = UART1_Read(). TRISD = 0. uart_wr2 = temp_res >> 8. uart_wr1 = temp_res. Delay_ms(7). UART1_Write(uart_wr1). UART1_Write(uart_wr2). Delay_ms(7). while (1) { if (UART1_Data_Ready()) { temp_res = ADC_read(2). PORTD = uart_wr2. UART1_Init(9600).void main() { TRISA = 0XFF. Delay_ms(100). uart_rd1 = UART1_Read(). PORTB = uart_wr1. TRISB = 0. } } } Programacion en Labview: 8 .

Conclusion: Entre más nos metemos al entorno de programación. nos damos cuenta lo poderosa que es esta herramienta. también nos ayuda a conocer más el lenguaje de programación en C como ser capaces de diseñar una tarjeta adquiridora de datos para Labview. 9 .

para ver el desempeño del PIC. En la siguiente figura se muestra una función de transferencia ideal de un convertidor de 8 bits de precisión.Práctica 3 Convertidor analógico digital de 3 canales 8 bits con comunicación por puerto serie. Ahora que ya sabemos hacer la conversión y mandar los datos por puerto serie. Usualmente será necesario acondicionar la señal de entrada del convertidor A-D. Introducción. bien sea atenuando bien sea amplificándola. Objetivo. Este muestreo está definido por la función de transferencia. Materiales: Potenciómetros de 10 kilo con el circuito anterior Diagrama: 10 . Un CAD muestrea una señal analógica y la convierte en un valor digital de 'n' bits. ahora se deberá de elaborar 3 convertidores a 8 bit.

if (uart_rd1==65){ uart_wr1 = temp_res1>> 2. } Delay_ms(7). uart_rd1. uart_rd1 = UART1_Read(). } Delay_ms(7). UART1_Write(uart_wr). temp_res2 = ADC_read(3). uart_wr2. UART1_Init(9600). UART1_Write(uart_wr1). unsigned int temp_res. Delay_ms(100). void main() { TRISA = 0XFF. char uart_rd. temp_res2. unsigned int uart_wr. uart_rd2. uart_wr1. temp_res1. temp_res1 = ADC_read(2). if (uart_rd==64){ uart_wr = temp_res>> 2. while (1) { if (UART1_Data_Ready()) { temp_res = ADC_read(1).Código en C. uart_rd = UART1_Read(). 11 . TRISB = 0.

PORTB=uart_wr2. } } } Programacion en Labview: 12 .uart_rd2 = UART1_Read(). UART1_Write(uart_wr2). } Delay_ms(7). if (uart_rd2==69){ uart_wr2 = temp_res2>> 2.

Conclusión: Como podemos ver cada convertidor tiene su propia respuesta. Labview nos ayuda mucho en la construcción de estas prácticas. 13 . y esto lo logramos con la programación en C. esto se puede ver en las llaves en cada lectura.

Tenía en un principio como objetivo el conectar periféricos relativamente lentos (ratones.) de una forma realmente sencilla. Materiales: Protoboard. que en la actualidad es uno de los mas usados. impresoras. en esta practica comenzaremos a profundizar la programación para lograr la comunicación USB mediante el PIC y la computadora. El USB o Universal Serial Bus es una interfaz para la transmisión serie de datos y distribución de energía desarrollado por empresas líderes del sector de las telecomunicaciones y de los ordenadores y que ha sido introducida en el mercado de los PC´s y periféricos para mejorar las lentas interfaces serie (RS232) y paralelo. unidades ZIP.Práctica 4 Prueba de eco USB. DB-25. cámaras digitales. rápida y basada en comunicaciones serie. PIC18F4550 Push Button Resistencia 10 Kilo Ohms Leds Capacitores de 22 pF Capacitores de 10nF Cristal oscilador 8MHz Conector USB (tipo A o tipo B) Diagrama: Colocar indicadores (Led) al puerto D 8 2 14 . aunque por sus características también podía conectarse hasta discos duros. Ahora pasaremos a otro protocolo de comunicación. RS-232 que son los puertos que se encuentran en la mayoría de los computadores. Provee una mayor velocidad de transferencia (de hasta 100 veces más rápido) comparado con el puerto Paralelo de 25-pin y el Serial DB-9. etc. Introducción. Objetivo.

the HID Device Name will appear in the respective window. The character that user sends to PIC from the HID terminal will be re-sent back to user. * Description: This example establishes connection with the HID terminal that is active on the PC. Upon connection establishment. * Test configuration: MCU: PIC18F4550 15 . /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika.Código en C Programa Principal.initial release. 2005-2008 * Revision History: 20050502: .

com/en/tools/easypic6/ Oscillator: Ext. is raised with PLL to 48.pdf Dev. } //***************************************************************************************** ********* 16 .000 MHz (USB osc.mikroe.Place jumpers J12 in the right position */ unsigned char k. const char *text = "MIKROElektronika Compilers ER \r\n".microchip.there's so much place for mistake! . //***************************************************************************************** ********* // Main Interrupt Routine //***************************************************************************************** ********* void interrupt() { HID_InterruptProc().mikroe. unsigned char userWR_buffer[64].Board: EasyPIC6 http://www.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 . Modules: HS 8. userRD_buffer[64].http://ww1.pdf#page14 SW: mikroC PRO for PIC http://www.com/pdf/easypic6/easypic6_manual_v100.000MHz) on-board USB-HID http://www.com/downloads/en/DeviceDoc/39632D.mikroe.

PIR1 = 0. TRISB = 0xFF. //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. PEIE. PIE2 = 0. RCON.INT0IE. PIR2 = 0. INTCON2 = 0xF5. ADCON1 |= 0x0F. INTCON3 = 0xC0.//***************************************************************************************** ********* // Initialization Routine //***************************************************************************************** ********* void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0. 17 // Configure all ports with analog function // Disable comparators // Disable Priority Levels on interrupts // Disable GIE.RBIE .IPEN = 0. as digital CMCON |= 7. TRISD = 0. PIE1 = 0. TMR0IE. TRISC = 0xFF.

TRISE = 0x07; LATA = 0; LATB = 0; LATC = 0; LATD = 0; LATE = 0; //-------------------------------------// Clear user RAM // Banks [00 .. 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //***************************************************************************************** //***************************************************************************************** // Main Program Routine //***************************************************************************************** void main() { unsigned char i, ch; Init_Main(); HID_Enable(&userRD_buffer, &userWR_buffer); Delay_ms(1000); Delay_ms(1000); while (1) { k = HID_Read(); i = 0; while (i < k) { ch = userRD_buffer[i]; PORTD = ch; userWR_buffer[0] = ch; 18

while (!HID_Write(&userWR_buffer, 1)) ; i++; } } HID_Disable(); } //***************************************************************************************** Programas fuente. //****************************************************************************** // // File Version 1.01 // //****************************************************************************** #include "Definit.h" #include "VARs.h" // The number of bytes in each report, // calculated from Report Size and Report Count in the report descriptor unsigned char const HID_INPUT_REPORT_BYTES unsigned char const HID_OUTPUT_REPORT_BYTES unsigned char const HID_FEATURE_REPORT_BYTES // Byte constants unsigned char const NUM_ENDPOINTS = 2; = 1; = 1; = 2;

unsigned char const ConfigDescr_wTotalLength = USB_CONFIG_DESCRIPTOR_LEN + USB_INTERF_DESCRIPTOR_LEN + USB_HID_DESCRIPTOR_LEN + (NUM_ENDPOINTS * USB_ENDP_DESCRIPTOR_LEN); unsigned char const HID_ReportDesc_len unsigned char const Low_HID_ReportDesc_len = 47; = HID_ReportDesc_len; 19

unsigned char const High_HID_ReportDesc_len 8; unsigned char const Low_HID_PACKET_SIZE unsigned char const High_HID_PACKET_SIZE 8; // Descriptor Tables

= HID_ReportDesc_len >> = HID_PACKET_SIZE; = HID_PACKET_SIZE >>

unsigned char const DescTables[USB_DEVICE_DESCRIPTOR_ALL_LEN*2] = { // Device Descriptor USB_DEVICE_DESCRIPTOR_LEN, 0, Device descriptor (always 0x12) USB_DEVICE_DESCRIPTOR_TYPE, 0, DEVICE descriptor 0x00, 0, byte) 0x02, 0, // bcdUSB // // bLength // bDescriptorType - Length of -1=

- USB revision 2.00 (low (high byte)

0x00, 0, // bDeviceClass - Zero means each interface operates independently (class code in the interface descriptor) 0x00, 0, 0x00, 0, // bDeviceSubClass // bDeviceProtocol - maximum size

EP0_PACKET_SIZE, 0, // bMaxPacketSize0 of a data packet for a control transfer over EP0 0x78, 0, 0x56, 0, 0x01, 0, 0x00, 0, 0x01, 0, 0x00, 0, 0x01, 0, 0x02, 0, // idVendor // // idProduct // // bcdDevice // // iManufacturer // iProduct

- Vendor ID (low byte) (high byte) - Product ID (low byte) (high byte) - ( low byte) (high byte) - String1 - String2 20

and "Remote wakeup" 50.Alternate setting . 0.0x00. 0. 0.Number of interface. mA from the bus. based array 0x00. 0. endpoints used in this interface 0x03. 0x01. 0. descriptor plus the interface and endpoint descriptors that are part of the configuration. 0x01. 0x01.Configuration Value // iConfiguration // bmAttributes // MaxPower . 0. 0. 0. 0. 0. 0. // bNumEndPoints // bInterfaceClass // bInterfaceSubClass ."Bus powered" . 0x00.( None ) -1 // bNumConfigurations USB_CONFIG_DESCRIPTOR_LEN. 0x00. // Configuration Descriptor // iSerialNumber . 0. // Interface Descriptor USB_INTERF_DESCRIPTOR_LEN.String Index for this . 0. INTERFACE descriptor 0x00.attributes .Total length of this config. 0. Interface descriptor (always 0x09) USB_INTERFACE_DESCRIPTOR_TYPE. 0 . 0.Length of -4= // ( high byte) . 0.bus-powered draws 50*2 // bDescriptorType .assigned by the USB . CONFIGURATION descriptor // bLength // bDescriptorType . configuration ( None ) 0xA0. 0. // bInterfaceNumber // bAlternateSetting // bLength .Length of -2= ConfigDescr_wTotalLength.Number of NUM_ENDPOINTS. 0x00.Number of interfaces // bNumInterfaces // bConfigurationValue . // wTotalLength . 0. Configuration descriptor (always 0x09) USB_CONFIG_DESCRIPTOR_TYPE.Not A boot device 21 .

Index to string descriptor that // bLength // bDescriptorType . descriptor (always 0x07) USB_ENDPOINT_DESCRIPTOR_TYPE. .length of 22 . 0. HID descriptor (always 0x09) USB_HID_DESCRIPTOR_TYPE. Endpoint Type . // EP1_TX Descriptor USB_ENDP_DESCRIPTOR_LEN. 0. EP1 - USB_ENDPOINT_TYPE_INTERRUPT. 0. HID descriptor 0x01. high order byte 1. 0. 0x01. 0x00. 0. 0. 0. 0.0x00. 0. 0x22. 0.none 0x00. 0. // bInterfaceProtocol . ENDPOINT descriptor 0x81. High_HID_ReportDesc_len.polling interval (1 ms) // bLength . 0.low order byte High_HID_PACKET_SIZE.In. 0.01) // Localized country code (none) // # of HID class descriptor to follow (1) // Report descriptor type (HID) Low_HID_ReportDesc_len.length of -5= // bDescriptorType . // iInterface describes this interface ( None ) // HID Descriptor USB_HID_DESCRIPTOR_LEN.max packet size .max packet . // bEndpointAddress // bLength . 0. 0. 0. 0.Length of . 0. 0x01. 0. // EP1_RX Descriptor USB_ENDP_DESCRIPTOR_LEN.Interrupt Low_HID_PACKET_SIZE.0x21 = // HID class release number (1. descriptor (always 0x07) // bInterval // bmAttributes // wMaxPacketSize // . size .

// HID_Report Descriptor 0x06. 0. 0. 0.max packet . 0xFF. 0.max packet size . 0. ENDPOINT descriptor 0x01. 0x01. 0. 0x08.USB_ENDPOINT_DESCRIPTOR_TYPE. 0. 0x03. 0. 0. // bEndpointAddress // bDescriptorType . 0xA1. 0.low order byte High_HID_PACKET_SIZE. 0x00. 0. // bInterval // bmAttributes // wMaxPacketSize // . 0x01. size . 0xFF. 0x75. 0x15. 0x09. high order byte 1. 0x95.Interrupt Low_HID_PACKET_SIZE. 0. 0. 0. EP1 - -5= USB_ENDPOINT_TYPE_INTERRUPT. 0. // The Input report 0x09. 0. 0xA0. 0. 0x00.Vendor defined // LOGICAL_MINIMUM (0) // LOGICAL_MAXIMUM (255) // REPORT_SIZE (8) // REPORT_COUNT (2) 23 .Out.polling interval (1 ms) // USAGE_PAGE (Vendor Defined) // USAGE ID (Vendor Usage 1) // COLLECTION (Application) // USAGE ID . Endpoint Type . 0. 0. 0. 0. 0. 0x26. 0.

Abs) HID_OUTPUT_REPORT_BYTES. 0x26. // The Output report 0x09. 0x91. 0. 0. 0. 0x15. 0. 24 // REPORT_SIZE (8) // LOGICAL_MAXIMUM (255) // LOGICAL_MINIMUM (0) // USAGE ID . // The Feature report 0x09. 0.Var. 0. 0. 0. 0x08. 0. 0. 0.Abs) . 0x81. 0x00.Vendor defined // INPUT (Data.Vendor defined // OUTPUT (Data. 0x95. 0x02. 0. 0. 0. 0. 0x05. 0xFF. 0. 0. 0. 0. 0x00. 0xFF. 0. 0x26. 0x02. 0x75. 0x08.Var. 0. 0.HID_INPUT_REPORT_BYTES. 0. // REPORT_COUNT (2) // REPORT_SIZE (8) // LOGICAL_MAXIMUM (255) // LOGICAL_MINIMUM (0) // USAGE ID . 0. 0x00. 0. 0x15. 0x75. 0x00. 0x04.

0. 0. 0. //****************************************************************************** unsigned char const LangIDDescr[8] = { 0x04. 0. USB_STRING_DESCRIPTOR_TYPE. 0. 0. 0. 0.0x95. 0. 0. 0. 0. 0.Low // .Var. 'a'. 0. 0. 0. 0. 0x09. 'm'. 0 }. 0. 0. 'a'. USB_STRING_DESCRIPTOR_TYPE. 25 // LangID (0x0409) . 0. //****************************************************************************** unsigned char const ManufacturerDescr[68] = { 34. 0. 0. 0. // End Collection 0xC0. ' '. 0. 0x02. 0. 'v'. 0. 's'.Abs) . 'a'. // REPORT_COUNT (2) HID_FEATURE_REPORT_BYTES. 'e'. 0. 0. 0. 't'.High // END_COLLECTION // FEATURE (Data. 0 }. 0xB1. 0. 0. 0. 0. 0. 0x04. 0. 0.

0. 'o'. 0. 0. 0. 0. 'P'. 0. 26 . 0. 0. 0. 0. 0. '4'. USB_STRING_DESCRIPTOR_TYPE. 0. 0. 0. 'I'. 'd'. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 'o'. 0. 0. 's'. 'z'. 0. ' '. 0. 0. 0. 'r'. 0. 0. 0. 0. 0. 'C'. 0. 'i'. 0. ' '. 0. 'k'. '8'. 0. 0. 0. 0. 0. 0. 0. 0. 'm'. 'C'. 0. 0. 0. 'a'. 0. 0. 0. //****************************************************************************** unsigned char const ProductDescr[96] = { 48. 0. 0. 0. 0. 0. '1'. 0. 0.'n'. 0. 'F'. ' '. 0 }. 0.

0. 0. 0. Byte_tmp_0[0] = High_HID_ReportDesc_len. '5'. 0 }. Byte_tmp_0[0] = ConfigDescr_wTotalLength. 0. 0. 0. 0. 's'. 0. Byte_tmp_0[0] = High_HID_PACKET_SIZE. ' '. USB_STRING_DESCRIPTOR_TYPE. 0. Byte_tmp_0[0] = Low_HID_PACKET_SIZE. 0. 0 }. 't'. 0. DescTables.'5'. //****************************************************************************** unsigned char const StrUnknownDescr[4] = { 2. 0. 0. 0. 't'. Byte_tmp_0[0] = Low_HID_ReportDesc_len. 0. ManufacturerDescr. 0. LangIDDescr. 0. // Initialization Function void InitUSBdsc() { Byte_tmp_0[0] = NUM_ENDPOINTS. '0'. Byte_tmp_0[0] = HID_ReportDesc_len. 'e'. 27 . 0. 0. 0. 0. 0. 0. 0.

28 . como también nos muestra la necesidad de crear driver para probar nuestro primer diseño lo cual veremos en la siguiente practica. En MIKROC acceder a la ventana de pruebas HID. } Procedimiento: Conectar el dispositivo a la computadora. Desde MikroC verificar si el dispositivo tiene comunicación con la computadora. HID es Human Interface Device. Conclusión: Al desarrollar la práctica nos damos cuenta la aplicación que se le puede dar a esta comunicación. StrUnknownDescr.ProductDescr.

El archivo fuente si cambia. Hardware: La misma configuración a la practica anterior Código en C: El archivo de código principal sigue siendo el mismo. ahora utilizaremos Labview para realizar mayores aplicaciones utilizando el protocolo USB. esto es debido. usando labview para realizar adquisiciones de datos u otra aplicación que se le quiera dar. Introducción: Ahora será necesario crear nuestro propio driver para poder usar a nuestro PIC como interfaz. 29 . Acceder al Driver Wizard que es un complemento de LabView. De entre las opciones que inmediatamente aparecen. Hay que modificar: ID vendor ID product Mensaje de dispositivo Los cuales nos ayudaran a la creación del driver. Creación del controlador. Se encuentra en el folder VISA y posteriormente Driver Wizard. elegir USB. a que se trabaja con un protocolo de comunicación avanzada. Objetivo: Después de los conocimientos adquiridos hasta ahora.Práctica 5 Prueba de eco USB por medio de LabView.

Cambiar el ID vendor y el ID product. POR LOS MISMOS QUE HEMOS CAMBIADO EN NUESTRO ARCHIVO FUENTE Y QUE HEMOS YA QUEMADO EN EL PIC. 30 .

para crear un driver más personalizado. cambiar el fabricante y el modelo del dispositivo. 31 .Si se quiere.

conectamos el dispositivo y en donde la computadora lo reconozca. actualizamos el controlador por el nuevo que acabamos de crear. Programación en Labview: 32 .Crearlo e instalarlo. significa que hemos hecho el proceso de manera correcta. una vez hecho esto. Verificar: Cuando el dispositivo deje de ser HID y pase a Dispositivo de National Instrumenst.

con esto y el programa de ECO hemos dado un paso a la programación con USB. 33 .Conclusion: Ahora hemos creado el driver que nos ayudara a la elaboración de las siguientes practicas.

2005-2008 * Revision History: 20050502: 34 . obtendremos una señal que re circulará en los mismos valores 4 veces. nuestra próxima escena será repetir las practicas de protocolo serie ahora con el protocolo usb. Código C Programa principal. Una vez teniendo los conocimientos de programación como en C y en labview. 8 bits por USB. Hay que recordar que la configuración del convertidor en MIKROC es bastante sencilla. Objetivo.Práctica 6 Convertidor analógico digital 1 canal. Introducción. ahora teniendo esa topología en mente y uniéndola con la prueba de eco USB obtendremos una adquisición de datos analógicos bastante fiel y rápida. y necesitamos solo la parte mas alta ya que si no. Materiales: Circuito de la practica 4 Potenciómetro de 10Kohms Diagrama: Realizar el circuito de la practica 4 conectando los dispositivos de adquisición como en la práctica del convertidor. /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. Finalmente cabe mencionar que el tamaño del convertidor es de 10 bits.

there's so much place for mistake! . is raised with PLL to 48.mikroe.pdf Dev.mikroe.mikroe.initial release.000 MHz (USB osc.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 . * Test configuration: MCU: PIC18F4550 http://ww1..microchip.Place jumpers J12 in the right position */ unsigned char k. Modules: HS 8. * Description: This example establishes connection with the HID terminal that is active on the PC. //***************************************************************************************** 35 . The character that user sends to PIC from the HID terminal will be re-sent back to user.com/en/tools/easypic6/ Oscillator: Ext.000MHz) on-board USB-HID http://www.com/pdf/easypic6/easypic6_manual_v100.Board: EasyPIC6 http://www. Upon connection establishment. unsigned char userWR_buffer[64].pdf#page14 SW: mikroC PRO for PIC http://www. the HID Device Name will appear in the respective window. userRD_buffer[64].com/downloads/en/DeviceDoc/39632D. unsigned int temp_res. const char *text = "MIKROElektronika Compilers ER \r\n".

Valor previo) CMCON |= 7. as digital (0X0F . PIR1 = 0. } //**************************************************************************** //***************************************************************************************** // Initialization Routine //**************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0. PEIE. PIR2 = 0. TMR0IE.RBIE 36 . ADCON1 |= 0x00. RCON.INT0IE. PIE2 = 0. //-------------------------------------// Configure all ports with analog function // Disable comparators // Disable Priority Levels on interrupts // Disable GIE.// Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc().IPEN = 0. PIE1 = 0. INTCON3 = 0xC0. INTCON2 = 0xF5.

LATA = 0. TRISD = 0. while (1) { k = HID_Read(). &userWR_buffer). LATB = 0.// Ports Configuration //-------------------------------------TRISA = 0xFF. LATC = 0. 37 . 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //**************************************************************************** // Main Program Routine //**************************************************************************** void main() { unsigned char i. LATD = 0. Delay_ms(1000). TRISE = 0x07. TRISB = 0xFF. ch. LATE = 0. Init_Main(). HID_Enable(&userRD_buffer. TRISC = 0xFF. Delay_ms(1000).. //-------------------------------------// Clear user RAM // Banks [00 .

while (!HID_Write(&userWR_buffer. } //**************************************************************************** Programacion en Labview: 38 . while (i < k) { ch = userRD_buffer[i]. userWR_buffer[0] = temp_res>> 2.i = 0. temp_res = ADC_read(2). 1)) . i++. PORTD = temp_res>> 2. } } HID_Disable().

Conclusión: Ahora vemos un mejor resultado con el muestreo de nuestros datos adquiridos del potenciómetro. 39 . eso se debe al protocolo de comunicación. con esto podemos ver la practicidad del USB.

/* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika.Práctica 7 Convertidor analógico digital 1 canal. 2005-2008 * Revision History: 20050502: . Introducción: Vimos la facilidad de pasar de un protocolo a otro. Código en C. The character that user sends to PIC from the HID 40 . the HID Device Name will appear in the respective window. 10 bits por USB.initial release. Upon connection establishment. Diagrama. gracias a la ayuda del lenguaje C y por la herramienta Labview. Objetivo: Realizaremos la misma práctica de conversión a 10 bits realizando la comunicación USB en vez de la serial. ahora seguimos nuestro paso realizando la práctica de convertidor analógico digital a 10 bits. Material: El mismo circuito de la practica 6 agregando dos leds mas para ver la conversión a 10 bits. La misma conexión de la practica anterior solo agregando dos leds mas como en la practica del conversor comunicación serial. * Description: This example establishes connection with the HID terminal that is active on the PC.

terminal will be re-sent back to user. 41 . unsigned int temp_res.microchip.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 . * Test configuration: MCU: PIC18F4550 http://ww1.000MHz) on-board USB-HID http://www.Place jumpers J12 in the right position */ unsigned char k.com/en/tools/easypic6/ Oscillator: Ext.pdf#page14 SW: mikroC PRO for PIC http://www.Board: EasyPIC6 http://www. //***************************************************************************************** // Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc().mikroe.mikroe. const char *text = "MIKROElektronika Compilers ER \r\n".com/downloads/en/DeviceDoc/39632D.mikroe.there's so much place for mistake! .com/pdf/easypic6/easypic6_manual_v100. unsigned char userWR_buffer[64]. is raised with PLL to 48.000 MHz (USB osc. Modules: HS 8.pdf Dev. userRD_buffer[64].

as digital (0X0F . PIR2 = 0. PIE1 = 0.RBIE 42 .} //***************************************************************************************** //***************************************************************************************** // Initialization Routine //***************************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0. INTCON3 = 0xC0.Valor previo) CMCON |= 7. // Configure all ports with analog function // Disable comparators // Disable Priority Levels on interrupts // Disable GIE.INT0IE.IPEN = 0. ADCON1 |= 0x00. //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. TMR0IE. PIR1 = 0. TRISC = 0xFF. PIE2 = 0. PEIE. TRISB = 0. INTCON2 = 0xF5. RCON.

Delay_ms(1000). if (ch == 0X01) { 43 . ch. &userWR_buffer). //-------------------------------------// Clear user RAM // Banks [00 . 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //***************************************************************************************** //***************************************************************************************** // Main Program Routine //***************************************************************************************** void main() { unsigned char i. i = 0.TRISD = 0. LATD = 0. LATE = 0. TRISE = 0x07. ch2. while (i < k) { ch = userRD_buffer[i]. LATB = 0. LATC = 0. HID_Enable(&userRD_buffer. LATA = 0. Init_Main(). Delay_ms(1000) while (1) { k = HID_Read()..

i++. } while (!HID_Write(&userWR_buffer. } //***************************************************************************************** Programación en Labview: 44 . 1)) . userWR_buffer[0] = temp_res. PORTD = temp_res.temp_res = ADC_read(2). if (ch2 == 0x08) { PORTB = temp_res >> 8. } Delay_ms(7). } } HID_Disable(). ch2 = userRD_buffer[i]. userWR_buffer[0] = temp_res >> 8.

45 .Conclusión: La conversión a 10 bits nos da mejor respuesta debido a la resolución. Lo que se observo en la practica fueron perturbaciones debido al ruido entregado del mismo potenciómetro.

the HID Device Name will appear in the respective window. /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. Materiales: Realizar las conexiones de la práctica de comunicación serie convertidor analógico conectando para realizar la comunicación serie como en la primer practica.Práctica 8. * Test configuration: 46 . Convertidor analógico digital de 3 canales a 8 bits. Llevaremos a la práctica los conocimientos obtenidos al programar el protocolo serie. Objetivo. ahora en un protocolo más rápido y eficaz. Introducción. * Description: This example establishes connection with the HID terminal that is active on the PC. The character that user sends to PIC from the HID terminal will be re-sent back to user. 2005-2008 * Revision History: 20050502: . Profundizar mas en el protocolo USB usando lenguaje C y la herramienta Labview para realizar un manejo de mayor cantidad de datos. Código en C.initial release. Upon connection establishment.

pdf#page14 SW: mikroC PRO for PIC http://www. temp_res2.Board: EasyPIC6 http://www. //***************************************************************************************** // Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc(). is raised with PLL to 48.pdf Dev.mikroe. unsigned int temp_res.Place jumpers J12 in the right position */ unsigned char k.com/downloads/en/DeviceDoc/39632D.microchip.MCU: PIC18F4550 http://ww1. } //***************************************************************************************** 47 . const char *text = "MIKROElektronika Compilers ER \r\n".com/pdf/easypic6/easypic6_manual_v100.mikroe. unsigned char userWR_buffer[64].there's so much place for mistake! .mikroe. Modules: HS 8. temp_res1.000MHz) on-board USB-HID http://www.000 MHz (USB osc.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 .com/en/tools/easypic6/ Oscillator: Ext. userRD_buffer[64].

PIE1 = 0. ADCON1 |= 0x00.IPEN = 0. TMR0IE.Valor previo) CMCON |= 7.RBIE 48 . TRISE = 0x07. PIR1 = 0. RCON. PEIE. INTCON2 = 0xF5. // Configure all ports with analog function // Disable comparators // Disable Priority Levels on interrupts // Disable GIE. TRISB = 0. as digital (0X0F . PIE2 = 0. PIR2 = 0.INT0IE.//***************************************************************************************** // Initialization Routine //***************************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0. //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. TRISC = 0xFF. TRISD = 0. INTCON3 = 0xC0.

&userWR_buffer). while (i < k) { ch = userRD_buffer[i]. 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //***************************************************************************************** // Main Program Routine //***************************************************************************************** void main() { unsigned char i. i = 0. LATD = 0. LATC = 0.. Init_Main(). HID_Enable(&userRD_buffer. Delay_ms(1000).LATA = 0. ch. ch2. LATB = 0. } 49 . if (ch == 0X01) { temp_res = ADC_read(0). LATE = 0. ch3 . while (1) { k = HID_Read(). userWR_buffer[0] = temp_res>> 2. //-------------------------------------// Clear user RAM // Banks [00 . Delay_ms(1000).

} } HID_Disable(). 1)) . userWR_buffer[0] = temp_res2>> 2. } Programación con labview: 50 . i++. ch2 = userRD_buffer[i]. userWR_buffer[0] = temp_res1>> 2.Delay_ms(7). if (ch3 == 0x0F) { temp_res2 = ADC_read(2). if (ch2 == 0x08) { temp_res1 = ADC_read(1). } Delay_ms(7). ch3 = userRD_buffer[i]. } while (!HID_Write(&userWR_buffer.

51 .

Conclusión: Podemos ver la cantidad de datos y la velocidad con la cual se puede trabajar con el protocolo USB. 52 .

Convertidor analógico digital 1 canal.Práctica 9. Material: Circuito de práctica 7 Diagrama: El circuito se usara sin cambios. Código en C. ahora nuestro propósito es eliminar ese ruido utilizando un filtro para lograr una mejor fidelidad. el filtro se trabajara en labview. También usaremos el mismo código que en la práctica 7. Introducción: Como pudimos ver en la respuesta de la señal entrega por nuestro potenciómetro obtuvimos ruido. Objetivo: Ahora vamos a introducir un filtro para obtener una mejor respuesta a la señal de salida de nuestro convertidor de 10 bits. 10 bits con filtro. Programación en Labview: 53 .

54 .

Nos damos cuenta que un filtro no en necesariamente colocar un capacitor y una resistencia o usando opam.Conclusión: Al llevar a cabo esta práctica podemos ver el cambio entre la señal de entrada en la práctica anterior a la actual esto gracias al filtro. sino que también lo podemos realizar mediante software. 55 .

filtros y todo el análisis que se necesite y lo hacemos con valores muy exactos.Práctica 10. Introducción. Seguiremos usando el mismo código de programación. también podemos hacer operaciones. No sólo eso. Agregar esta característica a la tarjeta es importante. Ahora sacaremos una de las muchas funciones de Labview para ir completando nuestras prácticas y así obtener mayor conocimiento en la programación. Diagrama: Seguiremos usando el armado del circuito anterior Código en C. continuos y fieles. Objetivo. ya que los valores de los sensores pueden ser guardados en un archivo y así ser revisados más tarde. Programación en Labview: 56 . promedios. Convertidor analógico digital 3 canales con guardado de datos. Material: Circuito de práctica 8.

57 .

58 .Conclusión: Usamos una herramienta de Labview para guardar los datos obtenidos de la medición. así vamos conociendo mas nuestra interfaz.

Material: Circuito práctica 5. Upon connection establishment. 2005-2008 * Revision History: 20050502: . Usando los conocimientos obtenidos hasta el momento para realizar el control de un motor usando lógica PLC. Introducción. /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. Control de motor reversible. Usar la metodología de programación de escalera para lograr el giro del motor. * Description: This example establishes connection with the HID terminal that is active on the PC. the HID Device Name will appear in the respective window. Código en C. LM293B Motor de corriente directa a 5volts. Push Button 1 Fusible. Objetivo. The character that user sends to PIC from the HID terminal will be re-sent back to user.Práctica 11.initial release. 59 3 .

unsigned char userWR_buffer[64].000 MHz (USB osc.microchip.mikroe. //***************************************************************************************** // Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc().Board: EasyPIC6 http://www.Place jumpers J12 in the right position */ unsigned char k. userRD_buffer[64].000MHz) on-board USB-HID http://www. Modules: HS 8. } //***************************************************************************************** 60 . is raised with PLL to 48.there's so much place for mistake! .com/pdf/easypic6/easypic6_manual_v100.pdf Dev.mikroe.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 .* Test configuration: MCU: PIC18F4550 http://ww1. const char *text = "MIKROElektronika Compilers ER \r\n".com/downloads/en/DeviceDoc/39632D.mikroe.pdf#page14 SW: mikroC PRO for PIC http://www.com/en/tools/easypic6/ Oscillator: Ext.

// Configure all ports with analog function // Disable comparators // Disable Priority Levels on interrupts // Disable GIE. ADCON1 |= 0x0F.IPEN = 0. INTCON2 = 0xF5. TRISE = 0x07. as digital CMCON |= 7. RCON. //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. PIR2 = 0. TRISC = 0xFF. PIR1 = 0. TMR0IE. PEIE.RBIE 61 . TRISD = 0. PIE2 = 0.INT0IE. INTCON3 = 0xC0. TRISB = 0xFF.//***************************************************************************************** // Initialization Routine //***************************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0. PIE1 = 0.

PORTD = ch. ch1 = PORTB. while (i < k) { ch = userRD_buffer[i]. HID_Enable(&userRD_buffer. while (1) { k = HID_Read(). &userWR_buffer). ch. userWR_buffer[0] = ch1. //-------------------------------------// Clear user RAM // Banks [00 . Delay_ms(1000).LATA = 0. LATD = 0. LATE = 0. LATC = 0. ch1. Delay_ms(1000). 62 . LATB = 0. i = 0. 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //***************************************************************************************** //***************************************************************************************** // Main Program Routine //***************************************************************************************** void main() { unsigned char i. Init_Main()..

i++.while (!HID_Write(&userWR_buffer. } //***************************************************************************************** Programación en labview: 63 . 1)) . } } HID_Disable().

64 . Podemos ver lo poderoso que es saber usar una herramienta como el Labview para poder controlar un motor usando la lógica de escalera.Resultados. claro este gracias a acoplar al pic con un programa en lenguaje c usando mikroc.

El generador de funciones entrara en AI1+ y AI1para usar el modo diferencial. Las tarjetas DAQ NI USB-6008 y NI USB-6009 tienen capacidades multifunción con ocho canales de entrada analógica 12 ó 14 bits. Programacion en Labview: 65 . Incluyen terminales de tornillo para extraíbles para conectarse por señal directa. Introducción. Objetivo. Ambos dispositivos funcionan con la corriente del bus USB así que no necesitan una fuente de energía externa para trabajar. Diagrama: Colocaremos la salida del potenciómetro a la salida AI0 y lo alimentaremos con la fuente incluida en la tarjeta. una referencia de tensión de abordo para suministrar energía a dispositivos y sensores externos. así como para proteger contra sobretensión en las líneas de entrada analógica de hasta ±35 V. Material: USB-6008 Potenciómetro Generador de funciones.Práctica 12. Aprender a usar una nueva interfaz para conocer la diferencia de programación asi como todas las utilidades de la tarjeta. 12 líneas E/S digitales y un contador. una capa diseñada en cuatro capas para reducir el ruido y aumentar la precisión. Medición de un potenciómetro y de un generador de funciones por medio de la tarjeta USB6008. dos salidas analógicas.

Conclusion: Conocer las interfaces realizadas por national instruments y ver la diferencia de practicidad entre la daq profesional o una hecha por nosotros. 66 .

Objetivo. Conectaremos el generador de funciones a la entrada diferencial AI1. mediante el uso de un contador que acumula el número de periodos. USB 6008 Generador de funciones. Materiales. Frecuencímetro. Introducción. Dado que la frecuencia se define como el número de eventos de una clase particular ocurridos en un período. contando el número de repeticiones de una onda en un intervalo de tiempo. Un frecuencímetro es un instrumento que sirve para medir la frecuencia. Programación en Labview 67 .Hardware.Práctica 13. Diagrama. Con la tarjeta de National construir un dispositivo capaz de medir la frecuencia de la señal de entrada. es generalmente sencilla su medida.

68 .Conclusión: Vemos la facilidad de procesar una señal con la ayuda de la tarjeta USB 6008 realizando un frecuencímetro acercándonos al comportamiento de un osciloscopio.

Material: USB-6008 LM35 Diagrama: Alimentar el sensor con la tarjeta USB-6008 La salida conectarla a AI0. en modo SEF. En esta práctica veremos otra aplicación de Labview. Block Diagram 69 . checando los datos obtenidos. la cual es poder mandar un correo a un servidor. Control de un sensor de temperatura con indicador de correo electrónico. Introducción.Práctica 14. Objetivo: Diseñar y construir un sistema telemétrico con el fin de monitorear la temperatura. si el dato es mayor a la temperatura que se exponga enviara un correo avisando que se a llegado al límite y parara el proceso.

70 .Conclusión: Vemos la facilidad de hacer un sistema telemétrico usando la interfaz USB 6008 y la herramienta de Labview para censar la temperatura y mandar un correo con los datos obtenidos en la medición.