سلام . من برای خواندن فرکانس یک سیگنال ، آن سیگنال را به پایه ورودی اینتراپت خارجی 1 میدهم. تایمر 1 را هم فعال کرده ام و با اندازه گیری فاصله زمانی بین دو سیگنال متوالی فرکانس ورودی را میخوانم.
در حالت عادی مشکلی ندارم و کار درست انجام میشود. اما وقتی که از وقفه دریافت اطلاعات usart استفاده میکنم ، به صورت اتفاقی مقدار فرکانس خوانده شده پرش پیدا میکند. برای اطمینان، یک delay در حدود 2 میلی ثانیه در روتین وقفه usart نوشتم و دیدم که کلا مقدار فرکانس خوانده شده درب و داغون شد!
سوال من این است که اصلا وقفه usart چی کاره است که بخواهد کار وقفه خارجی را مختل کند؟ چون طبق دیتاشیت مگا8 میدانیم که اولویت وقفه خارجی 0 از همه وقفه ها بیشتر است. و وقفه USART نباید تاثیری روی آن داشته باشد. همچنین این وقفه USART روی مقدار تایمر هم نباید تاثیری بگذارد؟ چون من از وقفه تایمر اصلا استفاده ای نکرده ام. مقدار تایمر در رویت وقفه خارجی هر بار ریست میشود.
در عجبم چرا گذاشتن delay در وقفه USART دارد کارها را خراب میکند :cry2: اصلا با منطق جور در نمیاد. خواهشا اگه ممکنه کمک کنید. چند روزه معطل این قضیه هستم این هم بخشی از کدم:
در حالت عادی مشکلی ندارم و کار درست انجام میشود. اما وقتی که از وقفه دریافت اطلاعات usart استفاده میکنم ، به صورت اتفاقی مقدار فرکانس خوانده شده پرش پیدا میکند. برای اطمینان، یک delay در حدود 2 میلی ثانیه در روتین وقفه usart نوشتم و دیدم که کلا مقدار فرکانس خوانده شده درب و داغون شد!
سوال من این است که اصلا وقفه usart چی کاره است که بخواهد کار وقفه خارجی را مختل کند؟ چون طبق دیتاشیت مگا8 میدانیم که اولویت وقفه خارجی 0 از همه وقفه ها بیشتر است. و وقفه USART نباید تاثیری روی آن داشته باشد. همچنین این وقفه USART روی مقدار تایمر هم نباید تاثیری بگذارد؟ چون من از وقفه تایمر اصلا استفاده ای نکرده ام. مقدار تایمر در رویت وقفه خارجی هر بار ریست میشود.
در عجبم چرا گذاشتن delay در وقفه USART دارد کارها را خراب میکند :cry2: اصلا با منطق جور در نمیاد. خواهشا اگه ممکنه کمک کنید. چند روزه معطل این قضیه هستم این هم بخشی از کدم:
کد:
// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; //************************************************* if (recieve_mode==0 && data==0x0A) { recieve_mode=1; data_ok=1; } else if (recieve_mode==1 && data==0x0B) { recieve_mode=2; data_ok=1; } else if (recieve_mode==2) { a=data; recieve_mode=3; data_ok=1; } else if (recieve_mode==3) { b=data; recieve_mode=4; data_ok=1; } else if (recieve_mode==4) { c=data; recieve_mode=5; data_ok=1; } else if (recieve_mode==5 && data==0x0E) { recieve_mode=6; data_ok=1; } else if (recieve_mode==6 && data==0x0F) { data_ok=1; //This flag means that the recieved data is in correct format recieve_mode=0; } if (data_ok==1) data_ok=0; // this command means that if recieved data is not in correct format mode=0. So the cycle will be terminated. else recieve_mode=0; //************************************************* if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; } //****************************************************************************8 // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { //komaki2=komaki3*timer_over_flow; timer_value=TCNT1; array[komaki2]=timer_value; TCNT1=0; komaki2++; if (timer_value<1428 && timer_over_flow==0) // f>700 flag=1; else if (timer_value<2000 && timer_over_flow==0) // f>500 flag=2; else if (timer_value<50000 && timer_over_flow==0) // f>100 flag=3; else flag=4; timer_over_flow=0; if (komaki2>50) komaki2=0; } //************************************************************************
دیدگاه