kopia lustrzana https://github.com/evil-mad/EggBot
Optimization 1) Union for StepAcc
rodzic
ba8cda332b
commit
69dffbdcb1
|
@ -306,7 +306,8 @@ typedef enum
|
||||||
// Working registers
|
// Working registers
|
||||||
static volatile MoveCommandType CurrentCommand;
|
static volatile MoveCommandType CurrentCommand;
|
||||||
//#pragma udata access fast_vars
|
//#pragma udata access fast_vars
|
||||||
static UINT32 StepAcc[NUMBER_OF_STEPPERS] = {0,0};
|
union union32b4 acc_union[2];
|
||||||
|
//static UINT32 StepAcc[NUMBER_OF_STEPPERS] = {0,0};
|
||||||
// Temporary signed 32 bit value for ISR
|
// Temporary signed 32 bit value for ISR
|
||||||
static INT32 TestRate;
|
static INT32 TestRate;
|
||||||
BOOL FIFOEmpty;
|
BOOL FIFOEmpty;
|
||||||
|
@ -353,6 +354,8 @@ void clear_StepCounters(void);
|
||||||
#pragma interrupt high_ISR
|
#pragma interrupt high_ISR
|
||||||
void high_ISR(void)
|
void high_ISR(void)
|
||||||
{
|
{
|
||||||
|
TRISDbits.TRISD1 = 0;
|
||||||
|
LATDbits.LATD1 = 1;
|
||||||
//Check which interrupt flag caused the interrupt.
|
//Check which interrupt flag caused the interrupt.
|
||||||
//Service the interrupt
|
//Service the interrupt
|
||||||
//Clear the interrupt flag
|
//Clear the interrupt flag
|
||||||
|
@ -468,10 +471,10 @@ void high_ISR(void)
|
||||||
{
|
{
|
||||||
CurrentCommand.Rate[0] = 0x80000000;
|
CurrentCommand.Rate[0] = 0x80000000;
|
||||||
}
|
}
|
||||||
StepAcc[0] = StepAcc[0] + CurrentCommand.Rate[0];
|
acc_union[0].value = acc_union[0].value + CurrentCommand.Rate[0];
|
||||||
if (StepAcc[0] & 0x80000000)
|
if (acc_union[0].bytes.b4 & 0x80)
|
||||||
{
|
{
|
||||||
StepAcc[0] = StepAcc[0] & 0x7FFFFFFF;
|
acc_union[0].bytes.b4 = acc_union[0].bytes.b4 & 0x7F;
|
||||||
OutByte = OutByte | STEP1_BIT;
|
OutByte = OutByte | STEP1_BIT;
|
||||||
TookStep = TRUE;
|
TookStep = TRUE;
|
||||||
if (CurrentCommand.DirBits & DIR1_BIT)
|
if (CurrentCommand.DirBits & DIR1_BIT)
|
||||||
|
@ -496,10 +499,10 @@ void high_ISR(void)
|
||||||
{
|
{
|
||||||
CurrentCommand.Rate[1] = 0x80000000;
|
CurrentCommand.Rate[1] = 0x80000000;
|
||||||
}
|
}
|
||||||
StepAcc[1] = StepAcc[1] + CurrentCommand.Rate[1];
|
acc_union[1].value = acc_union[1].value + CurrentCommand.Rate[1];
|
||||||
if (StepAcc[1] & 0x80000000)
|
if (acc_union[1].bytes.b4 & 0x80)
|
||||||
{
|
{
|
||||||
StepAcc[1] = StepAcc[1] & 0x7FFFFFFF;
|
acc_union[1].bytes.b4 = acc_union[1].bytes.b4 & 0x7F;
|
||||||
OutByte = OutByte | STEP2_BIT;
|
OutByte = OutByte | STEP2_BIT;
|
||||||
TookStep = TRUE;
|
TookStep = TRUE;
|
||||||
if (CurrentCommand.DirBits & DIR2_BIT)
|
if (CurrentCommand.DirBits & DIR2_BIT)
|
||||||
|
@ -530,10 +533,10 @@ void high_ISR(void)
|
||||||
{
|
{
|
||||||
CurrentCommand.Rate[0] = 0x80000000;
|
CurrentCommand.Rate[0] = 0x80000000;
|
||||||
}
|
}
|
||||||
StepAcc[0] = StepAcc[0] + CurrentCommand.Rate[0];
|
acc_union[0].value = acc_union[0].value + CurrentCommand.Rate[0];
|
||||||
if (StepAcc[0] & 0x80000000)
|
if (acc_union[0].bytes.b4 & 0x80)
|
||||||
{
|
{
|
||||||
StepAcc[0] = StepAcc[0] & 0x7FFFFFFF;
|
acc_union[0].bytes.b4 = acc_union[0].bytes.b4 & 0x7F;
|
||||||
OutByte = OutByte | STEP1_BIT;
|
OutByte = OutByte | STEP1_BIT;
|
||||||
TookStep = TRUE;
|
TookStep = TRUE;
|
||||||
CurrentCommand.Steps[0]--;
|
CurrentCommand.Steps[0]--;
|
||||||
|
@ -560,10 +563,10 @@ void high_ISR(void)
|
||||||
{
|
{
|
||||||
CurrentCommand.Rate[1] = 0x80000000;
|
CurrentCommand.Rate[1] = 0x80000000;
|
||||||
}
|
}
|
||||||
StepAcc[1] = StepAcc[1] + CurrentCommand.Rate[1];
|
acc_union[1].value = acc_union[1].value + CurrentCommand.Rate[1];
|
||||||
if (StepAcc[1] & 0x80000000)
|
if (acc_union[1].bytes.b4 & 0x80)
|
||||||
{
|
{
|
||||||
StepAcc[1] = StepAcc[1] & 0x7FFFFFFF;
|
acc_union[1].bytes.b4 = acc_union[1].bytes.b4 & 0x7F;
|
||||||
OutByte = OutByte | STEP2_BIT;
|
OutByte = OutByte | STEP2_BIT;
|
||||||
TookStep = TRUE;
|
TookStep = TRUE;
|
||||||
CurrentCommand.Steps[1]--;
|
CurrentCommand.Steps[1]--;
|
||||||
|
@ -765,11 +768,11 @@ void high_ISR(void)
|
||||||
// Use the SEState to determine which accumulators to clear.
|
// Use the SEState to determine which accumulators to clear.
|
||||||
if (CurrentCommand.SEState & 0x01)
|
if (CurrentCommand.SEState & 0x01)
|
||||||
{
|
{
|
||||||
StepAcc[0] = 0;
|
acc_union[0].value = 0;
|
||||||
}
|
}
|
||||||
if (CurrentCommand.SEState & 0x02)
|
if (CurrentCommand.SEState & 0x02)
|
||||||
{
|
{
|
||||||
StepAcc[1] = 0;
|
acc_union[1].value = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FIFOEmpty = TRUE;
|
FIFOEmpty = TRUE;
|
||||||
|
@ -793,6 +796,7 @@ void high_ISR(void)
|
||||||
ButtonPushed = TRUE;
|
ButtonPushed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LATDbits.LATD1 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init code
|
// Init code
|
||||||
|
@ -2812,8 +2816,8 @@ void clear_StepCounters(void)
|
||||||
globalStepCounter2 = 0;
|
globalStepCounter2 = 0;
|
||||||
|
|
||||||
// Clear both step accumulators as well
|
// Clear both step accumulators as well
|
||||||
StepAcc[0] = 0;
|
acc_union[0].value = 0;
|
||||||
StepAcc[1] = 0;
|
acc_union[1].value = 0;
|
||||||
|
|
||||||
// Re-enable interrupts
|
// Re-enable interrupts
|
||||||
INTCONbits.GIEH = 1; // Turn high priority interrupts on
|
INTCONbits.GIEH = 1; // Turn high priority interrupts on
|
||||||
|
|
|
@ -75,6 +75,17 @@ typedef enum
|
||||||
COMMAND_MOTOR_MOVE_TIMED
|
COMMAND_MOTOR_MOVE_TIMED
|
||||||
} CommandType;
|
} CommandType;
|
||||||
|
|
||||||
|
// Byte union used for accumulator
|
||||||
|
union union32b4 {
|
||||||
|
struct byte_map {
|
||||||
|
UINT8 b1; // Low byte
|
||||||
|
UINT8 b2;
|
||||||
|
UINT8 b3;
|
||||||
|
UINT8 b4; // High byte
|
||||||
|
} bytes;
|
||||||
|
UINT32 value;
|
||||||
|
};
|
||||||
|
|
||||||
// This structure defines the elements of the move commands in the FIFO that
|
// This structure defines the elements of the move commands in the FIFO that
|
||||||
// are sent from the command parser to the ISR move engine.
|
// are sent from the command parser to the ISR move engine.
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
Ładowanie…
Reference in New Issue