Вы находитесь на странице: 1из 70

Reportes de Temas Avanzados

Practicas serial - USB


06/12/2010
INDICE
INTRODUCCION AL LABVIEW Y MIKROC....................................................... 2
Practica 1 Prueba de Eco Comunicacin serial.................................................. 3
Prctica 2 Convertidor analgico digital de 1 canal a 10 bits mediante puerto
serie. .................................................................................................................. 7
Prctica 3 Convertidor analgico digital de 3 canales 8 bits con comunicacin
por puerto serie. ............................................................................................... 10
Prctica 4 Prueba de eco USB. ........................................................................ 14
Prctica 5 Prueba de eco USB por medio de LabView. ................................... 29
Prctica 6 Convertidor analgico digital 1 canal, 8 bits por USB. ..................... 34
Prctica 7 Convertidor analgico digital 1 canal, 10 bits por USB. ................... 40
Prctica 8. Convertidor analgico digital de 3 canales a 8 bits......................... 46
Prctica 9. Convertidor analgico digital 1 canal, 10 bits con filtro. .................. 53
Prctica 10. Convertidor analgico digital 3 canales con guardado de datos. . 56
Prctica 11. Control de motor reversible. ......................................................... 59
Prctica 12. Medicin de un potencimetro y de un generador de funciones por
medio de la tarjeta USB-6008. ......................................................................... 65
Prctica 13. Frecuencmetro. ........................................................................... 67
Prctica 14. Control de un sensor de temperatura con indicador de correo
electrnico. ....................................................................................................... 69

INTRODUCCION AL LABVIEW Y MIKROC


El LabView es un lenguaje de programacin de alto nivel, de tipo grfico, y
enfocado al uso en instrumentacin. Pero como lenguaje de programacin,
debido a que cuenta con todas las estructuras, puede ser usado para elaborar
cualquier algoritmo que se desee, en cualquier aplicacin, como en anlisis,
telemtica, 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 diseado para el desarrollo, construccin y depuracin de
aplicaciones integradas basadas en el PIC.

Practica 1 Prueba de Eco Comunicacin serial


Objetivo:
Construir nuestro primer circuito con el PIC18F4550 para lograr la
comunicacin serial por medio de labview y mikroC.
Introduccion
La comunicacin serial consiste en el envo de un bit de informacin de manera
secuencial, sto es, un bit a la vez y a un ritmo acordado entre el emisior y el
receptor.
La comunicacin serial en computadores ha seguido los estndares definidos
en 1969 por el RS-232 (Recommended Standard 232) que establece niveles de
voltaje, velocidad de transmisin de los datos, etc. Por ejemplo, este protocolo
establece un nivel de -12v como un uno lgico y un nivel de voltaje de +12v
como un cero lgico (por su parte, los microcontroladores emplean por lo
general 5v como un uno lgico y 0v como un cero lgico).
Existen en la actualidad diferentes ejemplos de puertos que comunican
informacin 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 conexin de mltiples dispositivos.
Aunque en naturaleza serial, no suele referenciarse de esta manera ya que
sigue sus propios estndares y no los establecidos por el RS-232.
La mayora de los microcontroladores, entre ellos los de Microchip, poseen un
puerto de comunicacin 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
8
3

Push button

Resistencia 10 kilo ohms

Cristal 8Mhz

Cable para protoboard.

Diagrama:

Cdigo de programacin:
char uart_rd;

void main () {
UART1_Init(9600);
Delay_ms(100);
TRISB = 0;
PORTB = 0;
while (1) {

//inicializamos UART a 9600 bps


//espera por UART para estabilizar
//PORTB como salidas
//apagamos todo el puerto
//fin del ciclo
4

if (UART1_Data_Ready()) { //checamos si el dato es recibido


uart_rd = UART1_Read();

//leemos el dato recibido

PORTB = uart_rd;
UART1_Write(uart_rd);

//se envia dato por el UART

}
}
}
Programacion en Labview:

Conclusion:
En esta prctica comenzamos a usar un nuevo PIC programando en un
lenguaje avanzado como el C, usando como interfaz Labview logrando la
comunicacin serial entre el pic y la computadora. Viendo el resultado en el
control de encendido en el puertoB.

Prctica 2 Convertidor analgico digital de 1 canal a 10


bits mediante puerto serie.
Objetivo.
Utilizando los conocimientos de la prctica anterior realizar la conversin
analgica digital de 10 bits trasmitiendo los datos por comunicacin serial
usando programacin en C y Labview.
Introduccin:
Un conversor (o convertidor) analgico-digital (CAD), (o tambin ADC del ingls
"Analog-to-Digital Converter") es un dispositivo electrnico capaz de convertir
una entrada analgica de voltaje en un valor binario, Se utiliza en equipos
electrnicos como ordenadores, grabadores de sonido y de vdeo, y equipos de
telecomunicaciones. La seal analgica, que vara de forma continua en el
tiempo, se conecta a la entrada del dispositivo y se somete a un muestreo a
una velocidad fija, obtenindose as una seal digital a la salida del mismo.
Material:
En esta prctica seguiremos utilizando el circuito anterior agregando los
siguientes dispositivos Potencimetro 10 K y 2 Leds.
Diagrama:

Cdigo en C
char uart_rd1, uart_rd2;
unsigned int temp_res;
unsigned int uart_wr1, uart_wr2;
7

void main() {

TRISA = 0XFF;
TRISB = 0;
TRISD = 0;
UART1_Init(9600);
Delay_ms(100);

while (1) {
if (UART1_Data_Ready()) {
temp_res = ADC_read(2);
uart_rd1 = UART1_Read();
uart_wr1 = temp_res;
UART1_Write(uart_wr1);
PORTB = uart_wr1;
Delay_ms(7);
uart_rd2 = UART1_Read();
uart_wr2 = temp_res >> 8;
UART1_Write(uart_wr2);
PORTD = uart_wr2;
Delay_ms(7);
}
}
}
Programacion en Labview:

Conclusion:
Entre ms nos metemos al entorno de programacin, nos damos cuenta lo
poderosa que es esta herramienta, tambin nos ayuda a conocer ms el
lenguaje de programacin en C como ser capaces de disear una tarjeta
adquiridora de datos para Labview.

Prctica 3 Convertidor analgico digital de 3 canales 8


bits con comunicacin por puerto serie.
Objetivo.
Ahora que ya sabemos hacer la conversin y mandar los datos por puerto
serie, ahora se deber de elaborar 3 convertidores a 8 bit, para ver el
desempeo del PIC.
Introduccin.
Un CAD muestrea una seal analgica y la convierte en un valor digital de 'n'
bits. Usualmente ser necesario acondicionar la seal de entrada del
convertidor A-D, bien sea atenuando bien sea amplificndola.
Este muestreo est definido por la funcin de transferencia. En la siguiente
figura se muestra una funcin de transferencia ideal de un convertidor de 8 bits
de precisin.
Materiales:
Potencimetros de 10 kilo con el circuito anterior
Diagrama:

10

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

temp_res2 = ADC_read(3);
11

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

12

Conclusin:
Como podemos ver cada convertidor tiene su propia respuesta, y esto lo
logramos con la programacin en C, esto se puede ver en las llaves en cada
lectura. Labview nos ayuda mucho en la construccin de estas prcticas.

13

Prctica 4 Prueba de eco USB.


Objetivo.
Ahora pasaremos a otro protocolo de comunicacin, que en la actualidad es
uno de los mas usados, en esta practica comenzaremos a profundizar la
programacin para lograr la comunicacin USB mediante el PIC y la
computadora.
Introduccin.
El USB o Universal Serial Bus es una interfaz para la transmisin serie de
datos y distribucin de energa desarrollado por empresas lderes del sector de
las telecomunicaciones y de los ordenadores y que ha sido introducida en el
mercado de los PCs y perifricos para mejorar las lentas interfaces serie (RS232) y paralelo. Provee una mayor velocidad de transferencia (de hasta 100
veces ms rpido) comparado con el puerto Paralelo de 25-pin y el Serial DB-9,
DB-25, RS-232 que son los puertos que se encuentran en la mayora de los
computadores. Tena en un principio como objetivo el conectar perifricos
relativamente lentos (ratones, impresoras, cmaras digitales, unidades ZIP,
etc.) de una forma realmente sencilla, rpida y basada en comunicaciones
serie, aunque por sus caractersticas tambin poda conectarse hasta discos
duros.
Materiales:
Protoboard.
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

14

