اطلاعیه

Collapse
No announcement yet.

;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

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

    ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

    سلا م به همه دوستان
    میخواستم بپرسم چطور میشه مثلا 1200 عدد کلید فشاری و 1200 عدد led داشته باشیم و بخوایم که با فشار دادن هر کلید فشاری، led متناظر باهاش روشن بشه.(تا اینجاش که کاری نداره) اما مثلا کلید فشاری شماره 25 رو میزنیم و led شماره 25 روشن میشه ، حالا با فشار دادن کلید فشاری شماره 30 ، led شماره 25 خاموش و led شماره 30 روشن بشه.(توتعداد زیاد موندم)

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

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

    سگمنت رو درایو میکنه ،که میشه از بقیه پایه هاش استفاده کرد.(اگر با این میکرو ها حل بشه که خیلی بهتره تا قطعه جدیدی نخواد.یه جورایی به نظر میرسه باید تمام این میکرو ها از همدیگه اطلا
    ع داشته باشن.اولش فکر کردم خیلی راحت باشه اما هر چی فکر کردم نشد
    جدیدترین ویرایش توسط aninventor; ۱۰:۳۱ ۱۳۹۷/۰۴/۲۹.

    #2
    پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

    درود ، واقعا وجود این همه کلید و led نیازه ؟
    یعنی نمیشه کلید ها به صورت کیپد باشه و عدد وارد کنیم و به جای led از سگمنت و نمایش شماره استفاده کنیم ؟

    اگر نیازه ، هر میکرو می*تونه یک عدد اختصاصی داشته باشه که همون عدد دکمه کنارش هست ، وقتی فشرده میشه از طریق یک مسیر مشترک که می*تونه i2c یا پروتکل دیگه باشه برای یک میکرو اطلاعات رو ارسال کنه . اون هم led مربوطه روشن کنه .

    دیدگاه


      #3
      پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

      ممنونم
      راستش آره یه مانیتورینگی دارم طراحی میکنم که بهتره اینجوری باشه.
      اما نمیشه برای یه همچین کاری از i2c یا پروتکل دیگه استفاده نکنم چون احتمالا این امکانات میکرو اشغال شده باشه.
      یه فکری امروز به ذهن رسید اونم اینه که مثلا پایه های A2 میکرو ها رو به هم وصل کنیم و زمانی که یکیشون یک شد تمام میکروها میفهمن که این پایه یک شده و خروجیشون رو ریست کنن و یه شرطی هم بذاریم که اگه ورودی خودش و A2 یک شد ریست نشه.
      امیدوارم توسته باشم منظورم رو برسونم.حالا نمیدونم اینجوری جواب میده یا نه

      دیدگاه


        #4
        پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

        سلام دوست عزیز,
        اگه کنار هر کلید یک میکرو داری (یعنی 1200 میکرو باهم), تقریبا با همون چیزایی که خودت گفتی, میشه این کار رو انجام داد:
        روش زیر پیشنهادی هست و امیدوارم دوستان دیگه هم مشارکت کنن و یا شروعی باشه برای حالت های بهتر....

        توی این کار من از دوتا وقفه صفر و یک هر میکروکنترلر استفاده کردم:
        وقفه صفر برای روشن کردن ال ای دی ها ( ال ای دی رو با صفر روشن میکنم که از منبع تغذیه جریان بکشه, نه از میکرو, فرض PORTB.0 برای روشن کردن ال ای دی هاست و تو برنامه اسمش رو گذاشتم LED)
        وقفه یک برای اعلام کردن به سایر میکروها که اگه ال ای دی روشن هست, خاموش بشه, به جز ال ای دی خود همون میکرو... ( در اینجا PORTB.1 رو در نظر گرفتم و تو برنامه اسمش رو دلخواه گذاشتم Enable)
        یه متغیر هم داریم به نام Status_LED که هر سری که وقفه شماره یک اتفاق میوفته, مقدارش کمو زیاد میشه و این برای این منظور هست که میکرو تشخیص بده ال ای دی مربوط به خودش رو اگه روشنه باید خاموش کنه یا نه
        , یا فرمان بده که ال ای دی های میکرو های دیگه خاموش بشن.....

        به لحاظ سخت افزار, پایه PORTB.1 یا همون Enable رو دادم به وقفه شماره یک هر میکرو,
        یعنی وقتی این پایه صفر بشه وقفه میکرو هم که با حالت (Falling Edge) تعریف شده, اونم فعال میشه, دستوراتش اجرا میشه و و به همین ترتیب تا آخر به همه میکروها اعلام میشه

        تحلیل برنامه:
        تعریف متغیر ها:


        #include <mega8.h>
        #include <delay.h>
        #define LED PORTB.0
        #define Enable PORTB.1
        unsigned int Status_LED=1;


        وقتی یک کلید فشار داده میشه, وقفه شماره صفر فعال میشه و دستورات زیر اجرا میشه:


        // External Interrupt 0 service routine
        interrupt [EXT_INT0] void ext_int0_isr(void)
        {


        LED=0;
        Status_LED --;
        Enable =0;


        }



        خط اول برای روشن کردن ال ای دی ( که همون طور گفتم ال ای دی ها رو با صفر روشن میکنم )
        خط دوم, یکی از مقدار فعلی متغیر Status_LED کم میکنه, تو مقدار دهی اول تو تعریف بهش یک دادیم, الان میشه صفر)
        خط سوم, PORTB.1 یا همون پایه Enable فعال میشه
        ای پایه وصله به وقفه شماره یک میکرو بعدی , چون صفر میشه در نتیجه دستورات وقفه شماره یک اون میکرو اجرا میشه:


        // External Interrupt 1 service routine
        interrupt [EXT_INT1] void ext_int1_isr(void)
        {


        Enable =0;
        Status_LED ++;
        if(Status_LED<2) {LED=0; Enable =0;}
        if(Status_LED>=2) {LED=1; Status_LED=1; Enable =0;}


        }


        خط دوم یکی به متغیر Status_LED اضافه میکنه: دو حالت پیش میاد:
        اگه این مقدار کمتر از دو باشه, معنیش اینه که کلید وقفه مربوط به این میکرو زده شده و درنتیجه باید ال ای در روشن بشه
        اگه بیشتر از دو باشه, فرمان میده که اگه این میکرو ال ای دی روشن داره, خاموش کنه, چون جایه دیگه ال ای دی روشن هست و تو هر سری وقفه های یک میکرو کنترلر فعال میشن تا در نهایت به اولین میکرو برگرده...
        در نهایت اون Enable یا همون PORTB.1 , رو تو حلقه بی نهایت یک کن که وقتی یکبار کل Loop انجام شد , غیر فعال بشه....

        یکبار با خودت تحلیل کنی, بهتر متوجه میشی....
        حالا این برنامه رو واسه هر 1200 میکرو باید بنویسی, PORTB.1 رو بدی به وقفه یک هر میکرو و میکرو بعدیش, و در نهایت PORTB.1 آخرین میکرو رو بدی به وقفه یک اولین میکرو....
        (شکل پایین من برای 4 تا میکرو گذاشتم, عین همینو واسه 1200 میکرو باید سیم کشی کنی)


        مسله ای که هست این که این روش به احتمال خیلی زیاد در عمل با کندی در روشن و خاموش کردن ال ای دی ها مواجه خواهد بود, چون 1200میکرو تا بخواد خونده بشه و برگرده و در عمل سیم کشی و کلاک و نوع میکرو و... تو عامل کندی تاثیر داره....
        تاپیک زیر رو هم مطالعه کن واسه حذف bounce کلیدها....
        دوستان یه سوال داشتم، راه حلی واسه دکمه پوش باتن وجود داره؟ من تو پروژم از شرط صفر و یک بودن پایه استفاده کردم ولی وقتی دکمه رو میزنم از هر سه بار فقط یه بار کار می کنه؟ دوستان، کسی پروژه آماده ای؟روشی؟راه حلی نداره؟


        باز دوستا اگه روش بهتر مد نظرشون بود عنوان کنن....

        جدیدترین ویرایش توسط Hamidreza.BRZ; ۱۵:۲۶ ۱۳۹۷/۰۴/۳۰.

        دیدگاه


          #5
          پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

          خیلی ممنونم
          میرم تو پروتیوس شبیه سازی کنم به هر نتیجه ای رسیدم خبر میدم

          دیدگاه


            #6
            پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

            مگه همه led ها کنار دکمه متناظرشون قرار داره ؟ قرار نیست جای دیگه led ها روشن بشن ؟ فقط هر دکمه رو زدیم مطمئن بشیم بقیه خاموش میشه ؟

            دیدگاه


              #7
              پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

              نوشته اصلی توسط Masood Ashoori نمایش پست ها
              مگه همه led ها کنار دکمه متناظرشون قرار داره ؟ قرار نیست جای دیگه led ها روشن بشن ؟ فقط هر دکمه رو زدیم مطمئن بشیم بقیه خاموش میشه ؟
              بله دقیقا همینطوره.
              هر میکرو و led و کلید فشاری(که البته کلید لمسی از نوع خازنیه) یکجا هستن.این مجموعه داخل یک دایره قرار داره. فاصله این دایره با دایره بعدی تقریبا 5 سانتی متره و همه این دایره ها با هم یک مستطیل بزرگ رو تشکیل میدن و همه این ها پشت شیشه دودی بزرگی قرار دارن که قراره طول اتاق کنترل رو پر کنه.:gathering:

              یه چیزی مثل شکل زیر:
              ...
              ...
              ...
              ...
              ...
              ...




              جدیدترین ویرایش توسط aninventor; ۰۴:۱۸ ۱۳۹۷/۰۴/۳۰.

              دیدگاه


                #8
                پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

                خب اینطوری راه ساده تری به فکرم رسید ، آقا حمیدرضا هم دستشون درد نکنه برنامه رو توضیح دادند


                یک سیم مشترک همه پین های مثلا b1 رو بهم وصل میکنیم .
                روی همه میکرو ها پین a1 به کلید وصل باشه .
                سمت میکرو کلید فشرده شده ، یک تابع خوانده بشه . که بیاد پین مشترک b1 رو high کنه و با یک delay کوتاه led خودش رو روشن کنه . این delay برای اینه که خودش خاموش نشه مجدد

                در سمت سایر میکرو ها ، شرط میذاریم اگر b1 در سطح high. led خودش رو خاموش کنه .

                دیدگاه


                  #9
                  پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

                  نوشته اصلی توسط Masood Ashoori نمایش پست ها
                  خب اینطوری راه ساده تری به فکرم رسید ، آقا حمیدرضا هم دستشون درد نکنه برنامه رو توضیح دادند


                  یک سیم مشترک همه پین های مثلا b1 رو بهم وصل میکنیم .
                  روی همه میکرو ها پین a1 به کلید وصل باشه .
                  سمت میکرو کلید فشرده شده ، یک تابع خوانده بشه . که بیاد پین مشترک b1 رو high کنه و با یک delay کوتاه led خودش رو روشن کنه . این delay برای اینه که خودش خاموش نشه مجدد

                  در سمت سایر میکرو ها ، شرط میذاریم اگر b1 در سطح high. led خودش رو خاموش کنه .
                  با سپاس
                  خوب اینجوری که شما میفرمایید ، باید بشه پایه ای که بعنوان out تعریف کردیم در همون زمان بعنوان in هم استفاده بشه.یعنی اگه ولتاژی به پایه out بدیم بشه اطلاعات اون پایه رو وارد میکرو کرد.
                  البته یه فکری جدیدا کردم که اگه ورودی کلید فشاری یک شد پایه مثلا c6 بصورت out بشه و اگه صفر شد بصورت in در بیاد.
                  به هر حال با کمک دوستان هر موقع با هر طرفندی به جواب رسیدم نتیجه رو میذارم.برم روش کار کنم

                  دیدگاه


                    #10
                    پاسخ : ;کنترل و مانیتورینگ برای ورودی و خروجی های بسیار زیاد بوسیه میکروکنترلر

                    با سلام
                    بالاخره با کمک دوستان موفق شدم .
                    روش کار این طور بود که ابتدا اگه ورودی(کلید فشاری) (پایه A0) یک بشه ، پایه مشترک بین همه میکرو ها یعنی A1 رو یه لحظه روشن خاموش میکنه(برای ریست کردن بقیه میکروها) و سپس پایه A2 (خروجی اصلی)(LED)رو روشن میکنه(ست میکنه)
                    سپس اگه ورودی صفر باشه و دستور ریست از طرف A1 صادر بشه پایه A2 رو خاموش میکنه.

                    میخوام که عکس ها و فایل HEX رو براتون بذارم.
                    اما هر کاری میکنم بلد نمیشم .لطفا راهنمایی کنید
                    جدیدترین ویرایش توسط aninventor; ۰۷:۴۰ ۱۳۹۷/۰۵/۰۱.

                    دیدگاه

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