اطلاعیه

Collapse
No announcement yet.

اشکال در ارتباط بین متغییر و تایمر 0

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

    اشکال در ارتباط بین متغییر و تایمر 0

    یک متغییر از نوع سینگل دارم که میخوام در هر سیکل کار یکی بهش اضافه بشه مثلا
    اما وقتی این اضافه کردن در حلقه لوپ اصلی برنامه بکار میره ، عملا هیچ تاثیری روی مقدارش در روتین زیرمجموعه وقفه تایمر 0 نداره ، چرا ؟
    مثال :
    کد:
    $regfile = "m16def.dat"
    $crystal = 11059200
    $baud = 1200 :
    
    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , Rs = Porta.0 , E = Porta.2
    Config Lcd = 16 * 2
    
    
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 8 :
    On Timer0 Scan :
    Enable Timer0
    Stop Timer0
    Start Timer0
    
    
    Dim Si As Single
    
    
    Do
    Si = Si + 1
    Loop
    اگه اینجا باشه مقدار همیشه برابر با 0.0 چاپ میشه ،
    انگار نه انگار که اینجا این متغییر هی یکی بهش اضافه میشه مثلا...
    End
    
    Scan:
    Cls
    ' Si = Si + 1
    
    اما اگه همون خط دستور اضافه کردن را توی خود تایمر بنویسم
    مثل بچه آدم اضافه و چاپ میکنه ، چرا ؟
    چه خاکی تو سر این باسکام و ای وی آر و خودم بکنم ؟
    
    Lcd Si
    Return
    End
    آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
    تا در سفر دوزخ از اين باده بنوشم
    آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
    هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

    #2
    پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

    با سلام
    دوست عزیز do-loop یه حلقه بینهایت هست که هیچ موقع ازش بیرون نمیشه اومد مگه در زمان سر ریزی تایمر که مستقیما میره و دستورات مربوط به برچسب سر ریزی رو انجام میده و سپس با دستور return برمیگرده به همون do-loop
    موفق باشی

    دیدگاه


      #3
      پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

      نوشته اصلی توسط پراو
      با سلام
      دوست عزیز do-loop یه حلقه بینهایت هست که هیچ موقع ازش بیرون نمیشه اومد مگه در زمان سر ریزی تایمر که مستقیما میره و دستورات مربوط به برچسب سر ریزی رو انجام میده و سپس با دستور return برمیگرده به همون do-loop
      موفق باشی
      ممنون.
      مشکل اصلی من در واقع نیاز من به وجود یک متغییر عمومی هست
      در برنامه اصلی من در حلقه do loop همیشه مقداری را از پورت سریال میخونم و در یک متغییر قرار میدم
      و در تایمر0 هم فقط وظیفه رفرش 4 فروند سونسگمنت را گذاشتم
      تابعی که قراره عدد سونسگمنت را نمایش بده داخل تایمر صفر هست
      چه راه حلی پیشنهاد میکنید که بتونم مقادیری که در do loop مقدار میگیرند را در تایمرصفر بتونم ازشون استفاده کنم ، با توجه به کارکردی که من لازم دارم ؟
      آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
      تا در سفر دوزخ از اين باده بنوشم
      آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
      هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

      دیدگاه


        #4
        پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

        ولله راسیتش این کار مسخره ایه که بخوای روی یک متغیر از نوع single توی یه اینتراپت کار کنی چون بر خلاف متغیر هایی از نوع صحیح عملیات بسیار به کندی انجام میشه. دوم من از bascom خوشم نمیاد. سوم اینکه بهتره توی روتین وقفه یه متغیر صحیح رو اضافه کنی و در لوپ اصلی این مقدار رو به مقدار نهایی اضافه کنی و کارهای تبدیل به متن رو در لوپ اصلی برنامه انجام بدی تا برای رفرش sevensegment ها وقت کافی موجود باشه. چهارم بر خلاف تصور چشم من و شما (بر خلاف چشم روبوکاپ) حداکثر تا 10 هرتز دقت داره و بعد از اون دیگه نمیتونه مقادیر رو درست از هم تشخیص بده بنا براین تبدیل مقدار single به متن و نمایش روی seven-seg ها میتونه هر 100 میلی ثانیه یا بیشتر انجام بشه. بنا براین بهتره یک آرایه برای نگهداری پترن های 7seg داشته باشی و هر از گاهی مقدار عدد رو توی این آرایه بفرم متنی یا نهایی برای نمایش توسط روتین تایمر نگهداری کنی. پنجم نداره. ششم نصف شبی حال و حوصله بیش از این رو ندارم. هفتم عدد هفت شانس میاره. موفق باشی.

        دیدگاه


          #5
          پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

          سینگل یا اینتیجر فقط یک مثال بود ،که ببینم مشکل چیه که چرا یک متغییر عمومی توی روال تایمر0 دسترسی بهش نیست ؟

          آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
          تا در سفر دوزخ از اين باده بنوشم
          آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
          هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

          دیدگاه


            #6
            پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

            چه راه حلی پیشنهاد میکنید که بتونم مقادیری که در do loop مقدار میگیرند را در تایمرصفر بتونم ازشون استفاده کنم
            شما که توی مثال اول متغیر رو داخل do-loop نذاشته بودی اما حالا میگی داخل do -loop هم عمل نمیکنه
            یه سوال : آیا از چند do-loop استفاده نکردی؟
            نمونه برنامه رو بذار اگه بتونم کمکت کنم

            دیدگاه


              #7
              پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

              نوشته اصلی توسط پراو
              شما که توی مثال اول متغیر رو داخل do-loop نذاشته بودی اما حالا میگی داخل do -loop هم عمل نمیکنه
              یه سوال : آیا از چند do-loop استفاده نکردی؟
              نمونه برنامه رو بذار اگه بتونم کمکت کنم
              چرا توی مثال اولم هم بین do loop نوشته بودم : Si = Si + 1
              همون سورس که توی پست اول هست ،
              فقط یک lcd به میکروکنترلر وصل کنید نتیجه اتفاقی که دارم میگم میفته معلومه :angry:

              پیوست: اقا فکر کنم باگ کامپایلر خورده به تورم :job:

              به صورت کلی متغییری که توی do... loop مقدار میگیره توی تایمر0 به مقدارش دسترسی نیست!!! ( علت برام ناشناخته ) و البته برعکس.
              آیا ممکنه برای این کار نیاز باشه یه لغت کلیدی برای متغییر ها کم گذاشته باشم؟ چمیدونم مثلا public ، هرچند که از تمام type هایی که برای dim ها میشداستفاده کنم ، کردم....
              شاید نکته ای داره که من بی تجربم :(
              شاید مال این avr جینیا باشه
              دیگه دارم قاطی میکنم جدی جدی :wow:

              پیوست 2: تشکر مضاعف از دوستان بابت راهنمائی که میکنن.

              EDITED"
              توی شبیه ساز پروتئوس داره درست کار میکنه !:(
              آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
              تا در سفر دوزخ از اين باده بنوشم
              آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
              هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

              دیدگاه


                #8
                پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

                من دقیق متوجه نمیشم شما چی میگی :
                چرا توی مثال اولم هم بین do loop نوشته بودم : Si = Si + 1
                همون سورس که توی پست اول هست ،
                شما داخل do-loop متغیر رو نذاشتی بلکه بعد از پایان do-loop این کار رو کردی :
                Do
                Loop
                Si = Si + 1
                اگه اینجا باشه مقدار همیشه برابر با 0.0 چاپ میشه ،
                انگار نه انگار که اینجا این متغییر هی یکی بهش اضافه میشه مثلا...

                دیدگاه


                  #9
                  پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

                  ممنون.

                  احتمالا موقعی که خواستم توضیحات فارسی اضافه کنم توی انجمن انگار جابجا شده ،حواسم نبوده ....
                  توی do...loop هست

                  توی پروتئوس تست میکنم مشکلی ندار و متغییر را چاپ میکنه ، تا اینجا انگار مشکل از کامپایلر نبوده خداروشکر ، یعنی ممکنه iic atmega16 این مشکل را داشته باشه ، با 2 تا ic دیگه هم تست کردم فرقی نکرد ( البته فقط mega16 در اختیار دارم )
                  آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
                  تا در سفر دوزخ از اين باده بنوشم
                  آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
                  هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

                  دیدگاه


                    #10
                    پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

                    من بازم دقیق متوجه نمیشم
                    شما کلا در عمل موفق نمیشید عدد رو نشون بدید یا با برنامه ای که متغیر داخل do-loop است نمیتونید؟
                    دقت داشته باشید اگه si=si+1 رو داخل do-loop بذارید برنامه ناقص است چون داخل حلقه مرتب
                    مقدار متغیر رو افزایش میده و در هنگام سر ریزی آخرین مقداری رو که متغیر داشته فقط نشون میده

                    دیدگاه


                      #11
                      پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

                      نوشته اصلی توسط پراو
                      من بازم دقیق متوجه نمیشم
                      شما کلا در عمل موفق نمیشید عدد رو نشون بدید یا با برنامه ای که متغیر داخل do-loop است نمیتونید؟
                      دقت داشته باشید اگه si=si+1 رو داخل do-loop بذارید برنامه ناقص است چون داخل حلقه مرتب
                      مقدار متغیر رو افزایش میده و در هنگام سر ریزی آخرین مقداری رو که متغیر داشته فقط نشون میده
                      سلام
                      ببینید وقتی در حلقه do..loop میزارم ( اگه مثلا نوعش integer هم باشه باید تا 32هزارتا بره ، و بعد از سرریز هم از -32 شروع میکنه دوباره اضافه کردن ، )به طور کلی این فقط یک مثاله ، یا حتی بیام waitms تعریف کنم که مثلا دیرتر از 1دقیقه به سرریز برسه ، اینا هیچ ، مشکل اصلیم اینه که متغییری که در حلقه اصلی برنامه مقدارش تغییر میکنه ، در وقفه تایمر 0 مقدارش همیشه صفر خونده میشه ، چرا این اتفاق می افته ؟

                      پیوست : برنامه اصلیم طرز کارش اینه که از پورت سریال مقداری را میخونه ، و در یک متغییر قرار میده ، که در وقفه تایمر0 این مقدار برای نمایش روی 4عدد 7segment قراره بکار بره (همونطور که میدونید برای رفرش 7seg مجبورم از خاموش روشن کردن های سریع استفاده کنم و الی آخر مباحث مربوط به 7seg ...)
                      درواقع انتظار اصلی من از ic همینه که مقادیر ورودی از پورت سریال را فقط برامروی سون سگمنت نمایش بده ، در این حین دیدم که هر متغییری که در حلقه اصلی برنامه مقدار میگیره ، توی تایمر0 دسترسی به مقدار تغییر کرده اون نیست !!!! این شد که برای طرح مشکلم یک مثال ساده نوشتم توی انجمن قرار دادم کلا بحث سررریز و کندی عملیات single و اینا ندارم

                      نرم افزاری احتمالا مشکل ندارم ، چون توی شبیه ساز پروتئوس داره درست کار میکنه ، یه جای کار سخت افزاری احتمال مشکل میدم ،

                      روش مشابهی برای حل مشکل من پیشنهاد میکنید ؟
                      آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
                      تا در سفر دوزخ از اين باده بنوشم
                      آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
                      هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

                      دیدگاه


                        #12
                        پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

                        از adc استفاده نکردی؟
                        چند ثانیه یک بار سر ریز داری ؟
                        به نظر من بهتره که رفرش سون سگمنت ها رو داخل do-loop انجام بدی و هنگام سر ریزی مقدار رو بخونی در غیر این صورت اگه زمان سرریزی زیاد باشه اعداد روی سون سگمنت خاموش و روشن میشه مگه از latch استفاده کنی که هزینه بالا میره
                        لینک شبیه سازی پروتئوس رو بذار ببینم بعیده توی پروتئوس جواب بگیری اما در عمل برنامت مشکل داشته باشه

                        دیدگاه


                          #13
                          پاسخ : اشکال در ارتباط بین متغییر و تایمر 0

                          با تشکر از پراو عزیز که وقتشون را گذاشتن

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

                          کد:
                            
                          'Configute the timer to use the clock divided by 1024
                          
                          Config Timer0 = Timer , Prescale = 1024
                          
                           
                          
                          'Define the ISR handler
                          
                          On Ovf0 Tim0_isr
                          
                          'you may also use TIMER0 for OVF0, it is the same
                          
                           
                          
                          Enable Timer0                        ' enable the timer interrupt
                          
                          Enable Interrupts                      'allow interrupts to occur
                          
                          Do
                          
                           'your program goes here
                          
                          Loop
                          
                           
                          
                          'the following code is executed when the timer rolls over
                          
                          Tim0_isr:
                          
                          Print "*";
                          
                          Return
                          
                           
                          
                          ')
                          
                          End
                          آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
                          تا در سفر دوزخ از اين باده بنوشم
                          آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
                          هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

                          دیدگاه

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