# [SOLUCIONADO] puerto paralelo con matlab



## ariel (Jun 13, 2006)

hola tengo un problema, se trata del manejo de puerto paralelo con matlab, es un progama que cuenta pulsos de en ecoder acoplado a un motor de iman permanente, el cual envia pulsos que deberian ser leidos por matlab, pero al parecer los datos son perdidos y no son leidos, uso el sig codigo para la lectura:

%Configuracion del puerto.............
%
%dio        >>          nombre del objeto puerto
%M1         ->          D0 y D1, estado de motor 1
%M2         ->          D2 y D3, estado de motor 2
%rM1        <-          S3 realimentacion de encoder del motor 1,...
%                       recibe los pulsos de este encoder
%rM2        <-          S3 realimentacion de encoder del motor 2,...
%                       recibe los pulsos de este encoder
%Variables auxiliares.................
%
%derecha        >>          se envia cuando se requiere giro de motor...
%                           a la derecha
%izquierda      >>          se envia cuando se requiere giro de motor...
%                           a la izquierda
%travado        >>          se envia cuando se requiere que el motor....
%                           este travado
%contador_rM1   >>          guarda el numero de pulsos enviados por.....
%                           el encoder del motor 1
%contador_rM2   >>          guarda el numero de pulsos enviados por.....
%                           el encoder del motor 2
%auxrM1         >>          variable que guarda el anterior valor de ...
%                           rM1
%auxrM2         >>          variable que guarda el anterior valor de ...
%rM2

global dio derecha izquierda travado suelto M1 M2 ...
       rM1 rM2 contador_rM1 contador_rM2 auxrM1 auxrM2
contador_rM1=0;     %guarda el número de pulsos del encoder 1
contador_rM2=0;     %guarda el número de pulsos del encoder 1
derecha=    1
izquierda=  2
travado=    3
suelto=     0
dio=digitalio('parallel','lpt1')    %declaracion de puerto
M1=addline(dio,[0 1],'out')         %pines manejadores de motor1
M2=addline(dio,[2 3],'out')         %pines manejadores de motor2
rM1=addline(dio,8,'in')             %pin de realimentacion encoder1
rM2=addline(dio,9,'in')             %pin de realimentacion encoder2

putvalue(dio.Line(1:4),0)           %pone en cero todos los pines
auxrM1=getvalue(rM1)
auxrM2=getvalue(rM2)
%temporización: define la frecuencia de muestreo para la toma de datos
%               de los encoders
%set(dio,'TimerFcn',@daqcallback2)   %referencia a la funcion que atendera cuando ocurra el evento
%set(dio,'TimerPeriod',0.001)            %define periodo de muestreo en segundos
%start(dio)                          %comienza el evento...
%en este caso, el conteo de los pulsos de los encoders
%rtddemo
tic;
while toc<50

    if xor(getvalue(rM1),auxrM1)==1 && auxrM1==1	%solo cuenta si existe un cambio de uno a cero (transicion de pendiente neg)
	contador_rM1=contador_rM1+1;
    end
    if xor(getvalue(rM2),auxrM2)==1 && auxrM2==1	%solo cuenta si existe un cambio de uno a cero (transicion de pendiente neg)
	contador_rM2=contador_rM2+1;
    end

    auxrM1=getvalue(rM1);
    auxrM2=getvalue(rM2);

end

Utilizo el anterior codigo pues al usar los eventos de tiempo del toobox de adquisicion de datos tuve resultados aun mas lentos


Lo que qiero saber es como podria acelerar el tiempo de muestreo de mi puerto paralelo, para que no pierda pulsos.......................


----------



## Karles23 (Oct 4, 2006)

Hola!!! si aun esta abierto el tema me gustaria contactar contigo. He empezado un proyecto sobre el posicionado 2D. Por eso tengo que utilizar dos motores paso a paso y controlarlos mediante el matlab y el puerto paralelo. Agradeceria muchissimo un poco de atensión!! muchas gracias!!!!


----------



## ariel (Oct 5, 2006)

ok . . .
bueno pero que es exactamente lo que quieres. no he trabajado mucho con motores paso a paso, pero que yo sepa no hay una realimentacion en los mismos, a demas el programa anterior ya de por si indica todo lo que hay que saber para manejar el puerto paralelo en matlab y sacar el valor que quieras e incluso trabajar con realimentacion.


----------



## Lucio M (Oct 5, 2006)

Resulta que la función getvalue, la uso para tomar datos del puerto paralelo, en Matlab 6.5, y funciona bien en Windows 98, pero en Windows Xp no funciona. Quería saber si hay que instalar algún driver, una dll, o alguna función extra para que funcione el puerto paralelo como entrada. Como salida funciona bien en ambos sistemas operativos.


----------



## ariel (Oct 6, 2006)

Bueno yo solo trabaje con Matlab 7 bajo XP y no tuve ningun casi problema, el unico problema fua al declarar el registro de datos del puerto algunos bytes como out, y otros como in, (que deberia funcionar) ahi solo funcionaba con la primera declaracion, lo solucine usando otro registro, poco funcional pero no quedo de otra. ahora no se si es ese tu problema pero el uso de los puertos bajo XP, es restringido . . .


----------



## agustinzzz (Oct 6, 2006)

Si no entiendo mal, vos estas leyendo el el puerto paralelo cada vez que queres ver el estado de un determinado pin. Lo que yo te puedo sugerir para acelerar la operacion (ya que cada vez que lees el puerto te demora un cierto tiempo) es leer todo el dato del puerto una ves, saca cuentas y fijate si el pin que vos queres leer esta en el estado que tiene que estar. Se entiende?
Saludos!


----------



## ariel (Oct 6, 2006)

agustinzzz dijo:
			
		

> Si no entiendo mal, vos estas leyendo el el puerto paralelo cada vez que queres ver el estado de un determinado pin. Lo que yo te puedo sugerir para acelerar la operacion (ya que cada vez que lees el puerto te demora un cierto tiempo) es leer todo el dato del puerto una ves, saca cuentas y fijate si el pin que vos queres leer esta en el estado que tiene que estar. Se entiende?
> Saludos!



Mas o menos, pero de lo que forma parte esta seccion de codigo es de un prograna que controla la posición de un motor DC, a traves del puerto paralelo, asi que debe ser hecha en tiempo real, por eso es que trato de muestrear la señal cada que puedo, bueno el anterior codigo ya es de bastante tiempo, y para solucionar el problema de perdida de datos por el retardo remplace la parte del anterior codigo que cuenta si se ha producido una trancision de pendiente por un XOR, y cuento cada que se produce un cambio en el pin seleccionado, con eso logre un velocidad de muestreo aceptable que permite realizar mi aplicacion . . .

Bueno aunque ya solucione el problema, gracias por darte la molestia de responder y sugerir algo


----------



## Karles23 (Oct 9, 2006)

Buenas!! gracias a todos por su interes especialmente a Ariel. Exactamente tengo que hacer el control de dos motores paso a paso, para poder hacer el posicionado 2D. Por eso tengo que leer dos datos por matlab, X e Y. 
Por ejemplo: 
X=5
Y=15
Por lo tanto cuando se lea las variables el motor empezara a girar hasta la poscion 5 y 15 respectivamente.
Por eso tengo que poder escrivir y leer mediante el puerto paralelo.

Ariel; te agradeceria que me mandaras el codigo completo de matlab y asin poder guiarme y modificarlo para mi aplicacion.
Un saludo!!


----------



## Lucio M (Oct 10, 2006)

Hola ariel.
En el programa que hice en ningún lado he declarado la dirección de los registros, puesto que digitalio lo hace automáticamente. Mediante la funcion addline pude saber cuáles son los pines correspondientes a cada indice del vector donde se almacenan los datos. El drama es que no consigo habilitar los pines del registro de datos como entradas. El mismo programa funciona en Windows 98, pero no funciona en el XP. Lo que creo que debería hacer es conseguir algún driver que habilite el puerto desde el Xp, y que al ejecutar el programa en Matlab, realmente el puerto deje entrar datos a través del registro de datos. He instalado un par de drivers, que tienen la opcion de dejar habilitados los puertos como entradas, pero cuando ejecuto el programa en matlab, no pasa nada. No se me ocurre otra cosa.


----------



## ariel (Oct 10, 2006)

OK OK . . . 

La primera ves no te entendi, no nesesitas ningun diver, lo que requieres es habilitar tu puerto LPT1, desde el administrador de dispositivos de win XP, y solo eso, si ves la configuración del puerto esta para nunca ser usado . . . .ok 


