۱۴۰۱ بهمن ۲۵, سه‌شنبه

ماژول تایمر در میکروکنترلرهای PIC

 


استفاده از دستور delay علیرغم سادگی دقت کافی را برای اندازه گیری زمان و ارتباط سریال با ماژولهای مختلف را ندارد.  خوشبختانه در میکروکنترلرهای مختلف واحد(های) تایمر 8 بیتی و گاهی 16 بیتی تعبیه شده است . با استفاده از ماژول تایمر میتوان دقت اندازه گیری زمان را افزایش د اد و به زمان واقعی برای ساخت تقویم و ساعت دسترسی پیدا کرد .
در سیستم های embedded  تایمر نقش اساسی بازی میکند . با استفاده از تایمر میتوانیم برنامه هایی مولتی تسک را بنویسیم و منابع سیستم را بین واحدهای مختلف تقسیم کنیم .

مبانی شمارش در سیستم های دیجیتالی

یک ماژول تایمر معمولاً یک مدار دیجیتال (جانبی) در تراشه میکروکنترلر است که می تواند از طریق چند SRF (رجیسترهای اختصاصی) کنترل شود. هسته این مدار دیجیتال به عنوان " شمارنده دیجیتال" شناخته می شود. شمارنده دیجیتال مجموعه‌ای از فلیپ فلاپ‌ها است که به‌طور سریالی به هم متصل می‌شوند تا به اصطلاح شمارنده دیجیتال بسازند.

ابتدا یک مدار فلیپ فلاپ JK را درنظر میگیریم . رفتار این مدار مطابق جدول شکل زیر است. و نماد آن در تصویر رسم شده است .


از مدارات داخلی فلیپ فلاپ صرف نظر میکنیم ( شاید در آینده در موضوعات معماری پردازنده به این موضوع برگردیم و مدارات داخلی یک پردازنده دیجیتال را با هم بررسی کنیم.) یک سطح انتزاعی برای بررسی مدار شمارنده و به تبع آن مدار تایمر میکروکنترلر کفایت میکند . از جدول بالا ردیف آخر مدنظر ما است . یعنی وقتی که هر دو ورودی J و K در یک فلیپ فلاپ 1 باشند ( یا به ولتاژ سطح بالا - مثلا 5 ولت _ متصل باشند). در این حالت خاص ، خروجی مدار FF اگر 1 باشد ( مثلا 5 ولت در خروجی داشته باشیم) ، بعد از لبه بالا رونده کلاک 0 میشود و اگر خروجی FF برابر با 0 باشد ، بعد از کلاک 1 میشود . خروجی Q بار نیز به همین صورت تغییر میکند .

اگر از پین Q از یک فلیپ فلاپ به عنوان منبع کلاک برای فلیپ فلاپ دیگر (به صورت متوالی متصل) استفاده کرده باشیم، آنگاه پایه Q فلیپ فلاپ دوم با فرکانسی تغییر می کند که نیمی از فرکانس ساعت پایه تغذیه شده است. به همین ترتیب اگر پایه Q فلیپ فلاپ دوم را به عنوان منبع ساعت فلیپ فلاپ دیگری استفاده کنیم ، فرکانس تغییر ff سوم برابر با یک چهارم فرکانس تغییرات ff اول و نصف فرکانس تغییرات ff دوم خواهد بود. مدار حاصل از این 3 فلیپ فلاپ شمارنده دیجیتال 3 بیتی نامیده می شود.


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

بعد از رسیدن شمارنده به عدد 111 دودویی ، با کلاک بعدی شمارنده اصطلاحا سرریز میکند و دوباره 000 میشود .

رزولوشن (دقت) تایمر

نکته مهمی که باید به آن توجه کرد، عددی است که در آن سرریز تایمر رخ میدهد . (در اینجا عدد 7) ما یک تایمر 3 بیتی داریم و سرریز در عدد 7 رخ میدهد . با استفاده از فرمول و جایگذاری تعداد فلیپ فلاپها به جای n رزولوشین تایمر بدست می آید. اگر ما یک تایمر 8 بیتی داشته باشیم ، دقت ما 255 ( سرریز در 256 امین عدد رخ میدهد.) و اگر تایمر 16 بیتی داشته باشیم دقت 65535 خواهیم داشت . 

به تعداد بیتهایی که ماژول تایمر را میسازند دقت یا رزولوشن تایمر میگویند . 

تایمر چگونه کار میکند؟

من عمدا در این بخش بین تایمر و شمارنده دیجیتال تفاوتی قائل نشدم . عملا مبنای هردو یکی هستند . درصورتیکه کلاک شمارنده را از سیستم کلاک میکروکنترلر بگیریم ( به وسیله تنظیم رجیسترهای تایمر - در ادامه توضیح داده میشود.-) عملا یک تایمر داریم که با فرکانس سیستم ( یا نسبتی از کلاک سیستم) کار میکند . 

با اینکه قلب یک تایمر شمارنده دیجیتال است ، اما عملا تعدادی مدار منطقی و رجیسترهایی به شمارنده اضافه شده اند تا امکان کنترل و مقدار دهی اولیه و تنظیم تایمر را برای ما فراهم کنند.

مثلا یک تقسیم کننده فرکانس منبع را به اعداد 2 ، 4 ، 8 ، 16 و ... تقسیم میکند و در اختیار واحد شمارنده قرار میدهد . یا یک مولتی پلکسر ورودی تایمر را بین کلاک سیستم ( تایمر) یا ورودی خارجی (کانتر) انتخاب میکند .

تایمر دارای دو حالت (mode) است :

حالت تایمر

حالت شمارنده ( کانتر)

حالت تایمر

در حالت تایمر، ماژول تایمر توسط کلاک سیستم (نوسانگر) در حال افزایش است. همانطور که می دانید فرکانس اسیلاتور ثابت است و ممکن است 4،8،16،20 مگاهرتز یا هر مقدار دیگری باشد. بنابراین، مقدار ذخیره شده در فلیپ فلاپ های ماژول تایمر نشان دهنده تعداد کلاکها است. که به راحتی با استفاده از فرمول زیر به دوره زمانی تبدیل می شود:

Time period = Number Of Ticks x Period of Each Tick 
بنابراین، ماژول تایمر در حالت تایمر می تواند به عنوان زمان سنج استفاده شود! به این معنی که می توان از آن به گونه ای استفاده کرد که فواصل زمانی ایجاد کند که بین رویدادهای مورد نظر تاخیر به وجود آورد. و همچنین می توان از آن برای اندازه گیری بازه زمانی بین چند رویداد استفاده کرد. 

بلوک دیاگرام ماژول Timer1 (از دیتاشیت) در زیر نشان داده شده است


حالت شمارنده

در حالت شمارنده، ماژول تایمر توسط یک منبع کلاک خارجی (سیگنال) روی پین T1CK (در تایمر شماره 1) افزایش می یابد. این بدان معناست که اگر یک push button را به ورودی ساعت خارجی شمارنده وصل کرده باشید، سپس با فشار دادن دکمه، مقدار شمارنده افزایش می‌یابد (در رجیستر TMRx- می‌تواند TMR0، TMR1 و غیره باشد.) شمارنده باید ابتدا لبه پایین رونده داشته باشد سپس افزایش در هر لبه بالارونده رخ میدهد. میتوان با استفاده از رجیسترهای کنترلی تایمر ، حساسیت را به جای لبه بالارونده به لبه پایین رونده سیگنال ایجاد کرد.
همانطور که ممکن است متوجه شده باشید که ماژول تایمر به طور کلی دارای شمارنده/رجیستر دیجیتال اصلی به نام TMRx است. جایی که x می تواند 1،2 یا هر عدد دیگری باشد. و سایر قسمت های مدار از طریق یک رجیستر به نام TxCON کنترل می شوند. بیایید Timer1 را برای مثال در نظر بگیریم. SFR اختصاص داده شده به کنترل این ماژول Timer1 T1CON است. در بخش فرعی بعدی، عملکرد هر بیت از این ثبات (رجیستر) را به تفصیل مورد بحث قرار خواهیم داد.

بررسی رجیستر 
T1CON 



T1CON
R/WR/WR/WR/WR/WR/WR/WR/W
T1CKPS1T1CKPS0T1OSCENT1SYNCTMR1CSTMR1ON
Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
#BitNameSet/ClearFunction Description
0TMR1ON1Enables Timer1
0Stops Timer1
1TMR1CS1External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
0Internal clock (FOSC/4)
2T1SYNC1When TMR1CS = 1, Do not synchronize external clock input

When TMR1CS = 0, This bit is ignored

0When TMR1CS = 1, Synchronize external clock input


When TMR1CS = 0, This bit is ignored

3T1OSCEN1Oscillator is enabled
0Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain)
4-5T1CKPS0:T1CKPS11 11:8 prescale value
1 01:4 prescale value
0 11:2 prescale value
0 01:1 prescale value
6
7

 تایمر در میکروکنترلر PIC16f877

میکروکنترلر مورد استفاده ما در این سری آموزشها یعنی pic16f877 دارای 3 ماژول تایمر/کانتر مستقل از هم به نام های timer0 , timer1  و timer2 میباشد. کلیات استفاده از تایمرها تفاوت چندانی با یکدیگر ندارد .بعضی تایمرها خصوصیات متفاوتی با دیگرتایمرها دارند ولی در راه اندازی واستفاده کردن تفاوت خاصی وجود ندارد.

تایمر 0

طبق اطلاعات مندرج در دیتاشیت تایمر 0 دارای امکانات زیر است:
• تایمر/ شمارنده 8 بیتی
• قابل خواندن و نوشتن 
• مقسم فرکانسی قابل برنامه ریزی نرم افزاری 3 بیتی (8 گزینه) 
• انتخاب ساعت داخلی یا خارجی 
• وقفه داخلی در سرریز از FFh تا 00h 
• انتخاب لبه برای کلاک خارجی در مد شمارنده

رجیستر اصلی تایمر 0 که مقدار آن را نگهداری میکند TMR0 است . TMR0 یک رجیستر 8 بیتی است . همچنین 2 رجیستر کنترلی 
OPTION_REG و INTCON تایمر0 را تنظیم میکنند که شرح آن در ادامه می آید.

عنوان رجیستر

کاربرد

OPTION_REG

منبع کلاک و مقسم فرکانسی تایمر 0 را تنظیم میکند.

TMR0

مقدار شمارش شده را نگه میدارد . در هنگام سرریزشدن یک وقفه داخلی ایجاد میکند.

INTCON

این رجیستر پرچم سرریز تایمر را نگهداری میکند (TMR0IF) و وقفه را (TMR0IE) فعال یا غیرفعال میکند.


ساختار رجیستر OPTION_REG


  • RBPU : این بیت به تایمر 0 اختصاص نیافته است.
  • INTEDG : این بیت به تایمر 0 اختصاص نیافته است.
  • T0CS : به معنی Timer0 Clock Source Select bit : اگر 1 باشد منبع کلاک تایمر از بیت T0CKI و اگر 0 باشد منبع کلاک از مقسم کلاک داخلی میکرو می آید.
  • T0SE : به معنی Timer0 Source Edge Select : اگر 1 باشد با لبه پایین رونده و اگر 0 باشد با لبه بالا رونده سیگنال دریافتی از پایه T0CKI فعال میشود.
  • PSA: اگر 1 باشد مقسم فرکانسی به تایمر نگهبان اختصاص میابد و اگر 0 باشد به تایمر 0 اختصاص داده میشود.
  • PS2:PS0: نسبت تقسیم فرکانس را بدست میدهد :

ساختار رجیستر INTCON


GIE (Global Interrupt Enable bit)
1-Enables all unmasked interrupts
0-Disables all interrupts

PIE (Peripheral Interrupt Enable bit)
1-Enables all unmasked peripheral interrupts
0-Disables all peripheral interrupts

TMR0IE (TMR0 Overflow Interrupt Enable bit)
1-Enables the TMR0 interrupt
0-Disables the TMR0 interrupt

INTE (RB0/INT External Interrupt Enable Bit)
1-Enables the RB0/INT external interrupt
0-Disables the RB0/INT external interrupt

RBIE(RB Port Change Interrupt Enable Bit)
1-Enables the RB port change interrupt
0-Disables the RB port change interrupt

TMR0IF (TMR0 Overflow Interrupt Flag bit)
1-TMR0 register has overflowed (must be cleared in software)
0-TMR0 register did not overflow

INTF (RB0/INT External Interrupt Flag Bit)
1-RB0/INT External interrupt occurred(must be cleared in software))
0-RB0/INT External interrupt did not occur

RBIF (RB Port Change Interrupt Flag Bit)
1-At least one of the RB7 – RB4 pins changed state; a mismatch condition will continue to set line bit. Reading PORT B will end the mismatch condition and allow the bit to be cleared(must be cleared in software)
0-None of the RB7 – RB4 pins have changed state.

روند تنظیم و کارکرد تایمر 0

  • تایمر 0 را می توان هم به عنوان تایمر و هم به عنوان شمارنده استفاده کرد. 
  • تایمر 0 مقدار رجیستر TMR0 را ذخیره می کند. 
  • تمام قسمت های سمت چپ مدارهای منبع ساعت هستند. 
  • ثبات T0CON (Timer 0 Control) برای برنامه ریزی تایمر استفاده می شود و شامل بیت های نشان داده شده در شکل (T0CS، PSA و غیره) است. 
  • منبع ساعت می تواند داخلی یا خارجی باشد و توسط بیت T0CS کنترل می شود. 
  • در برخی موارد، کلاکی که از اسیلاتور می‌آید برای برنامه‌های ما بسیار سریع است: می‌توانیم آن را با استفاده از مقسم فرکانسی کاهش دهیم. مقسم فرکانسی مداری است که فرکانس سیگنال را بر 2، 4، 8، 16، ...، 256 تقسیم می کند. 
  • مقسم فرکانسی توسط بیت PSA فعال می شود. مقدار مقسم فرکانسی در رجیستر TMR0 نوشته می شود.

محاسبات تاخیر (delay)

یادگیری نحوه محاسبه تاخیر زمانی توسط تایمر بسیار مهم است زیرا تولید تاخیر دقیق رایج ترین کاربرد تایمر است.


مثال: میخواهیم تاخیر زمانی 1 میلی ثانیه ایجاد کنیم و فرض میکنیم یک نوسان ساز کریستالی 20 مگاهرتز به PIC متصل است.
 تایمر مربوط به فرکانس داخلی است که همیشه Fosc/4 است. 
فرکانس منبع ساعت (کریستال) Fosc = 20 مگاهرتز = 20000000 هرتز بنابراین، فرکانس تایمر:

Ftimer = Fosc / 4 = 20000000 / 4 = 5000000 Hz = 5 MHz

 اگر Prescaler = 1:32 باشد  پس 
Ftimer = 5000000 / 32 = 156250hz
بنابراین، مقدار رجیستر TMR0 برابر است با :
RegValue = 256-(Delay * Fosc)/(Prescalar*4)) = 256-((1ms * 20Mhz)/(32*4)) = 256-156=100
بعد از وقوع وقفه تایمر ، تایمر با این مقادیر دوباره بارگذاری میشود تا تایمر با همان تاخیر (1 میلی ثانیه) شروع شود. همانطور که خواهیم دید، قبل از وارد کردن این مقدار، رجیسترهای تایمر باید پیکربندی شوند.

کد تایمر0


در زیر مراحل پیکربندی و استفاده از Timer0 برای تولید تاخیر آورده شده است:
  1.  شمارش تایمر را برای تاخیر مورد نیاز محاسبه کنید. 
  2. بر اساس محاسبات تاخیر، بیت های Presaclar را در OPTION_REG تنظیم کنید. 
  3. PSAbit را برای استفاده از prescalar پاک کنید. 
  4. منبع ساعت داخلی/خارجی را با استفاده از بیت TOCS انتخاب کنید. 
  5. مقدار تایمر را در ثبات TMRO بارگذاری کنید. 
  6. وقفه Timer0 را با تنظیم بیت TMR0IE فعال کنید 
  7. با تنظیم بیت های GIE و PIE وقفه های سراسری و محلی را فعال کنید.
در زیر کد مربوط به چشمک زدن LED هر 1 میلی ثانیه آورده شده است :
#define _XTAL_FREQ 20000000
#include <xc.h>
// BEGIN CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG
int Count=0;
void main(void)
{
    TMR0=0;        //TMR0 Initiation
    T0CS=0;        //Choosing to work with internal clk
    T0SE=0;        //Reacting on Low2High edge
    PSA=0;         //Choosing to work with a Prescaler
    PS0=1;
    PS1=1;         //Prescaler value divides 256
    PS2=1;
    while(1)
    {
        while(!T0IF);        //Stays here 256 times and then T0IF=1
        T0IF=0;              //Resetting the overflow flag
        Count++;             //Increasing by 1
        if(Count==15)
        {
            Count=0;          //when count reaches 15 - Resetting to 0
        }
     }
 }

هیچ نظری موجود نیست:

ارسال یک نظر