NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3125 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 4 از 4

موضوع: مشکل در اجرای تابع getchar و وقفه تایمر

  1. #1
    تازه وارد
    تاریخ عضویت
    Oct 2010
    نوشته ها
    2
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض مشکل در اجرای تابع getchar و وقفه تایمر

    با سلام
    من به یه مشکلی برخوردم اونم اینه که داخل یه تابع از تابع 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();

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    این مال 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;

    }
    ویرایش توسط erfanjeddy : 03-10-2015 در ساعت 20:04

  4. #3
    تازه وارد
    تاریخ عضویت
    Oct 2010
    نوشته ها
    2
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط erfanjeddy نمایش پست ها
    این مال 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() کی فراخونی میشه ؟
    و اینکه حلقه گذاشته شده وقتی کاراکترها تموم میشه از اون خارج میشه و بقیه برنامه اجرا میشه

  5. #4
    کاربر فعال
    تاریخ عضویت
    May 2014
    نوشته ها
    198
    تشکر
    14
    تشکر شده 79 بار در 71 پست

    پیش فرض

    اون بالا نوشتی که وقفه تایمر اتفاق نمیوفته وقتی 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 میاد بیرون، حالا وقفه تایمر میتونه اتفاق بیوفته.

موضوعات مشابه

  1. دستور ()getchar
    توسط a.amirian در انجمن میکروکنترلرهای 8و16 بیتی
    پاسخ: 5
    آخرين نوشته: 23-08-2014, 00:11
  2. مشکل getchar پورت سریال lpc1768
    توسط ashil2012 در انجمن LPC series (NXP)
    پاسخ: 3
    آخرين نوشته: 31-08-2013, 17:05

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •