Pages: [1]   Go Down
Author Topic: timing seriale impossibile  (Read 317 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, sono nuovo qui, spero di aver postato nel topic giusto.

ho un problema di comunicazione con la seriale tra matlab e arduino (possibile che la velocita cambi a seconda del verso di comunicazione?)

ho scritto uno script in matlab che dovrebbe fare questo: ogni 500 ms inviare un bit sulla porta parallela ad un apparecchiatura connessa ad un sensore sull' arduino.
per sincronizzare il tutto mando attraverso la seriale con matlab un valore sull'arduino.
larduino appena mi legge il valore sulla seriale si salva il tempo T0 in microsecondi
500ms dopo matlab manda un ttl sulla porta parallela ( di seguito il sensore legge il bit e salva il tempo impiegato come differenza tra quello appena preso e il valore precedente T0)
ora se la comunicazione fosse corretta la differenza dovrebbe essere abb. costante e cmq sui 500 ms come ordinato da matlab.

ebbene sorpresa sorpresa il tempo è addirittura inferiore sui 350 ms....il che mi fa pensare che matlab sia piu lento ad inviare sulla porta seriale il comando, che sò 150 ms di ritardo e di conseguenza la tempistica è falsata


i miei dubbi possono avere fondamento????


allego lo script di matlab e mi inchino al vostro parere



Code:
%function solenoidiArduino
clear all
close all

%Priority(2);                                % aumenta la priorità di matlab
numtrial = 1001;
answer=1;
y=zeros(numtrial,1);
tempistica1=zeros(numtrial,1);
arduino=serial('COM5','BaudRate',115200); % create serial communication object on port COM5
fopen(arduino); % initiate arduino communication
%%
dio = digitalio('parallel','lpt1');% carica la porta parallela
addline(dio,0:7,'out')   %pin 8
putvalue(dio.line,[0 0 0 0 0 0 0 0]);% azzera i pin
KbName('UnifyKeyNames');
escapeKey = KbName('ESCAPE');
i=0;
exit_key=0;
% ButtonName=questdlg('START THE EXPERIMENT ?', ...
%     'Response','Yes','No','Yes');
% if strcmp(ButtonName,'No');
%     exit_key = 1; %  EXIT,
%     %return;
% end
%tstart=KbPressWait;% aspetta che sia premuto un tasto x avviarsi
%HideCursor% nasconde il cursore
wakeup = WaitSecs(1); % aspetta
KbReleaseWait; % aspetta che vengano rilasciati tutti i tasti:
[ keyIsDown, seconds, keyCode ] = KbCheck; %mi informa sui tasti premuti dalla tastiera
%%
tbase=GetSecs;

for i=1:numtrial
    i
    fprintf(arduino,char (answer)); % send answer variable content to arduino
    start=GetSecs;
    WaitSecs(.5);
    tempistica1(i)=GetSecs-start;
    putvalue(dio.line,[1 1 1 1 1 1 1 1]);
    a=fscanf(arduino);
    y(i)=str2double(a);
    putvalue(dio.line,[0 0 0 0 0 0 0 0]); %riazzera i pin
        [ keyIsDown, seconds, keyCode ] = KbCheck; %
    if keyCode(escapeKey)
        exit_key = 1; %  EXIT,
fclose(arduino); % end communication with arduino
        break;
    end
% end
end;
fclose(arduino); % end communication with arduino
return
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9870
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ebbene sorpresa sorpresa il tempo è addirittura inferiore sui 350 ms....il che mi fa pensare che matlab sia piu lento ad inviare sulla porta seriale il comando, che sò 150 ms di ritardo e  di conseguenza la tempistica è falsata

Windows, e nemmeno Linux, non è un sistema operativo realtime, tocca sempre fare i conti con latenze varie e i "comodi" del s.o. stesso.
Logged

Pages: [1]   Go Up
Jump to: