مبانی شمارش در سیستم های دیجیتالی
یک ماژول تایمر معمولاً یک مدار دیجیتال (جانبی) در تراشه میکروکنترلر است که می تواند از طریق چند 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 مگاهرتز یا هر مقدار دیگری باشد. بنابراین، مقدار ذخیره شده در فلیپ فلاپ های ماژول تایمر نشان دهنده تعداد کلاکها است. که به راحتی با استفاده از فرمول زیر به دوره زمانی تبدیل می شود:
بلوک دیاگرام ماژول Timer1 (از دیتاشیت) در زیر نشان داده شده است
حالت شمارنده
بررسی رجیستر T1CON
T1CON | |||||||||
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | ||
– | – | T1CKPS1 | T1CKPS0 | T1OSCEN | T1SYNC | TMR1CS | TMR1ON | ||
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
#Bit | Name | Set/Clear | Function Description | ||||||
0 | TMR1ON | 1 | Enables Timer1 | ||||||
0 | Stops Timer1 | ||||||||
1 | TMR1CS | 1 | External clock from pin RC0/T1OSO/T1CKI (on the rising edge) | ||||||
0 | Internal clock (FOSC/4) | ||||||||
2 | T1SYNC | 1 | When TMR1CS = 1, Do not synchronize external clock input When TMR1CS = 0, This bit is ignored | ||||||
0 | When TMR1CS = 1, Synchronize external clock input When TMR1CS = 0, This bit is ignored | ||||||||
3 | T1OSCEN | 1 | Oscillator is enabled | ||||||
0 | Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain) | ||||||||
4-5 | T1CKPS0:T1CKPS1 | 1 1 | 1:8 prescale value | ||||||
1 0 | 1:4 prescale value | ||||||||
0 1 | 1:2 prescale value | ||||||||
0 0 | 1:1 prescale value | ||||||||
6 | – | – | – | ||||||
– | – | ||||||||
7 | – | – | – | ||||||
– | – |
تایمر در میکروکنترلر PIC16f877
میکروکنترلر مورد استفاده ما در این سری آموزشها یعنی pic16f877 دارای 3 ماژول تایمر/کانتر مستقل از هم به نام های timer0 , timer1 و timer2 میباشد. کلیات استفاده از تایمرها تفاوت چندانی با یکدیگر ندارد .بعضی تایمرها خصوصیات متفاوتی با دیگرتایمرها دارند ولی در راه اندازی واستفاده کردن تفاوت خاصی وجود ندارد.
تایمر 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)
Ftimer = Fosc / 4 = 20000000 / 4 = 5000000 Hz = 5 MHz
کد تایمر0
- شمارش تایمر را برای تاخیر مورد نیاز محاسبه کنید.
- بر اساس محاسبات تاخیر، بیت های Presaclar را در OPTION_REG تنظیم کنید.
- PSAbit را برای استفاده از prescalar پاک کنید.
- منبع ساعت داخلی/خارجی را با استفاده از بیت TOCS انتخاب کنید.
- مقدار تایمر را در ثبات TMRO بارگذاری کنید.
- وقفه Timer0 را با تنظیم بیت TMR0IE فعال کنید
- با تنظیم بیت های GIE و PIE وقفه های سراسری و محلی را فعال کنید.
//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
}
}
}
هیچ نظری موجود نیست:
ارسال یک نظر