Неконтролируемый доступ к переменной Помогите решить проблему. В теле обработчика прерывания происходит
накопление переменной angle на величину delta=10. Переменная
angle обьявлена как внешняя. Но явный доступ к ней осуществляется
только в теле вышеупомянутого обрабочика. Переменная инкрементируется как и ожидается, но в какой-то момент изменяет свое значение случайным образом. Возможно где-то параллельный процесс, модифицирующий ее.
#include
#include
#define f0 2
#define fclk 30000
#define angle_max 8160
unsigned int delta=0;
unsigned int quarter=0;
unsigned int volatile angle;
main()
{
FLL_CTL0=DCOPLUS+XCAP18PF; //?????????
SCFI0=FLLD_4+FN_3; //?????
SCFQCTL=SCFQ_4M; //????????????
FLL_CTL1=SELM_XT2;
void delay ();
void init_timerB();
int f;
f=20;
delta=f/f0;
init_timerB();
delay();
}
void init_timerB(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer
TBCCR0=0x3FF;
//TBCCTL0=CCIE;
TBCTL = TBSSEL_2 + MC_3 + TBCLR+ID_1+TBIE;
TBCCTL1=OUTMOD_6;//+CCIE;
P1SEL=0x12; //output SMCLK and MCLK
P1DIR=0x12; // for oscilloscope
P2SEL=0x0C;
P2DIR=0x0C;
_EINT();
}
void delay ()
{
for (;;);
}
#pragma vector=TIMERB1_VECTOR //?????? ??????????-??????????? ???-??????
__interrupt void TIMERB1_ISR(void)
{
extern unsigned int delta;
extern unsigned int volatile angle;
extern unsigned int quarter;
unsigned int loc;
extern const unsigned int Sine_table[];
extern const unsigned int * Sine_ptr;
if (TBIV==0x0E)
{
switch (quarter)
{
case 0:
if(angle>angle_max)
{
quarter=1;
angle-=delta;
}
else
//angle+=delta; //?????????? ???????? ??? ??????? ???????
asm("ADD &delta,&angle");
break;
case 1:
if(angle==0)
{
quarter=0;
angle+=delta;
}
else
angle-=delta; //?????????? ???????? ??? ??????? ???????
break;
default:break;
}
loc = angle;
loc=loc>>8; //???????? ??????? ???? ? ?????????? ??? ????????
Sine_ptr=&Sine_table[0]+loc; //? ???????? ?????????
//TBCCR1=*Sine_ptr;
}
}