9-6-1

/*
  Sample for Finite Impuls Response Filter
*/
#include 
#include "iodefine.h"
#define size 51

extern void setDSP(void) ;
extern unsigned int fir(unsigned short) ;
extern unsigned short hn[size],hn_rom[size],*inpa,xn[size] ;

void initAdDa0(void) ;
void initTmu0(void) ;
void initXYRAM() ;
void main(void) ;

void main(void){
  unsigned short *p;

  inpa = &xn[50] ;
  for(p=&xn[0] ; p<&xn[51] ; p++) *p = 0 ;
  initXYRAM() ;

  set_cr(0x60001002) ;                   /* DSP bit on                      */
  setDSP() ;
  initAdDa0() ;                          /* Initialize A/D1 D/A0            */
  initTmu0() ;                           /* Initialize TMU0                 */

  while(1) /* sleep()*/ ;
}

void initAdDa0(void){
  AD.CR.BYTE = 0x27 ;                    /*                                 */
  AD.CSR.BYTE = 0x31 ;                   /* Scan mode AN1                   */
  DA.DACR.BYTE = 0x40 ;                  /* Enable DA0                      */
  PC.CR.WORD = 0x5555 ;                  /* Port C = output                 */
}

void initTmu0(void){
  TMU0.TCR.WORD = 0x0020 ;               /* 1/4 Pclock,Enable interrupt     */
  TMU0.TCNT = TMU0.TCOR = 170 ;          /* 44kHz                           */
  INTC.IPRA.WORD = 0xf000 ;              /* Priority = 15                   */
  TMU.TSTR.BIT.STR0 = 1 ;                /* Start TMU0                      */
}

void tuni0(void){
  TMU0.TCR.BIT.UNF = 0 ;                 /* Clear UNF bit                   */
  DA.DADR0 = (fir(AD.DRBH<<7)+ 0x8000)>>7 ;
}

void initXYRAM(void){
  unsigned short *p , *q;

  for(p=&hn[0],q=&hn_rom[0] ; p < &hn[51] ; p++,q++) *p = *q ;
}


9-6-2

            .cpu         shdsp
            .export      _setDSP,_fir,_hn,_hn_rom,_xn,_inpa
            .import      _inp

;void setDSP(void)
; Set DSP bit on SR (only SH3-DSP )
; Set S bit on SR   (lock overflow)
_setDSP:
            repeat       lp_start,lp_start,#48         ;set repeat counter & address
            mov.w        set_dsp,r1                    ;get DSP=1 , DMY=1 , S=1 data
            stc          sr,r2                         ;get SR
            or           r2,r1                         ;modify SR
            mov.l        modu,r3                       ;get mod address
            ldc          r1,sr                         ;set SR
            rts                                        ;
            ldc          r3,mod                        ;set MOD

           .align        4
modu:      .data.w       LWORD     _xn_end - 2         ;
           .data.w       LWORD     _xn                 ;
set_dsp:   .data.w       h'1802                        ;


; unsigned short fir( unsigned short in )
_fir:
            mov.l        inpa,r5                       ;get Xn data set address
            mov.l        @r5,r6                        ;
            mov.w        r4,@r6                        ;set input data to Xn
            mov.l        _hna,r4                       ;get Hn address
                                                       ;multiply and calculate
            pclr         a0                            movx   @r4+,x0  movy   @r6+,y0
                                    pmuls  x0,y0,m0    movx   @r4+,x0  movy   @r6+,y0
lp_start:
            padd         a0,m0,a0   pmuls  x0,y0,m0    movx   @r4+,x0  movy   @r6+,y0

            padd         a0,m0,a0   pmuls  x0,y0,m0    movx   @r4+,x0  movy   @r6,y0
            padd         a0,m0,a0   pmuls  x0,y0,m0
            padd         a0,m0,a0

            sts          a0,r0                         ;transfer Yn -> R0

            mov          r6,@r5                        ;set new Xn address
            rts
            shlr16       r0                            ;return unsigned short data

           .align        4
_hna:      .data.l       _hn
_hna_end:  .data.l       _hn_end
_hna_rom:  .data.l       _hn_rom
inpa:      .data.l       _inpa

           .section      B,data,align=4
_inpa:     .res.l        1


           .section      IN,data,locate=h'a5017000
_xn:       .res.w        51
_xn_end:   .equ          $



9-6-3

;Low pass filter
;loss:
;    80.000 [dB]
;Sampling frequency:
;  44.00000 [kHz]
;Cut-off frequency1:
;   4.00000 [kHz]
           .section    HN,data,locate=h'a5007000
_hn:       .res.w      51
_hn_end:   .equ        $

     .section	C,data,align=4
_hn_rom:
           .xdata.w    0.00003368
           .xdata.w    0.00008478
           .xdata.w    0.00010412
           .xdata.w   -0.00000000
           .xdata.w   -0.00031112
           .xdata.w   -0.00081744
           .xdata.w   -0.00132815
           .xdata.w   -0.00146134
           .xdata.w   -0.00076262
           .xdata.w    0.00104212
           .xdata.w    0.00374289
           .xdata.w    0.00645082
           .xdata.w    0.00768753
           .xdata.w    0.00585295
           .xdata.w   -0.00000000
           .xdata.w   -0.00934491
           .xdata.w   -0.01969528
           .xdata.w   -0.02679738
           .xdata.w   -0.02563682
           .xdata.w   -0.01206464
           .xdata.w    0.01546677
           .xdata.w    0.05472118
           .xdata.w    0.09960683
           .xdata.w    0.14141642
           .xdata.w    0.17109463
           .xdata.w    0.18182995
           .xdata.w    0.17109463
           .xdata.w    0.14141642
           .xdata.w    0.09960683
           .xdata.w    0.05472118
           .xdata.w    0.01546677
           .xdata.w   -0.01206464
           .xdata.w   -0.02563682
           .xdata.w   -0.02679738
           .xdata.w   -0.01969528
           .xdata.w   -0.00934491
           .xdata.w   -0.00000000
           .xdata.w    0.00585295
           .xdata.w    0.00768753
           .xdata.w    0.00645082
           .xdata.w    0.00374289
           .xdata.w    0.00104212
           .xdata.w   -0.00076262
           .xdata.w   -0.00146134
           .xdata.w   -0.00132815
           .xdata.w   -0.00081744
           .xdata.w   -0.00031112
           .xdata.w   -0.00000000
           .xdata.w    0.00010412
           .xdata.w    0.00008478
           .xdata.w    0.00003368
           .end