Summary: The core file provides two macros, READSER and WRITSER, for communicating with a PC via the serial port. One can create graphical user interfaces in MATLAB to control the DSP in real time.
READSER and WRITSER. Both accept
one parameter. READSER n reads up to
*AR3. (AR3 is left pointing one past
the last memory location written.) The actual number of
characters read is left in AR1. If
AR1 is zero, then no characters were available in
the input buffer.
WRITSER n adds
*AR3 to the
serial output buffer; in other words, it queues them to be
sent to the PC. AR3 is left pointing one location
after the last memory location read.READSER and WRITSER modify
registers AR0, AR1,
AR2, AR3, and BK, as
well as the flag TC. Be sure you restore these
registers after calling READSER and
WRITSER if you need them later in your code.
ser_rxlen and
ser_txlen values in core.asm.)
The buffers are 127 characters long; however, the code cannot
distinguish between a completely-full and completely-empty
buffer. Therefore, only 126 characters can be stored in the
buffers.srx_head
and srx_tail; if both memory locations hold the
same value, the input buffer is empty. Likewise, the output
buffer can be checked by comparing the values stored in memory
locations stx_head and stx_tail. The
number of characters in the buffer can be computed by
subtracting the head pointer from the tail pointer; add the
length of the buffer (normally 127) if the resulting distance
is negative.
1 .copy "core.asm"
2
3 .sect ".data"
4 hold .word 0
5
6 .sect ".text"
7 main
8 stm #hold,AR3 ; Read to hold location
9
10 READSER 1 ; Read one byte from serial port
11
12 cmpm AR1,#1 ; Did we get a character?
13 bc main,NTC ; if not, branch back to start
14
15 stm #hold,AR3 ; Write from hold location
16 WRITSER 1 ; ... one byte
17
18 b main
AR3 to point to the
location hold so that READSER will
store serial data there. On Line 9,
READSER 1 reads one serial byte into hold;
the byte is placed in the low-order bits of the word, and the
high-order bits are zeroed. If a byte was read,
AR1 will be set to 1. AR1 is checked
in Line 12; Line 13 branches back to
the top if no byte was read. Otherwise, AR3 is
reset to hold (since READSER moved
it), then on Line 16, WRITSER sends
the word received. Finally, Line 18 branches back
to the start to receive another character.
1 % ser_set: Initialize serial port and create three sliders 2 3 % Set serial port mode 4 !mode com2:38400,n,8,1 5 6 % open a blank figure for the slider 7 Fig = figure(1); 8 9 % open sliders 10 11 % first slider 12 sld1 = uicontrol(Fig,'units','normal','pos',[.2,.7,.5,.05],... 13 'style','slider','value',4,'max',254,'min',0,'callback','wrt_slid'); 14 15 % second slider 16 sld2 = uicontrol(Fig,'units','normal','pos',[.2,.5,.5,.05],... 17 'style','slider','value',4,'max',254,'min',0,'callback','wrt_slid'); 18 19 % third slider 20 sld3 = uicontrol(Fig,'units','normal','pos',[.2,.3,.5,.05],... 21 'style','slider','value',4,'max',254,'min',0,'callback','wrt_slid');
mode command to set up serial port COM2 (which
is connected to the DSP) to match the serial port settings
on the DSP evaluation board: 38,400 bps, no parity, eight
data bits, and one stop bit. Line 7 then
creates a new MATLAB figure for the controls; this prevents
the controls from being overlaid on any graph you may have
already created.
Fig, tells the slider to create itself in the
window we created in Line 7. The rest of the
parameters are property/value pairs:
| units | - |
normal tells MATLAB to use positioning
relative to the window boundaries.
|
| pos | - | Tells MATLAB where to place the control. |
| style | - |
Tells MATLAB what type of control to
place. slider creates a slider control.
|
| value | - | Tells MATLAB the default value for the control. |
| max | - | Tells MATLAB the maximum value for the control. |
| min | - | Tells MATLAB the minimum value for the control. |
| callback | - | Tells MATLAB what script to call when the control is manipulated. wrt_slid.m is a MATLAB file that reads the values of the sliders and sends them to the DSP via the serial port. |
1 % wrt_slid: write values of sliders out to com port
2
3 % open com port for data transfer
4 fid = fopen('com2:','w');
5
6 % send data from each slider
7 v = round(get(sld1,'value'));
8 fwrite(fid,v,'uint8');
9
10 v = round(get(sld2,'value'));
11 fwrite(fid,v,'uint8');
12
13 v = round(get(sld3,'value'));
14 fwrite(fid,v,'uint8');
15
16 % send reset pulse
17 fwrite(fid,255,'uint8');
18
19 % close com port connection
20 fclose(fid);
get function to
retrieve the value property. The value is
then rounded off to create an integer, and the integer is
sent as an 8-bit quantity to the DSP in Line
8. (The number that is sent at this step will
appear when the serial port is read with
READSER in your code.) Then the other two
sliders are sent in the same way.
0xFF (255) to the
DSP, which can be used to indicate that the three
previously-transmitted values represent a complete set of
data points. Your code can check for the value 255 to
detect and correct synchronization errors.
Comments, questions, feedback, criticisms?