اطلاعیه

Collapse
No announcement yet.

توقف برنامه پشت دستور get در ارتباط سریال

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    توقف برنامه پشت دستور get در ارتباط سریال

    سلام من یه پروژه ای دارم که توش از ارتباط سریال استفاده کردم
    و از دستور get برای دریافت اطلاعات استفاده کردم
    و همون طور که میدونید برنامه وقتی به این دستور میرسه
    متوقف میشه و منتظر دریافت اطلاعات میشه
    مشکل من اینکه من نیاز دارم توی حلقم
    دایم وضعیت یک سنسور چک بشه ولی این get
    و توقف برنامه کارمو خراب کرده
    دوستان اگه میشه برای رفع این مشکل راهنمایی کنن
    آیا باید از وقفه استفاده کنم?
    اگه باید از وقفه استفاده کنم دوستان لطفا طرز استفاده رو هم
    بیان کنن و اینکه از کدوم نوع وقفه باید استفاده کنم
    با تشکر.

    #2
    پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

    تو روتین اینتراپت ارتباط سریال هردفعه یک متغیر رو یک کن اخرش می تونی اضافه کنی چک کن تو برنامت اگه یک بود دیتا رو بخون وقتی هم که خوندی صفرش کن
    التماس دعا

    دیدگاه


      #3
      پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

      ممنون . ولی من نفهمیدم میشه بیشتر توضیح بدید
      اینکه تو وقفه سریال چرا باید یه متغیر صفر ویک کنم و اینکه چه جوری وضعیت سنسور رو چک کنم?

      دیدگاه


        #4
        پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

        برو داخل تابع get و توش تو شرط حلقه ی while ش یه شرط دیگه رو اضافه کن . مثلا یه متغیر رو هر 20 میلی ثانیه زیاد کن و هر وقت متغیر به عدد خاصی رسید شرط حلقه رو تغییر بده تا از داخل حلقه بیاد بیرون.
        روش اینتراپت دوستمون هم عالیه .
        برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

        دیدگاه


          #5
          پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

          تو کدویژن وقتی uart رو فعال می کنی اینراپت reciver رو هم فعال کن بعد دنیال این قسمت برنامه بگرد

          // USART Receiver interrupt service routine
          interrupt [USART_RXC] void usart_rx_isr(void)
          {
          char status,data;
          status=UCSRA;
          data=UDR;
          if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
          {
          rx_buffer[rx_wr_index++]=data;
          #if RX_BUFFER_SIZE == 256
          // special case for receiver buffer size=256
          if (++rx_counter == 0) rx_buffer_overflow=1;
          #else
          if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
          if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          }
          #endif
          }
          // این جا می تونی برنامه بنویسی چیزی که گرفته تو کاراکتر data هستش می تونی همین جا استقاده کنی که نخواد تو برنامت چک کنی اگه نه هم می تونی اینجا بنویسی
          a=1;
          }

          while(1){
          if(a==1) {
          get();
          a=0;
          };
          }
          التماس دعا

          دیدگاه


            #6
            پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

            واقعا ممنونم
            این روش واقعا عالیه
            و سوال اخر این که اون دوستمون گفتن توی تابع get
            یه تغییراتی بدیم فقط میخواستم ببینم
            تو کدویژن چه جوری میشه وارد یه تابع شد و تغییراتی توش داد?
            با سپاس فراوان

            دیدگاه


              #7
              پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

              نوشته اصلی توسط mohammadt3000
              واقعا ممنونم
              این روش واقعا عالیه
              و سوال اخر این که اون دوستمون گفتن توی تابع get
              یه تغییراتی بدیم فقط میخواستم ببینم
              تو کدویژن چه جوری میشه وارد یه تابع شد و تغییراتی توش داد?
              با سپاس فراوان
              باید کتابخونه که توش هست رو بازکنی اون جا تغییر بدی اما من همچین توصیه رو کلا ندارم اگه چیز خاصی می خواید بهتره بنویسید تابع get فقط میادUDR رو به شما پس می ده ...
              التماس دعا

              دیدگاه


                #8
                پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                سلام :smile:
                به نظر من بهتره از وقفه تایمر استفاده کنی
                به این صورت که دستورات مربوط به چک کردن اون سنسور رو توی زیر روال وقفه تایمر مینویسی. زمان تایمر رو هم میذاری روی مقداری که مد نظرته
                http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

                دیدگاه


                  #9
                  پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                  من a=1 رو اونجا که گفتید گزاشتم و شرط رو هم تو برنامم گزاشتم ولی این طوری همش a=1 بود نمیشه a رو یه جایه دیگه بزارم چون اونجا جواب نمیده
                  با اینکه بعد از شرط مثله شما a=0 میکردم ولی چون همشa=1 میشد بازم هم پشت get گیر میکرد

                  دیدگاه


                    #10
                    پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                    نوشته اصلی توسط ali.ra
                    تو کدویژن وقتی uart رو فعال می کنی اینراپت reciver رو هم فعال کن بعد دنیال این قسمت برنامه بگرد

                    // USART Receiver interrupt service routine
                    interrupt [USART_RXC] void usart_rx_isr(void)
                    {
                    char status,data;
                    status=UCSRA;
                    data=UDR;
                    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                    {
                    rx_buffer[rx_wr_index++]=data;
                    #if RX_BUFFER_SIZE == 256
                    // special case for receiver buffer size=256
                    if (++rx_counter == 0) rx_buffer_overflow=1;
                    #else
                    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
                    if (++rx_counter == RX_BUFFER_SIZE)
                    {
                    rx_counter=0;
                    rx_buffer_overflow=1;
                    }
                    #endif
                    }
                    // این جا می تونی برنامه بنویسی چیزی که گرفته تو کاراکتر data هستش می تونی همین جا استقاده کنی که نخواد تو برنامت چک کنی اگه نه هم می تونی اینجا بنویسی
                    a=1;
                    }

                    while(1){
                    if(a==1) {
                    get();
                    a=0;
                    };
                    }
                    من a=1 رو اونجا که گفتید گزاشتم و شرط رو هم تو برنامم گزاشتم ولی این طوری همش a=1 بود نمیشه a رو یه جایه دیگه بزارم چون اونجا جواب نمیده
                    با اینکه بعد از شرط مثله شما a=0 میکردم ولی چون همشa=1 میشد بازم هم پشت get گیر میکرد

                    دیدگاه


                      #11
                      پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                      if(a==1) رو اشتباه نکردین چون زیاد اشتباه می شه که یک مساوی گذاشته بشه و شرط هم همیشه درست می شه و ...
                      تنها موردی که باعث می شه دوباره گیر کنه اینه که اینقدر سریع دیتا بیاد که هر دفعه دیتایی واسه خوندن وجود داشته باشه
                      من این روش رو بار ها به کار بردم و جواب گرفتم

                      اگه بازهم جواب نگرفتید اگه مایل بودید بخشی از کد رو بزارید یا بیشتر توضیح بدید که مشکل مرتفع بشه
                      التماس دعا

                      دیدگاه


                        #12
                        پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                        نوشته اصلی توسط ali.ra
                        if(a==1) رو اشتباه نکردین چون زیاد اشتباه می شه که یک مساوی گذاشته بشه و شرط هم همیشه درست می شه و ...
                        تنها موردی که باعث می شه دوباره گیر کنه اینه که اینقدر سریع دیتا بیاد که هر دفعه دیتایی واسه خوندن وجود داشته باشه
                        من این روش رو بار ها به کار بردم و جواب گرفتم

                        اگه بازهم جواب نگرفتید اگه مایل بودید بخشی از کد رو بزارید یا بیشتر توضیح بدید که مشکل مرتفع بشه
                        سلام
                        نه مشکل مساوی رو ندارم
                        من هم فکر میکنم مشکل سرعت باشه البته دیتای اصلی نه فکر میکنم دایم دیتای جرت و پرت میاد البته حدس میزنم
                        چون وقتی سیم های سریال رو قطع میکنم دیگه گیر نمیکنه برنامه و دایم تو حلقه میچرخه

                        اضافه شده در تاریخ :
                        بعد من وقفه ارسال رو هم فعال کردم
                        اون مشکلی ایجاد نمیکنه?

                        دیدگاه


                          #13
                          پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                          نوشته اصلی توسط mohammadt3000
                          سلام
                          نه مشکل مساوی رو ندارم
                          من هم فکر میکنم مشکل سرعت باشه البته دیتای اصلی نه فکر میکنم دایم دیتای جرت و پرت میاد البته حدس میزنم
                          چون وقتی سیم های سریال رو قطع میکنم دیگه گیر نمیکنه برنامه و دایم تو حلقه میچرخه

                          اضافه شده در تاریخ :
                          بعد من وقفه ارسال رو هم فعال کردم
                          اون مشکلی ایجاد نمیکنه?
                          فکر نمی کنم مشکل از اینتراپت ارسال باشه اما فعال نشه بهتر هستش فقط rx میکرو رو pull up کنید با 5 کیلو خوبه ببینید چطور می شه
                          التماس دعا

                          دیدگاه


                            #14
                            پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                            نوشته اصلی توسط ali.ra
                            فکر نمی کنم مشکل از اینتراپت ارسال باشه اما فعال نشه بهتر هستش فقط rx میکرو رو pull up کنید با 5 کیلو خوبه ببینید چطور می شه
                            سلام
                            پول پ هم کردم مشکل حل نشد
                            توی تنظیمات کدویزارد بافر رو روی چند بزارم?
                            من روی 64 گزاشتم


                            روی 96 گزاشتم بازم درست نشد

                            دیدگاه


                              #15
                              پاسخ : توقف برنامه پشت دستور get در ارتباط سریال

                              بافر مشکل رو حل نمی باد ریت چقدر هستش؟
                              التماس دعا

                              دیدگاه

                              لطفا صبر کنید...
                              X