Cdigo en C
Programa Principal.
/*
* Project name:
HIDtest2 (USB HID Read & Write Test)
* Copyright:
(c) MikroElektronika, 2005-2008
* Revision History:
20050502:
- initial release;
* Description:
This example establishes connection with the HID terminal that is active
on the PC. Upon connection establishment, 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.
* Test configuration:
MCU:

PIC18F4550
15

http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf
Dev.Board:

EasyPIC6

http://www.mikroe.com/en/tools/easypic6/
Oscillator:

HS 8.000 MHz (USB osc. is raised with PLL to 48.000MHz)

Ext. Modules:

on-board USB-HID

http://www.mikroe.com/pdf/easypic6/easypic6_manual_v100.pdf#page14
SW:

mikroC PRO for PIC


http://www.mikroe.com/en/compilers/mikroc/pro/pic/

* NOTES:
(*) Be VERY careful about the configuration flags for the 18F4550 - there's
so much place for mistake!
- Place jumpers J12 in the right position
*/
unsigned char k;
unsigned char userWR_buffer[64], userRD_buffer[64];
const char *text = "MIKROElektronika Compilers ER \r\n";
//*****************************************************************************************
*********
// Main Interrupt Routine
//*****************************************************************************************
*********
void interrupt()
{
HID_InterruptProc();
}
//*****************************************************************************************
*********

16

//*****************************************************************************************
*********
// Initialization Routine
//*****************************************************************************************
*********
void Init_Main()
{
//-------------------------------------// Disable all interrupts
//-------------------------------------INTCON = 0;

// Disable GIE, PEIE, TMR0IE,INT0IE,RBIE

INTCON2 = 0xF5;
INTCON3 = 0xC0;
RCON.IPEN = 0;

// Disable Priority Levels on interrupts

PIE1 = 0;
PIE2 = 0;
PIR1 = 0;
PIR2 = 0;
ADCON1 |= 0x0F;
as digital
CMCON |= 7;

// Configure all ports with analog function

// Disable comparators

//-------------------------------------// Ports Configuration


//-------------------------------------TRISA = 0xFF;
TRISB = 0xFF;
TRISC = 0xFF;
TRISD = 0;
17

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

0x00, 0,

// iSerialNumber

- ( None )

0x01, 0,

// bNumConfigurations

-1

// Configuration Descriptor
USB_CONFIG_DESCRIPTOR_LEN, 0,
Configuration descriptor (always 0x09)

// bLength

USB_CONFIG_DESCRIPTOR_TYPE, 0,
CONFIGURATION descriptor

- Length of

// bDescriptorType

-2=

ConfigDescr_wTotalLength, 0,
// wTotalLength
- Total length of
this config. descriptor plus the interface and endpoint descriptors that are part of
the configuration.
0x00, 0,

//

( high byte)

0x01, 0,

// bNumInterfaces

0x01, 0,

// bConfigurationValue - Configuration Value

- Number of interfaces

0x00, 0,
configuration ( None )

// iConfiguration

- String Index for this

0xA0, 0,
and "Remote wakeup"

// bmAttributes

- attributes - "Bus powered"

50, 0,
mA from the bus.

// MaxPower

- bus-powered draws 50*2

// Interface Descriptor
USB_INTERF_DESCRIPTOR_LEN, 0,
Interface descriptor (always 0x09)

// bLength

USB_INTERFACE_DESCRIPTOR_TYPE, 0,
INTERFACE descriptor
0x00, 0,
based array

// bInterfaceNumber

0x00, 0,

// bAlternateSetting

NUM_ENDPOINTS, 0,
endpoints used in this interface

- Length of

// bDescriptorType

- Number of interface, 0

- Alternate setting

// bNumEndPoints

0x03, 0,

// bInterfaceClass

0x00, 0,

// bInterfaceSubClass

-4=

- Number of

- assigned by the USB


- Not A boot device

21

0x00, 0,

// bInterfaceProtocol

0x00, 0,
// iInterface
describes this interface ( None )

- none

- Index to string descriptor that

// HID Descriptor
USB_HID_DESCRIPTOR_LEN, 0,
HID descriptor (always 0x09)

// bLength

USB_HID_DESCRIPTOR_TYPE, 0,
HID descriptor
0x01, 0,

- Length of

// bDescriptorType

- 0x21 =

// HID class release number (1.01)

0x01, 0,
0x00, 0,

// Localized country code (none)

0x01, 0,

// # of HID class descriptor to follow (1)

0x22, 0,

// Report descriptor type (HID)

Low_HID_ReportDesc_len, 0,
High_HID_ReportDesc_len, 0,
// EP1_RX Descriptor
USB_ENDP_DESCRIPTOR_LEN, 0,
descriptor (always 0x07)

// bLength

USB_ENDPOINT_DESCRIPTOR_TYPE, 0,
ENDPOINT descriptor
0x81, 0,

// bDescriptorType

// bEndpointAddress

USB_ENDPOINT_TYPE_INTERRUPT, 0,
Endpoint Type - Interrupt

- length of

- In, EP1

// bmAttributes

Low_HID_PACKET_SIZE, 0,
size - low order byte

// wMaxPacketSize

High_HID_PACKET_SIZE, 0,
high order byte

//

1, 0,

// bInterval

-5=

- max packet

- max packet size -

- polling interval (1 ms)

// EP1_TX Descriptor
USB_ENDP_DESCRIPTOR_LEN, 0,
descriptor (always 0x07)

// bLength

- length of
22

USB_ENDPOINT_DESCRIPTOR_TYPE, 0,
ENDPOINT descriptor
0x01, 0,

// bDescriptorType

// bEndpointAddress

USB_ENDPOINT_TYPE_INTERRUPT, 0,
Endpoint Type - Interrupt

- Out, EP1

// bmAttributes

Low_HID_PACKET_SIZE, 0,
size - low order byte

// wMaxPacketSize

High_HID_PACKET_SIZE, 0,
high order byte

//

1, 0,

// bInterval

-5=

- max packet

- max packet size -

- polling interval (1 ms)

// HID_Report Descriptor
0x06, 0,

// USAGE_PAGE (Vendor Defined)

0xA0, 0,
0xFF, 0,
0x09, 0,

// USAGE ID (Vendor Usage 1)

0x01, 0,
0xA1, 0,

// COLLECTION (Application)

0x01, 0,
// The Input report
0x09, 0,

// USAGE ID - Vendor defined

0x03, 0,
0x15, 0,

// LOGICAL_MINIMUM (0)

0x00, 0,
0x26, 0,

// LOGICAL_MAXIMUM (255)

0x00, 0,
0xFF, 0,
0x75, 0,

// REPORT_SIZE (8)

0x08, 0,
0x95, 0,

// REPORT_COUNT (2)
23

HID_INPUT_REPORT_BYTES, 0,
0x81, 0,

// INPUT (Data,Var,Abs)

0x02, 0,
// The Output report
0x09, 0,

// USAGE ID - Vendor defined

0x04, 0,
0x15, 0,

// LOGICAL_MINIMUM (0)

0x00, 0,
0x26, 0,

// LOGICAL_MAXIMUM (255)

0x00, 0,
0xFF, 0,
0x75, 0,

// REPORT_SIZE (8)

0x08, 0,
0x95, 0,

// REPORT_COUNT (2)

HID_OUTPUT_REPORT_BYTES, 0,
0x91, 0,

// OUTPUT (Data,Var,Abs)

0x02, 0,
// The Feature report
0x09, 0,

// USAGE ID - Vendor defined

0x05, 0,
0x15, 0,

// LOGICAL_MINIMUM (0)

0x00, 0,
0x26, 0,

// LOGICAL_MAXIMUM (255)

0x00, 0,
0xFF, 0,
0x75, 0,

// REPORT_SIZE (8)

0x08, 0,
24

0x95, 0,

// REPORT_COUNT (2)

HID_FEATURE_REPORT_BYTES, 0,
0xB1, 0,

// FEATURE (Data,Var,Abs)

0x02, 0,
// End Collection
0xC0, 0

// END_COLLECTION

};
//******************************************************************************
unsigned char const LangIDDescr[8] = {
0x04, 0,
USB_STRING_DESCRIPTOR_TYPE, 0,
0x09, 0,

// LangID (0x0409) - Low

0x04, 0

//

- High

};
//******************************************************************************
unsigned char const ManufacturerDescr[68] = {
34, 0,
USB_STRING_DESCRIPTOR_TYPE, 0,
't', 0, 0, 0,
'e', 0, 0, 0,
'm', 0, 0, 0,
'a', 0, 0, 0,
's', 0, 0, 0,
' ', 0, 0, 0,
'a', 0, 0, 0,
'v', 0, 0, 0,
'a', 0, 0, 0,
25

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

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

ProductDescr;
StrUnknownDescr;
}
Procedimiento:
Conectar el dispositivo a la computadora.
En MIKROC acceder a la ventana de pruebas HID.
HID es Human Interface Device.
Desde MikroC verificar si el dispositivo tiene comunicacin con la computadora.

Conclusin:
Al desarrollar la prctica nos damos cuenta la aplicacin que se le puede dar a
esta comunicacin, como tambin nos muestra la necesidad de crear driver
para probar nuestro primer diseo lo cual veremos en la siguiente practica.

28

Prctica 5 Prueba de eco USB por medio de LabView.


