<< Chapter < Page | Chapter >> Page > |
Download the code here ser_echo
1 .copy "v:\54x\dsplib\core.asm"
23 .sect ".data"
4 hold .word 05
6 .sect ".text"7 main
8 stm #hold,AR3 ; Read to hold location9
10 READSER 1 ; Read one byte from serial port11
12 cmpm AR1,#1 ; Did we get a character?13 bc main,NTC ; if not, branch back to start14
15 stm #hold,AR3 ; Write from hold location16 WRITSER 1 ; ... one byte
1718 b main
On Line 8, we tell
READSER
to receive into the location hold by setting
AR3
to point at it.
On Line 9, we call
READSER 1
to read 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, we tell reset
AR3
to hold (since
READSER
moved it), then call
WRITSER
to send the word we received on Line 16. On Line 18, we branch back to the start to
receive another character.
Many students have found that there are issues with the
READSER
and
WRITSER
macros. Performance
of these macros is often "flaky" if they even work at all. Two ECE 320 studentsI-Ju Liao and Jung-Gyu Lee from the Fall 2002 semester created this alternative method which
provides much better assembly support for serial port access. The following is a skeletonfor reading data from the serial port onto the DSP:
Skeleton of a program for receiving data over the serial port. The function
of interest is get_data. In this function, we first recieve one 8 bit valueand store it at
value_1
. Then, we receive one 16 bit value and store it at
value_2
.
.copy "v:\ece320\54x\dsplib\core.asm".sect ".data"value_1 .word 0
value_2 .word 0.sect ".text"
main:loop:WAITDATAcall #get_data ; call function to get serial port datastm #BlockLen-1, BRC
rptb endblock-1;******your code goes hereendblock:b loopget_data:
pshm AR0 ; we save all registers that are used inpshm AR2 ; this function - note that accumulator
pshm AR3 ; B IS OVERWRITTEN!pshm BKmvdm #srx_head, AR2 ; srx_head, defined in core.asm, points
; to one element past the last value; recieved in the serial recieve bufferstm #ser_rxlen, BK ; set BK to length of receive buffermar *+AR2(-4)% ; AR2 now points to the most recently
; received block of 24 bits, i.e. one 8; bit value and one 16 bit valuestm #1, AR0 ; set incrementstm #value_1, AR3 ; get first value
mvdd *AR2+0%, *AR3 ; save at value_1stm #value_2, AR3 ; get second valueld *AR2+%, 8, B ; place first 8 bits in high part of B
or *AR2+%, B ; combine last 8 bits in low part of Bstl B, *AR3 ; save at value_2popm BK
popm AR3popm AR2
popm AR0ret
Notification Switch
Would you like to follow the 'Digital signal processing laboratory (ece 420)' conversation and receive update notifications?