اطلاعیه

Collapse
No announcement yet.

ریست متغیرها!

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

    ریست متغیرها!

    سلام دوستان
    من یه برنامه دارم که متغییر بد از این که از وقفه سریال یه مقداری رو دریافت کرد همون باقی میمونه!
    به نظرتون از چه روشی استفاده کنم که وقتی دیگه دیتا رو روی USART ندارم میکرو متوجه شه!
    نمیدونم تونستم متظورمو بگم!

    #2
    پاسخ : ریست متغیرها!

    نوشته اصلی توسط ehsancompany
    نمیدونم تونستم متظورمو بگم!
    اصلا

    دیدگاه


      #3
      پاسخ : ریست متغیرها!

      نوشته اصلی توسط mojalan
      اصلا
      خوب بینین
      وقتی وقفه سریال فعاله اگه دیتایی از پایه RX وارد میکرو بشه مقدار ascii اون در ریجیستر UDR ذخیره میشه
      مثلا 13 رو بر میگردونه .!اوکی؟
      حالا بعد از این که از طرف دیگه دیتا ارسال نشد
      بایستی میکرو بفهمه که دیگه خبری نیست!
      اما چه طور ؟! :NO:
      خوب انگار مقدار قبلی در ریجیستر UDR ذخیره میشه
      من میخوام وقتی دیتایی نیومد دیگه متغییره صفر بشه

      دیدگاه


        #4
        پاسخ : ریست متغیرها!

        دو تا راه به ذهن من میرسه
        اول اینکه دیتایی رو که داره به میکرو میرسه اگر دست تو هست یک کاراکتر برای انتهاش تعریف کن یا بهتر بگم به صورت یک فریم پدر مادر دار درش بیار و start , stop , check sum هم براش بزار.
        اینجوری میتونی با بک تابع ساده تو روتین سریالت و یه پردارش کوچیک انتهای فریمت رو بفهمی.
        دوم اینکه اگر دیتای دریافتی یکدفعه وارد میکرو میشه و فاصله زمانی بین بایتهای ارسالی از بیرون در یک سری ارسال وجود نداره میتونی یک تایمر رو ابتدای روتین سریالت صفر کنی و وقتی تایمرت Overflow داد میفهمی که داده هات تمام شدن.

        دیدگاه


          #5
          پاسخ : ریست متغیرها!

          با چه زبانی برنامه مینویسی ؟
          اگر با وقفه دریافت کنی که قطعا این مورد رو نداری
          هميشه به ياد خدا باش !

          دیدگاه


            #6
            پاسخ : ریست متغیرها!

            با بسکام کار میکنم
            من برای پروژه GSM میخوام پس دیتا رو نمیتونم با start /stop bit و چک سام کار کنم .درسته؟!
            در ضمن من کل کارم با وقفه ها هستش
            منظورتونو گرفتم
            من خودم میخوام با WDT بیامو هر 2 ثانیه ریست انجام بدم!
            ولی میخوام یه اینجور چیزی باشه
            if no data then variable=0 (البته این خط الگوریتمشه)
            میشه یه همچین چیزی؟!

            دیدگاه


              #7
              پاسخ : ریست متغیرها!

              سلام

              همونطور که دوستمون امیر . م اشاره کرده شما میتونی تایمر یک رو تو وقفه سریال مقدار دهی کنی و بعد استارت بزنی حالا اگه تا زمانی که تایمر overflow نشده دیتایی دریافت نشه وقفه سرریز تایمر فعال میشه
              داخل روتین وقفه تایمر با set کردن یک متغییر به بدنه برنامه اطلاع میدی که دیتایی برای دریافت وجود نداره
              ضمنا باید تو همین روتین وقفه سرریز. تایمر رو هم متوقف کنی که سیکل وقفه تایمر تکرار نشه

              دیدگاه


                #8
                پاسخ : ریست متغیرها!

                نوشته اصلی توسط majid sh
                سلام

                همونطور که دوستمون امیر . م اشاره کرده شما میتونی تایمر یک رو تو وقفه سریال مقدار دهی کنی و بعد استارت بزنی حالا اگه تا زمانی که تایمر overflow نشده دیتایی دریافت نشه وقفه سرریز تایمر فعال میشه
                داخل روتین وقفه تایمر با set کردن یک متغییر به بدنه برنامه اطلاع میدی که دیتایی برای دریافت وجود نداره
                ضمنا باید تو همین روتین وقفه سرریز. تایمر رو هم متوقف کنی که سیکل وقفه تایمر تکرار نشه
                اگه امکانش هست با بیسیک یا سی یه نمونه کد بزارین
                فک کنم با این حل بشه

                دیدگاه


                  #9
                  پاسخ : ریست متغیرها!

                  توی دستورات بسکام این مورد هستش
                  یه نگاهی به help بنداز میبینیش
                  موفق باشی
                  هميشه به ياد خدا باش !

                  دیدگاه


                    #10
                    پاسخ : ریست متغیرها!

                    اینم یه کد مفهومی با کامپایلر کدویژن:

                    کد:
                    #define Timer1Start TCCR1B=0x05
                    #define Timer1Stop  TCCR1B=0x00
                    #define Timeout   xxxx // set time for 2sec
                    
                    char  All_data_recived;
                    
                    
                    
                    // USART Receiver interrupt service routine
                    interrupt [USART_RXC] void usart_rx_isr(void)
                    {
                      data=UDR;
                      .
                      .
                      .
                      TCNT1 = Timeout;
                      Timer1Start;
                    }
                    
                    
                    // Timer1 overflow interrupt service routine
                    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                    {
                      Timer1Stop;
                      All_data_recived = 1;
                    }
                    توی بدنه اصلی برنامه متغییر All_data_recived رو چک میکنیم اگه یک بود یعنی یه پک دیتا بصورت کامل دریافت شده

                    دیدگاه

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