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

Practica N 1 Secuencia de leds Introduccin Se describir como se realizo una secuencia de leds en un byte utilizando programacin en lenguaje G utilizando

Labview. Objetivo Realizar una secuencia en leds grficos con la utilizacin de lenguaje G en Labview y despus ser visualizada en una interface fsica.

Desarrollo

La secuencia que debe realizar es el desplazamiento de un bit en un byte de LSB a MSB y viceversa se visualizara en un array booleano el cual representa un byte de leds u ocho bits Figura 1.1.

Figura 1.1 La secuencia en nmero decimal es 1, 2, 4, 8, 16, 32, 64 y 128 para obtenerla se ocupa la funcin donde n es numero de incremento 1 , el incremento n+1 se logra con una estructura FOR y para el decremento una estructura case. Despus de obtener la secuencia numrica se hace una conversin decimal a binario con esto se obtiene cdigo Figura1.2

Figura 1.3

Descripcin de funciones utilizadas en el cdigo

Inversor de la variable x

Comparador mayor de las variables x y

Potencia

Diferencia de variables x y Realiza operaciones aritmticas y booleano Para seleccionar la operacin (sumar, multiplicar, AND, OR o XOR), haga clic en la funcin y seleccione Cambiar el modo en el men contextual

Convertidor numero a booleano Swap Data Intercambia el orden superior de 8 bits y el de bajo orden de 8 bits para cada palabra de datos.

Estructura Case

Estructura For

Estructura While

Interface USB La interface se realiza a partir de un microcotrolador PIC de Microchip la cual proporciona una librera dinmica mpusbapi.dll para la conexin de la famila 18FXX50 la cual posee conexin usb 2.0 esta librera proporciona funciones a continuacin descritas MPUSBGETDLLVERSION(VOID) Lee el nivel de revisin del MPUSAPI.dll. Es un nivel de revisin de 32bits. Esta funcin no devuelve la versin del cdigo, no realiza nada con el USB. Devuelve la versin de la dll en formato hexadecimal de 32bits. MPUSBGETDEVICECOUNT(PVID_PID) Devuelve el nmero de dispositivo con VID_PID asignado. pVID_PID: Input: cadena de caracteres del nmero de identificacin asignado

MPUSBOPEN(INSTANCE, PVID_PID, PEP, DWDIR, DWRESERVED) Devuelve el acceso al pipe del Endpoint con el VID_PID asignado. Todas las pipes se abren con el atributo FILE_FLAG_OVERLAPPED. Esto permite que MPUSBRead, MPUSBWrite y MPUSBReadInt tengan un valor de time-out. Nota: el valor del time-out no tiene sentido en una pipe sncrona. instance: Input: Un nmero de dispositivo para abrir. Normalmente, se utiliza primero la llamada de MPUSBGetDeviceCount para saber cuantos dispositivos hay. Es importante entender que el driver lo comparten distintos dispositivos. El nmero devuelto por el MPUSBGetDeviceCount tiene que ser igual o menor que el nmero de todos los dispositivos actualmente conectados y usando el driver genrico. Ejemplo: Si hay tres dispositivos con los siguientes PID_VID conectados: Dispositivo tipo 0, VID 0x04d8, PID 0x0001 Dispositivo tipo 1, VID 0x04d8, PID 0x0002 Dispositivo tipo 2, VID 0x04d8, PID 0x0003 Si el dispositivo que nos interesa tiene VID=0x04d8 y PID=0x0002 el MPUSBGetDeviceCount devolver un 1. Al llamar la funcin tiene que haber un mecanismo que intente llamar MPUSOpen() desde 0 hasta MAX_NUM_MPUSB_DEV. Se tiene que contar el nmero de llamadas exitosas. Cuando este nmero sea igual al nmero devuelto por MPUSBGetDeviceCount, hay que dejar de hacer las llamadas porque no puede haber ms dispositivos con el mismo VID_PID. pVID_PID: Input: String que contiene el PID&VID del dispositivo objetivo. El formato es vid_xxxx&pid_yyyy. Donde xxxx es el valor del VID y el yyyy el del PID, los dos en hexadecimal. Ejemplo: Si un dispositivo tiene un VID=0x04d8 y un PID=0x000b, el string de entrada es: vid_0x04d8&pid_0x000b. pEP: Input: String con el nmero del Endpoint que se va a abrir. El formato es \\MCHP_EPz o \MCHP_EPz dependiendo del lenguaje de programacin. Donde z es el nmero del Endpoint en decimal. Ejemplo: \\MCHP_EP1 o \MCHP_EP1 Este argumento puede ser NULL (nulo) para crear lazos con Endpoints de funciones no especficas.

