Special Filter Instructions
4-62
After the FIR or COR instruction executes, the new startOfBuff will be the
last location in the circular buffer. After another FIR/COR instruction, the new
startOfBuff will be the second to last location in the circular buffer, and so
on.
The second detail is the STAT register. The STAT register must be saved im-
mediately after every FIR or COR instruction. Consequently, this saved value
must be loaded before every FIR or COR instruction. If the tag bit in the STAT
register is set before an FIR or COR instruction, this tells the processor two
things. First, it knows that it must
wrap around
to the first RAM location of the
circular buffer. Second, it knows that the startOfBuff (and R0) currently
points to the last location in the circular buffer. Thus, R0 will increment by R5
after the first multiply. This will become more clear after examining the next ex-
ample code.
The third detail is that the filter coefficients take up only N RAM locations, but
the circular buffer takes up N+1 RAM locations.
Below is an example of the FIR or COR execution inside a DAC interrupt ser-
vice routine.
; FIR Filtering routine (N = 3)
––––––––––––––––––––––––––––––––––––––––––
rovm ;reset overflow mode
mov R5, –2 * N ;circular buffer length (3 words)
mov R1,coeffs ;R1 points to first of N filter
coefficients
mov MR,*R1++ ;must increment R1
mov R0,*startOfBuff ;R0 points to start of circular
buffer
mov AP0,0 ;set up room for the
mov STR,0 ; 32 bit output sample (AC0
and AC1)
zacs A0 ; STR should be 1 for COR/CORK
instructions
mov STAT,*filterSTAT_tag ;load STAT with last filter
tag status
rpt N–2
fir A0,*R0++ ;Do one sample ––> 32 bit result
mov *filterSTAT_tag,STAT ;save STAT with last filter
tag status
;R0 now points to the last/oldest
sample
movs *ySampleOut,A0 ;FIR outputs bits 0–15 in AC0,
16–32 in AC1