sábado, 27 de agosto de 2011

Fireweed

La música muestra nuestro interior tal cual sucede en ese instante

jueves, 18 de agosto de 2011

Comunicacion PIC18FXXXX con Matlab por Puerto USB




Hola a todos, los saludo yo de nuevo. Vuelvo
con otra entrada la cual un microcontrolador
PIC-18FXXXX cualquiera de esta familia, se
conecta con una PC por puerto USB mediante
interfaz de Matlab.
Primero definamos el Puerto USB, Bus Serie
Universal, es como serial pero con paquetes
de 64 bytes y con velocidades de 480,12 o 1,5 Mbps
en este caso la frecuencia de clock usada para
comunicar el PIC con la PC es 48 Mhz, pero
usando los Phase Locked Loops (PLL) del PIC
se usan cristales mas bajos a la misma velocidad.
El tipo de conexion puede ser HID o BULK, HID se
usa para dispositivos como mouse,teclados y blabla
y BULK TRANSFER que entrega el dato por "volumen"
el ancho de banda puede variar y los envia
en secuencia lo cual nos lo hace mas simple.
Cualquier dispositivo USB debe identificarse ante
el HOST(PC) hay queespecificar el tipo
de transferencia de datos
a usar (endpoints), VID&PID, nombre y serie
del producto que se conecta para que el
host identifique al driver y pueda instalarlo
con el fin de que el dispositivo pueda formar
las “pipes” ó túneles para su comunicación
con el host y se oiga el clasico Pu PUM! al
conectar cualquier USB.
El driver y la libreria a usar es la MPUSBAPI
que nos brinda MICROCHIP, buscando MICROCHIP
SOLUTIONS para descargar en MICROCHIP.com
(si no lo encuentran pueden comunicarse a este
blog para ayuda) El programa para el PIC lo
desarrolle en PIC-C el cual lo descarge en red
A continuacion el programa completo compilado
y probado:
///////////////////////////////////////////
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN,MCLR,NOPBADEN
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


#define USB_HID_DEVICE FALSE
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK
#define USB_EP1_TX_SIZE 64
#define USB_EP1_RX_SIZE 64

#include
#include
#include
#define LEDV PIN_A0
#define LEDR PIN_A1
#define LED_ON output_high
#define LED_OFF output_low

#BYTE TRISA = 0x0F92
#BYTE TRISB = 0x0F93
#BYTE PORTA = 0x0F80
#BYTE PORTB = 0x0F81
#BYTE ADCON1 = 0x0FC1
#BYTE CMCON = 0x0FB4

int8 dato[64];
void main(void) {

LED_ON(LEDV);
LED_OFF(LEDR);

usb_init();
usb_task();
usb_wait_for_enumeration();

LED_OFF(LEDV);
LED_ON(LEDR);

TRISA = 0x00;
TRISB = 0x00;
ADCON1 = 0x0F;
CMCON = 0x07;
while (TRUE)
{
if(usb_enumerated())
{
if (usb_kbhit(1))
{ usb_get_packet(1, dato, 64);
portb = dato[0];
dato[1] = porta;
usb_put_packet(1, dato, 64, USB_DTS_TOGGLE);
}
}
}

}

//////////////////////////////
ESCRIBAN SU CORREO EN COMENTARIO y
ENVIO LOS CODIGOS POR EMAIL

Como se ve es bastante sencillo, y se logra enviar
hasta 128 paquetes de 64 bytes cada uno
o tambien de 8 bits que es mas comun
desde dato[0] hasta dato[128],

Ahora vamos al codigo en MATLAB el cual
nos facilita la vida porque solo se carga la
MPUSBAPI y listo ojo que son 3 archivos
MPUSBAPI.dll
MPUSBAPI.c
MPUSBAPI.h
tienen que estar en la misma carpeta
del archivo .m que creemos
Ahhhhhhhh! Tienen que crear un archivo .m
en File->New->M-File y copian el siguiente codigo
%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
loadlibrary mpusbapi _mpusbapi.h alias libreria
data_in = eye(1,64,'uint8');
data_out = eye(1,64,'uint8');
vid_pid_norm = libpointer('int8Ptr',[uint8('vid_04d8&pid_000b') 0]);
out_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]);
in_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]);
[conectado] = calllib('libreria','MPUSBGetDeviceCount',vid_pid_norm)


if conectado == 1
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0));






[my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0)); while (data_out(1)<=255)
calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10));
[aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(64), uint8(64), uint8(10));
data_out (1) = (data_out(1))+1;
data_in(2)
pause (0.1); end
calllib('libreria', 'MPUSBClose', my_in_pipe);
calllib('libreria', 'MPUSBClose', my_out_pipe);
end
unloadlibrary libreria % Importante descargar la librería de memoria, de lo contrario genera errores
close all
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


Este programa envia un contador de 1 a 255 y muestra


por el puerto B del pic, y tambien lee el puerto A


y lo muestra en Matlab.


Recomiendo usar el Proteus 7. 4


Service Pack 3
luego instales los USB drivers


solo ahi me funciono


la simulacion


Para cualquier duda


o para los archivos


comenta el post


estare atento
En la proxima comunicaremos


este pic con LabView, y tambien


el control de varios servomotores


en JAVA NEtbeans o matlab


Saludos