# PicUSB-Matlab  con comunicacion Bulk Transfers USB



## adrianjpc (May 5, 2009)

Hola a todos! 
Eh querido controlar desde matlab un microcontrolado en especial el PIC18F4550 ya que  cuenta con el protocolo usb  
la comunicacion que quiero establecer es la de Bulk Transfersa  USB sin necesidad de emular el puerto serial(COM), por lo que este cuenta con una alta velocidad de transferencia (480MB/s) en forma bidireccional.

Para una mayor facilidad de desarrollo de aplicaciones basadas en el bus USB, Microchip ha creado un archivo dll
(mpuspapi.dll) en el que proporciona las funciones de acceso al puerto USB con un microcontrolador de la familia PIC18Fxx5x. 

Entonces desde matlab encontre una funcion para llamar librerias y hacer utlidad de ella,  pero a un no lo eh entendido muy bien como se utliza.  

esta funcion se llama:

*loadlibrary*

*Syntax*

loadlibrary('shrlib', 'hfile')
loadlibrary('shrlib', @protofile)
loadlibrary('shrlib', ..., 'options')
loadlibrary shrlib hfile options
[notfound, warnings] = loadlibrary('shrlib', 'hfile')

si alguien que me pueda explicar como funciona esta funcion *loadlibrary* ya que utilizandolo de manera perfecta podremos madar y recibir datos del microcontrolador para la adquisioon de datos.


----------



## adrianjpc (May 6, 2009)

holaa a todos 

Encontre esta pagina donde explica con ejemplos como cargar una libreria en matlab
http://www.codeproject.com/KB/DLL/MatlabGenericDll.aspx?df=100&forumid=26247&exp=0&select=972623

pero a un no logro cargar la libreria me marca error. la otra idea es cargarla con funiones mex en matlab (Mex-file), funciona para cargar codigos realizados en C. ya eh realizado estas dos opciones
pero aun me sigue marcando error .

alguien que sepa como cargar una libreria en matlab o ejecutar codigos C en matlab seria de buena ayuda .

hasta luegoo y saludos a todos


----------



## adrianjpc (May 6, 2009)

este es el error que les comentaba al cargar la libreria que esta en la carpeta de \documentos\matlab

>> loadlibrary('mpusbapi.dll','_mpusbapi.h');
Warning: Warnings messages were produced while parsing.  Check the functions you
intend to use for correctness.  Warning text can be viewed using:
[notfound,warnings]=loadlibrary(...) 
> In loadlibrary at 381
>>


----------



## jokelnice (May 6, 2009)

colega la verdad intente por todas partes en matlab y no pude asi que finalmente me decidi por otros programas como labview , visual basic , labwindows


----------



## adrianjpc (May 8, 2009)

la verdad encontre a un amigo que ya establecio la comunicacion usb matlab con funciones mex-file
eso fue lo que me aconsejo porque no pudo cargar directamente la libreria mpusbapi.dll


----------



## adrianjpc (May 9, 2009)

function prueba
loadlibrary mpusbapil mpusbapil.h alias libreria
libisloaded mpusbapil
libfunctions('libreria', '-full')

%pause;

vid_pid_norm_c='vid_04d8&pid_0010';
out_pipe_c=('\\MCHP_EP1');
in_pipe_c=('\\MCHP_EP1');

vid_pid_norm = libpointer('voidPtr',[uint32(vid_pid_norm_c) 0]);
out_pipe = libpointer('voidPtr',[uint32(out_pipe_c) 0]);
in_pipe = libpointer('voidPtr',[uint32(in_pipe_c) 0]);



calllib('libreria','MPUSBGetDLLVersion')
calllib('libreria','MPUSBGetDeviceCount',vid_pid_norm)

end

con esto logre que me detectara mi dispositivo 
cuando esta conectado me envia 1 y cuando esta deconectado 0. Tambien me regresa la vercion de la libreria 1.0.0.0

ahora lo que falta es abrir el dispositivo, escribir y cerrarlo.

saludos


----------



## jagarciauceda (May 13, 2009)

Hola ! yo estoy haciendo lo mismo que tu...conseguiste comunicar matlab con tu pic? agradeceria mucho que me dijeras si lo conseguiste y lo mas importante como lo conseguiste

Gracias!


----------



## adrianjpc (May 13, 2009)

copia el programa que puse en el comentario pero con algunas modificaciones y ejecutalo en matlab  
con eso te detectara tu dispositivo y la vercion de la libreria 

tiens que tener el mpusbapi.dll y el _mpusbapi.h la tienes que tener en una carpeta


----------



## gpoolb (Jun 12, 2009)

Acabo de publicar lo siguiente en http://www.mathworks.com/matlabcentral/fileexchange/authors/60191 espero que te sea útil, espero tus comentarios. Ya habia logrado comunicacion con LabView 8.2, usando el mismo protocolo y con el segmento de código en matlab que amablemente compartiste me ayudó a concluirlo. Gracias.


----------



## adrianjpc (Jun 13, 2009)

gracias por tu aportacion gpoolb probare lo que acabaste de publicar

oajla ayude a resolver este problema..

saludos


----------



## jagarciauceda (Jun 17, 2009)

Hola gpoolb, estoy aprovechando esa rutina para comunicar con una interficie que utiliza el micro 18f4550. Te agradecería mucho si pudieras colgar todos los archivos necesarios para programar el micro. Ya se que tu utilizas el 18F2455....pero viene a ser lo mismo...

Yo en cuanto comunique subire el codigo.

Gracias

Salud!


----------



## adrianjpc (Jun 17, 2009)

Es practicamente lo mismo  solo tienes que poner la libreria del microcontrolador que estas utilizando 
en tu caso seria #include PIC18f4550 y de alli el codigo es el mismo tambien tienes que fijarte de los puertos que utiliza  el micro.


----------



## jagarciauceda (Jun 17, 2009)

Hi adrianjpc, 

 eso lo veo. A mi lo que me lía es la cantidad de compiladores que hay. Yo quiero saber exactamente que librerias son necesarias para generar el firmware. Me explico; quiero saber los headers necesarios para que comunique via usb.

 Por ejemplo: el amigo gpoolb utiliza no se que compilador, creo que el PCW, o algo asi. Pero en su codigo solo aparece el main y no hace ninguna referencia a las cabeceras.

...a ver si eres capaz de acercarme a la luz ; )


----------



## gpoolb (Jun 18, 2009)

Caballeros:

En la primera mitad del código usb.m el cual es un archivo de matlab (si no cuenta con matlab se puede usar el editor de texto para abrirlo) se encuentra el código del PIC listo para ser compilado (mismo que anexo como archivo adjunto en éste foro <<daq.c>>). *Las librerias _mpusbapi.h y mpusbapi.dll son exclusivas para el manejo de matlab, no los modifiquen*, el único que pueden modificar es el programa que se compila en el pic, el cual les adjunto el programa daq.c El compilador que uso es el CCS PCWH 3.227


----------



## jokelnice (Jun 18, 2009)

bueno colegas les confieso que en matlab habia intentado pero habia sido imposible bueno el aporte .
saludos ..........


----------



## gonsefo (Jul 21, 2009)

Bueno colegas yo me disculpo ante todo pues generalmente entro a los foros a buscar información y este es mi primer aporte a esta comunidad que tanto me ha brindado, espero les sirva....

yo lo monte completico y siguiendo las instrucciones al pie de l letra y funciona muy bien, entre un envio y otro se demora aprox 2 ms, si alguien lo hace funcionar mas rapido ojala publiquen la información pues es muy interesante....

gracias.


----------



## gonsefo (Jul 21, 2009)

el retardo obedece a que entr una tx y otra el sistema tiene 1ms como minimo y si se le quita no funciona


----------



## gpoolb (Jul 21, 2009)

Saludos...

Se ha actualizado la liga http://www.mathworks.com/matlabcentral/fileexchange/24417 donde se publica el enlace de MATLAB con PIC, se le ha añadido un pdf con instrucciones más detalladas para su implementación, la primera parte explica el funcionamiento de la libreria mpusbapi.dll, la segunda parte se explica más a detalle la compilación del PIC y el enlace a la PC, y la última explica cómo se implementa el código en MATLAB. Si algo no se entiende pregunten con confianza.


----------



## jokelnice (Jul 21, 2009)

excelente


----------



## tharsis (Jul 22, 2009)

Hello,

