اطلاعیه

Collapse
No announcement yet.

راهنمای در راه اندازی تایمر

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

    راهنمای در راه اندازی تایمر

    سلام دوستان
    لطفا بفرمایید چطور میشه یک تایمر مثلا تایمر صفر رو در پیک راه اندازی کرد ضمنا از micro code stdio استفاده می کنم که زبانش بیسیک است.اگر امکان داره یه برنامه ساده برای راه اندازیش بنویسد و ریجیستر هایی که به اون مرتبت هستن رو هم بگید.
    قبلا از کمکتان تشکر میکنم

    #2
    پاسخ : راهنمای در راه اندازی تایمر

    سلام.
    با فرض اینکه شما از میکروکنترلر PIC16F877A و یا مشابه اون استفاده میکنید برای راه اندازی تایمر صفر باید به نکات زیر توجه کنید:
    - تایمر صفر نیازی به راه اندازی ندارد. چون دائم در حال کار است و شما نمیتوانید این تایمر را غیر فعال کنید.
    -برای استفاده از این تایمر شما با سه رجیستر زیر سر و کار دارید. بیت هایی که هاشور زده شده ارتباطی به تایمر 0 ندارند و نباید مقدار دهی شوند:

    رجیستر TMR0 رجیستر محتوای تایمر 0 است و قابل خواندن و نوشتن است. در واقع برای ریست تایمر شما باید به این رجیستر مقدار صفر بدید.
    رجیستر INTCON شامل بیت های فعال کننده سراسری وقفه ها و همچنین فعال کننده وقفه تایمر 0 و همچنین پرچم Overflow تایمر 0 است.
    برای فعال کردن وقفه تایمر 0 ابتدا باید بیت TMR0IE را یک کنید و سپس پرچم Overflow تایمر0 یعنی TMR0IF را 0 قرار دهید و بعد بیتهای PEIE و GIE را یک کنید.
    رجیستر OPTION_REG رجیستر اصلی کنترل تایمر صفر است.

    برای اینکه تایمر 0 به عنوان تایمر عمل کند باید بیت T0CS برابر 0 باشد. اگر این بیت یک باشد کلاک ورودی تایمر از پین T0CKI تامین شده و تایمر به صورت شمارنده کار خواهد کرد.
    بیت T0SE جهت انتخاب لبه کلاک اعمالی به پین T0CKI به کار میرود. اگر این بیت 1 باشد با اعمال یک لبه پائین رونده به پین T0CKI شمارنده یک واحد افزایش می یابد و اگر 0 باشد با لبهبالا رونده افزایش می یابد.
    سه بیت کم ارزش این رجیستر برای انتخاب مقدار پیش تقسیم کننده کلاک ورودی تایمر 0 است. طبق شکل زیر:

    مطابق شکل بالا کلاک سیستم بر مقدار انتخاب شده تقسیم شده و به ورودی کلاک تایمر 0 اعمال میشود.
    البته توجه داشته باشید که برای اینکه خروجی پیش تقسیم کننده به ماژول تایمر 0 اختصاص پیدا کند باید بیت PSA در همین رجیستر را برابر 0 قرار دهید. اگر این بیت 1 باشد پیش تقسیم کننده به ماژول Watchdog Timer اختصاص میابد.

    برای راه اندازی تایمر 0 و بدون استفاده از وقفه ( چک کردن به روش سرکشی) میتونید از نمونه کد زیر استفاده کنید:
    کد:
    
    OPTION_REG = OPTION_REG & $c0
    OPTION_REG = OPTION_REG | $04
    TMR0 =0
    INTCON.2=0
    while INTCON.2=0
    wend
    در این برنامه به تایمر مقدار اولیه 0 داده شده و کلاک سیستم بر 32 تقسیم شده و به تایمر اعمال میشود، تایمر رو به بالا میشمارد. حلقه while منتظر سرریز تایمر و یک شدن بیت TMR0IF( بیت 2 از رجیستر INTCON ) میماند.

    دیدگاه


      #3
      پاسخ : راهنمای در راه اندازی تایمر

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



      include "MODEDEFS.BAS"
      TRISB=1
      PORTB=$0F
      TRISC=0
      PORTC=0
      '-------------------------------------------------------------------------------
      @ DEVICE pic16F873A
      @ DEVICE pic16F873A, WDT_on
      @ DEVICE pic16F873A, PWRT_ON
      @ DEVICE pic16F873A, PROTECT_OFF

      '-------------------------------------------------------------------------------
      DEFINE LCD_DREG PORTC
      DEFINE LCD_DBIT 4
      DEFINE LCD_EREG PORTC
      DEFINE LCD_EBIT 3
      define LCD RWREG PORTC
      define LCD_RWBIT 2
      DEFINE LCD_RSREG PORTC
      DEFINE LCD_RSBIT 1
      DEFINE LCD_BITS 4
      DEFINE LCD_LINES 2
      DEFINE OSC 4
      '-------------------------------------------------------------------------------
      Low PORTC.2
      LCDOut $FE,1
      pause 200
      '-------------------------------------------------------------------------------



      option_reg=%11000111
      TMR0=0
      start:
      lcdout $fe,1
      lcdout "tmr0=.5s",#TMR0
      pause 3000
      goto start

      دیدگاه


        #4
        پاسخ : پاسخ : راهنمای در راه اندازی تایمر

        نوشته اصلی توسط vahid120
        من برنامه رو نوشتم ولی ریجستری به نام tmr0 وجود خارجی نداره
        یعنی میخواهید بگید شرکت معظم microchip داره اشتباه میکنه و تو دیتاشیت دروغ گفته؟

        ضمناً برنامتونو کامپایل کردم ، کامپایلر هیچ ایرادی نمیگیره. یعنی رجیستر ناشناخته ای وجود نداره.

        دیدگاه


          #5
          پاسخ : راهنمای در راه اندازی تایمر

          سلام من که نتونستم کامپایلش کنم شاید کامپایلرم مشکل داره اگر ممکنه کامپایلرتون رو بزارید رو سایت دانلودش کنم.
          راستی این پیام ها رو میده:
          warning[207] c:/progra"1/mecani"1/mcs/timer.asm98:found label after colum 1.(device)
          error[122]c:/progra"1/mecani"1/mcs/timer.asm98:illegal opcode(pic16873a)

          دیدگاه


            #6
            پاسخ : پاسخ : راهنمای در راه اندازی تایمر

            نوشته اصلی توسط vahid120
            سلام من که نتونستم کامپایلش کنم شاید کامپایلرم مشکل داره اگر ممکنه کامپایلرتون رو بزارید رو سایت دانلودش کنم.
            راستی این پیام ها رو میده:
            warning[207] c:/progra"1/mecani"1/mcs/timer.asm98:found label after colum 1.(device)
            error[122]c:/progra"1/mecani"1/mcs/timer.asm98:illegal opcode(pic16873a)
            کامپایلر Pic basic pro رو میتونید از صفحه ای که لینکشو گذاشتم دانلود کنید:
            http://www.techno-electro.com/%D8%AF...PIC-Basic-Pro/

            دیدگاه


              #7
              پاسخ : راهنمای در راه اندازی تایمر

              متاسفانه مشکل از کامپایلر نبود حالا لطفا نظرتون رو در مورد پیام خطا بفرمایید راستی تایمر Include خاصی ندارد یعنی کتابخانه خاصی نداره که باید تعریف بشه

              دیدگاه


                #8
                پاسخ : راهنمای در راه اندازی تایمر

                بنده باز هم برنامتونو کامپایل کردم و هیچ خطایی اعلام نشد. به نظر بنده مشکل از کامپایلر شماست. راستی در قسمت بالا سمت چپ کامپایلر میکرو درست انتخاب شده یا نه؟

                دیدگاه


                  #9
                  پاسخ : راهنمای در راه اندازی تایمر

                  سلام
                  آقا یه دنیا ممنون از راهنمایی هاتون
                  مشکل از @ DEVICE pic16F873A
                  @ DEVICE pic16F873A, WDT_on
                  @ DEVICE pic16F873A, PWRT_ON
                  @ DEVICE pic16F873A, PROTECT_OFF بود حذفش کردم درست شد
                  فقط یک سوال دیگه بفرمایید اگر بخوایم زمان رو اندازه گیری کنیم چطور باید عمل کنیم
                  بطور مثال برای OPTION_REG=%11000111
                  من تایمر رو برای اندازه گیری زمان ارسال یک موج از یک پین و دریافت همان موج توسط گیرنده می خوام برای متر التراسونیک حالا شما بفرمایید پس از دریافت وقفه زمان واقعی رو چطور بدست بیارم
                  ممنون از حوسلتون

                  دیدگاه


                    #10
                    پاسخ : راهنمای در راه اندازی تایمر

                    نوشته اصلی توسط vahid120
                    من تایمر رو برای اندازه گیری زمان ارسال یک موج از یک پین و دریافت همان موج توسط گیرنده می خوام برای متر التراسونیک حالا شما بفرمایید پس از دریافت وقفه زمان واقعی رو چطور بدست بیارم
                    ممنون از حوسلتون
                    برای این کار شما باید از ماژولهای CCP استفاده کنید. باید یکی از ماژول های CCP رو در مد capture پیکره بندی کنید. این ماژولها برای حالت Capture فقط از تایمر 16 بیتی 1 استفاده میکنند. (البته در سری PIC16f87x ).
                    ماژول CCP1 و CCP2 تا حدود زیادی مشابه هم هستند و پیکره بندی اونها مانند هم است. به همین دلیل در دیتاشیت ارائه شده از طرف Microchip توضیحات هردو یکسان است و در نامگذاری رجیسترها به جای اشاره به شماره ماژول از حرف x کوچک استفاده کرده. فرض کنیم از CCP1 استفاده میکنیم. برای فعال کردن این ماژول باید به رجیستر CCP1CON مقدار بدید:

                    دو بیت CCPxX و CCPxY مربوط به دوبیت کم ارزش حالت PWM ده بیتی هستند و در مدی که ما میخواهیم کاربردی ندارند بنابراین به آنها مقدار 0 دهید.
                    چهار بیت CCPxM0 الی CCPxM3 تعیین کننده مد انتخابی برای ماژول است طبق جدول زیر:

                    برای اندازه گیری با لبه پائین رونده روی پین CCP1 باید به این سه بیت مقدار 0100 و برای لبه بالارونده مقدار 0101 بدید.
                    حال باید تایمر 1 رو فعا کنید. برای این کار باید به رجیستر کنترل تایمر 1 به نام T1CON مقدار بدید.:

                    در این رجیستر بیت های T1CKPS1 و T1CKPS0 مربوط به پیش تقسیم کننده کلاک ورودی تایمر هستند که به دلخواه خد به آن مقدار میدید.
                    بیت T1OSCEN جهت فعال کردن اسیلاتور داخلی کم توان برای کریستال خارجی 32Khz برای ساخت RTC است و در مد انتخابی ما کاربردی ندارد.به آن صفر اعمال کنید.
                    بیت T1SYNC برای سنکرون کردن کلاک خارجی با کلاک داخلی میکرو به کار میرود و به آن نیز احتیاج نداریم.
                    بیت TMR1CS برای انتخاب منبع کلاک تایمر 1 به کار میره . اگر این بیت صفر باشد کلاک تایمر از کلاک داخلی میکروکنترلر (FOSC/4) و اگر 1 باشه از کلاک خارجی اعمالی به پین RC0/T1OSO/T1CKI تغذیه میشه . پس به آن مقدار صفر بدید.
                    بیت TMR1ON برای فعال کردن تایمر 1 به کار میره. در زمان مناسب برای شروع عملیات اندازه گیری این بیت را یک کنید.
                    در انتها وقفه مربوط به هرکدام از ماژولها رو توسط بیتهای CCP1IE در رجیستر PIE1 و CCP2IE در PIE2 فعال کنید:


                    در صورت اعمال لبه مناسب به پین CCPx مقدار تایمر 1 در رجیستر های CCPR1L و CCPR1H ذخیره شده و اگر وقفه مربوطه فعال باشه میتونید در روتین وقفه مقدار این رجیسترها رو بخونید.

                    دیدگاه


                      #11
                      پاسخ : راهنمای در راه اندازی تایمر

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

                      دیدگاه


                        #12
                        پاسخ : راهنمای در راه اندازی تایمر

                        نوشته اصلی توسط Perfect
                        رجیستر TMR0 رجیستر محتوای تایمر 0 است و قابل خواندن و نوشتن است. در واقع برای ریست تایمر شما باید به این رجیستر مقدار صفر بدید.
                        سلام
                        نوشتن در رجیستر TMR0 مقدار Prescalar رو پاک میکنه ؟
                        اگه خودمون به رجیستر TMR0 مقدار بدیم یا از Set_timer0 استفاده کنیم فرقی داره ؟(تو CCS)
                        lممنون
                        زمان تنها واحد حقیقی اندازه گیریه
                        زمان وجود ماده رو اثبات میکنه
                        بدون زمان هیچکدوم ما وجود نخواهیم داشت
                        زمان یکتاست

                        دیدگاه


                          #13
                          پاسخ : راهنمای در راه اندازی تایمر

                          نوشته اصلی توسط Robo-amir
                          سلام
                          نوشتن در رجیستر TMR0 مقدار Prescalar رو پاک میکنه ؟
                          اگه خودمون به رجیستر TMR0 مقدار بدیم یا از Set_timer0 استفاده کنیم فرقی داره ؟(تو CCS)
                          lممنون
                          به نکته خوبی اشاره کردید که از قلم افتاده بود. همانطور که میدونید Prescaler تایمر صفر با تایمر Watchdog به اشتراک گذاشته شده . بیت PSA در رجیستر OPTION_REG مشخص میکنه که Prescaler به کدام یک از این دو ماژول اختصاص پیدا کنه. اگر این بیت یک باشه Prescaler به تایمر Watchdog اختصاص پیدا میکنه, و تایمر صفر بدون تقسیم کلاک از کلاک داخلی میکرو تغذیه میشه . زمانی که Prescaler به تایمر صفر اختصاص داشته باشه هر گونه دستور نوشتن در رجیستر محتوای تایمر صفر (TMR0) باعث ریست شدن مقدار شمارنده Prescaler میشه.

                          نکته دیگه : زمانی که محتوای رجیستر TMR0 رو تغییر میدید عمل شمارش صعودی تایمر به اندازه دو سیکل ماشین به تاخیر می افته و در کاربردهای حساس باید به اون توجه بشه.
                          در مورد سوال دومی که نوشتید باید بگم متاسفانه بنده با CCS کار نمیکنم و در این مورد نمیتونم اظهار نظر قطعی کنم. ولی طبق مثالی که در Reference Manual کامپایلر CCS موجوده به نظر نمیرسه تفاوتی داشته باشند:


                          دیدگاه


                            #14
                            پاسخ : راهنمای در راه اندازی تایمر

                            ممنون از توضیحات کاملتون جناب Perfect
                            پس با این تفاسیر اگه میخوام تابمر0 رو تو برنامه دائم Set کنم باید Prescaler رو به Watchdog اختصاص بدم ؟(آخه این جوریم که هر بار که Watchdog رو ریست میکنم باز Prescaler هم ریست میشه که)
                            با این وضع پس باید قید Prescaler رو بزنم دیگه ؟
                            اگه Watchdog کلا غیر فعال هم باشه باز نوشتن در رجیستر محتوای تایمر صفر (TMR0) باعث ریست شدن Prescaler میشه ؟
                            ممنون
                            زمان تنها واحد حقیقی اندازه گیریه
                            زمان وجود ماده رو اثبات میکنه
                            بدون زمان هیچکدوم ما وجود نخواهیم داشت
                            زمان یکتاست

                            دیدگاه


                              #15
                              پاسخ : راهنمای در راه اندازی تایمر

                              نوشته اصلی توسط Robo-amir
                              پس با این تفاسیر اگه میخوام تابمر0 رو تو برنامه دائم Set کنم باید Prescaler رو به Watchdog اختصاص بدم ؟(آخه این جوریم که هر بار که Watchdog رو ریست میکنم باز Prescaler هم ریست میشه که)
                              با این وضع پس باید قید Prescaler رو بزنم دیگه ؟
                              اگر Prescaler رو به Watchdog تخصیص بدید کلاکی که به تایمر میرسه ربطی به میزان Prescaler نداره و تایمر مستقیماً از کلاک داخلی (CPU) تغذیه میشه.
                              یعنی تایمر با حد اکثر فرکانس ممکن شروع به کار میکنه.

                              نوشته اصلی توسط Robo-amir
                              اگه Watchdog کلا غیر فعال هم باشه باز نوشتن در رجیستر محتوای تایمر صفر (TMR0) باعث ریست شدن Prescaler میشه ؟
                              اگر بیت PSA صفر باشه درسته ، همینطوره.

                              دیدگاه

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