PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل در اجرای تابع getchar و وقفه تایمر



sadeghkh
03-10-2015, 19:21
با سلام
من به یه مشکلی برخوردم اونم اینه که داخل یه تابع از تابع getchar استفاده کردم و داخل اون تابع تایمر رو هم روشن میکنم ولی وقفه تایمر اتفاق نمی افته وقتی که get char رو بر میدارم درست میشه
در ضمن تو getchar هم گیر نمیکنه یعنی بقیه دستورات به درستی انجام میشن
دوستان لطفا راهنمایم کنن

interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCCR1B=0x01;


do{
resive[i] = getchar();
i++;
}
while((resive[i-1] != 'n') && (i<17) );


for (r=0; r<160; r++){
if(resive[r] == '+'){
search[0] = resive[r];
search[1] = resive[r+1];
search[2] = resive[r+2];
search[3] = resive[r+3];
search[4] = resive[r+4];
search[5] = resive[r+5];
search[6] ='\0';
}

}
// puts1(search);
if( !(strcmp(search , "+CMTI:"))){
SMSALERT();

erfanjeddy
03-10-2015, 19:56
این مال ATMEGA اگه باشه وقفه به اصلاح باید NESTED بشه که (دوتا وقفه تو هم) که ATMEGA نمیتونه اجراش کنه.
نکته مهم تر: هرگز تو ISR حلقه با زمان نا معلوم نزار، getchar تعداد چرخشش به دریافت کاراکتر وابستس
پس کد درست اینطوری میشه، البته این مثال همینطوری قابل اجرا نیست فقط خواستم ماجرارو توضیح بدم

volatile char xflag;
void harchi()
{
TCCR1B=0x01;


while(!xflag);
do{
resive[i] = getchar();
i++;
}
while((resive[i-1] != 'n') && (i<17) );




for (r=0; r<160; r++){
if(resive[r] == '+'){
search[0] = resive[r];
search[1] = resive[r+1];
search[2] = resive[r+2];
search[3] = resive[r+3];
search[4] = resive[r+4];
search[5] = resive[r+5];
search[6] ='\0';
}


}
// puts1(search);
if( !(strcmp(search , "+CMTI:"))){
SMSALERT();
}


interrupt [EXT_INT0] void ext_int0_isr(void)
{
xflag = ture;

}

sadeghkh
03-10-2015, 21:47
این مال ATMEGA اگه باشه وقفه به اصلاح باید NESTED بشه که (دوتا وقفه تو هم) که ATMEGA نمیتونه اجراش کنه.
نکته مهم تر: هرگز تو ISR حلقه با زمان نا معلوم نزار، getchar تعداد چرخشش به دریافت کاراکتر وابستس
پس کد درست اینطوری میشه، البته این مثال همینطوری قابل اجرا نیست فقط خواستم ماجرارو توضیح بدم

volatile char xflag;
void harchi()
{
TCCR1B=0x01;


while(!xflag);
do{
resive[i] = getchar();
i++;
}
while((resive[i-1] != 'n') && (i<17) );




for (r=0; r<160; r++){
if(resive[r] == '+'){
search[0] = resive[r];
search[1] = resive[r+1];
search[2] = resive[r+2];
search[3] = resive[r+3];
search[4] = resive[r+4];
search[5] = resive[r+5];
search[6] ='\0';
}


}
// puts1(search);
if( !(strcmp(search , "+CMTI:"))){
SMSALERT();
}


interrupt [EXT_INT0] void ext_int0_isr(void)
{
xflag = ture;

}
الان تو این کد دوتا وقفه اتفاق نمی افته یکی برا تایمره
در مورد این مثالی که زدین هم توضیح میدین
مثلا تابع void harchi() کی فراخونی میشه ؟
و اینکه حلقه گذاشته شده وقتی کاراکترها تموم میشه از اون خارج میشه و بقیه برنامه اجرا میشه

erfanjeddy
04-10-2015, 00:04
اون بالا نوشتی که وقفه تایمر اتفاق نمیوفته وقتی getchar رو ور میدارم درست میشه
پس این یعنی وقفه تایمرت فعاله دیگه!!
و خود getchar درون سرویس کننده وقفه خارجی قرار داره
nterrupt [EXT_INT0] void ext_int0_isr

حالا فرض کن وقفه خارجی اتفاق افتاده و CPU دز حال اجرای getchar درون ISR قرار داره، یعنی هنوز reti صادر نشده
حالاااا این وسط تایمر وقفه ایجاد میکنه میشه NESTED interrupt که کلا atmega نداره
حالا چرا درست میشه وقتی getchar نیست؟
چون دیگه getchar نیست که CPU رو نگه داره میرسه به آخر ISR و reti صادر میشه حالا CPU میدونه تو وقفه نیست پس وقفه تایمر قابل اجراس.

- - - Updated - - -

این هرچی تابعیه که شما قبل اتفاق افتادن وقفه خاجی توشی. من چون نمیدونستم چیه اسمشو گذاشتم هرچی

- - - Updated - - -

حالا کد پیشنهادی من میاد یه فلگ رو ست میکنه و از ISR میاد بیرون، حالا وقفه تایمر میتونه اتفاق بیوفته.