I'm sorry I don't speak spanish very well (I'm french) but I could understand more or less this thread and the installation guide. I am trying to load the mpusbapi.dll in matlab but the loadlibrary function returns a lot of warnings because of unknow variable types, example :

 Type 'PCHAR' was not found.  Defaulting to type error.

I've read somewhere that might be because of the compiler used by matlab (LCC) doesn't recognize these particulars variable types. I didn't try the communication with the microcontroller (my board is not ready yet) but I'm afraid it would not work because of this "defaulting type error". 
Do you have the same warning messages ? If not, how did you solve this problem ?

Thank you for help and congratulations to gpoolb for his great work.


----------



## gpoolb (Jul 22, 2009)

Hola tharsis...

Entiendo que no tienes el Hardware con el PIC listo y sólo ejecutaste el archivo de MATLAB, el cual debe de correr sin generar errores. Mi duda es: Las librerias _mpusbapi.h y mpusbapi.dll ... ¿las tienes en la misma carpeta donde ejecutas el archivo de MATLAB? ... el archivo publicado en MATLAB ya fué actualizado el 10 Jul y fueron anexadas más detalles sobre la implementación, sugiero que descargues de nuevo. Espero tus comentarios.


----------



## tharsis (Jul 22, 2009)

Thank you for your reply. Yes, the files mpusbapi.dll and mpusbapi.h are in the same folder than the .m file. The warning messages doesn't come from your matlab script because these warnings appears in the very first command :

[notfound, warnings] = loadlibrary('mpusbapi', '_mpusbapi.h')


It's probably coming from the matlab C compiler. Maybe you're using a different compiler (like Borland) which recognize these variable types.

Anyway, I tried to run your matlab code (the latest version) with a quick made board (I have not implemented your firmware on the PIC). The USB communication seems to work fine even with these warnings since I received data from the PIC. I will keep working on it and I'll let you know if I better understand this "problem". In the meanwhile, if you have some ideas, please let me know...

Thank you again


----------



## gpoolb (Jul 22, 2009)

Hola de nuevo tharsis, Una duda ... ¿Qué versión de MATLAB estás utilizando? ... ¿me podrías dar más detalles sobre el error (el número de línea y la instrucción que genera el error)? ... si es posible copia y pega el error que sale en la línea de comandos de MATLAB. Espero tus comentarios.


----------



## tharsis (Jul 23, 2009)

Hi,

I'm using Matlab R2008b (7.7.0). The warnings (not errors, only warnings) are coming from the line 22 and I've got this message :

_Warning: Warnings messages were produced while parsing.  Check the functions you
intend to use for correctness.  Warning text can be viewed using:
[notfound,warnings]=loadlibrary(...) 
> In loadlibrary at 381
  In usb at 22
_

Then I run this command to get the warnings:
_
[notfound, warnings]=loadlibrary('mpusbapi','_mpusbapi.h')_

I attached a .txt file containing the warnings. 
I Hope it can help...


----------



## washi_w_z_r (Jul 28, 2009)

Hola amigos: lei este post que me ayudo a enlazar matlab con el pic 18f4550, por ello aqui el cod que uso 

```
%////////////////////////////////////////////////////////////////////////%
%/// CONEXION USB MATLAB MEDIANTE LA LIBRERIA MPUSBAPI,DLL            ///%
%/// SOFTWARE QUE NOS PERMITE RECIBIR DATOS DESDE EL ADC DEL PIC      ///%
%/// 18F4550 Y ANALIZAR LA ONDAS FOTOPLETISMOGRAFICAS                 ///%
%///                CUSCO-PERU-2009                                   ///%
%////////////////////////////////////////////////////////////////////////%
%NOMBRAMOS A NUESTRO PROYECTO Conex_USB_1
function Conex_USB_1
%INCIALIZAMOS Y ESCONDEMOS EL GUI CREADO
f = figure('Visible','off','Position',[310,50,450,285]);

%DEFINIMOS CONTROLES ABRIR-CERRAR PUERTO
        %ABRIMOS CONEXION
         hAbrirConex = uicontrol('Style','pushbutton',...
             'String','Abrir','Enable','off','Position',[15,220,70,25],...
             'Callback',{@AbrirConexButton_Callback});
        %CERRAMOS CONEXION
         hCerrarConex = uicontrol('Style','pushbutton',...
             'String','Cerrar','Enable','off','Position',[15,150,70,25],...
             'Callback',{@CerrarConexButton_Callback});
        %CERRAMOS LIBRERIA PARA EVITAR ERRORES
         hCerrarLib = uicontrol('Style','pushbutton',...
             'String','Cerrar Lib','Enable','off','Position',[15,90,70,25],...
             'Callback',{@CerrarLibButton_Callback});
        %RECIBIMOS DATOS DEL ADC
         hRecibeADCRojoAC = uicontrol('Style','pushbutton',...
             'String','ADC ROJO AC','Enable','off','Position',[150,220,100,25],...
             'Callback',{@RecibeADCRojoACButton_Callback});
         hProcesaRojoAC = uicontrol('Style','pushbutton',...
             'String','PROCESAR ROJO AC','Enable','off','Position',[150,180,100,25],...
             'Callback',{@ProcesaRojoACButton_Callback});
         %CREAMOS EL OBJETO TIMER
         t = timer('TimerFcn',@Timer, 'Period', 10.0);
         %ALINEAMOS LOS BOTONES        
         align([hAbrirConex,hCerrarConex],'Center','None');
         ah = axes('Parent',f,'Position',[.15 .15 .7 .7]);
         %HACEMOS EL GUI VISIBLE
         set(f,'Visible','on')
 
         %CAMBIAMOS LA NORMALIZACXION DE LOS COMPONENTES
         set([f,hAbrirConex,hCerrarConex],'Units','normalized');
 
 %//////////////////////////////////////////////////////////////////////%
 %///    CARGAMOS LA LIBRERIA MPUSBAPI                               ///%
 %//////////////////////////////////////////////////////////////////////%
 
 %CARGAMOS LA LIBRERIA MPUSBAPI
 loadlibrary mpusbapi _mpusbapi.h alias libreria 
 libisloaded libreria
 
 %DECLARANDO VECTORES DE DATOS
 data_in = eye(1,64,'uint8');       % El que se recibe del PIC
 data_out = eye(1,3,'uint8');      % El que se envia al PIC

 %DECALARANDO VID-PID DEL PIC18F4550
 vid_pid_norm = libpointer('int8Ptr',[uint8('vid_04d8&pid_0052') 0]); 
 out_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]); 
 in_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]);
 
 %REALIZAMOS  CONTEO DE DISPOSITIVOS
 calllib('libreria','MPUSBGetDLLVersion');
 [conectado] = calllib('libreria','MPUSBGetDeviceCount',vid_pid_norm);

 %PREGUNTAMOS SI LA CONEX SE REALIZO
 %SI ES ASI HABILITAMOS EL BOTON ABRIR CONEX 
    if conectado == 1
        set(hAbrirConex,'Enable','on');
    end
    
%/////////////////////////////////////////////////////////////////////////%
%///                    FUNCIONES DE LOS BOTONES                       ///%
%/////////////////////////////////////////////////////////////////////////%
%CREAMOS FUNCIONES PARA CONTORLAR EL ENVIO Y RECEPCION DE DATOS
 function AbrirConexButton_Callback(source,eventdata)
     set(hCerrarConex,'Enable','on');
     set(hAbrirConex,'Enable','off');
     set(hRecibeADCRojoAC,'Enable','on');
     % ABRIMOS EL PIPE DE CONEXION
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
     % SE ENVIA DATO AL PIC
     calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10)); 
 end

%FUNCION CERRAR LOS PIPES DDE COMUNICACION
 function CerrarConexButton_Callback(source,eventdata)
     set(hAbrirConex,'Enable','off');
     set(hCerrarConex,'Enable','off');
     set(hCerrarLib,'Enable','on');
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); % Se abre el tunel de envio
     calllib('libreria', 'MPUSBClose', my_out_pipe); % Se cierra el tunel de envio
    %calllib('libreria', 'MPUSBClose', my_in_pipe); % Se cierra el tunel de envio
     libisloaded libreria
 end

%CERRAMOS LAS LIBRERIAS _mpusbapi.h y mpusbapi.dll PARA EVITAR ERRORES
 function CerrarLibButton_Callback(source,eventdata)
     set(hAbrirConex,'Enable','off');
     set(hCerrarConex,'Enable','off');
     unloadlibrary libreria
     libisloaded libreria
 end

%RECIBIMOS DATOS DEL ADC ROJO
 function RecibeADCRojoACButton_Callback(source,eventdata)
     set(hAbrirConex,'Enable','off');
     set(hCerrarConex,'Enable','on');
     set(hProcesaRojoAC,'Enable','on');
     set(hCerrarLib,'Enable','on');
      % ABRIMOS EL PIPE DE CONEXION
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (2), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
     % ENVIAMOS PETICON AL PIC
     calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10)); 
%     for n=0:10
     %DAMOS LA ORDEN PARA QUE EL PIC ENVIE DATOS HACIA LA PC
     [my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0));
     %RECIBIMOS DATOS PROVENEINTES DEL PIC
     [aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(11), uint8(11), uint8(0));
     data_in(1);
     data_in(2);
     data_in(3);
     data_in(4);
     data_in(5);
     data_in(6);
     data_in(7);
     data_in(8);
     data_in(9);
     data_in(10);
 %    end
 end
%PROCESAMOS DATOS DEL ADC ROJO
 function ProcesaRojoACButton_Callback(source,eventdata)
     Buff_Aux=cell(10,1);
     Buff_Aux{1}=data_in(1)+data_in(2);
     %plot(Buff_Aux)
%     start(t);
    find_system('Name','Prueba1');
    open_system('Prueba1');
    set_param('Prueba1', 'Solver', 'ode3');
    set_param('Prueba1/Constant','Value',Buff_Aux(1));
 end
%TIMER EMPIEZA A REAIZAR TAREA ASIGNADA
 function Timer(source,eventdata)
     %Buff_Aux=cell(10,1);
     %Buff_Aux{1}=data_in(1)+data_in(2);
     %plot(Buff_Aux)
     
     Dato=0:pi/100:2*pi;
     y=sin(Dato);
     plot(Dato,y)
 end
end
```
Aunque falta mucho para terminar el proy que realizo, estoy investigando como graficar en tiempo real con el matlab , los datos prov del adc del pic18f4550, si alguine tiene una idea le agradecere mucho el interes, saludos a todos. PD: El prog lo realize en GUIDE(progamacion grafica)


----------



## jagarciauceda (Jul 31, 2009)

hola a todos, sigo probando pero me da el siguiente error al cargar la libreria en Matlab:

Warning: Warnings messages were produced while parsing.  Check the functions you
intend to use for correctness.  Warning text can be viewed using:
[notfound,warnings]=loadlibrary(...)
> In loadlibrary at 374
  In usb at 22

conectado =

     0

>> 


Gracias...me estoy volviendo medio locooooooo


----------



## washi_w_z_r (Jul 31, 2009)

hola , una pregunta, ¿la librerias mpusbapi. dll y _mpusb.h estan en la misma carpeta en la cual esta tu prog ?.


----------



## jagarciauceda (Ago 1, 2009)

hola washi_w_z_r,

    ayer estuve indagando y di con mi problema...fue un despiste con el vendor (VID) en Matlab. Puse el mio que es 0x0011 y solucione el problema.

     Por cierto yo estoy haciendo algo parecido a lo que haces tu, pero para un ECG y un acelerometro de tre ejes. Si quieres podemos compartir impresiones. De hecho estoy estudiando tu codigo pq creo que es bastante interesante.

    Muchas gracias!


----------



## washi_w_z_r (Ago 1, 2009)

hola jagarciauceda, enhorabuena que resolviste tu problema, mira ya consegui hacer esto con el pic:

- Enviar una orden para q se apague y prendan los leds 
- Enviar una orden para q el pic me devuelva valores guardados en un arreglo SPO10{12 26 35 4}(este arreglo ta en en pic).
- Implemente un timer para poder graficar los datos que provienen del pic.

Lo mas interesante es lo siguiente: 
Cuando pido datos del arreglo al picç, este  me envia dato_in(1)=12 y dato_in(2)=26 , entonces intente visualizar en el graficador que hice y bueno los grafica   

Ahhh por ello intente que me envie datos provenientes del pic( ADC) pero me envia dato_in(1)=1, dato_in(2)=0, ? , implemente un boton para q cuando presione dicho boton me devuelva el valor del ADC y lo grafique pero me envia lo mismo...

Aqui te dejo el cod que desarrolle:


```
%////////////////////////////////////////////////////////////////////////%
%/// CONEXION USB MATLAB MEDIANTE LA LIBRERIA MPUSBAPI,DLL            ///%
%/// SOFTWARE QUE NOS PERMITE RECIBIR DATOS DESDE EL ADC DEL PIC      ///%
%/// 18F4550 Y ANALIZAR LA ONDAS FOTOPLETISMOGRAFICAS                 ///%
%///                CUSCO-PERU-2009                                   ///%
%////////////////////////////////////////////////////////////////////////%
%NOMBRAMOS A NUESTRO PROYECTO Conex_USB_1
function Conex_USB_1
hAxesRaw = [];
hAxesRojoAC = [];

%DEFINIMOS VARIABLE ADQUISICION_DATO
%Adquisicion_Dato = false;
%hProcesaRojoAC = [];
hRecibeADCRojoAC = [];
Buff_Aux= [1 1 1 ];

%% INCIALIZAMOS Y ESCONDEMOS EL GUI CREADO
f = figure('Visible','off','Position',[310,50,550,485]);%6,'Color',[0 0 0.15]);
%IMPORTAMOS IMAGEN
[x,map]=imread('escudo.jpg','jpg');
%Representamos imagen en figura, con su mapa de colores
image(x),colormap(map),axis off,hold on

%% DEFINIMOS CONTROLES ABRIR-CERRAR PUERTO
        %CREAMOS BARRA DE MENUS
        mAbrir = uimenu(f,'Label','Conex USB');
        Abrir = uimenu(mAbrir,'Label','Abrir',...
            'Callback',{@AbrirMenu_Callback});
        mAnalizar = uimenu(f,'Label','ANALIZAR');
        RojoAC = uimenu(mAnalizar,'Label','ROJO AC',...
            'Callback',{@RojoACMenu_Callback});
        InfrAC = uimenu(mAnalizar,'Label','INFR AC',...
            'Callback',{@InfrACMenu_Callback});
        RojoDC = uimenu(mAnalizar,'Label','ROJO DC',...
            'Callback',{@RojoDCMenu_Callback});
        InfrDC = uimenu(mAnalizar,'Label','INFR DC',...
            'Callback',{@InfrDCMenu_Callback});
        LuzDC = uimenu(mAnalizar,'Label','LUZ DC',...
            'Callback',{@LuzDCMenu_Callback});
        mSPO2 = uimenu(f,'Label','SPO2');
        SPO2 = uimenu(mSPO2,'Label','Abrir',...
            'Callback',{@SPO2Menu_Callback});
        %CREAMOS UN PANEL PARA CONEX USB
        pConexion = uipanel('BorderType','etchedin',...
                    'Parent',f,'Title','CONEX USB',...
                    'Position',[.05 .65 .2 .3]);
        pRojoAC = uipanel('BorderType','etchedin',...
                    'Parent',f,'Title','ROJO AC',...
                    'Position',[.05 .42 .2 .2]); 
        pInfrAC = uipanel('BorderType','etchedin',...
                    'Parent',f,'Title','INFR AC',...
                    'Position',[.05 .42 .2 .2]);
        pRojoDC = uipanel('BorderType','etchedin',...
                    'Parent',f,'Title','ROJO DC',...
                    'Position',[.05 .42 .2 .2]);
        pInfrDC = uipanel('BorderType','etchedin',...
                    'Parent',f,'Title','INFR DC',...
                    'Position',[.05 .42 .2 .2]);
        pLuz = uipanel('BorderType','etchedin',...
                    'Parent',f,'Title','LUZ DC',...
                    'Position',[.05 .42 .2 .2]);
        pSPO2 = uipanel('BorderType','etchedin',...
            'Parent',f,'Title','SPO2',...
            'Position',[.05 .42 .2 .2]);
        %BOTONES : ABRIR CERRAR CONEXION , ENCEDER APAGAR LEDS
         hAbrirConex = uicontrol('Parent',pConexion,'Style','pushbutton',...
             'String','Abrir','Enable','off','Position',[1,90,70,25],...
             'Callback',{@AbrirConexButton_Callback});
         hCerrarConex = uicontrol('Parent',pConexion,'Style','pushbutton',...
             'String','Cerrar','Enable','off','Position',[15,60,70,25],...
             'Callback',{@CerrarConexButton_Callback});
         hLEDV = uicontrol('Parent',pConexion,'Style','pushbutton',...
             'String','LEDV','Enable','off','Position',[15,35,70,25],...
             'Callback',{@LEDVButton_Callback});
         hLEDR = uicontrol('Parent',pConexion,'Style','pushbutton',...
             'String','LEDR','Enable','off','Position',[15,10,70,25],...
             'Callback',{@LEDRButton_Callback});
        %CERRAMOS LIBRERIA PARA EVITAR ERRORES
         hCerrarLib = uicontrol('Style','pushbutton',...
             'String','Cerrar Lib','Enable','on','Position',[315,5,70,55],...
             'Callback',{@CerrarLibButton_Callback});
        %CREAMOS BOTONES PARA RECIBIR Y PROCESAR DATOS PIC_ADC
         hRecibeADCRojoAC = uicontrol('Parent',pRojoAC,'Style','pushbutton',...
             'String','ADC ROJO AC','Position',[1,50,100,25],...
             'Callback',{@RecibeADCRojoACButton_Callback});
         hProcesaRojoAC = uicontrol('Parent',pRojoAC,'Style','pushbutton',...
             'String','Procesa Dato','Enable','off','Position',[1,20,100,25],...
             'Callback',{@ProcesaRojoACButton_Callback});
         %CREAMOS BOTONES INICIO Y PARADA DE GRAFICOS
         hIniciaPloter_RojoAC = uicontrol('Style','pushbutton',...
             'String','INICIO','ForegroundColor',[0,1,0],...
             'Enable','on','FontWeight','bold',...
             'Position',[250,380,100,25],...
             'Callback',{@IniciaPloter_Callback});
         hPausaPloter = uicontrol('Style','pushbutton',...
             'String','PAUSA','ForegroundColor',[1,0,0],...
             'Enable','on','FontWeight','bold',...
             'Position',[250,350,100,25],...
             'Callback',{@PausaPloter_Callback});
         %CREAMOS EL OBJETO TIMER
         timerObj = timer('Period',0.05,'ExecutionMode','fixedSpacing','timerFcn',@DatosUSB);
         timer_RojoAC = timer('Period',0.5,'ExecutionMode','fixedSpacing','timerFcn',@Datos_RojoAC);
         %ALINEAMOS LOS BOTONES        
         align([hAbrirConex,hCerrarConex,hLEDR,hLEDV],'Center','None');
         %HACEMOS EL GUI VISIBLE
         set(f,'Visible','on');
         set([hRecibeADCRojoAC,hProcesaRojoAC],'FontWeight','bold');
         %CREAMOS EJES DE COORD
         hAxesRaw  = axes('visible','off','position', [0.13  0.1  0.775 0.31]);
                      title('PRUEBA');
         hAxesRojoAC  = axes('visible','off','position', [0.13  0.1  0.775 0.31]);
                      title('ROJO AC');
         %CAMBIAMOS LA NORMALIZACXION DE LOS COMPONENTES
         set([f,hAbrirConex,hCerrarConex,hRecibeADCRojoAC,hProcesaRojoAC, hPausaPloter,hIniciaPloter_RojoAC],'Units','normalized');
         set(f,'MenuBar','none');
         set([pConexion,pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off');
         set([Abrir,RojoAC,InfrAC,RojoDC,InfrDC,LuzDC,SPO2],'ForegroundColor',[0 0 1] );

%% CARGAMOS LA LIBRERIA MPUSBAPI
 
 %CARGAMOS LA LIBRERIA MPUSBAPI
 loadlibrary mpusbapi _mpusbapi.h alias libreria 
 libisloaded libreria
 
 %DECLARANDO VECTORES DE DATOS
 data_in = eye(1,10,'uint8');       % El que se recibe del PIC
 data_out = eye(1,3,'uint8');      % El que se envia al PIC

 %DECALARANDO VID-PID DEL PIC18F4550
 vid_pid_norm = libpointer('int8Ptr',[uint8('vid_04d8&pid_0052') 0]); 
 out_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]); 
 in_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]);
 
 %REALIZAMOS  CONTEO DE DISPOSITIVOS
 calllib('libreria','MPUSBGetDLLVersion');
 [conectado] = calllib('libreria','MPUSBGetDeviceCount',vid_pid_norm);

 %PREGUNTAMOS SI LA CONEX SE REALIZO
 %SI ES ASI HABILITAMOS EL BOTON ABRIR CONEX 
    if conectado == 1
        set(hAbrirConex,'Enable','on');
    end
 %% FUNCIONES DE BARRA DE MENU
 function AbrirMenu_Callback(source,eventdata)
     set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
     set(pConexion,'visible','on')
 end
 function RojoACMenu_Callback(source,eventdata)
     set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
     set([pRojoAC,pConexion],'visible','on')
 end
 function InfrACMenu_Callback(source,eventdata)
     set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
     set([pInfrAC,pConexion],'visible','on') 
 end
 function RojoDCMenu_Callback(source,eventdata)
     set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
     set([pRojoDC,pConexion],'visible','on') 
 end
 function InfrDCMenu_Callback(source,eventdata)
     set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
     set([pInfrDC,pConexion],'visible','on')
 end
 function LuzDCMenu_Callback(source,eventdata)
     set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
     set([pLuz,pConexion],'visible','on')
 end
 function SPO2Menu_Callback(source,eventdata)
     set([pConexion,pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
     set([pSPO2,pConexion],'visible','on')
 end
 %%    FUNCION ABRIR CONEXION PUERTO USB
 function AbrirConexButton_Callback(source,eventdata)
     set(hCerrarConex,'Enable','on');
     set(hAbrirConex,'Enable','off');
     set(hLEDV,'Enable','on');
     set(hLEDR,'Enable','on');
     set(hRecibeADCRojoAC,'Enable','on');
     % ABRIMOS EL PIPE DE CONEXION
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
     % SE ENVIA DATO AL PIC
     calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10)); 
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); % Se abre el tunel de envio
     calllib('libreria', 'MPUSBClose', my_out_pipe); % Se cierra el tunel de envio
         
 end
%% FUNCION ENCIENDE APAGA LEDS
function LEDRButton_Callback(source,eventdata)
     set(hAbrirConex,'Enable','off');
     set(hRecibeADCRojoAC,'Enable','on');
     % ABRIMOS EL PIPE DE CONEXION
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
     data_out(2)=1
     % SE ENVIA DATO AL PIC
     calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10)); 
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); % Se abre el tunel de envio
     calllib('libreria', 'MPUSBClose', my_out_pipe); % Se cierra el tunel de envio
end
function LEDVButton_Callback(source,eventdata)
     set(hAbrirConex,'Enable','off');
     set(hRecibeADCRojoAC,'Enable','on');
     % ABRIMOS EL PIPE DE CONEXION
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
      data_out(2)=2;
     % SE ENVIA DATO AL PIC
     calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10)); 
 end
%% FUNCION CERRAR PIPES DE COMUNICACION
 function CerrarConexButton_Callback(source,eventdata)
     set(hAbrirConex,'Enable','off');
     set(hCerrarConex,'Enable','off');
     set(hCerrarLib,'Enable','on');
     [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); % Se abre el tunel de envio
     calllib('libreria', 'MPUSBClose', my_out_pipe); % Se cierra el tunel de envio
    %calllib('libreria', 'MPUSBClose', my_in_pipe); % Se cierra el tunel de envio
     libisloaded libreria
 end

%% CERRAMOS LIBRERIAS _mpusbapi.h y mpusbapi.dll PARA EVITAR ERRORES
 function CerrarLibButton_Callback(source,eventdata)
     set(hAbrirConex,'Enable','off');
     set(hCerrarConex,'Enable','off');
     unloadlibrary libreria
     libisloaded libreria
      stop(timerObj)
      close(f);
 end
%% RECIBIMOS DATOS DEL ADC_ROJO
 function RecibeADCRojoACButton_Callback(source,eventdata)
     % ABRIMOS EL PIPE DE CONEXION
     %[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (1), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
     % ENVIAMOS PETICON AL PIC
    % calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10)); 
%     for n=0:10
     %DAMOS LA ORDEN PARA QUE EL PIC ENVIE DATOS HACIA LA PC
   %  [my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0));
     %RECIBIMOS DATOS PROVENEINTES DEL PIC
  %   [aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(11), uint8(11), uint8(0));
%     data_in(1)
 %    data_in(2)
     start(timer_RojoAC);
     %data_in(2)     %data_in(3)     %data_in(4)
     %data_in(5)     %data_in(6)     %data_in(7)     %data_in(8)
     %data_in(9)     %data_in(10)                  
end
%% TIMER EMPIEZA A REALIZAR TAREA ASIGNADA
    function DatosUSB(hObject, eventdata)
       Xdato = linspace(0,1,256);
       Ydato = sin(30*2*pi*Xdato) + randn(size(Xdato))*0.2;
       Xunits='Segundos';
       Yunits='Voltios';
       if ishandle(hAxesRaw)
           axes(hAxesRaw);
           plot(Xdato,Ydato);
           xlabel(Xunits);
           ylabel(Yunits);
       end
    end
%% TIMER ROJOAC
    function Datos_RojoAC(source, eventdata)
       %ABRIMOS EL PIPE DE CONEXION
       [my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (2), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
       % ENVIAMOS PETICON AL PIC
       calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(1)); 
       %DAMOS LA ORDEN PARA QUE EL PIC ENVIE DATOS HACIA LA PC
       [my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0));
       %RECIBIMOS DATOS PROVENEINTES DEL PIC
       [aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(2), uint8(2), uint8(0))
       data_in(1)
       data_in(2)
       %Buff_Aux(1) = data_in(1) ;       %valor asignado a
       Xdato = linspace(0,10,1024);
       Ydato = data_in(1)/100 + data_in(2)/100
       Xunits='Segundos';
       Yunits='Voltios';
       if ishandle(hAxesRojoAC)
           axes(hAxesRojoAC);
           plot(Xdato,Ydato);
           xlabel(Xunits);
           ylabel(Yunits);
       end
    end
%% PROCESAMOS DATOS DEL ADC ROJO
 function IniciaPloter_Callback(source,eventdata)
        %Buff_Aux=rand(1,1e5);    %creamos un arreglo de 1x1e5 de tamaño   
        %tic;
        % ABRIMOS EL PIPE DE CONEXION
        %[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (3), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); 
        % ENVIAMOS PETICON AL PIC
        %calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10)); 
        %DAMOS LA ORDEN PARA QUE EL PIC ENVIE DATOS HACIA LA PC
        %[my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0));
        %RECIBIMOS DATOS PROVENEINTES DEL PIC
        %[aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(11), uint8(11), uint8(0));
        %a = data_in(1);   
        %a = randn(1,1e5);
        %Generates a random signal to display
       
        %Buff_Aux(1:1) = data_in(1) + data_in(2);       %valor asignado a 1x1 del arreglo
        %fs = 200 ;               %samplificadorng frequency
        %timeBase = 4;           %tiempo en sec
        %hF = figure;             %creamos eje de coord
        %hAx = gca;               %
        %maxA = 40;  minA = 0;    %definimos maximo y minimo en el eje y
        %nSamples = round(fs*timeBase); %asegura que el producto se un entero
        %ind = 1;                  %creamos un index 
        %hLine = plot(hAx,(1:nSamples)/fs,Buff_Aux(1:1,ind));  %parametros para el eje x
        %xlabel('[sec]');   %damos nombre al eje x
        %ylim([minA maxA]);  %limitamos el eje y
        %tic;    %empezamos a medir el tiempo
        %añadimos "ishandle" para cerrar el ploteador
        %while ishandle(hLine)
           %set(hLine,'ydata',Buff_Aux(ind,1:1)) %empezamos a graficar
          % drawnow                              %actualizamos el grafico
          % t=toc;                               %terminamos de medir el tiempo
           %ind = round(t*fs);
         %  ind = max(1,1);                       %nos quedamos en el index 1:1
        %end
        %------------------------------------------------------------------
       % if Adquisicion_Dato
        %    if strcmp(timerObj.Running,'on')
         %       stop(timerObj);
          %  end
            %Adquisicion_Dato = false;
           % set(hObject,'string','Start Adq');
       % end 
       % Adquisicion_Dato = true;
        %set(hObject,'string','Stop Adq');
        if strcmp(timerObj.Running, 'off')
            start(timerObj);
        end
 end
%% FUNCION PAUSA
 function PausaPloter_Callback(source,eventdata)
        stop(timerObj);
        stop(timer_RojoAC);
        %Adquisicion_Dato = false;
end
end
```

Tambien estoy intentando conectar dos pic18f4550, en c# es mas facil , al parecer tendre que crear otro panel para este pic pero como intercambio datos uhmm interesante... 
Bueno espero que el cod que puse te de mas ideas y si resuelves el envio de datos pasa la voz ...


----------



## Vannes (Oct 19, 2009)

Me parece excelente tu aporte Gpoolb, ya lo he probado y modificado y adaptado a mi hardware y todo perfecto.
El problema lo tengo en la interfaz gráfica con matlab, el proyecto que estoy realizando necesito tener una buena interfaz gráfica con leds, displays  7 segmentos... 
¿Como lo puedo realizar con gui de matlab? Ya he imprimido y visto diferentes tutoriales y videotutoriales, pero no he encontrado nada para hacer un simple led.
Gracias y necesito ayuda rápida, el tren se me escapa!!


----------



## Dolphinr2d2 (Dic 30, 2009)

Yo tengo una pregunta, que espero me puedan contestar, de antemano muchas gracias. 
Voy a trabajar con el PIC 18F14K50 al parecer este pic solo se puede programar con MPLAB, según lo que veo la instalación del driver que utilizan lo hacen con el archivo que viene en CC, esta basado, ahora la pregunta es yo puedo utilizar el programa de ejemplo de USB Device - MCHPUSB - Generic Driver - C18 - Low Pin Count Development Kit que proporciona microchip para mplab con el mismo archivo .m modificando algunas cosas de acuerdo a lo que requiera, es que no he encontrado prácticamente nada de información para este microcontrolador si alguien me pudiera accesorar un poco se lo agradeceré mucho. básicamente solo necesito transmitir texto del micro a la pc y excibirlo y viceversa excibiendo el texto que llega al micro en un lcd, de antemano muchas gracias, y cualquier tip o consejo será bien recibido.


----------



## alfredxx (Ene 11, 2010)

Hola a todos; probé el codigo de gpoolb y efectivamente funciona. Ahora bien, yo solo quiero enviar datos del adc a matlab, pero no he podido realizar dicha función. Si alguien me puede ayudar se los agradecería bastante.

Saludos...


----------



## yabo2005 (Sep 23, 2010)

Saludos, a todos, les cuento que probe los archivos de @gpoolb posteados en la primera pagina de este hilo, la pruebas las estoy realizando en matlab 7.8.0 R2009a, con un micrcotrontrolador 18F4550, al principio no me corria, el programa del micro compilaba bien pero aparecia un error en matlab supuestamente relacionado con cargar la libreria dll de michochip, analizando el codigo de matlab encontre que para el ejemplo 1 en la linea 46
el vid & pid estaba declarado asi:

vid_pid_norm = libpointer([/SIZE]'int8Ptr'[/size][/SIZE][/SIZE],[uint8('vid_04d8&pid_000b') 0]);

no se porque este maltab no funciona asi lo que hice fue cambiar el b en exadecimal por 0011 asi: 


vid_pid_norm = libpointer('int8Ptr',[uint8('vid_04d8&pid_0011') 0]);

y corrio muy bien, la velocidad es muy buena.
en el segundo ejemplo ocurre lo mismo, este codigo esta en la linea 81, 
Para la persona que pide como enviar datos del conversor analogo digital 
en segundo ejemplo de @gpoolb se muestra como, funciona muy bien, lo probe enviando datos de voltaje de un potenciomentro y funciona excelente el rango esta a 16 bits de 0 a 65k. 
si alguien necesita el codigo modificado para el 18F4550 aca estan, tambien coloco archivos de la tarjeta que diseñe para trabajar con usb y el 18F4550.

Ver el archivo adjunto Ej2_USB_Bulk_Matlab_2009.rar
Ver el archivo adjunto Tarjeta_USB_4550.rar

IMAGEN TARJETA USB CON 18F4550


----------



## jmi48 (Sep 27, 2010)

tharsis dijo:


> Hi,
> 
> I'm using Matlab R2008b (7.7.0). The warnings (not errors, only warnings) are coming from the line 22 and I've got this message :
> 
> ...



Hola tengo exactamente el mismo problema con exactamente los mismo warnings, la dll , .h .m estan en la misma carpeta.
Al correr el .m tira esos warnings, pero anda todo 10 puntos,. pero al compilarlo con el deploytool (con Microsoft Visual C++ 6.0 in C:\Archivos de programa\Microsoft Visual Studio ) no anda ni en chiste, se compila todo ok. Pero al correr el ejecutable en la carpeta donde estan las librerias no anda, hasta donde segui en el ejecutable el problema lo hace la carga de la libreria, estimo que es por todos los warnings.

alguna idea???????
Gracias


----------



## yabo2005 (Nov 19, 2010)

Saludos, alguien ha podido graficar señales enviadas por el micro en matlab especificamente la señal vs TIEMPO, por ahora lo que he podido hacer es recibir señales y graficarlas con plot, tengo dos tipos de señales en mi proyecto, de las cuales puedo seleccionar cual graficar y son:- Señal analogica, valor del conversor AD del PIC- Señal Digital proveniente de un sensor de temperatura ds1820en cuanto a los valores se hace bien la adquisicion pero al graficar en matlab y sumando tiempos, el matlab se demora mucho en llenar el grafico. por ejemplo, tengo:- Para leer el sensor de temperatura me demoro 12ms- En la comunicacion usb en Tx y Rx tengo configuradas las funciones en matlab con un tiempo  de 1ms cada una total(2ms en Tx y Rx).- En matlab tengo un pause despues de cada plot de 50ms (pause(0.05))- Y estoy graficando en un plot vectores con tamaño 300 valores (1-300)Se supone que 12ms + 2ms + 50ms = 64msAhora 64ms * 300 = 19200ms = 19.2 seg que se supone que demoraria en llenar el grafico desde 1 a 300 pero en realidad demora unos 50 segundos.No se si implementando un timer en matlab se pueda graficar mejor, bueno cualuquier ayuda o consejo se los agradeceria.


----------



## cehio_Lo (Ene 14, 2011)

Intente graficar con el simulink lo leido del adc lo consegui hasta cierto punto, atravez de s-functions el problema q en cada muestreo debe cargar la libreria abrir tuneles enviar dato, etc lo cual provoca q la transmision sea lenta lo ideal seria q cargue las librerias y habra tuneles al inicio digamos en t=0 y viceversa en t=final, quizas con esto podriamos sacarle mejor el jugo a los pic's con la ayuda del matlab. Si tienen alguna idea de como lograrlo 
avisan please!
Saludos.


----------



## jcristhian_1 (Mar 7, 2011)

_
Grafica señal vs tiempo
Intente graficar con el simulink lo leido del adc lo consegui hasta cierto punto, atravez de s-functions el problema q en cada muestreo debe cargar la libreria abrir tuneles enviar dato, etc lo cual provoca q la transmision sea lenta lo ideal seria q cargue las librerias y habra tuneles al inicio digamos en t=0 y viceversa en t=final, quizas con esto podriamos sacarle mejor el jugo a los pic's con la ayuda del matlab. Si tienen alguna idea de como lograrlo 
avisan please!
Saludos.
_

Hola cehio_Lo creo que tu problema pasa por implementar una variable que haga de flag o indicador,cuando no se ha efectuado aun la declaración y la carga de la librería flag=0
cuando ya se cargo la libreria y se abrieron los tuneles flag =1, eso lo metes en un bloque if -else teniendo a flag como condicion, saludos. Aqui hay lgo de eso:
http://200.13.98.241/~javier/lab_control/labcontrolP07/sfunction.pdf


----------



## josb86 (May 13, 2011)

buenas estoy algo perdido con esto del usb en matlab y utilizo matlab por que es el gui que mas manejo, bueno mi pregunta es esta y espero una respuesta sencilla si se puede , lo unico que quiero es que cuando pulse un pushbutton me envie el programa de matlab por ejemplo un numero 2 o una letra al pic listo algo sencillo como para poder render un led en el pic.

function pushbutton1_Callback(hObject, eventdata, handles)


----------



## leonardo19 (May 19, 2011)

buenos dias estoy haciendo un proyecto para la universidad, basado en la adc. Yo ya tengo el programa en lenguaje c, lo cual yo puedo simular desde proteus, y me corre perfectamente. Pero a la hora de quemar el pic y conectarlo al pc realmente, no pasa nada, que podra estar fallando??


----------



## josb86 (May 19, 2011)

leonardo19 dijo:


> buenos dias estoy haciendo un proyecto para la universidad, basado en la adc. Yo ya tengo el programa en lenguaje c, lo cual yo puedo simular desde proteus, y me corre perfectamente. Pero a la hora de quemar el pic y conectarlo al pc realmente, no pasa nada, que podra estar fallando??



puede que no tengas configurado bien el pll en el pic puede que no hayas colocado el vid del micro igual al del programa puede que tengas un capacitor en el Vusb que no sea el corrector...


----------



## murphy9 (May 28, 2011)

leonardo19 pudiste solucionar tu problema?. Me ocurre algo muy parecido a ti, en transmisión bulk la simulación funciona perfecto, pero a la hora de conectar la placa a la pc, no hay comunicación entre matlab y el pic. Alguna idea de que puede estar pasando?. El programa que le cargo al pic es exactamente el mismo que el de la simulación que funciona


----------



## leonardo19 (May 31, 2011)

Ya esta listo, lo que pasaba es que el compilador CCS estaba generando un .hex malo y na quedaba bien quemado el PIC pero lo reinstale nuevamente y ahora si funciona, y hasta puedo meterlo en un bloque de simulink y graficarlo en un scope


----------



## murphy9 (Jun 4, 2011)

Gracias por tu respuesta leonardo19, te comento que en mi caso, el pic no se comunica correctamente con matlab en windows seven (lo probé con el ultimate de 32 bits, no se las demás versiones), sin embargo no hay ningún inconveniente en windows xp. Sinceramente desconozco la razón, si alguien tiene idea de que puede estar pasando, le agradeceré la información.


----------



## jcristhian_1 (Jun 5, 2011)

Hola, leonardo19, graficas los datos en tiempo real en simulink?, podrias explicarnos como haces para introducir los datos en simulink y graficarlos.


----------



## leonardo19 (Jun 6, 2011)

Lo que hago simplemente es crear una funcion en un archivo .m y luego lo llamo desde el simulink con el bloque matlab function, y se corre la simulacion en simulink con el tiempo de simulacion en inf=infinito, acontinuacion les posteo el programa en matlab


function salida=funcion(entrada)
global data_in data_out
loadlibrary mpusbapi _mpusbapi.h alias libreria

data_in = eye(1,1,'uint8');
data_out = eye(1,1,'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]);

 [Esta_conectado] = calllib ('libreria','MPUSBGetDeviceCount', vid_pid_norm);

 if(Esta_conectado)

     data_out=uint8(entrada);

     [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));


     calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(1), uint8(1), uint8(10)); % Se envia el dato al PIC
     [aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(1), uint8(1), uint8(10));


            salida=double(data_in)*5/255;

      calllib('libreria','MPUSBClose',my_in_pipe);
      calllib('libreria','MPUSBClose',my_out_pipe);
 end

end


----------



## jcristhian_1 (Jun 6, 2011)

Lo probare, muchas gracias.


----------



## hackmanice (Ago 4, 2011)

Monte el mismo circuito funciona la parte del adc pero la parte de los leds me puden ayudar a verificar que esta sucediendo. Me pueden informar si el cristal para este circuito es de 20Mhz o 45Mhz, gracias


----------

