You are on page 1of 8

Comunicacin PC-PIC por USB con Visual Basic Este proyecto es una versin ms elaborada del artculo Comunicacin

PC-PIC por USB, al que remito para ms detalle en la configuracin de fuses, descripcin de funciones USB, etc. En este caso se emplea una aplicacin desarrollada bajo visual basic para poder interactuar con el PIC desde el PC. Esta aplicacin permite la lectura del canal analgico del Puerto A de un PIC 18F4550, adems de la lectura o escritura de los puertos B y D. Todo controlado desde el PC a travs de una conexin USB.

La aplicacin VB indica la orden al PIC mediante un cdigo de 4 caracteres. El primero de esos caracteres le indica al PIC la actuacin que debe realizar, ya sea la lectura de la entrada analgica, lectura del puerto D o puerto B, escrituras en los puertos,etc.

if (usb_cdc_kbhit()){

//Si hay recepcin de datos los lee

recepcion_datos(); switch(opcion[0]){ //Gestin segn informacin recibida case '0': escritura_puertoD(); break; case '1': canal_analogico(); break; case '2': lectura_puertoD(); break; case '3': lectura_puertoB();

break; case '4': escritura_puertoB(); break; default: break; } }

recepcion_datos() {

char c;

//Caracteres individuales de la cadena

i=0;

//Reinicio del puntero para 1 caracter //Recepcin mxima de 4 caracteres

for (i=0;i<4;i++){

//Hasta que buffer se quede vaco if (usb_cdc_kbhit()) c=usb_cdc_getc(); opcion[i]=c; } } El resto de caracteres del cdigo ser la informacin a mostrar en el puerto del PIC en el caso de la escritura en los puertos. i=3; //ultimo caracter recibido... //Guarda el caracter recibido

decodificacion(i); //lo transforma en los 4 bits bajos Puerto B PuertoB_bajo = numero; i=2; //guarda valor

//penultimo caracter recibido...

decodificacion(i); //lo transforma en los 4 bits altos Puerto B PuertoB_alto = numero; //guarda el valor

//Salida de los dos caracteres leidos como un byte

PORTB=(PuertoB_alto<<4)|(PuertoB_bajo);

Por su lado, el PIC enva la informacin solicitada al PC mediante cadenas de caracteres acotadas por un primer carcter que indica de que informacin se trata y un carcter final (#) para separarla de las posteriores cadenas. La aplicacin Visual Basic se encarga de identificarlos. Los caracteres contenidos entre ambos ser la informacin "til".

lectura_puertoD() {

TRISD=0xff;

//Puerto D como entrada

PuertoD= PORTD;

//Envo por USB a la aplicacin visual basic printf(usb_cdc_putc, "\fD%x#", PuertoD); }

[+/-] Ver / Ocultar programa completo //////////////////////////////////////////////////////////////////////////////// // // // COMUNICACIN PC - PIC POR USB // // Clase de dispositivo CDC USB emulando dispositivo RS232 // Interfase con aplicacin Visual basic // // // // RobotyPic (c) // // // //////////////////////////////////////////////////////////////////////////////// #include <18F4550.h> #device adc=10; //PIC a emplear //Conversor A/D de 10 bits

//

#fuses HSPLL,NOWDT,NOLVP,USBDIV,PLL5,CPUDIV1,VREGEN #use delay(clock=20000000) //Frecuencia del cristal oscilador externo

#define USB_CON_SENSE_PIN PIN_B0 //Pin de deteccin conexin-desconexin dispositivo USB #include <usb_cdc.h> #byte TRISD = 0xf95 #byte PORTD = 0xf83 #byte TRISB = 0xf93 #byte PORTB = 0xf81 //Librera de control USB

/******************************************************************************/ int16 valor_digital; //Valor digital obtenido del conversor A/D float valor_analogico; //Valor analgico medido en el conversor A/D int PuertoB; //Valor del puerto B int PuertoD; //Valor del Puerto D char opcion[4]=""; //Recepcin informacin del PC int i; //Puntero int PuertoD_bajo; //4 bits bajos del Puerto D int PuertoD_alto; //4 bits altos del Puerto D int PuertoB_bajo; //4 bits bajos del Puerto B int PuertoB_alto; //4 bits altos del Puerto B int numero; //Valor numrico de los puertos /******************************************************************************/ /******************** LECTURA Y ENVIO CANAL ANALOGICO *************************/ canal_analogico() { valor_digital=read_adc(); //Lectura conversor AD valor_analogico=5.0*valor_digital/1024.0; //Transformacin a valor analgico printf(usb_cdc_putc, "\fA%01.2fV#", valor_analogico); //Envo por USB } /******************************************************************************/ /************************** RECEPCION CADENA ***********************************/ recepcion_datos() { char c; //Caracteres individuales de la cadena

i=0; //Reinicio del puntero para 1 caracter for (i=0;i<4;i++){ //Recepcin mxima de 4 caracteres if (usb_cdc_kbhit()) c=usb_cdc_getc();//Hasta que buffer se quede vaco opcion[i]=c; //Guarda el ultimo caracter recibido } } /******************************************************************************/ /************************** DECODIFICACIN ************************************/ decodificacion(i) { if (opcion[i]=='0') numero=0; else if (opcion[i]=='1') numero=1; else if (opcion[i]=='2') numero=2; else if (opcion[i]=='3') numero=3; else if (opcion[i]=='4') numero=4; else if (opcion[i]=='5') numero=5; else if (opcion[i]=='6') numero=6; else if (opcion[i]=='7') numero=7; else if (opcion[i]=='8') numero=8; else if (opcion[i]=='9') numero=9; else if (opcion[i]=='A') numero=10; else if (opcion[i]=='B') numero=11; else if (opcion[i]=='C') numero=12;

else if (opcion[i]=='D') numero=13; else if (opcion[i]=='E') numero=14; else if (opcion[i]=='F') numero=15; } /******************************************************************************/ /************************* ESCRITURA PUERTO B *********************************/ escritura_puertoB() { TRISB=0b00000100; //Puerto B como salida excepto Bit 2

i=3; //ultimo caracter recibido... decodificacion(i); //lo transforma en los 4 bits bajos Puerto B PuertoB_bajo = numero; //guarda valor i=2; //penultimo caracter recibido... decodificacion(i); //lo transforma en los 4 bits altos Puerto B PuertoB_alto = numero; //guarda el valor //Salida de los dos caracteres leidos como un byte PORTB=(PuertoB_alto<<4)|(PuertoB_bajo); } /******************************************************************************/ /************************* ESCRITURA PUERTO D *********************************/ escritura_puertoD() { TRISD=0x00; //Puerto D como salida

i=3; //ultimo caracter recibido... decodificacion(i); //lo transforma en los 4 bits bajos Puerto D PuertoD_bajo = numero; //guarda valor i=2; //penultimo caracter recibido... decodificacion(i); //lo transforma en los 4 bits altos Puerto D PuertoD_alto = numero; //guarda el valor //Salida de los dos caracteres leidos como un byte PORTD=(PuertoD_alto<<4)|(PuertoD_bajo); } /******************************************************************************/ /*************************** LECTURA PUERTO B *********************************/ lectura_puertoB() { TRISB=0xff; //Puerto B como entrada

PuertoB= PORTB; PuertoB= PuertoB & 0b11111110; //Ignora Bit RB0 printf(usb_cdc_putc,"\fB%x#", PuertoB); //Envo a aplicacin visual basic } /******************************************************************************/ /*************************** LECTURA PUERTO D *********************************/

lectura_puertoD() { TRISD=0xff;

//Puerto D como entrada

PuertoD= PORTD; printf(usb_cdc_putc, "\fD%x#", PuertoD); //Envo a aplicacin visual basic } /******************************************************************************/ /************************* FUNCIN PRINCIPAL ********************************/ void main() { TRISD=0xff; //Puerto D como entrada

setup_adc_ports(AN0); //Definicin pin a utilizar como entrada analgica setup_adc(ADC_CLOCK_INTERNAL);//Definicin de la fuente de reloj para el A/D set_adc_channel(0); //Seleccin del canal analgico usb_cdc_init(); usb_init(); //Inicializacin del modo CDC //Inicializacin del control del USB

do { usb_task(); //Deteccin de la conexin de dispositivo USB if (usb_enumerated()) { //Devuelve TRUE si dispositivo ha sido enumerado por el PC if (usb_cdc_kbhit()){ //Si hay recepcin de datos los lee recepcion_datos(); switch(opcion[0]){ //Gestin segn la informacin recibida case '0': escritura_puertoD(); break; case '1': canal_analogico(); break; case '2': lectura_puertoD(); break; case '3': lectura_puertoB(); break; case '4': escritura_puertoB(); break; default: break; } } } delay_ms(10); } while (TRUE); }

Bajo proteus se ha desarrollado un esquema para poder comprobar los puertos como entradas y salidas mediante interruptores y leds.

Aqu podemos ver el resultado:

Descargar Comunicacin PC-PIC por USB con VB

El proyecto contenido en el artculo ha sido diseado y probado con xito utilizando las siguientes versiones de software: - Windows xp y windows 7 - Proteus V7.7 SP2 - CCS PIC C COMPILER v4.084

You might also like