Go Down

Topic: timing seriale impossibile (Read 328 times) previous topic - next topic

cardamr

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: [Select]

%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

astrobeed


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.

Go Up