Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.matlab

Topic: Paradoxical Pushbutton behavior and nonresponsiveness
Replies: 1   Last Post: Dec 4, 2012 7:44 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Paul

Posts: 6
Registered: 12/4/12
Paradoxical Pushbutton behavior and nonresponsiveness
Posted: Dec 4, 2012 5:23 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

Dear Matlabbers, I have the following problem, for which I will supply some code and then also describe my unsuccesful attempts to localize the exact problem. I hope you can help.

I'm doing research on sensory perception and learning in rats, and I'm using Matlab to control a behavioral setup through some external hardware (a field programmable gate array (FPGA) from Opal Kelley, if you must know).

On the push of a button, I want to begin the task, i.e. run the Matlab function which automates the behavioral setup. This includes several loops for checking the status of photo-beams in the setup and subsequent reward delivery in two sites in the setup.

In general this works fine, and I'm using many more buttons and pop-up menu's to control various aspects of various versions of the task this way. However there is one problem which bothers me in all these cases;

I wish to be able to temprorarilly override the reward-delivery criteria, so that I can deliver reward at any moment I wish, when the script is already running. I am able to do this by using the KbCheck function in a loop, but for some reason I cannot do this using a callback function of a pushbutton.

I placed the code at the end. As you can see it's quite a lot of loops which continuously check the state of the FPGA output.

1) Initially I thought the pushbutton callback didn't work because the FPGA was busy, but this is not the case since I can operate the FPGA using the KbCheck function as coded.
2) Then I thought the GUI functions were busy in some way (I'm a n00b), but this is also not the case, since I was able to substitute the current code with some arbitrary loops to keep Matlab busy, but then the pushbutton callback DID work.
3) I'm able to operate hardware OTHER than the FPGA through pushbutton commands in this loop (the StepperSend functions control other hardware), but this occurs with a striking delay of seconds/minutes.

So something must be keeping something too busy to respond to the pushbutton commands; it's just not very clear what. I have been reading all the information on pushbutton operations online but I just can't find a solution. Please help! Thanks in advance!

% --- Executes on button press in PBStart.
function
PBStart_Callback(hObject, eventdata, handles)
global objCard
global sPortDef
global structVals
% hObject handle to PBStart (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

a=cellstr(get(handles.POPStage,'String'));

switch a{get(handles.POPStage, 'Value')}
case 'Stage 0.2'
StepperSend('com3','Y000G');
pause(0.2)
StepperSend('com3','X18000G');
pause(0.2)
ITI = 2;
I = 0;
start = 1; % controls loop
reward = 1; % controls loop
x = 0;
ES = 0; % Exit Signal

while ~ES % press 'escape' to exit

BeamBC = ReadFPGA(objCard,sPortDef.ADRES_BeamBC,false,structVals,sPortDef);

if BeamBC.SENSOR0 == 499 && start

StepperSend('com3','X000G') % Close door X when BeamBC (in2) is interrupted

time1 = BeamBC.KLOK1*60 + (BeamBC.KLOK0/1000);

start = 0; % skips this loop until trial is over
reward = 1; % allow reward dispensing

x = 1;

end

if x

time2 = BeamBC.KLOK1*60 + (BeamBC.KLOK0/1000);

I = time2 - time1; % I is the amount of seconds that have passed since beamBC interruption (in2).

end

if I > ITI % If I is larger than the designated ITI, open DoorY.

StepperSend('com3','Y18000G')

x = 0;

I = 0;

end

AccessL = ReadFPGA(objCard,sPortDef.ADRES_AccessL,false,structVals,sPortDef);

AccessR = ReadFPGA(objCard,sPortDef.ADRES_AccessR,false,structVals,sPortDef);

if AccessL.SENSOR0 == 375 && reward

disp('Dispensing reward on the left side')

SetFPGA(objCard,sPortDef.ADRES_ValveS1,1,uint32(600),sPortDef.PULSE,sPortDef)% Open ValveS1 (left)

pause(0.2)

SetFPGA(objCard,sPortDef.ADRES_PumpS,1,uint32(280),sPortDef.PULSE,sPortDef)% Pump reward

StepperSend('com3','Y000G')

StepperSend('com3','X18000G')

start = 1; % prepares start of next trial by allowing doorX to close upon BeamFC (in2) interruption

reward = 0;

% no more rewards until next trial is started

elseif AccessR.SENSOR0 == 471 && reward

disp('Dispensing reward on the right side')

SetFPGA(objCard,sPortDef.ADRES_ValveS2,1,uint32(600),sPortDef.PULSE,sPortDef)% Open ValveS2 (right)

pause(0.2)

SetFPGA(objCard,sPortDef.ADRES_PumpS,1,uint32(280),sPortDef.PULSE,sPortDef)% Pump reward

StepperSend('com3','Y000G')

StepperSend('com3','X18000G')

start = 1; % prepares start of next trial by allowing doorX to close upon BeamFC (in2) interruption

reward = 0;

% no more rewards until next trial is started

end

[ keyIsDown, seconds, keyCode ] = KbCheck;

if keyIsDown % Define keyboard shortcuts

if keyCode(37) % Left arrow for left reward

disp('Dispensing reward on the left side')

SetFPGA(objCard,sPortDef.ADRES_ValveS1,1,uint32(600),sPortDef.PULSE,sPortDef)% Open ValveS1 (left)

pause(0.2)

SetFPGA(objCard,sPortDef.ADRES_PumpS,1,uint32(280),sPortDef.PULSE,sPortDef)% Pump reward

elseif keyCode(39) % Right arrow for right reward

disp('Dispensing reward on the right side')

SetFPGA(objCard,sPortDef.ADRES_ValveS2,1,uint32(600),sPortDef.PULSE,sPortDef)% Open ValveS2 (right)

pause(0.2)

SetFPGA(objCard,sPortDef.ADRES_PumpS,1,uint32(280),sPortDef.PULSE,sPortDef)% Pump reward

elseif keyCode(27)

disp('Received exit signal. Stopping session.')

ES = 1;

break

end

end

end

case 'Stage 1.0'

disp(

'Not coded yet')

end



Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.