Objetivo:
Despus de los conocimientos adquiridos hasta ahora, ahora utilizaremos
Labview para realizar mayores aplicaciones utilizando el protocolo USB.
Introduccin:
Ahora ser necesario crear nuestro propio driver para poder usar a nuestro PIC
como interfaz, usando labview para realizar adquisiciones de datos u otra
aplicacin que se le quiera dar, esto es debido, a que se trabaja con un
protocolo de comunicacin avanzada.
Hardware:
La misma configuracin a la practica anterior
Cdigo en C:
El archivo de cdigo principal sigue siendo el mismo.
El archivo fuente si cambia.
Hay que modificar:
ID vendor
ID product
Mensaje de dispositivo
Los cuales nos ayudaran a la creacin del driver.
Creacin del controlador.
Acceder al Driver Wizard que es un complemento de LabView. Se encuentra en
el folder VISA y posteriormente Driver Wizard.
De entre las opciones que inmediatamente aparecen, elegir USB.

29

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

Si se quiere, cambiar el fabricante y el modelo del dispositivo, para crear un


driver ms personalizado.

31

Crearlo e instalarlo, una vez hecho esto, conectamos el dispositivo y en donde


la computadora lo reconozca, actualizamos el controlador por el nuevo que
acabamos de crear.
Verificar: Cuando el dispositivo deje de ser HID y pase a Dispositivo de
National Instrumenst, significa que hemos hecho el proceso de manera
correcta.
Programacin en Labview:

32

Conclusion:
Ahora hemos creado el driver que nos ayudara a la elaboracin de las
siguientes practicas, con esto y el programa de ECO hemos dado un paso a la
programacin con USB.

33

Prctica 6 Convertidor analgico digital 1 canal, 8 bits


por USB.
Objetivo.
Una vez teniendo los conocimientos de programacin como en C y en labview,
nuestra prxima escena ser repetir las practicas de protocolo serie ahora con
el protocolo usb.
Introduccin.
Hay que recordar que la configuracin del convertidor en MIKROC es bastante
sencilla, ahora teniendo esa topologa en mente y unindola con la prueba de
eco USB obtendremos una adquisicin de datos analgicos bastante fiel y
rpida. Finalmente cabe mencionar que el tamao del convertidor es de 10
bits, y necesitamos solo la parte mas alta ya que si no, obtendremos una seal
que re circular en los mismos valores 4 veces.
Materiales:
Circuito de la practica 4
Potencimetro de 10Kohms
Diagrama:
Realizar el circuito de la practica 4 conectando los dispositivos de adquisicin
como en la prctica del convertidor.

Cdigo C
Programa principal.
/*
* Project name:
HIDtest2 (USB HID Read & Write Test)
* Copyright:
(c) MikroElektronika, 2005-2008
* Revision History:
20050502:

34

- initial release;
* Description:
This example establishes connection with the HID terminal that is active
on the PC. Upon connection establishment, 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.
* Test configuration:
MCU:

PIC18F4550
http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf

Dev.Board:

EasyPIC6

http://www.mikroe.com/en/tools/easypic6/
Oscillator:

HS 8.000 MHz (USB osc. is raised with PLL to 48.000MHz)

Ext. Modules:

on-board USB-HID

http://www.mikroe.com/pdf/easypic6/easypic6_manual_v100.pdf#page14
SW:

mikroC PRO for PIC


http://www.mikroe.com/en/compilers/mikroc/pro/pic/

* NOTES:
(*) Be VERY careful about the configuration flags for the 18F4550 - there's
so much place for mistake!
- Place jumpers J12 in the right position
*/
unsigned char k;
unsigned char userWR_buffer[64], userRD_buffer[64];
unsigned int temp_res;
const char *text = "MIKROElektronika Compilers ER \r\n";
//*****************************************************************************************
35

// Main Interrupt Routine


