Reportes de Temas AvanzadosPracticas 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. 1 Capacitores de 22 microfaradios 4 Capacitores de 22 picofaradios 2 Max232 1 Conector DB9 1 PIC18F4550 1 Leds Resistencias de 330 ohms 8 8 3 PORTB = 0. void main () { UART1_Init(9600). while (1) { //inicializamos UART a 9600 bps //espera por UART para estabilizar //PORTB como salidas //apagamos todo el puerto //fin del ciclo 4 . TRISB = 0. Diagrama: Código de programación: char uart_rd.Push button 1 Resistencia 10 kilo ohms 1 Cristal 8Mhz 1 Cable para protoboard. Delay_ms(100). UART1_Write(uart_rd).if (UART1_Data_Ready()) { //checamos si el dato es recibido uart_rd = UART1_Read(). //leemos el dato recibido PORTB = uart_rd. //se envia dato por el UART } } } Programacion en Labview: 5 . 6 . Viendo el resultado en el control de encendido en el puertoB. usando como interfaz Labview logrando la comunicación serial entre el pic y la computadora.Conclusion: En esta práctica comenzamos a usar un nuevo PIC programando en un lenguaje avanzado como el C. Se utiliza en equipos electrónicos como ordenadores. se conecta a la entrada del dispositivo y se somete a un muestreo a una velocidad fija. grabadores de sonido y de vídeo. Introducción: Un conversor (o convertidor) analógico-digital (CAD). uart_wr2. Material: En esta práctica seguiremos utilizando el circuito anterior agregando los siguientes dispositivos Potenciómetro 10 K y 2 Leds. Diagrama: Código en C char uart_rd1. (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. 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. unsigned int uart_wr1. La señal analógica. y equipos de telecomunicaciones. 7 . que varía de forma continua en el tiempo. uart_rd2.Práctica 2 Convertidor analógico digital de 1 canal a 10 bits mediante puerto serie. obteniéndose así una señal digital a la salida del mismo. unsigned int temp_res. Objetivo. UART1_Write(uart_wr1). while (1) { if (UART1_Data_Ready()) { temp_res = ADC_read(2). uart_rd2 = UART1_Read(). TRISD = 0. PORTD = uart_wr2. uart_wr2 = temp_res >> 8. Delay_ms(7). PORTB = uart_wr1. UART1_Write(uart_wr2). } } } Programacion en Labview: 8 .void main() { TRISA = 0XFF. Delay_ms(7). Delay_ms(100). UART1_Init(9600). uart_rd1 = UART1_Read(). uart_wr1 = temp_res. TRISB = 0. 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 .Conclusion: Entre más nos metemos al entorno de programación. ahora se deberá de elaborar 3 convertidores a 8 bit. Introducción. Objetivo. En la siguiente figura se muestra una función de transferencia ideal de un convertidor de 8 bits de precisión. Usualmente será necesario acondicionar la señal de entrada del convertidor A-D. Ahora que ya sabemos hacer la conversión y mandar los datos por puerto serie. Un CAD muestrea una señal analógica y la convierte en un valor digital de 'n' bits.Práctica 3 Convertidor analógico digital de 3 canales 8 bits con comunicación por puerto serie. Materiales: Potenciómetros de 10 kilo con el circuito anterior Diagrama: 10 . Este muestreo está definido por la función de transferencia. para ver el desempeño del PIC. bien sea atenuando bien sea amplificándola. 11 . char uart_rd. uart_rd = UART1_Read(). Delay_ms(100). uart_rd2. if (uart_rd==64){ uart_wr = temp_res>> 2. unsigned int uart_wr. temp_res1. uart_rd1. } Delay_ms(7). UART1_Write(uart_wr). uart_rd1 = UART1_Read(). temp_res1 = ADC_read(2). unsigned int temp_res. UART1_Init(9600).Código en C. uart_wr2. TRISB = 0. } Delay_ms(7). temp_res2 = ADC_read(3). uart_wr1. UART1_Write(uart_wr1). while (1) { if (UART1_Data_Ready()) { temp_res = ADC_read(1). temp_res2. if (uart_rd1==65){ uart_wr1 = temp_res1>> 2. void main() { TRISA = 0XFF. } } } Programacion en Labview: 12 .uart_rd2 = UART1_Read(). if (uart_rd2==69){ uart_wr2 = temp_res2>> 2. PORTB=uart_wr2. } Delay_ms(7). UART1_Write(uart_wr2). Conclusión: Como podemos ver cada convertidor tiene su propia respuesta. y esto lo logramos con la programación en C. esto se puede ver en las llaves en cada lectura. 13 . Labview nos ayuda mucho en la construcción de estas prácticas. DB-25. unidades ZIP. cámaras digitales. impresoras.) de una forma realmente sencilla. en esta practica comenzaremos a profundizar la programación para lograr la comunicación USB mediante el PIC y la computadora. Introducción. Materiales: Protoboard. 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. Tenía en un principio como objetivo el conectar periféricos relativamente lentos (ratones. Ahora pasaremos a otro protocolo de comunicación. que en la actualidad es uno de los mas usados. RS-232 que son los puertos que se encuentran en la mayoría de los computadores. PIC18F4550 Push Button Resistencia 10 Kilo Ohms Leds 8 Capacitores de 22 pF 2 Capacitores de 10nF Cristal oscilador 8MHz Conector USB (tipo A o tipo B) Diagrama: Colocar indicadores (Led) al puerto D 14 . rápida y basada en comunicaciones serie. etc. aunque por sus características también podía conectarse hasta discos duros.Práctica 4 Prueba de eco USB. 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. Objetivo. 2005-2008 * Revision History: 20050502: . The character that user sends to PIC from the HID terminal will be re-sent back to user. /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. the HID Device Name will appear in the respective window.Código en C Programa Principal. Upon connection establishment.initial release. * Description: This example establishes connection with the HID terminal that is active on the PC. * Test configuration: MCU: PIC18F4550 15 . Place jumpers J12 in the right position */ unsigned char k.mikroe.http://ww1. userRD_buffer[64]. is raised with PLL to 48.mikroe.Board: EasyPIC6 http://www.com/pdf/easypic6/easypic6_manual_v100.com/downloads/en/DeviceDoc/39632D. const char *text = "MIKROElektronika Compilers ER \r\n".000 MHz (USB osc. Modules: on-board USB-HID http://www.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 .pdf#page14 SW: mikroC PRO for PIC http://www.000MHz) Ext. } //***************************************************************************************** ********* 16 .com/en/tools/easypic6/ Oscillator: HS 8. //***************************************************************************************** ********* // Main Interrupt Routine //***************************************************************************************** ********* void interrupt() { HID_InterruptProc(). unsigned char userWR_buffer[64].pdf Dev.microchip.there's so much place for mistake! .mikroe. RBIE INTCON2 = 0xF5. PIR1 = 0. TRISB = 0xFF. TMR0IE. TRISD = 0. TRISC = 0xFF.IPEN = 0. // Disable GIE. RCON. // Disable Priority Levels on interrupts PIE1 = 0. INTCON3 = 0xC0. PIR2 = 0. // Configure all ports with analog function // Disable comparators //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. PEIE. as digital CMCON |= 7. PIE2 = 0. ADCON1 |= 0x0F. 17 .//***************************************************************************************** ********* // Initialization Routine //***************************************************************************************** ********* void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0.INT0IE. 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 = 1; unsigned char const HID_OUTPUT_REPORT_BYTES = 1; unsigned char const HID_FEATURE_REPORT_BYTES = 2; // Byte constants unsigned char const NUM_ENDPOINTS = 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; = HID_ReportDesc_len >> unsigned char const Low_HID_PACKET_SIZE = HID_PACKET_SIZE; unsigned char const High_HID_PACKET_SIZE 8; = HID_PACKET_SIZE >> // Descriptor Tables unsigned char const DescTables[USB_DEVICE_DESCRIPTOR_ALL_LEN*2] = { // Device Descriptor USB_DEVICE_DESCRIPTOR_LEN, 0, Device descriptor (always 0x12) // bLength USB_DEVICE_DESCRIPTOR_TYPE, 0, DEVICE descriptor 0x00, 0, byte) 0x02, 0, - Length of // bDescriptorType // bcdUSB -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, // bDeviceSubClass 0x00, 0, // bDeviceProtocol EP0_PACKET_SIZE, 0, // bMaxPacketSize0 of a data packet for a control transfer over EP0 0x78, 0, // idVendor 0x56, 0, // 0x01, 0, // idProduct 0x00, 0, // 0x01, 0, // bcdDevice 0x00, 0, // 0x01, 0, // iManufacturer 0x02, 0, // iProduct - maximum size - Vendor ID (low byte) (high byte) - Product ID (low byte) (high byte) - ( low byte) (high byte) - String1 - String2 20 0. // bAlternateSetting NUM_ENDPOINTS. 0. 0.attributes . 0. 0. Configuration descriptor (always 0x09) // bLength USB_CONFIG_DESCRIPTOR_TYPE. and "Remote wakeup" // bmAttributes . 0x00."Bus powered" 50. // bNumConfigurations -1 // Configuration Descriptor USB_CONFIG_DESCRIPTOR_LEN. INTERFACE descriptor 0x00.Number of .( None ) 0x01. 0. 0.0x00. 0. 0. 0 .Length of // bDescriptorType -2= ConfigDescr_wTotalLength. descriptor plus the interface and endpoint descriptors that are part of the configuration. 0. configuration ( None ) // iConfiguration . // ( high byte) 0x01. 0. 0.bus-powered draws 50*2 // Interface Descriptor USB_INTERF_DESCRIPTOR_LEN. Interface descriptor (always 0x09) // bLength USB_INTERFACE_DESCRIPTOR_TYPE.assigned by the USB . 0. based array // bInterfaceNumber 0x00. endpoints used in this interface .Not A boot device 21 .Number of interfaces 0x00.Total length of this config. // bInterfaceClass 0x00. 0. 0.String Index for this 0xA0. // bNumInterfaces 0x01.Configuration Value . 0.Length of // bDescriptorType . // bConfigurationValue . 0.Number of interface. CONFIGURATION descriptor . mA from the bus.Alternate setting // bNumEndPoints 0x03. // bInterfaceSubClass -4= . // wTotalLength . 0. // iSerialNumber . // MaxPower . 0. // bInterfaceProtocol 0x00. 0.Interrupt . HID descriptor (always 0x09) // bLength USB_HID_DESCRIPTOR_TYPE. EP1 // bmAttributes Low_HID_PACKET_SIZE.0x21 = // HID class release number (1. descriptor (always 0x07) // bLength USB_ENDPOINT_DESCRIPTOR_TYPE. 0. . 0. HID descriptor 0x01. 0.01) 0x01. // bDescriptorType // bEndpointAddress USB_ENDPOINT_TYPE_INTERRUPT. 0. 0.max packet . descriptor (always 0x07) // bLength . high order byte // 1. // iInterface describes this interface ( None ) . 0.length of 22 .Index to string descriptor that // HID Descriptor USB_HID_DESCRIPTOR_LEN. size . // # of HID class descriptor to follow (1) 0x22. Endpoint Type . 0. 0. // EP1_RX Descriptor USB_ENDP_DESCRIPTOR_LEN.In. 0. // bInterval -5= - .none . 0. 0. ENDPOINT descriptor 0x81. 0. 0.low order byte // wMaxPacketSize High_HID_PACKET_SIZE. 0. High_HID_ReportDesc_len.polling interval (1 ms) // EP1_TX Descriptor USB_ENDP_DESCRIPTOR_LEN.length of . 0x00.0x00. 0. 0.max packet size - . // Report descriptor type (HID) Low_HID_ReportDesc_len. // Localized country code (none) 0x01. 0.Length of // bDescriptorType . // COLLECTION (Application) 0x01. // USAGE_PAGE (Vendor Defined) 0xA0. high order byte // 1. // USAGE ID (Vendor Usage 1) 0x01. 0. // LOGICAL_MINIMUM (0) 0x00. 0x26. 0. 0. 0x15. 0. 0. 0. // LOGICAL_MAXIMUM (255) 0x00.Interrupt . 0. 0. 0. 0.USB_ENDPOINT_DESCRIPTOR_TYPE. 0. 0.max packet size - . 0xFF. 0. 0. 0. 0x95.polling interval (1 ms) // HID_Report Descriptor 0x06. 0xA1.max packet . 0. // The Input report 0x09. 0. 0x09.Out. // REPORT_SIZE (8) 0x08. 0.low order byte // wMaxPacketSize High_HID_PACKET_SIZE. // REPORT_COUNT (2) 23 . size . 0. // bInterval -5= - . 0. Endpoint Type . ENDPOINT descriptor 0x01. EP1 // bmAttributes Low_HID_PACKET_SIZE. // USAGE ID . 0. 0. 0.Vendor defined 0x03. 0x75. // bDescriptorType // bEndpointAddress USB_ENDPOINT_TYPE_INTERRUPT. 0xFF. 0x26. 0. 0. 0. // USAGE ID . // OUTPUT (Data. 0. 0. 0. 0.Abs) 0x02. 0x75. // REPORT_COUNT (2) HID_OUTPUT_REPORT_BYTES. // LOGICAL_MINIMUM (0) 0x00. 0x75. 0. 0.Var. 0. 0xFF. // LOGICAL_MINIMUM (0) 0x00. 0. 0. 0. 0x26.Vendor defined 0x05. // LOGICAL_MAXIMUM (255) 0x00. 0. // The Output report 0x09.Abs) 0x02.Vendor defined 0x04. 0. 0x81. 0x15. 0xFF. 0. // The Feature report 0x09. 0. 0. 0. 0. 0. // REPORT_SIZE (8) 0x08. // LOGICAL_MAXIMUM (255) 0x00. 0x91. // REPORT_SIZE (8) 0x08.Var. 0. // INPUT (Data. 0. 0. 0. 0x15. // USAGE ID .HID_INPUT_REPORT_BYTES. 0x95. 24 . // REPORT_COUNT (2) HID_FEATURE_REPORT_BYTES. 't'. //****************************************************************************** unsigned char const LangIDDescr[8] = { 0x04. 0. 0. 'v'.Low 0x04. 0. 0 // . 0. 0. // LangID (0x0409) . 0. 25 . 0. 0. 0. 'm'. USB_STRING_DESCRIPTOR_TYPE. 'e'. 0. 0. USB_STRING_DESCRIPTOR_TYPE. 0 // END_COLLECTION }. 0.Var.0x95. 's'. 0xB1. 0. 'a'. 0. 0. //****************************************************************************** unsigned char const ManufacturerDescr[68] = { 34. 0. 0x09. 0. // FEATURE (Data. 0. 0. 0. // End Collection 0xC0. 0. 'a'. 0. 0. 0. 0. 0. 0. 0. 0.High }. 0. ' '.Abs) 0x02. 0. 0. 0. 0. 0. 0. 'a'. 0. 0. 0. 0. 26 . 0. 0. 0. '4'. ' '. 0. 0. 0 }. 0. ' '. 0. 0. 0. 0. 0. 'C'. 'P'. 's'. 0. 0. 0. 0. 0. 0. 'k'. 'z'. 0. 0. ' '. 'm'. 0. 0. 0. 0. 0. 0. 0. '8'. 0. 0. 0. //****************************************************************************** unsigned char const ProductDescr[96] = { 48. 0. 0. 'I'. 0. 0. 'o'. '1'. 0. 0. 0. 0. 'a'. 0. 0. 0. 0. 0. 'F'. 'o'. 0. 0. 'r'. 0. 0. 0. 0. 0. 0. 0. 0. 'C'. 0. 0. 0. 0. 0. 0. 'i'. 0. 0. USB_STRING_DESCRIPTOR_TYPE. 0. 'd'. 0. 0.'n'. 0. 'e'. Byte_tmp_0[0] = High_HID_ReportDesc_len. Byte_tmp_0[0] = Low_HID_ReportDesc_len. LangIDDescr. 0. 0. 't'. 0. 0. 0. //****************************************************************************** unsigned char const StrUnknownDescr[4] = { 2. Byte_tmp_0[0] = ConfigDescr_wTotalLength. 0. USB_STRING_DESCRIPTOR_TYPE. 0. DescTables. 0. 0. 0. ManufacturerDescr. 't'. 0 }. 0. 0. 0. 0. 0. 0. ' '. 0. '5'. 0. 0. 27 . Byte_tmp_0[0] = Low_HID_PACKET_SIZE.'5'. Byte_tmp_0[0] = HID_ReportDesc_len. // Initialization Function void InitUSBdsc() { Byte_tmp_0[0] = NUM_ENDPOINTS. 0. 0 }. 0. Byte_tmp_0[0] = High_HID_PACKET_SIZE. '0'. 0. 0. 's'. En MIKROC acceder a la ventana de pruebas HID. como también nos muestra la necesidad de crear driver para probar nuestro primer diseño lo cual veremos en la siguiente practica. Conclusión: Al desarrollar la práctica nos damos cuenta la aplicación que se le puede dar a esta comunicación. StrUnknownDescr. Desde MikroC verificar si el dispositivo tiene comunicación con la computadora. HID es Human Interface Device.ProductDescr. 28 . } Procedimiento: Conectar el dispositivo a la computadora. ahora utilizaremos Labview para realizar mayores aplicaciones utilizando el protocolo USB. usando labview para realizar adquisiciones de datos u otra aplicación que se le quiera dar. Objetivo: Después de los conocimientos adquiridos hasta ahora. Creación del controlador. De entre las opciones que inmediatamente aparecen. Acceder al Driver Wizard que es un complemento de LabView. Hay que modificar: ID vendor ID product Mensaje de dispositivo Los cuales nos ayudaran a la creación del driver. a que se trabaja con un protocolo de comunicación avanzada. Introducción: Ahora será necesario crear nuestro propio driver para poder usar a nuestro PIC como interfaz. Hardware: La misma configuración a la practica anterior Código en C: El archivo de código principal sigue siendo el mismo. 29 . Se encuentra en el folder VISA y posteriormente Driver Wizard.Práctica 5 Prueba de eco USB por medio de LabView. elegir USB. esto es debido. El archivo fuente si cambia. 30 .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. para crear un driver más personalizado. 31 .Si se quiere. cambiar el fabricante y el modelo del dispositivo. Programación en Labview: 32 . Verificar: Cuando el dispositivo deje de ser HID y pase a Dispositivo de National Instrumenst. una vez hecho esto. significa que hemos hecho el proceso de manera correcta.Crearlo e instalarlo. actualizamos el controlador por el nuevo que acabamos de crear. conectamos el dispositivo y en donde la computadora lo reconozca. con esto y el programa de ECO hemos dado un paso a la programación con USB.Conclusion: Ahora hemos creado el driver que nos ayudara a la elaboración de las siguientes practicas. 33 . 2005-2008 * Revision History: 20050502: 34 . Una vez teniendo los conocimientos de programación como en C y en labview. y necesitamos solo la parte mas alta ya que si no. Objetivo. Hay que recordar que la configuración del convertidor en MIKROC es bastante sencilla. obtendremos una señal que re circulará en los mismos valores 4 veces. /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. nuestra próxima escena será repetir las practicas de protocolo serie ahora con el protocolo usb. Código C Programa principal. 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.Práctica 6 Convertidor analógico digital 1 canal. 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. 8 bits por USB. Finalmente cabe mencionar que el tamaño del convertidor es de 10 bits. unsigned char userWR_buffer[64].000 MHz (USB osc. userRD_buffer[64].mikroe. const char *text = "MIKROElektronika Compilers ER \r\n". //***************************************************************************************** 35 .initial release.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 .there's so much place for mistake! .Board: EasyPIC6 http://www.pdf Dev.mikroe. Upon connection establishment.pdf#page14 SW: mikroC PRO for PIC http://www.com/pdf/easypic6/easypic6_manual_v100.com/downloads/en/DeviceDoc/39632D.000MHz) Ext. Modules: on-board USB-HID http://www.mikroe. is raised with PLL to 48.com/en/tools/easypic6/ Oscillator: HS 8. The character that user sends to PIC from the HID terminal will be re-sent back to user. the HID Device Name will appear in the respective window.Place jumpers J12 in the right position */ unsigned char k. unsigned int temp_res.microchip.. * Description: This example establishes connection with the HID terminal that is active on the PC. * Test configuration: MCU: PIC18F4550 http://ww1. INTCON3 = 0xC0.IPEN = 0. // Disable GIE. PIR2 = 0. RCON.RBIE INTCON2 = 0xF5. PEIE. PIR1 = 0. PIE2 = 0.INT0IE. // Configure all ports with analog function // Disable comparators //-------------------------------------- 36 .Valor previo) CMCON |= 7. // Disable Priority Levels on interrupts PIE1 = 0. } //**************************************************************************** //***************************************************************************************** // Initialization Routine //**************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0.// Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc(). TMR0IE. ADCON1 |= 0x00. as digital (0X0F . Delay_ms(1000). LATE = 0. Init_Main(). ch. LATB = 0.// Ports Configuration //-------------------------------------TRISA = 0xFF. TRISE = 0x07. LATA = 0. //-------------------------------------// Clear user RAM // Banks [00 . while (1) { k = HID_Read(). LATD = 0. TRISC = 0xFF. TRISD = 0. 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //**************************************************************************** // Main Program Routine //**************************************************************************** void main() { unsigned char i. LATC = 0. HID_Enable(&userRD_buffer.. &userWR_buffer). Delay_ms(1000). 37 . TRISB = 0xFF. temp_res = ADC_read(2). i++. while (i < k) { ch = userRD_buffer[i]. PORTD = temp_res>> 2. userWR_buffer[0] = temp_res>> 2. 1)) . } } HID_Disable(). while (!HID_Write(&userWR_buffer. } //**************************************************************************** Programacion en Labview: 38 .i = 0. 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. The character that user sends to PIC from the HID 40 . /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. Material: El mismo circuito de la practica 6 agregando dos leds mas para ver la conversión a 10 bits.initial release. the HID Device Name will appear in the respective window. Introducción: Vimos la facilidad de pasar de un protocolo a otro. Upon connection establishment.Práctica 7 Convertidor analógico digital 1 canal. * Description: This example establishes connection with the HID terminal that is active on the PC. Objetivo: Realizaremos la misma práctica de conversión a 10 bits realizando la comunicación USB en vez de la serial. 10 bits por USB. Código en C. Diagrama. La misma conexión de la practica anterior solo agregando dos leds mas como en la practica del conversor comunicación serial. ahora seguimos nuestro paso realizando la práctica de convertidor analógico digital a 10 bits. 2005-2008 * Revision History: 20050502: . gracias a la ayuda del lenguaje C y por la herramienta Labview. const char *text = "MIKROElektronika Compilers ER \r\n".terminal will be re-sent back to user. unsigned int temp_res.com/pdf/easypic6/easypic6_manual_v100. unsigned char userWR_buffer[64]. 41 .com/downloads/en/DeviceDoc/39632D.Board: EasyPIC6 http://www.pdf#page14 SW: mikroC PRO for PIC http://www.mikroe.microchip.Place jumpers J12 in the right position */ unsigned char k.pdf Dev. Modules: on-board USB-HID http://www.com/en/tools/easypic6/ Oscillator: HS 8.000 MHz (USB osc.there's so much place for mistake! . //***************************************************************************************** // Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc(). * Test configuration: MCU: PIC18F4550 http://ww1.mikroe.mikroe. userRD_buffer[64].com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 . is raised with PLL to 48.000MHz) Ext. } //***************************************************************************************** //***************************************************************************************** // Initialization Routine //***************************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0.IPEN = 0.RBIE INTCON2 = 0xF5. TRISC = 0xFF. as digital (0X0F . PIR1 = 0.INT0IE. PIR2 = 0. RCON. PIE2 = 0. 42 . // Disable GIE. TRISB = 0. // Configure all ports with analog function // Disable comparators //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. INTCON3 = 0xC0. PEIE. TMR0IE. ADCON1 |= 0x00.Valor previo) CMCON |= 7. // Disable Priority Levels on interrupts PIE1 = 0. LATB = 0. Delay_ms(1000). LATC = 0. LATD = 0. 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //***************************************************************************************** //***************************************************************************************** // Main Program Routine //***************************************************************************************** void main() { unsigned char i. TRISE = 0x07. i = 0. HID_Enable(&userRD_buffer. Init_Main(). ch. LATA = 0..TRISD = 0. ch2. while (i < k) { ch = userRD_buffer[i]. //-------------------------------------// Clear user RAM // Banks [00 . LATE = 0. if (ch == 0X01) { 43 . Delay_ms(1000) while (1) { k = HID_Read(). &userWR_buffer). } } HID_Disable(). i++. userWR_buffer[0] = temp_res >> 8. ch2 = userRD_buffer[i]. } //***************************************************************************************** Programación en Labview: 44 . } while (!HID_Write(&userWR_buffer. } Delay_ms(7). 1)) . if (ch2 == 0x08) { PORTB = temp_res >> 8.temp_res = ADC_read(2). PORTD = temp_res. userWR_buffer[0] = temp_res. Conclusión: La conversión a 10 bits nos da mejor respuesta debido a la resolución. 45 . Lo que se observo en la practica fueron perturbaciones debido al ruido entregado del mismo potenciómetro. * Description: This example establishes connection with the HID terminal that is active on the PC. Profundizar mas en el protocolo USB usando lenguaje C y la herramienta Labview para realizar un manejo de mayor cantidad de datos. /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. Introducción. Upon connection establishment. Convertidor analógico digital de 3 canales a 8 bits. Objetivo. Llevaremos a la práctica los conocimientos obtenidos al programar el protocolo serie. The character that user sends to PIC from the HID terminal will be re-sent back to user. the HID Device Name will appear in the respective window. 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. * Test configuration: 46 .initial release.Práctica 8. ahora en un protocolo más rápido y eficaz. Código en C. 2005-2008 * Revision History: 20050502: . temp_res2.000 MHz (USB osc. const char *text = "MIKROElektronika Compilers ER \r\n".com/en/tools/easypic6/ Oscillator: HS 8.com/pdf/easypic6/easypic6_manual_v100.mikroe.mikroe. Modules: on-board USB-HID http://www.Board: EasyPIC6 http://www. unsigned int temp_res. temp_res1.MCU: PIC18F4550 http://ww1. //***************************************************************************************** // Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc().com/downloads/en/DeviceDoc/39632D.000MHz) Ext.mikroe. } //***************************************************************************************** 47 .Place jumpers J12 in the right position */ unsigned char k. is raised with PLL to 48.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 . userRD_buffer[64]. unsigned char userWR_buffer[64].pdf#page14 SW: mikroC PRO for PIC http://www.there's so much place for mistake! .microchip.pdf Dev. as digital (0X0F . TRISE = 0x07. TRISD = 0. PIR2 = 0.INT0IE.IPEN = 0. // Disable Priority Levels on interrupts PIE1 = 0. // Disable GIE.//***************************************************************************************** // Initialization Routine //***************************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0.RBIE INTCON2 = 0xF5.Valor previo) CMCON |= 7. // Configure all ports with analog function // Disable comparators //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. INTCON3 = 0xC0. TMR0IE. TRISB = 0. ADCON1 |= 0x00. PIR1 = 0. RCON. PIE2 = 0. TRISC = 0xFF. 48 . PEIE. i = 0. LATD = 0. userWR_buffer[0] = temp_res>> 2. while (i < k) { ch = userRD_buffer[i]. Delay_ms(1000).. HID_Enable(&userRD_buffer. ch. ch2. //-------------------------------------// Clear user RAM // Banks [00 . Delay_ms(1000). ch3 . LATC = 0. Init_Main(). if (ch == 0X01) { temp_res = ADC_read(0). LATB = 0. &userWR_buffer). } 49 . while (1) { k = HID_Read(). LATE = 0.LATA = 0. 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //***************************************************************************************** // Main Program Routine //***************************************************************************************** void main() { unsigned char i. } Delay_ms(7). userWR_buffer[0] = temp_res2>> 2. if (ch3 == 0x0F) { temp_res2 = ADC_read(2). userWR_buffer[0] = temp_res1>> 2. } while (!HID_Write(&userWR_buffer.Delay_ms(7). 1)) . ch3 = userRD_buffer[i]. if (ch2 == 0x08) { temp_res1 = ADC_read(1). } Programación con labview: 50 . ch2 = userRD_buffer[i]. } } HID_Disable(). i++. 51 . Conclusión: Podemos ver la cantidad de datos y la velocidad con la cual se puede trabajar con el protocolo USB. 52 . 10 bits con filtro. ahora nuestro propósito es eliminar ese ruido utilizando un filtro para lograr una mejor fidelidad. Material: Circuito de práctica 7 Diagrama: El circuito se usara sin cambios. Programación en Labview: 53 . Convertidor analógico digital 1 canal. el filtro se trabajara en labview.Práctica 9. Objetivo: Ahora vamos a introducir un filtro para obtener una mejor respuesta a la señal de salida de nuestro convertidor de 10 bits. Código en C. 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. 54 . 55 .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. Nos damos cuenta que un filtro no en necesariamente colocar un capacitor y una resistencia o usando opam. sino que también lo podemos realizar mediante software. Programación en Labview: 56 . Agregar esta característica a la tarjeta es importante. filtros y todo el análisis que se necesite y lo hacemos con valores muy exactos. también podemos hacer operaciones. continuos y fieles. Introducción. No sólo eso. Material: Circuito de práctica 8. Convertidor analógico digital 3 canales con guardado de datos. ya que los valores de los sensores pueden ser guardados en un archivo y así ser revisados más tarde. Objetivo. Diagrama: Seguiremos usando el armado del circuito anterior Código en C. Ahora sacaremos una de las muchas funciones de Labview para ir completando nuestras prácticas y así obtener mayor conocimiento en la programación. promedios.Práctica 10. Seguiremos usando el mismo código de programación. 57 . 58 .Conclusión: Usamos una herramienta de Labview para guardar los datos obtenidos de la medición. así vamos conociendo mas nuestra interfaz. LM293B Motor de corriente directa a 5volts. 59 .Práctica 11. Objetivo.initial release. Control de motor reversible. Usar la metodología de programación de escalera para lograr el giro del motor. Código en C. 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. Material: Circuito práctica 5. 2005-2008 * Revision History: 20050502: . Push Button 3 1 Fusible. Upon connection establishment. Introducción. /* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika. * Description: This example establishes connection with the HID terminal that is active on the PC. Usando los conocimientos obtenidos hasta el momento para realizar el control de un motor usando lógica PLC. mikroe.com/downloads/en/DeviceDoc/39632D.pdf#page14 SW: mikroC PRO for PIC http://www.com/en/tools/easypic6/ Oscillator: HS 8.000MHz) Ext.mikroe.000 MHz (USB osc.* Test configuration: MCU: PIC18F4550 http://ww1.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 . //***************************************************************************************** // Main Interrupt Routine //***************************************************************************************** void interrupt() { HID_InterruptProc(). Modules: on-board USB-HID http://www.pdf Dev. userRD_buffer[64]. } //***************************************************************************************** 60 .Board: EasyPIC6 http://www. unsigned char userWR_buffer[64]. const char *text = "MIKROElektronika Compilers ER \r\n".com/pdf/easypic6/easypic6_manual_v100.there's so much place for mistake! .microchip.mikroe.Place jumpers J12 in the right position */ unsigned char k. is raised with PLL to 48. 61 .//***************************************************************************************** // Initialization Routine //***************************************************************************************** void Init_Main() { //-------------------------------------// Disable all interrupts //-------------------------------------INTCON = 0. // Disable Priority Levels on interrupts PIE1 = 0. TRISB = 0xFF. INTCON3 = 0xC0. RCON.IPEN = 0.RBIE INTCON2 = 0xF5. TMR0IE. // Disable GIE. ADCON1 |= 0x0F.INT0IE. PIE2 = 0. PIR1 = 0. TRISD = 0. TRISC = 0xFF. PEIE. // Configure all ports with analog function // Disable comparators //-------------------------------------// Ports Configuration //-------------------------------------TRISA = 0xFF. as digital CMCON |= 7. TRISE = 0x07. PIR2 = 0. ch. ch1. Delay_ms(1000). Delay_ms(1000). 07] ( 8 x 256 = 2048 Bytes ) //-------------------------------------} //***************************************************************************************** //***************************************************************************************** // Main Program Routine //***************************************************************************************** void main() { unsigned char i. HID_Enable(&userRD_buffer. &userWR_buffer). //-------------------------------------// Clear user RAM // Banks [00 . PORTD = ch. LATC = 0. ch1 = PORTB. userWR_buffer[0] = ch1. LATE = 0. 62 . LATB = 0. Init_Main(). LATD = 0. while (i < k) { ch = userRD_buffer[i].LATA = 0.. i = 0. while (1) { k = HID_Read(). } //***************************************************************************************** Programación en labview: 63 . i++.while (!HID_Write(&userWR_buffer. } } HID_Disable(). 1)) . 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. 64 . 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. Medición de un potenciómetro y de un generador de funciones por medio de la tarjeta USB6008. así como para proteger contra sobretensión en las líneas de entrada analógica de hasta ±35 V. Introducción. una capa diseñada en cuatro capas para reducir el ruido y aumentar la precisión. Aprender a usar una nueva interfaz para conocer la diferencia de programación asi como todas las utilidades de la tarjeta. Incluyen terminales de tornillo para extraíbles para conectarse por señal directa. Diagrama: Colocaremos la salida del potenciómetro a la salida AI0 y lo alimentaremos con la fuente incluida en la tarjeta. Programacion en Labview: 65 . Ambos dispositivos funcionan con la corriente del bus USB así que no necesitan una fuente de energía externa para trabajar. 12 líneas E/S digitales y un contador. Material: USB-6008 Potenciómetro Generador de funciones.Práctica 12. Objetivo. Las tarjetas DAQ NI USB-6008 y NI USB-6009 tienen capacidades multifunción con ocho canales de entrada analógica 12 ó 14 bits. dos salidas analógicas. una referencia de tensión de abordo para suministrar energía a dispositivos y sensores externos. 66 .Conclusion: Conocer las interfaces realizadas por national instruments y ver la diferencia de practicidad entre la daq profesional o una hecha por nosotros. Dado que la frecuencia se define como el número de eventos de una clase particular ocurridos en un período. Introducción. Materiales. USB 6008 Generador de funciones. mediante el uso de un contador que acumula el número de periodos. Objetivo. Conectaremos el generador de funciones a la entrada diferencial AI1. Con la tarjeta de National construir un dispositivo capaz de medir la frecuencia de la señal de entrada.Práctica 13. es generalmente sencilla su medida. Programación en Labview 67 . Diagrama. Un frecuencímetro es un instrumento que sirve para medir la frecuencia. contando el número de repeticiones de una onda en un intervalo de tiempo.Hardware. Frecuencímetro. 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. la cual es poder mandar un correo a un servidor. Control de un sensor de temperatura con indicador de correo electrónico. Block Diagram 69 . 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. checando los datos obtenidos. Objetivo: Diseñar y construir un sistema telemétrico con el fin de monitorear la temperatura. en modo SEF. En esta práctica veremos otra aplicación de Labview.Práctica 14. Introducción. Material: USB-6008 LM35 Diagrama: Alimentar el sensor con la tarjeta USB-6008 La salida conectarla a AI0. 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. 70 .