ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
21 июля
44117
Valdis (15.11.2005 15:19, просмотров: 642)
Неявный доступ к внешней переменной Помогите решить проблему. В теле обработчика прерывания происходит накопление переменной 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; } }