Hi, All !
It looks like I have found a bug.
Here is an extract from the source (for more see attachment):
uint32_t CalcStepTime(uint8_t s)
{
uint32_t n=0;
long a;
FeedAcc-=48000L*2560;
if(breaking)
{
a=-MaxdV;
}
else if(Feed<cframe.Feed)
{
a=MaxdV;
}
else a=0;
do
{
Feed+=a;
if(a>0 && Feed>=cframe.Feed)a=0;
if(Feed<0){ Feed=0; return n; }
n++;
}while(Add(Feed,FeedAcc)>=0);
return n;
}
And here is a piece of listing:
56:bug.c **** if(a>0 && Feed>=cframe.Feed)a=0;
GAS LISTING C:\DOCUME~1\9335~1\LOCALS~1\Temp/ccEdbaaa.s page 5
172 .stabn 68,0,56,.LM8-CalcStepTime
173 .LM8:
174 0040 0C4A mov r10, r12
175 0042 0D4B mov r11, r13
176 0044 1C83 sub #llo(1), r12
177 0046 0D73 subc #lhi(1), r13
178 0048 0638 jl .L9
179 004a 3E87 sub @r7+, r14
180 004c 3F77 subc @r7+, r15
181 004e 2782 sub #4, r7 ; restore r7 <<restoring r7 in a such
way will destroy comparison result !!!!!!!
182 0050 0228 jlo .L9
183 0052 0A43 mov #llo(0), r10
184 0054 0B43 mov #lhi(0), r11
185 .L9:
I used my own build from the CVS sources from 31.12.03.
All the best !
Bye.
#include <msp430x14x.h>
#include <signal.h>
#include <sys/inttypes.h>
#define Add(A,B) ({ int r;\
asm volatile("add.w %A[a],%A[b] \n"\
"addc.w %B[a],%B[b] \n"\
"rrc.w %[c]"\
: [c] "=r" (r), [b] "=rm" (B)
\
: "[b]" (B) , [a] "rm" (A));
\
r;})
#undef N
#undef Z
//Struct for the frame data
struct FRAME
{
uint8_t SX,SY,SZ; //Determines axis steps direction (ignored for G0)
long X,Y,Z; //Coordinate parameters (direct coordinates for G0,
normalized for others)
uint32_t N; //Number of steps (ignored for G0)
uint32_t Feed; //Feed rate mm/min x 2560
uint8_t func; //Function code
};
//Data for the current and next frames
struct FRAME cframe,nframe={1,2,3,100000UL,100UL,100UL,200,2400UL*2560,1};
//for G0 testing
#define MaxdV 38 // MaxA/80000*1000*60*2560=MaxA*1920
uint8_t G9=0;
long Feed=0;
uint8_t breaking;
static long FeedAcc=0; //Feed rate intergrator
uint32_t CalcStepTime(uint8_t s)
{
uint32_t n=0;
long a;
FeedAcc-=48000L*2560;
if(breaking)
{
a=-MaxdV;
}
else if(Feed<cframe.Feed)
{
a=MaxdV;
}
else a=0;
do
{
Feed+=a;
if(a>0 && Feed>=cframe.Feed)a=0;
if(Feed<0){ Feed=0; return n; }
n++;
}while(Add(Feed,FeedAcc)>=0);
return n;
}