Неявный доступ к внешней переменной Помогите решить проблему. В теле обработчика прерывания происходит
накопление переменной 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;
  }
}  
)