Suerte . . . . . .


----------



## ariel (Oct 10, 2006)

Karles23 dijo:
			
		

> Buenas!! gracias a todos por su interes especialmente a Ariel. Exactamente tengo que hacer el control de dos motores paso a paso, para poder hacer el posicionado 2D. Por eso tengo que leer dos datos por matlab, X e Y.
> Por ejemplo:
> X=5
> Y=15
> ...




Te lo digo otra ves, todo lo que requieres saber para mandar y recibir datos desde el puerto paralelo esta en mi primer post, desde la declaracion del objeto, pasando por la asignacion de los pines, y terminando en el envio y recepcion de datos por este puerto, y si tienes alguna duda de la funcion de algun comando manda un post, o mejos consulta el toobox de adquisicion de datos de Matlab, ai tienes una información tecnica y detallda del manejo del puerto paralelo, de otros dispositivos de entrada y salida de datos...ok


----------



## Karles23 (Oct 11, 2006)

Muchas gracias ariel!!!


----------



## oihana (Abr 19, 2007)

Hola como puedo conectar un microprocesador disen 552 al programa matlab?
Gracias!!


----------



## Rujg (Abr 16, 2012)

Que tal amigos, mi nombre es Gabriel y veran, ya tengo casi el mismo problema, yo solo quiero controlar un motor a pasos, disponiendo de su velocidad y si sentido de giro, a lo que voy es que el programa que tengo es uno que hace referencia a in puerto serial DB9, mi pc no lo tiene y opte por cable usb a DB25 que es el otro extremo que me pide el circuito.
El problema es que tengo error en comunico los pulsos deseados atraves de el cable usb.
mi codigo es el siguiente:
function varargout = motorGUI(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @motorGUI_OpeningFcn, ...
                   'gui_OutputFcn',  @motorGUI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function motorGUI_OpeningFcn(hObject, ~, handles, varargin)

 jose=digitalio('USB','com3');
 dato=addline(jose,0:3,'out');
 putvalue(dato,0);


handles.output = hObject;


guidata(hObject, handles);


function varargout = motorGUI_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;



function speed_Callback(hObject, eventdata, handles)

handles.delay=str2double(get(hObject,'String'))*1e-3;
guidata(hObject, handles);


function speed_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function up_Callback(hObject, eventdata, handles)
global a

a=str2double(get(handles.speed,'String'));
a=a+10;
set(handles.speed,'String',a);
handles.delay=a*1e-3;
guidata(hObject,handles);


function down_Callback(hObject, eventdata, handles)
global a

a=str2double(get(handles.speed,'String'));
a=a-10;
set(handles.speed,'String',a);
handles.delay=a*1e-3;
guidata(hObject,handles);


function direction_Callback(hobject, eventdata, handles)

f=get(handles.direction,'Value');
if f==1
    set(handles.direction,'String','DIRECTION ''L''');
else
    set(handles.direction,'String','DIRECTION ''R''');
end

function state_Callback(hObject, eventdata, handles)
d=get(hObject,'Value');
if d==1
    set(handles.state,'String','ON');
    jose=digitalio('usb','com3');
    dato=addline(jose,0:3,'out');
    g=1;
    while g
        e=get(handles.direction,'Value');
        if e==0
            mov=[3 6 12 9];
        else
            mov=[9 12 6 3];
        end
        delay=str2double(get(handles.speed,'String'))*1e-3;
        if delay<0 ||isnan(delay)
            errordlg('Time out of range','ERROR');
            delay=500;
            set(handles.speed,'String',500);
            set(handles.state,'String','OFF');
            set(handles.state,'Value',0);
            break;
        end
        if get(hObject,'Value')==0
            break
        end
        putvalue(dato,mov(1));
        pause(delay);
        if get(hObject,'Value')==0
            break
        end
        putvalue(dato,mov(2));
        pause(delay);
        if get(hObject,'Value')==0
            break
        end
        putvalue(dato,mov(3));
        pause(delay);
        if get(hObject,'Value')==0
            break
        end
        putvalue(dato,mov(4));
        pause(delay);
    end

else
    set(handles.state,'String','OFF');
end




Espero me puedan hechar una mano, hasta pronto.


----------

