📄 int_proc.h
字号:
}
#endm
MACRO init_adjust()
{
#if (1 == OPTIMIZED_INIT)
/* Nothing to be done, everything is already reset to zero. */
#else
close = hyst = fe_cmp = fcs_off = ramp_mode = 0;
#endif
}
#endm
/************************************************************************/
MACRO adjust()
{
#if 0
fraction _dy tempy; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
fraction _dx tempx; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
#else
register fraction tempx at(dx[0]);
register fraction tempy at(dy[1]);
#endif
register fraction accu0 at(acc[0]);
integer i; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
fraction temp1, temp2; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
i = count16 & 0x03;
if (i == 0) goto CASE_0;
if (i == 1) goto CASE_1;
if (i == 3) goto CASE_3;
goto END_SWITCH2;
CASE_0:
/* --------------------------------------- */
dsp_state = get_clr_ramp_stopped(dsp_state);
if ((fcrint != 0) || (!(ramp_mode & RAMP_ON))) /* FD060919 */
{
dsp_state = get_set_ramp_stopped(dsp_state);
}
if (fcrint == 0)
{
if (ramp_mode & RAMP_ON)
{
if (ramp_mode & RAMP_UP)
{
fcs_off = fcs_off + (fraction) ramp_step;
if ((int) fcs_off >= (int) ramp_max)
{
fcs_off = ramp_max;
ramp_mode &= RAMP_DOWN;
if (ramp_mode & SINGLE_RAMP)
{
ramp_mode &= RAMP_OFF;
}
/* else not needed ((!(ramp_mode & SINGLE_RAMP)) -> (CONTINUOUS_RAMP)) */
}
}
else /* ((!(ramp_mode & RAMP_UP) -> (RAMP_DOWN)) */
{
fcs_off = fcs_off - (fraction) ramp_step;
if ((int) fcs_off <= (int) ramp_min)
{
fcs_off = ramp_min;
ramp_mode |= RAMP_UP;
if (ramp_mode & SINGLE_RAMP)
{
ramp_mode &= RAMP_OFF;
}
/* else not needed ((!(ramp_mode & SINGLE_RAMP)) -> (CONTINUOUS_RAMP)) */
}
}
}
/* else not needed ((!(ramp_mode & RAMP_ON)) -> (RAMP_OFF)) */
}
goto END_SWITCH2;
CASE_1:
/* --------------------------------------- */
accu0 = fe_cmp;
if (ramp_mode & RAMP_UP)
{
accu0 -= fedec;
}
else
{
accu0 += fedec;
}
tempy = hyst;
temp1 = saturate(accu0 + tempy);
temp2 = saturate(accu0 - tempy);
if (temp1 < 0)
{
close = 1;
}
if (temp2 > 0)
{
fcrint = (fcrint | (close & fok));
close = 0;
}
goto END_SWITCH2;
CASE_3:
/* ---- max and min measurement on fe, te, hf ---------------------- */
if ((adjust_flags & ADJ_FLG_RESET) != 0)
{
accu0 = 0x7fff;
femin = accu0;
temin = accu0;
accu0 = 0x8000;
femax = accu0;
temax = accu0;
adjust_flags &= ~ADJ_FLG_RESET;
adjust_flags |= ADJ_FLG_NOSTAT;
}
else
{
tempx = temax;
tempy = tedec;
accu0 = max(tempx, tempy);
tempx = temin;
temax = accu0;
accu0 = min(tempx, tempy);
tempx = femax;
temin = accu0;
tempy = fedec;
accu0 = max(tempx, tempy);
tempx = femin;
femax = accu0;
accu0 = min(tempx, tempy);
femin = accu0;
adjust_flags &= ~ADJ_FLG_NOSTAT;
}
END_SWITCH2:
loop(1); /* Dummy, will be optimized away. Without this line the compiler complains about an "Expression syntax error". */
}
#endm
MACRO init_misc()
{
#if (1 == OPTIMIZED_INIT)
#else
oscout = 0;
vib_gain = 0;
fok = 0;
disc_mode = KICK_MODE;
disc_mode_int = KICK_MODE; /* MR041215 */
spindle_kick = 0x0000;
#endif
clv_ds = 100;
sw_time = clv_ds;
counter_def_up = def_tup;
counter_def_down = def_tdn;
}
#endm
/************************************************************************/
MACRO misc()
{
#if (1 == OPTIMIZED_DEC)
register fraction pacc at(p);
register fraction accu0 at(acc[0]);
register fraction accu1 at(acc[1]);
register memoryX * ax0 at(ax[0]);
register memoryY * ay0 at(ay[0]);
register fraction dx0 at(dx[0]);
register fraction dx1 at(dx[1]);
register fraction dy0 at(dy[0]);
register fraction dy1 at(dy[1]);
register int dy0_int at(dy[0]);
#else
register fraction pacc at(p);
register fraction accu0 at(acc[0]);
register fraction accu1 at(acc[1]);
register fraction dx0 at(dx[0]);
#endif
#if 0
fraction _dy tempy; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
fraction _dx tempx; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
#else
register fraction tempx at(dx[0]);
register fraction tempy at(dy[1]);
#endif
fraction * delay; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
memoryY CONST * c; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
memoryY * agc_ctrl_coeff;
integer i; /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
c = coeff_misc;
delay = delay_misc;
#if (1 == WORKAROUND_SPIKE_BUG)
dx0 = DEC10;
dy0 = DEC10;
if (dx0 != dy0) { /* Make sure that DEC10 (rate status) not read during the decimation filter update of DEC10. */
dx0 = DEC10;
}
#else
dx0 = DEC10;
#endif
dsp_state = get_clr_short_jump_stopped(dsp_state);
if (0 != (dx0 & 0x80))
{
dsp_state = get_set_short_jump_stopped(dsp_state);
}
i = count16 & 0x03;
if (i == 0) goto CASE_00;
if (i == 1) goto CASE_11;
if (i == 2) goto CASE_22;
if (i == 3) goto CASE_33;
CASE_00:
if (gainadj & 0x01)
{
if (gainadj & 0x02)
{
/* Inject oscillator signal into the tracking loop. */
tosc = osc;
/* Select tracking loop for AGC amplitude measurement, */
/* result -> amp1. */
accu0 = ta2dec * c[0];
}
else
{
/* Inject oscillator signal into the focus loop. */
fosc = osc;
/* Select focus loop for AGC amplitude measurement, */
/* result -> amp1. */
accu0 = fa2dec * c[0];
}
/* Amplitude amp1 is determined in three steps: */
/* 1. Filter signal using a notch filter with centre */
/* frequency at controller bandwidth. */
accu1 = accu0 - delay[0] + delay[1] * c[1];
delay[0] = accu0;
pacc = c[2] * delay[2];
accu0 = accu1 + pacc;
accu0 += pacc;
delay[1] = delay[2];
delay[2] = accu0;
/* 2. Take absolute value of filtered signal. */
accu1 = abs(accu0);
/* 3. Lowpass filter the absolute value. */
accu0 = accu1 * c[3] + amp1 * c[4];
/* Result: amp1 */
amp1 = accu0;
/*----------------------------*/
/* Oscilator that generates a signal wave with the same */
/* frequency as the bandwidth of the control loop to be measured.*/
tempx = oscout;
tempy = c[6];
accu1 = round(c[7] * tempx);
accu1 = tempy - delay[6] + accu1 + accu1 - delay[7];
delay[6] = tempy;
oscout = accu1;
delay[7] = tempx;
osc = oscout * vib_gain;
}
else
{
/* No signal injection when AGC procedure is turned off. */
tosc = fosc = 0;
delay[6] = delay[7] = oscout = 0;
}
/* downsampling of internal signals */
#if ((1 == OPTIMIZED_DEC) && (1 == HARDWARE_LOOP))
ax0 = SIGDEC_VAR_ARRAY_ADD;
ay0 = SIG_ARRAY_ADD;
dx1 = *ay0++; /* sig[0] */
dy0_int = 0x0002;
accu0 = dx1 >> dy0_int; /* sig[0] >> 2 */
loop(7)
{
dx0 = *ax0; /* sigdec_var[i] */
accu0 = accu0 + dx0; /* sigdec_var[i] + sig[i] >> 2 */
dx1 = *ay0++; /* sig[i+1] */
*ax0++ = accu0; /* sigdec_var[i] += sig[i] >> 2 */
accu0 = dx1 >> dy0_int; /* sig[i+1] >> 2 */
}
#elif (1 == OPTIMIZED_DEC)
ax0 = SIGDEC_VAR_ARRAY_ADD;
ay0 = SIG_ARRAY_ADD;
dx1 = *ay0++; /* sig[0] */
dy0_int = 0x0002;
accu0 = dx1 >> dy0_int; /* sig[0] >> 2 */
/***** i = 0 *****/
dx0 = *ax0; /* sigdec_var[i] */
accu0 = accu0 + dx0; /* sigdec_var[i] + sig[i] >> 2 */
dx1 = *ay0++; /* sig[i+1] */
*ax0++ = accu0; /* sigdec_var[i] += sig[i] >> 2 */
accu0 = dx1 >> dy0_int; /* sig[i+1] >> 2 */
/***** i = 1 *****/
dx0 = *ax0; /* sigdec_var[i] */
accu0 = accu0 + dx0; /* sigdec_var[i] + sig[i] >> 2 */
dx1 = *ay0++; /* sig[i+1] */
*ax0++ = accu0; /* sigdec_var[i] += sig[i] >> 2 */
accu0 = dx1 >> dy0_int; /* sig[i+1] >> 2 */
/***** i = 2 *****/
dx0 = *ax0; /* sigdec_var[i] */
accu0 = accu0 + dx0; /* sigdec_var[i] + sig[i] >> 2 */
dx1 = *ay0++; /* sig[i+1] */
*ax0++ = accu0; /* sigdec_var[i] += sig[i] >> 2 */
accu0 = dx1 >> dy0_int; /* sig[i+1] >> 2 */
/***** i = 3 *****/
dx0 = *ax0; /* sigdec_var[i] */
accu0 = accu0 + dx0; /* sigdec_var[i] + sig[i] >> 2 */
dx1 = *ay0++; /* sig[i+1] */
*ax0++ = accu0; /* sigdec_var[i] += sig[i] >> 2 */
accu0 = dx1 >> dy0_int; /* sig[i+1] >> 2 */
/***** i = 4 *****/
dx0 = *ax0; /* sigdec_var[i] */
accu0 = accu0 + dx0; /* sigdec_var[i] + sig[i] >> 2 */
dx1 = *ay0++; /* sig[i+1] */
*ax0++ = accu0; /* sigdec_var[i] += sig[i] >> 2 */
accu0 = dx1 >> dy0_int; /* sig[i+1] >> 2 */
/***** i = 5 *****/
dx0 = *ax0; /* sigdec_var[i] */
accu0 = accu0 + dx0; /* sigdec_var[i] + sig[i] >> 2 */
dx1 = *ay0++; /* sig[i+1] */
*ax0++ = accu0; /* sigdec_var[i] += sig[i] >> 2 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -