اطلاعیه

Collapse
No announcement yet.

راه اندازی 10 عدد 7Segment

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

    راه اندازی 10 عدد 7Segment

    با سلام خدمت همه اساتید محترم
    پروژه ای دارم که در آن باید تعداد 10 عدد 7segment را از طریق میکرو مگا 32 راه اندازی کنم. به دو علت زیر نمایش با پرش و طبیعتن کاهش شدت نور همراه است:
    - تعداد زیاد 7سگمنت ها
    - در این برد از NTC بعنوان سنسور دما استفاده کردم که چون نمودار آن غیر خطیست، ناچار به ازای هر درجه حرارت یه خط دستور دارم و اندازه گیری دما زمان بر میشود ( امکان تغییر سنسور دما وجود ندارد)
    7 segment ها از نوع آند مشترک بوده و از طریق Refresh کردن روشن میشوند.
    آیا راه بهتری ( با کمترین المان های سخت افزاری) برای کنترل 7segment ها وجود دارد؟

    با تشکر

    #2
    پاسخ : راه اندازی 10 عدد 7Segment

    سلام. شیلد هایی برای آردینو وجود داره که به استفاده از رابط دیتا (مثلا I2C یا سریال) یک مجموعه سگنمت رو درایو می کنه.

    سوال >> بافر واسط بین میکرو و سگمت ها چیه؟ موازی (245**74) یا شیفت رجیستر (595**74)
    راهنمایی >> چون پروسه قرائت دما زمان بر است بهتره برای جلوگیری از پرش زیاد و کم نور شدن رفرش سگمنت ها در تایمر میکرو قرار گیرد.
    راهنمایی >> فرکانس کاری پردازنده رو بالا ببرید و بررسی کنید هر عددی از روی سگمنت ها که تغییر نکرده در رفرش خاموش نگردد.
    STM32 واقعا یه چیز دیگه است...

    دیدگاه


      #3
      پاسخ : راه اندازی 10 عدد 7Segment

      سوال >> بافر واسط بین میکرو و سگمت ها چیه؟ موازی (245**74) یا شیفت رجیستر (595**74)
      74245 هستش، منتها در تست ها متوجه شد که بجای بافر از ترانزیستور استفاده کنم ، شدن نور بیشتر است.

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

      فرکانس کاری پردازنده رو بالا ببرید و بررسی کنید هر عددی از روی سگمنت ها که تغییر نکرده در رفرش خاموش نگردد.
      فرکانس روی 16 مگ است، گرچه در تست ها متوجه شدم که بین 8 تا 16 مگ تفاوت چندانی نیست.
      برای قسمت دوم سوالتون چه جوری میتونم اینکار رو بکنم؟ مثلن برای دما دو سون سگمنت قراردادم . در هر بار رفرش دهگان و صدگان اون رو جدا میکنم و نمایش میدم

      دیدگاه


        #4
        پاسخ : راه اندازی 10 عدد 7Segment

        نوشته اصلی توسط Mohammad am
        74245 هستش، منتها در تست ها متوجه شد که بجای بافر از ترانزیستور استفاده کنم ، شدن نور بیشتر است.
        استفاده از ترانزیستور برای 10 سون سگمنت! باید 80 عدد ترانزیستور استفاده بشه که غیر منطقی است!! به جای این کار مقدار مقاومت متصل به سگمنت ها رو کم کنید. مثلا 220 اهم یا 330 اهم.

        نوشته اصلی توسط Mohammad am
        میشه لطفن قدری بیشتر توضیح دهید؟
        شما احتمالا برای تولید عدد بر روی سون سگمنت ها ابتدا دما را از سنسور دریافت می کنید و پس از پردازش با استفاده از رفرش بر روی سگمنت ها نمایش می دهید! برای جلوگیری از ایجاد زمان قطع در حین قرائت دیتا و پردازش پروسه نمایش عدد بر روی سون سگمنت ها را در یکی از تایمر های میکرو قرار دهید و فقط مقدار متغیر ها را به روز کنید.

        نوشته اصلی توسط Mohammad am
        برای قسمت دوم سوالتون چه جوری میتونم اینکار رو بکنم؟ مثلن برای دما دو سون سگمنت قراردادم . در هر بار رفرش دهگان و صدگان اون رو جدا میکنم و نمایش میدم
        به عنوان مثال سنسور عدد 24.76 رو به میکرو می دهد. شما ابتدا باید ارقام را تفکیک کنید >> 6 7 4 2 سپس بر روی سگمنت ها نمایش دهید حال اگر عدد قبلی تولید توسط سنسور 24.32 بوده می توان از ارسال دیتای دو رقم صحیح خودداری کرد و فقط اعداد بخش اعشاری را بر روی سگمنت ها بروز کرد. در 74245 فکر کنم این کار (عدم تغییر دیتای پایه ها یا به اصطلاح لچ کردن) با H کردن پایه 19 امکان پذیر است و یا با استفاده از 74573 یا 74595 که اگر با شیفت رجیسترها کار کرده اید 74595 به علت اشغال کمتر پایه های میکرو و ساده سازی طراحی PCB بهتر است، امکان پذیر می باشد.

        ضمنا در این مورد مطمئن نیستم ولی شاید بی تاثیر نباشد >>> ترانزیستور متصل به هر سگمنت که وظیفه قطع و وصل پایه مشترک را دارد بهتر است از نوع فرکانس بالا انتخاب شود تا در ارتقای سرعت رفرش اختلالی به وجود نیاید.

        موفق باشید
        STM32 واقعا یه چیز دیگه است...

        دیدگاه


          #5
          پاسخ : راه اندازی 10 عدد 7Segment

          از یک میکروی atmega و یک max7219 استفاه کن. (برای 8 تا سون سگمنت). هر کدوم از آی سی max7219 می تونه 8 تا سون سگمنت رو درایو کنه.
          به جای پول دادنبه میکروی بزرگتر می تونی از یک mega8 استفاده کنی.
          ---------
          .
          .
          ...........

          دیدگاه


            #6
            پاسخ : راه اندازی 10 عدد 7Segment

            استفاده از ترانزیستور برای 10 سون سگمنت! باید 80 عدد ترانزیستور استفاده بشه که غیر منطقی است!! به جای این کار مقدار مقاومت متصل به سگمنت ها رو کم کنید. مثلا 220 اهم یا 330 اهم.
            چرا 80 تا؟؟!! 10 تا سون سگمنت است پس 10 تا ترانزیستور نیازه، پایه های دیتای A تا G هم که همگی مشترک و مستقیم به میکرو وصل هستند ( بخاطر تعداد زیاد سون سگمنت ها، ولتاژ متوسطی که روی هر سگمنت میفته زیر 0.5 ولت است و عملن نیازی به مقاومت نداره)

            شما احتمالا برای تولید عدد بر روی سون سگمنت ها ابتدا دما را از سنسور دریافت می کنید و پس از پردازش با استفاده از رفرش بر روی سگمنت ها نمایش می دهید! برای جلوگیری از ایجاد زمان قطع در حین قرائت دیتا و پردازش پروسه نمایش عدد بر روی سون سگمنت ها را در یکی از تایمر های میکرو قرار دهید و فقط مقدار متغیر ها را به روز کنید.
            متاسفانه متوجه نشدم :angry: :angry:

            اضافه شده در تاریخ :
            به عنوان مثال سنسور عدد 24.76 رو به میکرو می دهد. شما ابتدا باید ارقام را تفکیک کنید >> 6 7 4 2 سپس بر روی سگمنت ها نمایش دهید حال اگر عدد قبلی تولید توسط سنسور 24.32 بوده می توان از ارسال دیتای دو رقم صحیح خودداری کرد و فقط اعداد بخش اعشاری را بر روی سگمنت ها بروز کرد. در 74245 فکر کنم این کار (عدم تغییر دیتای پایه ها یا به اصطلاح لچ کردن) با H کردن پایه 19 امکان پذیر است و یا با استفاده از 74573 یا 74595 که اگر با شیفت رجیسترها کار کرده اید 74595 به علت اشغال کمتر پایه های میکرو و ساده سازی طراحی PCB بهتر است، امکان پذیر می باشد
            اگه بخوام Latch کنم که اونوقت باید برای هر سگمنت یه لچ بذارم، اونوقت میشه 10 تا لچ

            از یک میکروی atmega و یک max7219 استفاه کن. (برای 8 تا سون سگمنت). هر کدوم از آی سی max7219 می تونه 8 تا سون سگمنت رو درایو کنه.
            این آی سی در ایران هست؟

            دیدگاه


              #7
              پاسخ : راه اندازی 10 عدد 7Segment

              ین آی سی در ایران هست؟
              غیر ارجینالش رو پایا الکترونیک داره
              از آنجایی که آموزش ماهی گیری برای من بسیار مهم تر هستش، به همین خاطر، در این انجمن، تاجایی که بتونم جواب مطلبی رو مستقیم نمیگم و تلاش میکنم با آدرس دادن و کمی جستجو به جواب برسید. اگر عاشق الکترونیک باشید، دنبال جواب خواهید گشت.

              دیدگاه


                #8
                پاسخ : راه اندازی 10 عدد 7Segment

                ز یک میکروی atmega و یک max7219 استفاه کن. (برای 8 تا سون سگمنت). هر کدوم از آی سی max7219 می تونه 8 تا سون سگمنت رو درایو کنه.
                دیتاشیتش رو نگاه کردم، برای کاتد مشترکه.
                ازون گذشته، این آی سی هم به عنوان درایور هستش، اگه اشتباه نکنم مثلن مثل 7447، آیا مزیتی برای استفاده در پروژم داره؟

                دیدگاه


                  #9
                  پاسخ : راه اندازی 10 عدد 7Segment

                  نوشته اصلی توسط Mohammad am
                  فرکانس روی 16 مگ است، گرچه در تست ها متوجه شدم که بین 8 تا 16 مگ تفاوت چندانی نیست.
                  برای قسمت دوم سوالتون چه جوری میتونم اینکار رو بکنم؟ مثلن برای دما دو سون سگمنت قراردادم . در هر بار رفرش دهگان و صدگان اون رو جدا میکنم و نمایش میدم
                  این که در هر بار ریفرش مقدار عدد رو تبدیل میکنید کارایی دستکاه رو بسیار کم میکنه
                  روش بهتر اینه که پس از هر بار خواندن دما اون رو تنها یکبار تبدیل کنید و در یک بافر قرار دهید
                  و در هر ریفرش تنها این بافر رو به پورت ارسال کنید.
                  به این روش مقدار بسیار زیادی از بار پردازشی دستگاه کم میشه
                  If the wind will not serve, take to the oars

                  دیدگاه


                    #10
                    پاسخ : راه اندازی 10 عدد 7Segment

                    ش بهتر اینه که پس از هر بار خواندن دما اون رو تنها یکبار تبدیل کنید و در یک بافر قرار دهید
                    و در هر ریفرش تنها این بافر رو به پورت ارسال کنید.
                    به این روش مقدار بسیار زیادی از بار پردازشی دستگاه کم میشه
                    بافر سخت افزاری؟
                    چون در هر لحظه ممکنه دما تغییر کنه، بنابراین ناچارم که محاسبات دما رو مجدد انجام بدم.

                    اگر سوالم خیلی ابتدایی هستش عذر میخوام.

                    دیدگاه


                      #11
                      پاسخ : راه اندازی 10 عدد 7Segment

                      نوشته اصلی توسط Mohammad am
                      بافر سخت افزاری؟
                      چون در هر لحظه ممکنه دما تغییر کنه، بنابراین ناچارم که محاسبات دما رو مجدد انجام بدم.

                      اگر سوالم خیلی ابتدایی هستش عذر میخوام.
                      نه. منظورم از بافر یک آرایه ی کاراکتری هست .
                      برای نمونه شما در هر صد میلی ثانیه یکبار مقدار دما رو می خواید بخونید. ولی سون سگمنت ها باید در هر ده میلی ثانیه رفرش بشن.
                      کاری که شما کردید اینه که در هر ریفرش دارید دهگان صدگان و .... رو محاسبه میکنید درحالی که در این زمان تغییراتی ندارید
                      روش بهتر اینه که بیاید یکبار (نرخ نمونه برداری که از دما دارید) وقتی که دما رو دارید می خونید این محاسبات رو انجام بدید و نتیجه ی اون رو در آرایه قرار دهید
                      و تابع نمایش شما در هر دیفرش بیاد داده های این آرایه رو به خروجی پورت که پایه های سون سگمنت هست ارسال کنه. همه چی نرم افزاری هستش
                      به این روش مقدار بسیار زیادی از بار پردازشی دستگاه شما کم میشه
                      در کتاب مهندس سپاس یار راه اندازی سون سگمت رو گفته. جداول کاتد مشترک و آند مشترک رو هم محاسبه کرده
                      If the wind will not serve, take to the oars

                      دیدگاه


                        #12
                        پاسخ : راه اندازی 10 عدد 7Segment

                        نه. منظورم از بافر یک آرایه ی کاراکتری هست .
                        یعنی به عبارت ساده تر برای انکه از تایمر هم استفاده نکنم اینجوری میشه که:
                        در ریفرش اول دما رو در ورودی بخونم، محاسبات رو انجام بدم و در آرایه ذخیره کنم و نمایش بدم .
                        در ده ریفرش بعدی چون تغییرات دما لخت هستش، فقط مقدار درون آرایه رو نمایش بدم، در ریفرش 11ام مجدد دما رو بخونم و الی آخر....

                        درست متوجه شدم؟

                        دیدگاه


                          #13
                          پاسخ : راه اندازی 10 عدد 7Segment

                          نوشته اصلی توسط Mohammad am
                          یعنی به عبارت ساده تر برای انکه از تایمر هم استفاده نکنم اینجوری میشه که:
                          در ریفرش اول دما رو در ورودی بخونم، محاسبات رو انجام بدم و در آرایه ذخیره کنم و نمایش بدم .
                          در ده ریفرش بعدی چون تغییرات دما لخت هستش، فقط مقدار درون آرایه رو نمایش بدم، در ریفرش 11ام مجدد دما رو بخونم و الی آخر....

                          درست متوجه شدم؟
                          بله درسته.
                          ولی در هر صورت باید از وقفه ی تایمر استفاده کنید (هیچ اجباری نیست و میتونید همین رو هم در مسیر اصلی برنامه انجام بدید ولی بهتره اینکار رو نکنید)
                          محاسبات و کد های تبدیل و غیره در مسیر اصلی برنامه انجام میشه
                          نمایش در خروجی رو هم وقفه تایمر انجام میده. چون نمایش داده ها در سون سگمنت بصورت ریفرشی هست باید منظم انجام بشه و نباید در نمایش تاخیر بوجود بیاد
                          If the wind will not serve, take to the oars

                          دیدگاه


                            #14
                            پاسخ : راه اندازی 10 عدد 7Segment

                            نمایش در خروجی رو هم وقفه تایمر انجام میده. چون نمایش داده ها در سون سگمنت بصورت ریفرشی هست باید منظم انجام بشه و نباید در نمایش تاخیر بوجود بیاد
                            الان برنامه به اینصورت هستش که محاسبات در یک تابع ، نمایش در تابعی دیگر و اطلاعات مورد نیاز نمایش از طریق جدول Lookup هستش . فراخوانی تابع ها هم در حلقه اصلی است.
                            شما می فرمایید که به جای فراخوانی تابع بهتره که فراخوانی در وقفه تایمر انجام بشه؟

                            دیدگاه


                              #15
                              پاسخ : راه اندازی 10 عدد 7Segment

                              نوشته اصلی توسط Mohammad am
                              الان برنامه به اینصورت هستش که محاسبات در یک تابع ، نمایش در تابعی دیگر و اطلاعات مورد نیاز نمایش از طریق جدول Lookup هستش . فراخوانی تابع ها هم در حلقه اصلی است.
                              شما می فرمایید که به جای فراخوانی تابع بهتره که فراخوانی در وقفه تایمر انجام بشه؟
                              همه ی محاسبات و تبدیل ها در مسیر اصلی برنامه انجام میشه. بجر نمایش اون ها که در وقفه هستش
                              تقریبا به این شکل:

                              [code=c]
                              #define segment_data_port PORTA
                              #define SEGMENTS_COUNT 5
                              flash char lookup[] = {...};
                              flash char charmap[SEGMENTS_COUNT] = {...};

                              void display(){
                              static char index = 0;
                              index++;
                              if(index >= SEGMENTS_COUNT) index = 0;
                              segment_data_port = lookup[charmap[index]];
                              }

                              interrupt {
                              display();
                              }

                              [/code]
                              کاری که انجام میشه اینه که ما یه آرایه داریم به نام lookup که کد های کاراکترها رو نگهداری میکنه (اندازه برابر کاراکترهایی که در نمایش نیاز هست)
                              حالا یه آرایه هم هست به نام charmap که اندیس اعداد تبدیل شده رو داره(بعد از خواندن دما و تبدیل اون) که تعدادش برابر تعداد سگمنت ها هست (نظیر به نظیر)
                              توی تابع وقفه فقط یه جایگذاری ساده برای نمایش انجام میشه و با این کار حجم پردازش ها بسیار پایین میاد
                              If the wind will not serve, take to the oars

                              دیدگاه

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