//*****************************************************************************************
void interrupt()
{
HID_InterruptProc();
}
//****************************************************************************
//*****************************************************************************************
// Initialization Routine
//****************************************************************************
void Init_Main()
{
//-------------------------------------// Disable all interrupts
//-------------------------------------INTCON = 0;

// Disable GIE, PEIE, TMR0IE,INT0IE,RBIE

INTCON2 = 0xF5;
INTCON3 = 0xC0;
RCON.IPEN = 0;

// Disable Priority Levels on interrupts

PIE1 = 0;
PIE2 = 0;
PIR1 = 0;
PIR2 = 0;
ADCON1 |= 0x00;
as digital (0X0F - Valor previo)
CMCON |= 7;

// Configure all ports with analog function

// Disable comparators

//--------------------------------------

36

// Ports Configuration
//-------------------------------------TRISA = 0xFF;
TRISB = 0xFF;
TRISC = 0xFF;
TRISD = 0;
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();
37

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

38

Conclusin:
Ahora vemos un mejor resultado con el muestreo de nuestros datos adquiridos
del potencimetro, eso se debe al protocolo de comunicacin, con esto
podemos ver la practicidad del USB.

39

Prctica 7 Convertidor analgico digital 1 canal, 10 bits


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

terminal will be re-sent back to user.


* Test configuration:
MCU:

PIC18F4550
http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf

Dev.Board:

EasyPIC6

http://www.mikroe.com/en/tools/easypic6/
Oscillator:

HS 8.000 MHz (USB osc. is raised with PLL to 48.000MHz)

Ext. Modules:

on-board USB-HID

http://www.mikroe.com/pdf/easypic6/easypic6_manual_v100.pdf#page14
SW:

mikroC PRO for PIC


http://www.mikroe.com/en/compilers/mikroc/pro/pic/

* NOTES:
(*) Be VERY careful about the configuration flags for the 18F4550 - there's
so much place for mistake!
- Place jumpers J12 in the right position
*/
unsigned char k;
unsigned char userWR_buffer[64], userRD_buffer[64];
unsigned int temp_res;
const char *text = "MIKROElektronika Compilers ER \r\n";
//*****************************************************************************************
// Main Interrupt Routine
//*****************************************************************************************
void interrupt()
{
HID_InterruptProc();

41

}
//*****************************************************************************************
//*****************************************************************************************
// Initialization Routine
//*****************************************************************************************
void Init_Main()
{
//-------------------------------------// Disable all interrupts
//-------------------------------------INTCON = 0;

// Disable GIE, PEIE, TMR0IE,INT0IE,RBIE

INTCON2 = 0xF5;
INTCON3 = 0xC0;
RCON.IPEN = 0;

// Disable Priority Levels on interrupts

PIE1 = 0;
PIE2 = 0;
PIR1 = 0;
PIR2 = 0;
ADCON1 |= 0x00;
as digital (0X0F - Valor previo)
CMCON |= 7;

// Configure all ports with analog function

// Disable comparators

//-------------------------------------// Ports Configuration


//-------------------------------------TRISA = 0xFF;
TRISB = 0;
TRISC = 0xFF;

42

TRISD = 0;
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, ch2;
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];
if (ch == 0X01) {
43

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

44

Conclusin:
La conversin a 10 bits nos da mejor respuesta debido a la resolucin. Lo que
se observo en la practica fueron perturbaciones debido al ruido entregado del
mismo potencimetro.

45

Prctica 8. Convertidor analgico digital de 3 canales a


8 bits.
Objetivo.
Profundizar mas en el protocolo USB usando lenguaje C y la herramienta
Labview para realizar un manejo de mayor cantidad de datos.
Introduccin.
Llevaremos a la prctica los conocimientos obtenidos al programar el protocolo
serie, ahora en un protocolo ms rpido y eficaz.
Materiales:
Realizar las conexiones de la prctica de comunicacin serie convertidor
analgico conectando para realizar la comunicacin serie como en la primer
practica.
Cdigo en C.
/*
* Project name:
HIDtest2 (USB HID Read & Write Test)
* Copyright:
(c) MikroElektronika, 2005-2008
* Revision History:
20050502:
- initial release;
* Description:
This example establishes connection with the HID terminal that is active
on the PC. Upon connection establishment, 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.
* Test configuration:
46

MCU:

PIC18F4550
http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf

Dev.Board:

EasyPIC6

http://www.mikroe.com/en/tools/easypic6/
Oscillator:

HS 8.000 MHz (USB osc. is raised with PLL to 48.000MHz)

Ext. Modules:

on-board USB-HID

http://www.mikroe.com/pdf/easypic6/easypic6_manual_v100.pdf#page14
SW:

mikroC PRO for PIC


http://www.mikroe.com/en/compilers/mikroc/pro/pic/

* NOTES:
(*) Be VERY careful about the configuration flags for the 18F4550 - there's
so much place for mistake!
- Place jumpers J12 in the right position
*/
unsigned char k;
unsigned char userWR_buffer[64], userRD_buffer[64];
unsigned int temp_res, temp_res1, temp_res2;
const char *text = "MIKROElektronika Compilers ER \r\n";
//*****************************************************************************************
// Main Interrupt Routine
//*****************************************************************************************
void interrupt()
{
HID_InterruptProc();
}
//*****************************************************************************************

47

//*****************************************************************************************
// Initialization Routine
//*****************************************************************************************
void Init_Main()
{
//-------------------------------------// Disable all interrupts
//-------------------------------------INTCON = 0;

// Disable GIE, PEIE, TMR0IE,INT0IE,RBIE

INTCON2 = 0xF5;
INTCON3 = 0xC0;
RCON.IPEN = 0;

// Disable Priority Levels on interrupts

PIE1 = 0;
PIE2 = 0;
PIR1 = 0;
PIR2 = 0;
ADCON1 |= 0x00;
as digital (0X0F - Valor previo)
CMCON |= 7;

// Configure all ports with analog function

// Disable comparators

//-------------------------------------// Ports Configuration


//-------------------------------------TRISA = 0xFF;
TRISB = 0;
TRISC = 0xFF;
TRISD = 0;
TRISE = 0x07;

48

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, ch2, ch3 ;
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];
if (ch == 0X01) {
temp_res = ADC_read(0);
userWR_buffer[0] = temp_res>> 2;
}
49

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

50

51

Conclusin:
Podemos ver la cantidad de datos y la velocidad con la cual se puede trabajar
con el protocolo USB.

52

Prctica 9. Convertidor analgico digital 1 canal, 10 bits


con filtro.
Objetivo:
Ahora vamos a introducir un filtro para obtener una mejor respuesta a la seal
de salida de nuestro convertidor de 10 bits, el filtro se trabajara en labview.
Introduccin:
Como pudimos ver en la respuesta de la seal entrega por nuestro
potencimetro obtuvimos ruido, ahora nuestro propsito es eliminar ese ruido
utilizando un filtro para lograr una mejor fidelidad.
Material:
Circuito de prctica 7
Diagrama:
El circuito se usara sin cambios.
Cdigo en C.
Tambin usaremos el mismo cdigo que en la prctica 7.
Programacin en Labview:

53

54

Conclusin:
Al llevar a cabo esta prctica podemos ver el cambio entre la seal de entrada
en la prctica 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 tambin lo podemos realizar mediante software.

55

Prctica 10. Convertidor analgico digital 3 canales con


guardado de datos.
Objetivo.
Ahora sacaremos una de las muchas funciones de Labview para ir
completando nuestras prcticas y as obtener mayor conocimiento en la
programacin.
Introduccin.
Agregar esta caracterstica a la tarjeta es importante, ya que los valores de los
sensores pueden ser guardados en un archivo y as ser revisados ms tarde.
No slo eso, tambin podemos hacer operaciones, promedios, filtros y todo el
anlisis que se necesite y lo hacemos con valores muy exactos, continuos y
fieles.
Material:
Circuito de prctica 8.
Diagrama:
Seguiremos usando el armado del circuito anterior
Cdigo en C.
Seguiremos usando el mismo cdigo de programacin.

Programacin en Labview:

56

57

Conclusin:
Usamos una herramienta de Labview para guardar los datos obtenidos de la
medicin, as vamos conociendo mas nuestra interfaz.

58

Prctica 11. Control de motor reversible.


Objetivo.
Usando los conocimientos obtenidos hasta el momento para realizar el control
de un motor usando lgica PLC.
Introduccin.
Usar la metodologa de programacin de escalera para lograr el giro del motor.
Material:
Circuito prctica 5.
LM293B
Motor de corriente directa a 5volts.
Push Button

1 Fusible.
Cdigo en C.
/*
* Project name:
HIDtest2 (USB HID Read & Write Test)
* Copyright:
(c) MikroElektronika, 2005-2008
* Revision History:
20050502:
- initial release;
* Description:
This example establishes connection with the HID terminal that is active
on the PC. Upon connection establishment, 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.
59

* Test configuration:
MCU:

PIC18F4550
http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf

Dev.Board:

EasyPIC6

http://www.mikroe.com/en/tools/easypic6/
Oscillator:

HS 8.000 MHz (USB osc. is raised with PLL to 48.000MHz)

Ext. Modules:

on-board USB-HID

http://www.mikroe.com/pdf/easypic6/easypic6_manual_v100.pdf#page14
SW:

mikroC PRO for PIC


http://www.mikroe.com/en/compilers/mikroc/pro/pic/

* NOTES:
(*) Be VERY careful about the configuration flags for the 18F4550 - there's
so much place for mistake!
- Place jumpers J12 in the right position
*/
unsigned char k;
unsigned char userWR_buffer[64], userRD_buffer[64];
const char *text = "MIKROElektronika Compilers ER \r\n";
//*****************************************************************************************
// Main Interrupt Routine
//*****************************************************************************************
void interrupt()
{
HID_InterruptProc();
}
//*****************************************************************************************

60

//*****************************************************************************************
// Initialization Routine
//*****************************************************************************************
void Init_Main()
{
//-------------------------------------// Disable all interrupts
//-------------------------------------INTCON = 0;

// Disable GIE, PEIE, TMR0IE,INT0IE,RBIE

INTCON2 = 0xF5;
INTCON3 = 0xC0;
RCON.IPEN = 0;

// Disable Priority Levels on interrupts

PIE1 = 0;
PIE2 = 0;
PIR1 = 0;
PIR2 = 0;
ADCON1 |= 0x0F;
as digital
CMCON |= 7;

// Configure all ports with analog function

// Disable comparators

//-------------------------------------// Ports Configuration


//-------------------------------------TRISA = 0xFF;
TRISB = 0xFF;
TRISC = 0xFF;
TRISD = 0;
TRISE = 0x07;

61

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, ch1;
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;
ch1 = PORTB;
userWR_buffer[0] = ch1;
62

while (!HID_Write(&userWR_buffer, 1)) ;


i++;
}
}
HID_Disable();
}
//*****************************************************************************************
Programacin en labview:

63

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

64

Prctica 12. Medicin de un potencimetro y de un


generador de funciones por medio de la tarjeta USB6008.
Objetivo.
Aprender a usar una nueva interfaz para conocer la diferencia de programacin
asi como todas las utilidades de la tarjeta.
Introduccin.
Las tarjetas DAQ NI USB-6008 y NI USB-6009 tienen capacidades multifuncin
con ocho canales de entrada analgica 12 14 bits, dos salidas analgicas, 12
lneas E/S digitales y un contador. Ambos dispositivos funcionan con la
corriente del bus USB as que no necesitan una fuente de energa externa para
trabajar. Incluyen terminales de tornillo para extrables para conectarse por
seal directa, una referencia de tensin de abordo para suministrar energa a
dispositivos y sensores externos, una capa diseada en cuatro capas para
reducir el ruido y aumentar la precisin, as como para proteger contra
sobretensin en las lneas de entrada analgica de hasta 35 V.
Material:
USB-6008
Potencimetro
Generador de funciones.
Diagrama:
Colocaremos la salida del potencimetro a la salida AI0 y lo alimentaremos con
la fuente incluida en la tarjeta. El generador de funciones entrara en AI1+ y AI1para usar el modo diferencial.

Programacion en Labview:

65

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

66

Prctica 13. Frecuencmetro.


