اطلاعیه

Collapse
No announcement yet.

پورت سریال

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

    پورت سریال

    سلام.

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

    با تشکر.

    #2
    پاسخ : پورت سریال

    منتظر پاسخ شما دوستان گرامی هستم.

    با تشکر.

    دیدگاه


      #3
      پاسخ : پورت سریال

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

      دیدگاه


        #4
        پاسخ : پورت سریال

        در حالتیکه در روال int0 وقفه ها غیر فعال بشن و این روال اونقدر طول بکشه که بیش از ظرفیت بافر سریال (معمولا دو تا) داده دریافت بشه داده های اضافی از بین میره

        دیدگاه


          #5
          پاسخ : پورت سریال

          نوشته اصلی توسط mojalan
          در حالتیکه در روال int0 وقفه ها غیر فعال بشن و این روال اونقدر طول بکشه که بیش از ظرفیت بافر سریال (معمولا دو تا) داده دریافت بشه داده های اضافی از بین میره
          میشه در مورد قسمتی که با رنگ قرمز مشخص شده بیشتر توضیح بدید من درست متوجه نشدم.
          ممنون

          دیدگاه


            #6
            پاسخ : پورت سریال

            با سلام.

            اما عملا باید راهی وجود داشته باشه تا وقتی در حال دریافت کاراکتر از پورت سریال هستیم و در این لحظه وقفه int0 اتفاق افتاد این وقفه اجرا بشه و پس از برگشت از روتین وفقه کاراکترهای باقی مانده دریافت بشه. تا اونجایی که من میدونم یک کاراکتر در واقع یک بایته که دارای بیتهای شروع و توقفه و چون در ارتباط سریال بایت به بایت اطلاعات ارسال میشه نباید با وقوع int0 کاراکتری از بین بره!
            اگه راهی بنظرتون میرسه مشتاق یادگیری و کمک شما دوستان هستم.

            با تشکر.

            دیدگاه


              #7
              پاسخ : پورت سریال

              1- معمولا پورتهای سریال دارای بافر دوبل سخت افزاری هستند یعنی اینکه در حالیکه یه داده (یک بایت) دریافت شده می تونند داده دوم رو هم دریافت کنند (ولی داده سوم خطای over write میده)
              2- در بسیاری از میکروها ؛ در روال یک وقفه؛ وقفه های دیگه بطور اتوماتیک(سخت افزاری) غیر فعال میشن ولی در AVR فکر میکنم اینطور نیست نمونش همین روال وقفه ای که کدویژن برای پورت سریال میسازه و در ابتدای اون با دستور cli وقفه ها رو غیر فعال میکنه و در آخر اون وقفه ها دوباره با sei فعال میشن.
              3- شما میتونید از "وقفه در وقفه"!!! استفاده کنید یعنی در روال یک وقفه وقفه های دیگه رو غیر فعال نکنید تا در صورت رویداد یک وقفه در حین اجرای روال یک وقفه دیگه؛ بتونید به کارهای اون برسید.
              همونطور که گفتم در اینحالت توجه به زمانبندی برای جلوگیری از رویداد خطا (مثل همین دریافت بیش از دو بایت در بافر سخت افزاری ) راهگشاست
              4- پیشنهاد میکنم هممون(اول از همه خودم ) بشینیم یه بار فصل مربوط به وقفه های میکرو رو از دیتاشیت بخونیم

              دیدگاه


                #8
                پاسخ : پورت سریال

                نوشته اصلی توسط mojalan
                1- معمولا پورتهای سریال دارای بافر دوبل سخت افزاری هستند یعنی اینکه در حالیکه یه داده (یک بایت) دریافت شده می تونند داده دوم رو هم دریافت کنند (ولی داده سوم خطای over write میده)
                2- در بسیاری از میکروها ؛ در روال یک وقفه؛ وقفه های دیگه بطور اتوماتیک(سخت افزاری) غیر فعال میشن ولی در AVR فکر میکنم اینطور نیست نمونش همین روال وقفه ای که کدویژن برای پورت سریال میسازه و در ابتدای اون با دستور cli وقفه ها رو غیر فعال میکنه و در آخر اون وقفه ها دوباره با sei فعال میشن.
                3- شما میتونید از "وقفه در وقفه"!!! استفاده کنید یعنی در روال یک وقفه وقفه های دیگه رو غیر فعال نکنید تا در صورت رویداد یک وقفه در حین اجرای روال یک وقفه دیگه؛ بتونید به کارهای اون برسید.
                همونطور که گفتم در اینحالت توجه به زمانبندی برای جلوگیری از رویداد خطا (مثل همین دریافت بیش از دو بایت در بافر سخت افزاری ) راهگشاست
                4- پیشنهاد میکنم هممون(اول از همه خودم ) بشینیم یه بار فصل مربوط به وقفه های میکرو رو از دیتاشیت بخونیم
                ممنونم mojalan عزیز از توضیحات عالی تون.
                اینطوری که من متوجه شدم مثلا میتونیم با فعال نگه داشتن وقفه 0 هنگامی که در حال دریافت داده سریال هستیم بایت دوم رو نیز ذخیره کنیم؟
                در صورتیکه بله چطور میتونم در هنگام فعال شدن یه وقفه، وقفه 0 رو نیز فعال نگه داریم؟

                دیدگاه


                  #9
                  پاسخ : پورت سریال

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

                  دیدگاه


                    #10
                    پاسخ : پورت سریال

                    سلام,
                    یک راه استفاده از DMA همراه با پورت سریال است؛ میکرو های جدید معمولا DMA دارند؛ وظیفه ی DMA گرفتن دیتا از یک پورت و کپی کردن آن در حافظه است، با این کار عملا مثل بافر با آن کار میکنیم.
                    ولی همیشه راهی برای از بین رفتن داده وجود دارد؛ بای حل مشکلات باید از پروتکل های لایه بالاتر استفاده کنید. اگر خیلی دیتا حیاتی است برای مثال یک دستور که باید به درستی برداشت شود، استفاده از پروتکلی مثل modbus شاید خوب باشد.
                    { خلاف قوانین - پاک شد }

                    دیدگاه

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