Autor Tema: Calculo de senos y cosenos en 160 ciclos  (Leído 1804 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jgpeiro

  • PIC10
  • *
  • Mensajes: 24
Calculo de senos y cosenos en 160 ciclos
« en: 22 de Marzo de 2006, 12:31:00 »
Aqui dejo un programa basado en el metodo CORDIC escrito en ensamblador que calcula senos y cosenos en 160 intrucciones a partir de una tabla de 16 arco tangentes.


;************SIN_FRAC
   w0   equ   in
   w1   equ   out_cos
   w2   equ   out_sin
   w3   equ   Temp1
   w4   equ   Temp2
   w5   equ   i
   w6   equ   &arctan_Tbl      ; Apunta a la direccion base de la tabla

;**************
Tabla de constantes en ROM
 arctan_Tbl[16]
   [00]   0x4DB9
   [01]   0x1DAC
   [02]   0x0FAD
   [03]   0x07F5
   [04]   0x03FE
   [05]   0x01FF
   [06]   0x00FF
   [07]   0x007F
   [08]   0x003F
   [09]   0x001F
   [10]   0x000F
   [11]   0x0007
   [12]   0x0004
   [13]   0x0002
   [14]   0x0001
   [15]   0x0000
;***************


   mov   #0x3243, in                 ; in = 0x4000 * pi / 6

   mov   #0x4DB9, out_cos          ; out_cos = 1 * valor de ajuste (0.6072)
   mov   #0x0000, out_sin         ; out_sin = 0
   mov   #0x0000, i                 ; i = 0
   mov   #0x0AB6, &arctan_Tbl        ; &arctan_TBL[0]

   bclr   SR, #3                         ; forzar >= 0
   do   #15, SIN16_2                ; Loop 16
   bra   N, SIN16_1  

                                  ; if ( in >= 0 )
   asr    out_sin, i, Temp1             ; Temp1 = out_sin >> i
   sub   out_cos, Temp1, Temp2        ; Temp2 = out_cos - Temp1
   asr    out_cos, i, Temp1            ; Temp1 = out_cos >> i
   add   out_sin, Temp1, out_sin         ; out_sin += Temp1
   inc     i, i               ; i++
   sub   in, [&arctan_Tbl++], in       ; in -= arctan_TBL[ i ]

   bra   SIN16_2     

SIN16_1:                           ; else if ( in < 0 )
   asr    out_sin, i, Temp1             ; Temp1 = out_sin >> i
   add   out_cos, Temp1, Temp2       ; Temp2 = out_cos + Temp1
   asr    out_cos, i, Temp1            ; Temp1 = out_cos >> i
   sub   out_sin, Temp1, out_sin         ; out_sin -= Temp1
   inc     i, i                              ; i++
   add   in, [&arctan_Tbl++], in       ; in += arctan_TBL[ i ]

SIN16_2:      
   mov   Temp2, w1         ; out_cos = Temp2

;FIN   sin( in ) = out_sin,   cos( in ) = out_cos


 

anything