Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.24 KB | None | 0 0
  1. // for Proteus compiler
  2. // Запись программы
  3. #COM 1 // по нужному COM-порту
  4. #PACKSIZE= 1 // пакетами по PACKSIZE байт
  5. #WAITCOEF= 2 // с задержкой, вычисляемой по формуле
  6. // (PackSize * 8 / BaudRate) * WaitCoef секунд
  7. // Если программа не зашивается, попробуйте уменьшить размер пакетов
  8. // и увеличить задержку
  9.  
  10. // подгрузка библиотек
  11. " proteus.lib" L
  12.  
  13. VARIABLE CORDIC-X
  14. VARIABLE CORDIC-Y
  15. VARIABLE CORDIC-Z
  16.  
  17. ARRAY ATG[] 27
  18. {
  19. HERE @
  20. ATG[] HERE !
  21. 45000000 , 26565051 , 14036243 , 7125016 , 3576334 , 1789911 , 895174 , 447614 ,
  22. 223811 , 111906 , 55953 , 27976 , 13988 , 6994 , 3497 , 1749 ,
  23. 874 , 437 , 219 , 109 , 55 , 27 , 14 , 7 , 3 , 2 , 1 ,
  24. HERE !
  25. }
  26. ARRAY ACOS[] 27
  27. {
  28. HERE @
  29. ACOS[] HERE !
  30. 45000000 , 22500000 , 11250000 , 5625000 , 2812500 , 1406250 , 703125 , 351562 , 175781 , 87890 ,
  31. 43945 , 21973 , 10986 , 5493 , 2746 , 1373 , 686 , 343 , 172 , 86 , 43 , 22 , 11 , 5 , 3 , 2 , 1 ,
  32. HERE !
  33. }
  34.  
  35. : -TH + ; INLINE
  36. : NEGATE 0 1 - * ; INLINE
  37.  
  38. : >>A // A B -- A shra B
  39. DUP IF
  40. 0 DO SHRA LOOP
  41. ELSE
  42. DROP
  43. THEN
  44. ;
  45.  
  46. : SINCOS // angle° * 10^6 -- x - cos * 2^10 ; y - sin * 2^10
  47. CORDIC-Z !
  48. 922113738 CORDIC-X !
  49. 0 CORDIC-Y !
  50. 27 1 DO
  51. CORDIC-Z @ 0< IF
  52. CORDIC-Z @ ATG[] I -TH @ + CORDIC-Z !
  53. CORDIC-X @ CORDIC-Y @ I >>A +
  54. CORDIC-Y @ CORDIC-X @ I >>A - CORDIC-Y ! CORDIC-X !
  55. ELSE
  56. CORDIC-Z @ ATG[] I -TH @ - CORDIC-Z !
  57. CORDIC-X @ CORDIC-Y @ I >>A -
  58. CORDIC-Y @ CORDIC-X @ I >>A + CORDIC-Y ! CORDIC-X !
  59. THEN
  60. LOOP
  61. CORDIC-X @ 10 >>A CORDIC-X !
  62. CORDIC-Y @ 10 >>A CORDIC-Y !
  63. ;
  64.  
  65. VARIABLE ANGLE<0
  66. : SIN // angle° * 10^6 --> sin * 2^10
  67. DUP 0< ANGLE<0 !
  68. ABS
  69. DUP 45000000 < IF SINCOS CORDIC-Y @ ANGLE<0 @ IF NEGATE THEN EXIT THEN // 0..45 sin(a)=sin(a)
  70. DUP 90000000 < IF 90000000 SWAP - SINCOS CORDIC-X @ ANGLE<0 @ IF NEGATE THEN EXIT THEN // 45..90 sin(a)=cos(90-a)
  71. DUP 135000000 < IF 90000000 - SINCOS CORDIC-X @ ANGLE<0 @ IF NEGATE THEN EXIT THEN // 90..135 sin(a)=cos(a-90)
  72. 180000000 SWAP - SINCOS CORDIC-Y @ ANGLE<0 @ IF NEGATE THEN // 135..180 sin(a)=sin(180-a)
  73. ;
  74.  
  75. : COS // angle° * 10^6 --> cos * 2^10)
  76. ABS
  77. DUP 45000000 < IF SINCOS CORDIC-X @ EXIT THEN // 0..45 cos(a)=cos(a)
  78. DUP 90000000 < IF 90000000 SWAP - SINCOS CORDIC-Y @ EXIT THEN // 45..90 cos(a)=sin(90-a)
  79. DUP 135000000 < IF 90000000 - SINCOS CORDIC-Y @ NEGATE EXIT THEN // 90..135 cos(a)=-sin(a-90)
  80. 180000000 SWAP - SINCOS CORDIC-X @ NEGATE // 135..180 cos(a)=-cos(180-a)
  81. ;
  82.  
  83. VARIABLE ANGLE>90
  84. VARIABLE ACOS_IN
  85. VARIABLE ANGLE_FIND
  86. : ACOS
  87. DUP 0< ANGLE>90 !
  88. ABS
  89. ACOS_IN !
  90. 45000000 ANGLE_FIND !
  91. 27 1 DO
  92. ACOS_IN @ ANGLE_FIND @ COS > IF
  93. ANGLE_FIND @ ACOS[] I -TH @ - ANGLE_FIND !
  94. ELSE
  95. ANGLE_FIND @ ACOS[] I -TH @ + ANGLE_FIND !
  96. THEN
  97. LOOP
  98. ANGLE>90 @ IF 180000000 ANGLE_FIND @ - ANGLE_FIND ! THEN
  99. ANGLE_FIND @
  100. ;
  101.  
  102.  
  103. MAIN:
  104. 90001000 COS
  105. 134990000 COS
  106. 135010000 COS
  107. 179990000 COS
  108. 180010000 COS
  109. BEGIN
  110.  
  111. AGAIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement