PDA

View Full Version : Sin and Cos in Spin

crgwbr
01-27-2007, 07:22 AM
Are there any objects already released that do Sin and Cos calculations.· If not, I could just use a floating point co-processor; I would just rather do it with software.

Thanks,
crgwbr

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
NerdMaster
For
Life

asterick
01-27-2007, 07:34 AM
There is a SIN table in the rom, it's fixed point, so you can just convert it to floating point by sign extending it and then dividing it by 32768.0. I forget where it's located... check the manual

Beau Schwabe
01-27-2007, 11:55 AM
crgwbr (http://forums.parallax.com/member.php?u=46269),
·
Here are a few routines that can be incorporated into any object.· Keep in mind, that the Propeller contains a ROM table for 1/4 of SIN.· Based on your degree value you either flip and/or mirror the data to get the proper quadrant. (The routine below does this for you).· The·SIN·angle is represented as a 13-bit value, while the returned value is represented as a signed 16-bit value.
·

PUB DEG2PROP(Deg) 'Convert Deg to 13-bit Propeller angle
Result := (Deg * 1024)/45

PUB Cos(angle) 'Cos angle is 13-bit ; Returns a 16-bit signed value
Result := sin(angle + \$800)

PUB Sin(angle) 'Sin angle is 13-bit ; Returns a 16-bit signed value
Result := angle << 1 & \$FFE
if angle & \$800
Result := word[\$F000 - Result]
else
Result := word[\$E000 + Result]
if angle & \$1000
-Result

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Beau Schwabe (mailto:bschwabe@parallax.com)

IC Layout Engineer
Parallax, Inc.

crgwbr
01-28-2007, 06:16 AM
Thanks Beau,

So to use those routines, I would use something like:

PropAng := DEG2PROP(270)
CosAng := Cos(PropAng)
SinAng := Sin(PropAng)

Would this work?

Thanks Again,
crgwbr

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
NerdMaster
For
Life

Tracy Allen
01-28-2007, 07:51 AM
That's right, or you can encapulate it as:

CosAng := Cos(DEG2PROP(270))
SinAng := Sin(DEG2PROP(270))

Here is an alternaive method to code the Sin routine that resolves the 4 quadrants using a case statement:

PRI Sin(pangle) | q ' prop angle is 0 to 2^13 (0 to 8191) for 0 to 360 degrees
q := pangle >> 11 ' quadrant is 2 highest bits
result := (pangle & \$7ff) << 1 ' 0 to 90- degrees, 11 bits, times two for word offset into sine table
case q ' result by quadrant, lookup in HUB SINE table
0 : result := word[\$E000 + result]
1 : result := word[\$F000 - result]
2 : result := -word[\$E000 + result]
3 : result := -word[\$F000 - result]
return

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Tracy Allen
www.emesystems.com (http://www.emesystems.com)

crgwbr
01-28-2007, 08:51 AM
Thanks Tracy

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
NerdMaster
For
Life

Graham Stabler
01-29-2007, 07:42 PM
If you are interested in assembly or just high speed then I wrote a cordic algorithm that will compute R.Sin(theta) and R.Cos(theta) simultaneously in no time at all, it uses Cordic:

http://en.wikipedia.org/wiki/Cordic

My intention was to releas the code in two forms, assembly to be inserted in to other assembly programs and as a high speed cordic object. The cordic method can be used for other things like sqrt and 1/x so it could sit in a cog and just churn out what was asked of it. I just need time to sit down and put it together but after my move I am still no quite unpacked.

I did release a basic demo program here though:

http://forums.parallax.com/forums/default.aspx?f=25&m=150119

Graham

Graham Stabler
01-29-2007, 07:44 PM
Oops, you said spin

crgwbr
01-29-2007, 07:49 PM
Sorry Graham, but I'm haveing enough trouble with learning spin. Not quite ready to learn assembly.

Thanks Anyway,
crgwbr

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
NerdMaster
For
Life