Las funciones especficas son: MPUSBRead, MPUSBWrite, MPUSBReadInt. 2 Librera MPUSBApi Nota: Para utilizar MPUSBReadInt(), el formato de pEP tiene que ser \\MCHP_EPz_ASYNC. Esta opcin slo est disponible para un Endpoint interrupcin IN. La pipe de datos abierta con _ASYNC debe almacenar datos con el intervalo especificado en el Endpoint descriptor con un mximo de 100 recepciones. Cualquier otro dato recibido despus de llenar el buffer del driver se ignora. La aplicacin del usuario tiene que llamar MPUSBReadInt() a menudo sin superar el mximo de 100. dwDir: Especifica la direccin del Endpoint: MP_READ: para MPUSBRead y MPUSBReadInt MP_Write: para MPUSBWrite dwReserved: por ahora nada. MPUSBOpen(0, vid_pid, out_pipe, MP_WRITE, 0) MPUSBREAD(HANDLE, PDATA, DWLEN, PLENGTH, DWMILLISECONDS) handle: Input: Identifica la pipe del Endpoint que se va a leer. La pipe unida tiene que crearse con el atributo de acceso MP_READ. pData: Output: Puntero al buffer que recibe el dato ledo de la pipe. dwLen: Input: Especifica el nmero de bytes que hay que leer de la pipe. pLenght: Output: Puntero al nmero de bytes ledos. MPUSBRead pone este valor a cero antes de cualquier lectura o de chequear un error. dwMilliseconds: Input: Especifica el intervalo de time-out en milisegundos. La funcin vuelve si transcurre el intervalo aunque no se complete la operacin. Si dwMilliseconds=0, la funcin comprueba los datos de la pipe y vuelve inmediatamente. Si dwMilliseconds es infinito, el intervalo de time-out nunca termina. MPUSBRead(myInPipe, VarPtr(s(0)), DatosDeseados, Datos, 1000) MPUSBWRITE(HANDLE, PDATA, DWLEN, PLENGTH, DWMILLISECONDS) handle: Input: Identifica la pipe del Endpoint que se va a escribir. La pipe unida tiene que crearse con el atributo de acceso MP_WRITE. pData: Output: Puntero al buffer que contiene los datos que se van a escribir en la pipe. dwLen: Input: Especifica el nmero de bytes que se van a escribir en la pipe. pLenght: Output: Puntero al nmero de bytes que se escriben al llamar esta funcin. MPUSBWrite pone este valor a cero antes de cualquier lectura o de chequear un error. dwMilliseconds: Input: Especifica el intervalo de time-out en milisegundos. La funcin vuelve si transcurre el intervalo aunque no se complete la operacin. Si dwMilliseconds=0, la funcin comprueba los datos de la pipe y vuelve inmediatamente. Si dwMilliseconds es infinito, el intervalo de time-out nunca termina. MPUSBWrite(myOutPipe, VarPtr(SendData(0)), bytes, VarPtr(bytes), 1000) . MPUSBREADINT(HANDLE, PDATA, DWLEN, PLENGTH, DWMILLISECONDS) handle: Input: Identifica la pipe del Endpoint que se va a leer. La pipe unida tiene que crearse con el atributo de acceso MP_READ. pData: Output: Puntero al buffer que recibe el dato ledo de la pipe. dwLen: Input: Especifica el nmero de bytes que hay que leer de la pipe. pLenght: Output: Puntero al nmero de bytes ledos. MPUSBRead pone este valor a cero antes de cualquier lectura o de chequear un error.