Objetivo.
Con la tarjeta de National construir un dispositivo capaz de medir la frecuencia
de la seal de entrada.
Introduccin.
Un frecuencmetro es un instrumento que sirve para medir la frecuencia,
contando el nmero de repeticiones de una onda en un intervalo de tiempo,
mediante el uso de un contador que acumula el nmero de periodos. Dado que
la frecuencia se define como el nmero de eventos de una clase particular
ocurridos en un perodo, es generalmente sencilla su medida.Hardware.
Materiales.
USB 6008
Generador de funciones.
Diagrama.
Conectaremos el generador de funciones a la entrada diferencial AI1.
Programacin en Labview

67

Conclusin:
Vemos la facilidad de procesar una seal con la ayuda de la tarjeta USB 6008
realizando un frecuencmetro acercndonos al comportamiento de un
osciloscopio.

68

Prctica 14. Control de un sensor de temperatura con


indicador de correo electrnico.
Objetivo:
Disear y construir un sistema telemtrico con el fin de monitorear la
temperatura, checando los datos obtenidos, si el dato es mayor a la
temperatura que se exponga enviara un correo avisando que se a llegado al
lmite y parara el proceso.
Introduccin.
En esta prctica veremos otra aplicacin de Labview, la cual es poder mandar
un correo a un servidor.
Material:
USB-6008
LM35
Diagrama:
Alimentar el sensor con la tarjeta USB-6008
La salida conectarla a AI0, en modo SEF.
Block Diagram

69

Conclusin:
Vemos la facilidad de hacer un sistema telemtrico usando la interfaz USB
6008 y la herramienta de Labview para censar la temperatura y mandar un
correo con los datos obtenidos en la medicin.

70

Вам также может понравиться