اطلاعیه

Collapse
No announcement yet.

ساعت؟

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

    ساعت؟

    سلام
    یه برنامه خیلی ساده برای ساعت نوشتم :

    کد:
    $regfile = "m16def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.0 , Db5 = Pinc.1 , Db6 = Pinc.2 , Db7 = Pinc.3 , Rs = Pinc.4 , E = Pinc.5
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim Second As Byte
    Dim Minute As Byte
    Dim Hour As Byte
    
    Dim S(2) As Byte
    Dim M(2) As Byte
    Dim H(2) As Byte
    
    
    For Hour = 0 To 23
    For Minute = 0 To 59
    For Second = 0 To 59
    
    S(1) = Second Mod 10
    S(2) = Second / 10
    M(1) = Minute Mod 10
    M(2) = Minute / 10
    H(1) = Hour Mod 10
    H(2) = Hour / 10
    
    Cls
    Cursor Off
    Lcd H(2) ; H(1) ; ":" ; M(2) ; M(1) ; ":" ; S(2) ; S(1)
    Wait 1
    
    
    Next Second
    Next Minute
    Next Hour
    
    End
    سوالم اینه که چرا غیر از دستور wait خود میکرو هم تاخیر میندازه؟ چون نوع متغیر سرعت پردازش رو تغییر میده.
    آیا راهی هست که از روی برنامه ، زمان همه ی تاخیرها رو بدست بیاریم؟
    تو یه برنامه دیگر هم باید چند تا 7seg رو مالتی پلکس می کردم ، تغییر نوع متغیر کل برنامه رو بهم ریخت

    #2
    پاسخ : ساعت؟

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

    Lcd H(2) ; H(1) ; ":" ; M(2) ; M(1) ; ":" ; S(2) ; S(1)

    باید کلی عملیات در پس زمینه انجام بشه. و این عملیات زمان خودش رو داره. بنابراین wait 1 شما به اندازه 1 ثانیه به علاوه کلیه زمانهای جنبی وقت میبره. اگر بخواییم برای رفع این مشکل زمانهای فوق رو حساب کنیم تا اون رو از 1 ثانیه کذایی کم کنیم به ظاهر ممکنه برنامه درست کار کنه ولی باز هم با کوچکترین تغییر در داخل برنامه ممکنه این زمان جابجا بشه.
    برای رفع این مشکل راههای زیادی هست ولی یکی از راحتترین راهها استفاده از زمانبندی غیر همزمانی مثلا با استفاده از تایمر سیستم هست. این تایمر میتونه زمانهای مثلا یک ثانیه و حتی دقیقه و ساعت رو براتون محاسبه کنه فارغ از اینکه در کجای برنامه هستین. یعنی بطور تئوری پدیت کردن زمان ساعت جدای از انجام عملیات نمایشی باشه. بنا براین در کد اصلی تون احتیاجی به wait هم نخواهید داشت.
    ضمنا درست عمل ضرب یا تقسیم همیشه یکسان هستن. جمع همیشه جمع هست. ولی زمان انجام عمل جمع دو بایت با زمان انجام همین عمل برای دوتا float خیلی فرق میکنه. در صورتی که برای هردو؛ دستور یکیه. البته ظاهرا.

    a + b

    دیدگاه


      #3
      پاسخ : ساعت؟

      سلام اساتید
      دوتا سوال

      1- ما از کجا بدونیم که واسه اجرای یک تابع در بیسکام چقدر زمان لازمه ؟(توی اسمبل بود راحته همشون دستورن ولی توی بیسکام )

      2-یکی هم توی بیسکام اگه از تابع wait 1 استفاده بشه باید تاخیر یک ثانیه ایجاد بشه دیگه. ولی وقتی از یک کریستال 12مگا استفاده می کنی این زمان ها به هم می خورن.مثلا یک ثانیه میشه 400میلی ثانیه چرا؟
      یادش بخیر یه وقتایی هر روز میومدم اینجا !

      دیدگاه


        #4
        پاسخ : ساعت؟

        2-یکی هم توی بیسکام اگه از تابع wait 1 استفاده بشه باید تاخیر یک ثانیه ایجاد بشه دیگه. ولی وقتی از یک کریستال 12مگا استفاده می کنی این زمان ها به هم می خورن.مثلا یک ثانیه میشه 400میلی ثانیه چرا؟
        احتمالا شما فیوز بیت ها رو تغییر ندادید!
        The harder I work, the luckier I get

        دیدگاه


          #5
          پاسخ : ساعت؟

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



          راجع به سرعت هم مطمئنا سرعت شما روی 12 سوئیچ شده ولی شما به کامپایلر (که از مشخصات زمان اجرا اطلاعاتی نداره و شما باید این اطلاعات رو بهش بدین) اطلاعی ندادین. سطر دوم برنامه داره به کامپایلر میگه که wait برای یک مدت زمان خاص یعنی چقدر. و احتمالا شما سرعت جدید میکرو رو داخل برنامه روی 12000000 تنظیم نکردین.

          دیدگاه


            #6
            پاسخ : ساعت؟

            نوشته اصلی توسط narek
            احتمالا شما فیوز بیت ها رو تغییر ندادید!
            فیوز بیت روی کریستال خارجی تنظیم شده ؟
            نوشته اصلی توسط reza_agha
            اگر دونستن زمان اجرای یک تابع در بسکام غیر از تغییر استراتژی برنامه برای رسیدن به سرعت پاسخ کلی برنامه مد نظر قرار بگیره (مثل این برنامه) کار درستی نیست. وگرنه روشهای متفاوتی میشه استفاده کرد. توی فروم هم زیاد توضیح داده شده.



            راجع به سرعت هم مطمئنا سرعت شما روی 12 سوئیچ شده ولی شما به کامپایلر (که از مشخصات زمان اجرا اطلاعاتی نداره و شما باید این اطلاعات رو بهش بدین) اطلاعی ندادین. سطر دوم برنامه داره به کامپایلر میگه که wait برای یک مدت زمان خاص یعنی چقدر. و احتمالا شما سرعت جدید میکرو رو داخل برنامه روی 12000000 تنظیم نکردین.
            آقا این را هم نوشتم ولی بازم ..

            اما فکر کنم از آی سی باشه چون تو آی سی دیگه تقریبا درست کار می کنه
            MEGA8L
            MEGA8A

            یادش بخیر یه وقتایی هر روز میومدم اینجا !

            دیدگاه


              #7
              پاسخ : ساعت؟

              سلام
              من با آزماش و خطا فهمیدم دستورات اون برنامه 919 میلی ثانیه تاخیر داشت!
              من رو یه پروژه کار می کنم که توش باید 10 تا 7seg همیشه روشن باشن و همزمان میکرو باید قسمت پخش صدا رو کنترل کنه به اضافه ارسال دیتا به پرینتر. چطور تاخیر دستور ها رو کنترل کنم؟!

              فروم رو سرچ کردم چند تا بحث مرتبط دیدم که به تاخیر اشاره داشت. اگر ممکنه راجعبشون بیشتر توضیح بدید

              اگه بخواهیم زمان دستورات داخل وقفه رو هم حساب کنیم ته تهش بشه 16 دستور .چون فرکانس کلاک 8مگه پس زمان اجرای هر کد 8/1 میکرو ثانیه است که ضرب در 16 میشه تاخیر دو میکرو ثانیه
              و

              $sim برای استفاده از محیط شبیه سازی بسکام و برای حذف تاخیرها در برنامه و اجرای stet to step در سیمولینک بسکام از این دستور استفاده می شود.


              دیدگاه


                #8
                پاسخ : ساعت؟

                کسی جواب نمیده؟!

                دیدگاه


                  #9
                  پاسخ : ساعت؟

                  میشه جواب داد. اما جواب به چی؟ حل مسئله؟ اگر تکنیک های برنامه نویسی مهم باشه که خیلی چیزا میشه گفت. ولی اینجا فقط کد نیست که مهمه. بلکه سخت افزار هم مهم میشه. مثلا 7seg هارو چطوری درایو میکنی؟ لچ داری یا نه؟ رفرش میشه؟ مبدل 4 بیتی به 7seg داری یا پترنش رو خودت تولید میکنی؟ این قسمت پخش صدا که میگی چیه؟ چکار میکنه؟ چطوری کنترل میشه؟ پرینترت سریاله یا پارالل. اگه پارالل هست چطوری اطلاعات رو بهش میفرستی؟ سیگنالینگ اش مثل Centronics هست یا جور دیگه ای؟
                  میبینی! قبل از اینکه بخواییم جوابی بدیم باید یک شناخت کامل از سیستم ات داشته باشیم. ولی با توضیحاتت هیچ چیزی دستگیرمون نشد.

                  درست مثل اینه که بگی من میخوام سواری کنم! خوب سوار چی بشی؟ کشتی؟ هواپیما؟ دوچرخه؟ بالهای خیال؟ چی؟

                  دیدگاه


                    #10
                    پاسخ : ساعت؟

                    نوشته اصلی توسط reza_agha
                    میشه جواب داد. اما جواب به چی؟ حل مسئله؟ اگر تکنیک های برنامه نویسی مهم باشه که خیلی چیزا میشه گفت. ولی اینجا فقط کد نیست که مهمه. بلکه سخت افزار هم مهم میشه. مثلا 7seg هارو چطوری درایو میکنی؟ لچ داری یا نه؟ رفرش میشه؟ مبدل 4 بیتی به 7seg داری یا پترنش رو خودت تولید میکنی؟ این قسمت پخش صدا که میگی چیه؟ چکار میکنه؟ چطوری کنترل میشه؟ پرینترت سریاله یا پارالل. اگه پارالل هست چطوری اطلاعات رو بهش میفرستی؟ سیگنالینگ اش مثل Centronics هست یا جور دیگه ای؟
                    میبینی! قبل از اینکه بخواییم جوابی بدیم باید یک شناخت کامل از سیستم ات داشته باشیم. ولی با توضیحاتت هیچ چیزی دستگیرمون نشد.

                    درست مثل اینه که بگی من میخوام سواری کنم! خوب سوار چی بشی؟ کشتی؟ هواپیما؟ دوچرخه؟ بالهای خیال؟ چی؟


                    سلام سوال من این بود که آیا روشی وجود دارد که بشه همه تاخیر ها رو محاسبه کرد؟؟؟ بیشتر دنبال یه تکنیک سر راست بودم. فکر نمی کردم همون توضیحاتی هم که اونجا دادم نیاز باشه. خوب این پروژه یک سیستم نوبت ده است. 7seg ها رفرش میشن و این کار مستقیم انجام میگیره. یک پورت دیتا از میکرو به همه 7seg ها میره و فعال سازی هم به صورت مالتی پلکس انجام میشه و اعداد هم با لوک پ تیبل decode میشن. برای قسمت پخش صدا هم قراره از آی سی ضبط و پخش صدا استفاده بشه. هر موقع شماره صندوق ها بالا بره ، باید شماره مورد نظر پخش بشه. پرینتر هم با پورت پاراللش کار می کنیم. تقریبا همون centronics که گفتید. این پروژه هنوز ناقصه ولی فعلا به مشکلی که بر خوردم رفرش شدن 7seg ها است که خاموش روشن میشن.

                    اگه اطلاعاتم کافی نیست بیشتر توضیح می دم.

                    دیدگاه


                      #11
                      پاسخ : ساعت؟

                      جناب reza_agha پر پرواز هم بهت دادم دیگه چی نیازه؟

                      دیدگاه


                        #12
                        پاسخ : ساعت؟

                        یک سایت خوب که حداقل همیشه پ باشه. دیشب پوست از سرم کنده شد تا یک جواب برای یکی از دوستان بفرستم!

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

                        این نباید به یک مورد خیلی خاص برمیگرده.
                        روال کلی هر برنامه به دو قسمت تفکیک میشه. یکی یک روال عمومی هست که مهم نیست کی اجرا میشه ولی باید اجرا بشه. و قسمت دوم وقفه ها هستن که وسط اجرای روال اصلی میان اجرا میشن و برمیگردن و اجرا رو دوباره دست بلوک اصلی میدن. این "مهم نیست" به این معنی هست که اگر وسطش وقفه ای پیش اومد اختلالی در اجرا برنامه پیش نمیاره. مثلا ارسال اطلاعات به پرینتر اگر با چند 10 میلی ثانیه تاخیر هم صورت بگیره چیز مهمی نیست. ولی شناسایی فشار دادن کلید نوبت دهی خیلی مهمه. چون پرینتر همیشه برای چاپ هست. ولی از طرف دیگه انجام این کار که آیا اگر فردی کلید رو فشار داد چکار باید کرد لزومی نداره در یک روال وقفه انجام بشه.

                        این وسط مسئله ای که پیش میاد ایجاد هماهنگی بین این دو قسمت هست که تکنیک های زیادی هست که فعلا برای راحتی میتونین یک سری متغیر عمومی تعریف کنین. در روال وقفه اونا رو مقدار دهی کنین یا ازشون استفاده کنین. مثلا قراره عدد 100 روی سون سگمنت نمایش داده بشه. در روال عمومی در یک روتین این مقادیر رو از جدول لوک پ استخراج کنین و داخل یک آرایه عمومی قرار بدین. و در روال وقفه زمانی فقط به ارسال این پترن ها به سون سگمنت ها فکر کنین.
                        در این حالت باید در روال عمومی فرض رو بر این بذارین که به محض اینکه این روال ارسال اطلاعات (منطقی) به سون سگمنت ها اجرا شد پس اطلاعات نمایش داده شدن. ولی بطور فیزیکی کی نمایش داده میشه بستگی به زمان اجرای روال تایمرتون داره.

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

                        دیدگاه


                          #13
                          پاسخ : ساعت؟

                          :mrgreen: ای بابا چرا اینقدر بیخودی این دوستمون رو می پیچونید راحت بهش بگین که ای دوست عزیز با دستورات معمولی wait , .... نمیشه یک ساعت دقیق ساخت :mrgreen: این و گفتم که این راه اشتب ول کنی بری سراغ rtc یا تایمر کانتر ها یا آی سی های ساعت مثل ds1307 [hr] :applause:
                          خیلی مواقع رک بودن به نظر من باعث میشه ما ها زودتر به نتیجه برسیم
                          مولا علی (ع) میفرمایند : آسوده باش , آستین هارا بالا بزن , بر خدا توکل کن , آنگاه خدا را خواهی دید که زودتر از تو دست به کار شده است .

                          دیدگاه


                            #14
                            پاسخ : ساعت؟

                            تایمر خود میکرو هم عالی جواب میده
                            بزار و خوتو رضا-آقا رو راحت کن

                            دیدگاه


                              #15
                              پاسخ : ساعت؟

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

                              دیدگاه

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