dwMilliseconds: Input: Especifica el intervalo de time-out en milisegundos. La funcin vuelve si transcurre el intervalo aunque no se complete la operacin. Si dwMilliseconds=0, la funcin comprueba los datos de la pipe y vuelve inmediatamente. Si dwMilliseconds es infinito, el intervalo de time-out nunca termina. MPUSBReadInt(myOutPipe, VarPtr(SendData(0)), bytes, VarPtr(bytes), 1000) MPUSBCLOSE(HANDLE) Cierra una determinada unin. handle: Input: Identifica la pipe del Endpoint que se va a cerrar. MPUSBClose (myOutPipe).

Labview cuenta con una funcin llamada Call Library Function Node con la cual el autor hizo un subVI en donde llama las funciones antes descritas y lo nombro PicUSB

Vid_Pid: Es el nombre del vendedor y producto con el que fue configurado nuestro dispositivo, en nuestro caso: "vid_0X04d8&pid_0010" N.bytes a escribir: Nos indica el numero de bytes o el tamao del dato que vamos a transferir. Dato a Enviar: Indica el dato que se va a enviar. Retardo de entrada y salida: Nos indica a cada cuanto tiempo haremos la capturar de datos. El tiempo tiene que indicarse en milisegundos. N.bytes a Recibir: Aqu indicaremos el tamao de datos que estamos enviando del dispositivo usb (microcontrolador o PicUSB). Dato Recibido: En esta parte es donde capturaremos los datos que se estn enviando del dispositivo y lo visualizamos en un grafica si estamos enviando datos de temperatura o el termmetro que tiene labview, esto depende de lo que se este controlando.

Firmware El microcontrolador PIC es programado con el siguiente cdigo

#include <18F4550.h> #DEVICE ADC=8 #fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN #use delay(clock=48000000)

#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID #define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers #define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers #define USB_EP1_TX_SIZE 2 //size to allocate for the tx endpoint 1 buffer #define USB_EP1_RX_SIZE 2 //size to allocate for the rx endpoint 1 buffer #include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver #include <PicUSB.h> //Configuracin del USB y los descriptores para este dispositivo #include <usb.c> //handles usb setup tokens and get descriptor reports //#include <lcd.c > //Asignacion de variables #define LEDV PIN_C1 #define LEDR PIN_C0 #define LED_ON output_high #define LED_OFF output_low #define modo recibe[0] #define param recibe[1] //#define paso recibe[2] //#define temp recibe[3] //#define letra recibe[4] //#define incremento recibe[6] #define Temperatura envia[0] //#define imprimir recibe[7] //#define incremento envia[1] #Byte PORTA = 0xF80 // Direccin del puerto A para la familia 18Fxx5x. #Byte PORTB = 0xF81 // Direccin del puerto B para la familia 18Fxx5x. #Byte PORTC = 0xF82 // Direccin del puerto C para la familia 18Fxx5x. #Byte PORTD = 0xF83 // Direccin del puerto D para la familia 18Fxx5x (Slo 40/44 // pines). #Byte PortE = 0xF84 //#DEFINE RDD_DATA PIN_A1 //#DEFINE RDD_CLOCK PIN_A2

