|
|
View previous topic :: View next topic |
Author |
Message |
bwake
Joined: 22 Jul 2008 Posts: 4
|
Help with floating point math |
Posted: Sat Jul 26, 2008 6:28 am |
|
|
I cannot understand what's wrong with the compiler I use (4.068)... In another topic I pointed out that it's not properly handling interrupts for a dsPIC 30F6014, now I discovered another odd behavior in floating point math. Look at the example code:
Code: |
#include <30F6014.h>
#include <math.h>
#device ANSI
#device ICD=TRUE
#device ADC=12
#FUSES NOWDT
#FUSES XT_PLL16
#FUSES PR
#FUSES NOCKSFSM
#FUSES WPSB16
#FUSES WPSA512
#FUSES PUT64
#FUSES NOBROWNOUT
#FUSES BORV47
#FUSES LPOL_HIGH
#FUSES HPOL_HIGH
#FUSES NOPWMPIN
#FUSES MCLR
#FUSES NOPROTECT
#FUSES NOWRT
#FUSES DEBUG
#FUSES NOCOE
#FUSES ICS0
#FUSES RESERVED
#use delay(clock=120M)
void rfft(float X[],int N)
{
int I,I0,I1,I2,I3,I4,I5,I6,I7,I8, IS,ID;
int J,K,M,N2,N4,N8;
float A,A3,CC1,SS1,CC3,SS3,E,R1,XT;
float T1,T2,T3,T4,T5,T6;
[...] //other FFT code here
do
{
for(I=IS;I<N;I+=ID)
{
I1 = I + 1;
I2 = I1 + N4;
I3 = I2 + N4;
I4 = I3 + N4;
T1 = X[I4] +X[I3];
X[I4] = X[I4] - X[I3];
X[I3] = X[I1] - T1;
X[I1] = X[I1] + T1;
if(N4!=1)
{
I1 = I1 + N8;
I2 = I2 + N8;
I3 = I3 + N8;
I4 = I4 + N8;
T1 = (X[I3] + X[I4])*0.7071067811865475244;
T2 = (X[I3] - X[I4])*0.7071067811865475244;
X[I4] = X[I2] - T1; //ERROR HERE: If X[I2] is zero and T1
//is nonzero positive, the result is positive!
X[I3] = (-1.0)*X[I2] - T1; //ERROR HERE: If I simply
//write "-X[I2]", the result has wrong sign
X[I2] = X[I1] - T2;
X[I1] = X[I1] + T2;
}
}
IS = 2 * ID - N2;
ID = 4 * ID;
}while(IS<N);
|
Maybe I should simple switch to MPLAB C30. I remember no time in the past I had similar problems with CCS using other PIC devices... |
|
|
RLScott
Joined: 10 Jul 2007 Posts: 465
|
Re: Help with floating point math |
Posted: Sat Jul 26, 2008 12:52 pm |
|
|
Can you demonstrate this problem using any simpler code? It seems to me that there is too much going on here to be able to say with any certainty that things are happening the way you say. _________________ Robert Scott
Real-Time Specialties
Embedded Systems Consulting |
|
|
bwake
Joined: 22 Jul 2008 Posts: 4
|
|
Posted: Sun Jul 27, 2008 3:36 am |
|
|
Point is: I can't. I tried to replicate the error inside main(), declaring an array of the same size and using the same variable assignment but I obtained only correct results. This is weird, however, because there's really no reason for the code to behave differently depending on its location...
I should mention, anyway, that at least the syntax is correct: compiling the same function under a PC based compilator I can see the same FFT output MATLAB generates from the same input.
I think there must be something very wrong with the entire system I use: using ICD2 inside MPLAB to debug this code I don't get what I would expect. I cannot understand, for example, why the "step over" function jumps over entire blocks of code when floating point math is involved or why some breakpoints are resolved on the following instruction... maybe the assembly generated is not fully compatible with the debugger? |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Jul 27, 2008 3:41 pm |
|
|
If you are not able to reproduce the error in a smaller program there is no way for us to verify your results and look for a possible bug.
A few general remarks:
- In the past it has taken CCS at least a year to create a stable compiler version for a new processor from the first compiler release.
- Only few people are discussing the dsPIC processors on this forum. This might indicate a small user base and little feedback to CCS.
- Your v4.068 is old. Current release is v4.076 and it looks like some serious bugs have been fixed: Quote: | 4.076 The COFF file format has been modified to allow MPLAB to read complex structures
4.076 A number of PCD issues fixed including access to high memory locations
4.076 Type casting of unsigned constants to signed constants modified for ANSI
4.075 A debugger problem with 88x parts is fixed
4.075 The debugger now offers an option to freeze the PIC peripherals
4.075 A PCD bug setting and clearing bits in high memory locations is fixed
4.074 A bug in structure bit to byte transfers is fixed
4.074 A PCD problem with &=0xff on an int16 is fixed
4.074 A problem in setup_counters() for some chips is fixed
4.073 UART definitions for some chips were wrong in 4.072
4.072 A number of bug fixes made for the PCD (24 bit) compiler
4.072 Setup_WDT() and Setup_Counters() have been updated for the newest chips
4.072 Using just UNSIGNED for variable types in PCD now yields a int16, not an int8
4.072 I2C slave now defaults to the clock streatch mode for all chips that support it
4.071 A debugger problem is resolved
4.070 Some IDE issues including hidden debugger screens have been fixed
4.070 I2C slave algorithms have been updated for some chips
4.069 Compiler R/W files are now kept in the windows APPDATA directory
4.069 An interrupt bug on many PCD devices is fixed
4.069 A PCD optimization error is fixed |
I can't recommend on switching to the Microchip C30 compiler as I don't know that compiler but it won't be trivial. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|