//declaramos variables globales int8 recibe[2]; int8 envia[2]; int8 dato; //int i=0; //int j=0; //char texto[16]; //int a; //void matriz (void); //void fRDD_send_data0(void); //void fRDD_send_data1(void); //int const letra[8]={48,120,204,204,252,204,204,204}; void main(void) { int8 adc[1]; set_tris_b(0x00); set_tris_a(0x00); //Configuracion para el puerto D como salida output_b(0x00); //Limpiamos el puerto D setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); disable_interrupts(GLOBAL); //deshabilitamos todas las interrupciones LED_OFF(LEDV); //Apagamos led Verde LED_ON(LEDR); //Encendemos led Rojo // lcd_init(); usb_init(); //inicializamos el USB usb_task(); //habilita periferico usb e interrupciones usb_wait_for_enumeration(); //esperamos hasta que el PicUSB sea configurado por el host setup_adc_ports(AN0|VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); LED_OFF(LEDR); //Apagamos el led Rojo LED_ON(LEDV); //encendemos led verde /* lcd_gotoxy(4,1); lcd_putc("DISPOSITIVO"); lcd_gotoxy(5,2); lcd_putc("CONECTADO");

delay_ms(3000); lcd_putc("\f"); */

while (TRUE) { if(usb_enumerated()) //Si el PicUSB est configurado { //salto: if (usb_kbhit(1)) //Si el endpoint de salida contiene datos del host {

usb_get_packet(1, recibe, 2); //Cachamos el paquete de tamao 2bytes del EP1 y almacenamos en recibe

if (modo==0)//modo salida digital d1,d2,d3,d4,d5,d6,d7,d8 { output_b(0x00); //El dato param recibido lo mandamos al puerto o registro d

} if (modo==1)//modo salida digital d1,d2,d3,d4,d5,d6,d7,d8 { output_b(param); //El dato param recibido lo mandamos al puerto o registro d //lcd_gotoxy(1,1); //printf(lcd_putc,"numero de paso" ); //lcd_gotoxy(7,2); //printf(lcd_putc,"%u",paso);

} /* if (modo==2)//modo salida digital d1,d2,d3,d4,d5,d6,d7,d8 { output_b(param); //El dato param recibido lo mandamos al puerto o registro d lcd_gotoxy(1,1); printf(lcd_putc,"numero de paso"); lcd_gotoxy(7,2); printf(lcd_putc,"%u",paso);

} if (modo==3)//modo salida digital d1,d2,d3,d4,d5,d6,d7,d8 { output_b(0x00); //El dato param recibido lo mandamos al puerto o registro d adc[0] = read_adc(); lcd_gotoxy(1,1); printf(lcd_putc,"TEMPERATURA%u",temp);

printf(lcd_putc,""); delay_us(10); usb_put_packet(1,adc,1,USB_DTS_TOGGLE); output_d(param); delay_ms(32);

} if (modo==4) {

strcpy(texto, imprimir) ;

lcd_gotoxy(1,1); printf(lcd_putc,texto);

// matriz();

} */ }

} } } /*void matriz() { PORTB = 0b11111110; //Filas 1 encendida, las demas apagadas. for (j=0;j<8;j++){ int8 mul=0b00000001;

mul=0b00000001; for (i=0;i<8;i++) { if((letra[j]&mul)!=0){ fRDD_send_data1(); } else{ fRDD_send_data0(); } mul=mul<<1; } delay_ms(2); PORTB = (PORTB <<1) +1; } } //-------------------------------------------------//---Envia un 0 al registro de desplazamiento: //-------------------------------------------------void fRDD_send_data0(void){ output_low(RDD_DATA); delay_us(2); output_low(RDD_CLOCK); delay_us(2); output_high(RDD_CLOCK); //delay_us(1); } //-------------------------------------------------//---Envia un 1 al registro de desplazamiento: //-------------------------------------------------void fRDD_send_data1(void){ output_high(RDD_DATA); delay_us(2); output_low(RDD_CLOCK); delay_us(2); output_high(RDD_CLOCK); }

*/

Utilizacin de subVI PICUSB a continuacin de obtiene el siguiente cdigo en donde se utiliza el subVI PICUSB y el cdigo de la figura 1,2

Diagrama de Interface

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