به نام خدا : سلام، توی این مطلب از آموزش AVR میخوام به آموزش مد CTC تایمر بپردازیم و البته این آموزش به صورت پروژه محور هستش و تو مطالب قبل ریجستر ها رو توضیح دادم، تو این مطلب میخوام پروژه ساعت با تایمر های ۰ و ۱ و ۲ به کمک مد CTC رو براتون قرار بدم.
آموزش جامع AVR جلسه ۱۸ Timer Counter CTC Mode
جان داش تقصیر من نیستا، این مطالب رو یکی در میدون میزارم تو سایت ، هی میام ترتیب رو رعایت کنم میبینم نمیشه و …. بگذریم حال توضیح دادن رو ندارم.
توجه مهم : اینو همون اول کار بگم که پروژه تو پروتئوس درست کار نمیکنه، در عمل درست کار میکنه، من تست کردم در عمل حدود هر ۵ دقیقه یه ۵-۸ ثانیه جو میوفته(البته بدون کریستال ۸ میگ خارجی) و کریستال هم نداشتم تا با کریستال تست کنم و ببینم اوضاع چطوره، اینم بگم که نمیدونم این تاخیری که وجود داره علتش چیه، آیا با کریستال خارجی مشکل رفع میشه، آیا مشکل از پروژه هستش اینو من نمیدونم کسی اگه فهمید به ما هم بگه.
اگه میخواین از کریستال خارجی استفاده کنید میتونید مطلب مقابل رو بخونید : آموزش جامع AVR جلسه ۱۴ System Clock and Clock Options
مطالبی که مربوط به ساعت هستش و من تو سایت گزاشتم به صورت زیر هستش :
- انواع روش ساخت ساعت با AVR
- نمایش ساعت تاریخ PC در LCD با آردوینو جلسه ۵
- پروژه AVR ساعت ساده با تایمر ۰
- پروژه AVR ساعت با ماژول DS۳۲۳۱ و سون سگمنت
- پروژه ساعت دیجیتال با LCD گرافیکی
- آموزش راه اندازی ماژول ساعت دقیق DS3231
- ساعت با ic ds1307
- ساعت دییجیتالی با سون سگمنت
آموزش مد CTC
توجه جالب : البته اینم بگم که لینک های بالا هیچ ربطی به این مطلب نداره؛ البته از یه لحاظ ربط داره ولی این مطلب برا آموزش کار با مد CTC تایمر هستش، که چون من میخوام پروژه محور مطالب رو آموزش بدم لذا گفتم مد CTC رو با گزاشتن مطالبی درباره ساعت توضیح بدم، البته مطالب دیگه ای با این مد و مد های دیگه رو به زودی میزارم تو سایت.
جواب : سواله خوبیه، میگم شما چقدر حواستون جمع هستش، نمیشه پیچوندتون و به جزئیات دقت میکنید.
در جواب باس بگم که این مد Normal از ۰ میشموره تا max (که مقدار ماکس در تایمر ۸ بیتی برابر ۲۵۵ و در تایمر ۱۶ بیتی برابر ۶۵۵۳۵ هستش) لذا مثلا فک کنید کلاک تایمر رو طوری تنظیم کنیم که به ازای هر ۱۰۰ تا کلاک ۱ ثانیه تولید میشه(۱ ثانیه طول میشه تا تایمر به اندازه ۱۰۰ بشموره، که مقدار TCNTn به ۱۰۰ برسه) لذا اگه بخوایم از مد نرمال استفاده کنیم بعد از این که مقدار ریجستر TCNTn به ۱۰۰ رسید باس مقدار TCNTn رو ۰ کنیم (و به متغییر ثانیه ۱ واحد اضافه کنیم) تا دوباره به ۱۰۰ برسه و ۱ ثانیه تولید بشه و باس باید مقدارش رو ۰ کنی و...
ما چون آدم تنبلی هستیم و علاقه داریم پروژه به صورت خیلی کوتاه بنویسیم و از آسون ترین روش استفاده کنیم میایم و از مد CTC استفاده میکنیم، حالا مد CTC مگه چه برتری نسبت به مد Normal داره؟؟؟؟ در زیر به این سوال جواب میدم :
یه خوبی که تو مد CTC هستش اینه که میشه مقدار MAX رو برخلاف مد Normal تعیین کرد، که این کار به کمک ریجستر (OCR0 در تایمر ۰ و OCR2 در تایمر ۲ و OCR1A در تایمر ۱) انجام میشه، که البته اگه جدول مربوط به انتخاب مد تو تایمر مربوطه که تو جلسات قبل گزاشتم(و تو دیتاشیت هم هستش) این موضوع که مقدار MAX کدوم مد رو میشه تعیین کرد و این تعیین کردن به عهده کدوم ریجستر هستش.
و تو مد CTC وقتی تایمر به MAX (که با ریجستر هایی که در بالا گفتم تعیین میشه کردش) برسه مقدار TCNTn به صورت خودکار صفر میشه و دیگه نیاز نیست دستی خودمون یه کد بزاریم تو پروژه تا وقتی به فلان عدد رسید صفرش کنیم، تو مد نرمال باس دستی ریجستر TCNTn رو صفر میکردیم، ولی تو مد CTC این کار به صورت خودکار انجام میشه.
منظور از TCNTn هم رو حتما میدونیم دیگه، به جای n اعداد ۰ و ۱ و۲ بزارید که میشه برا تایمر ۰ و ۱ و۲٫
اووووف مای گاد، چقدر توضیح دادم، ولی تو دیتاشت این موضوع رو تو ۵ کلمه گفته و من براش یه رمان نوشتم.
شماتیک پروژه (برا تموم تایمر ها همینه شماتیک)
اینم مدار در عمل (تو پروتئوس درست کار نمیکرد پروژه، مجبور شدم در عمل ببندم )
توی این عکسی که گرفتم یه مو بود ، مجبور شدم با فوتوشاپ حذفش کنم ولی یه جای عکس اگه دقت کنید گندی که زدم رو میتونید ببینید.
توضیح CTC در تایمر ۰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <mega16.h> #include <stdlib.h> #include <lcd.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm int i=0; int Second=57, Minute=59, Hour=22; char Str_Second[1],Str_Minute[1],Str_Hour[1]; interrupt[TIM0_COMP] void Timer_Counter0_comp() { i++; if(i == 125) { Second++; if(Second==60){Second=0; Minute++;} if(Minute==60){Minute=0; Hour++;} if(Hour==24){Hour=0;} itoa(Hour,Str_Hour); lcd_gotoxy(4,1); if(Hour<10)lcd_puts("0"); lcd_puts(Str_Hour); lcd_gotoxy(6,1); lcd_putchar(':'); ////////////////////////////////// itoa(Minute,Str_Minute); lcd_gotoxy(7,1); if(Minute<10)lcd_puts("0"); lcd_puts(Str_Minute); lcd_gotoxy(9,1); lcd_putchar(':'); ////////////////////////////////// itoa(Second,Str_Second); lcd_gotoxy(10,1); if(Second<10)lcd_puts("0"); lcd_puts(Str_Second); i = 0; } } void main(void) { // TIMER0 // Clock Timer0 = CLK/256 >>>>> CS00 = 0, CS01 = 0, CS02 = 1 // Mode = CTC >>>>> WGM00 = 0, WGM01 = 1 // Timer/Counter Output Compare Match Interrupt Enable >>>>> OCIE0 = 1 TCCR0 = (0<<FOC0) | (0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (1<<CS02) | (0<<CS01) | (0<<CS00); TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<OCIE0) | (0<<TOIE0); //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0); TCNT0 = 0; OCR0 = 250; lcd_init(16); #asm("sei") lcd_gotoxy(0,0);lcd_puts("DMF313.IR Timer"); while(1); } |
توضیح CTC در تایمر ۱
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <mega16.h> #include <stdlib.h> #include <lcd.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm int Second=55, Minute=59, Hour=21; char Str_Second[1],Str_Minute[1],Str_Hour[1]; interrupt[TIM1_COMPA] void Timer_Counter1_compa() { Second++; if(Second==60){Second=0; Minute++;} if(Minute==60){Minute=0; Hour++;} if(Hour==24){Hour=0;} itoa(Hour,Str_Hour); lcd_gotoxy(4,1); if(Hour<10)lcd_puts("0"); lcd_puts(Str_Hour); lcd_gotoxy(6,1); lcd_putchar(':'); ////////////////////////////////// itoa(Minute,Str_Minute); lcd_gotoxy(7,1); if(Minute<10)lcd_puts("0"); lcd_puts(Str_Minute); lcd_gotoxy(9,1); lcd_putchar(':'); ////////////////////////////////// itoa(Second,Str_Second); lcd_gotoxy(10,1); if(Second<10)lcd_puts("0"); lcd_puts(Str_Second); } void main(void) { // TIMER1 // Clock Timer1 = CLK/256 >>>>> CS10 = 0, CS11 = 0, CS12 = 1 // Mode = CTC >>>>> WGM10 = 0, WGM11 = 0, WGM12 = 1, WGM13 = 0 // Timer/Counter Output Compare A Match Interrupt Enable >>>>> OCIE1A = 1 TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (0<<WGM11) | (0<<WGM10); TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10); TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0); //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0 ); //TCNT1L = 0X00; TCNT1H = 0X00; //OCR1AL = 0X00; OCR1AH = 0X00; //OCR1BL = 0X00; OCR1BH = 0X00; TCNT1 = 0; OCR1A = 31250; lcd_init(16); #asm("sei") lcd_gotoxy(0,0);lcd_puts("DMF313.IR Timer"); while(1){}; } |
توضیح CTC در تایمر ۲
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include <mega16.h> #include <stdlib.h> #include <lcd.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm int i = 0; int Second=0, Minute=59, Hour=23; char Str_Second[1],Str_Minute[1],Str_Hour[1]; interrupt[TIM2_COMP] void Timer_Counter2_comp() { i++; if(i == 125) { Second++; if(Second==60){Second=0; Minute++;} if(Minute==60){Minute=0; Hour++;} if(Hour==24){Hour=0;} itoa(Hour,Str_Hour); lcd_gotoxy(4,1); if(Hour<10)lcd_puts("0"); lcd_puts(Str_Hour); lcd_gotoxy(6,1); lcd_putchar(':'); ////////////////////////////////// itoa(Minute,Str_Minute); lcd_gotoxy(7,1); if(Minute<10)lcd_puts("0"); lcd_puts(Str_Minute); lcd_gotoxy(9,1); lcd_putchar(':'); ////////////////////////////////// itoa(Second,Str_Second); lcd_gotoxy(10,1); if(Second<10)lcd_puts("0"); lcd_puts(Str_Second); i = 0; } } void main(void) { // TIMER2 // Clock Timer2 = CLK/256 >>>>> CS20 = 0, CS21 = 1, CS22 = 1 // Mode = CTC >>>>> WGM20 = 0, WGM21 = 1 // Timer/Counter Output Compare Match Interrupt Enable >>>>> OCIE2 = 1 TCCR2 = (0<<FOC2) | (0<<WGM20) | (0<<COM21) | (0<<COM20) | (1<<WGM21) | (1<<CS22) | (1<<CS21) | (0<<CS20); TIMSK = (1<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0); //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0); //ASSR = (0<<AS2) | (0<<TCN2UB) | (0<<OCR2UB) | (0<<TCR2UB); TCNT2 = 0; OCR2 = 250; lcd_init(16); #asm("sei") lcd_gotoxy(0,0);lcd_puts("DMF313.IR Timer"); while(1); } |
بررسی مُد CTC در تایمر/کانتر میکروکنترلرهای AVR ؟ [۲۴]
کار با تایمر/کانتر یک در مد CTC ؟ [۲۵]
خوب این مطلب هم تموم شد، نحوه محاسبه مقدار ریجستر TCNTn هم تو مطالب قبل گفتم داشمون تو دو لینک بالا هم فک کنم گفته باشه، ولی اگه کسی نمیدونه هنوز بگه تا توضیح بدم.
فعلا خدافظ تا مطلب بعد.
مهمان
سلام
وقت بخیر
با تشکر از زحمات شما و سایت خوبتون
ببخید چرا فیلم پروژه جلسه هجدهم باز نمیشه؟
این ارورو رو میده
Error loading player:
No playable sources found
اجرکم عند الله
نویسنده این مطلب
سلام
پاک شده انگار – هر چی گشتم تو آپارات پیداش نکردم متاسفانه.
مهمان
یه سوال داشتم
پروژ کامل ساعت تو ال سی دی کاراکتری تو سایت هس؟؟؟
منظورم از کامل اینه که بشه تنظیمش هم کرد
نویسنده این مطلب
سلام-نمیدونم.
مهمان
سلام این پروژه رو خیلی راحت تر هم میشد نوشت
گفتم کدش رو براتون بفرستم یه نگاه بندازین
#include
#include
#include
#include
int m=0,i=0,s=10,h=0,ms=0;
char clock[20],f[5];
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
// Place your code here
ms++;
if(ms==10)
{
s++;
ms=0;
if(s==60)
{
m++;
s=0;
if(m==60)
{
m++;
}
}
}
sprintf(clock,”%02d:%02d:%02d “,h,m,s);
lcd_gotoxy(0,0);
lcd_puts(clock);
}
مهمان
خیلی ممنون اگه میشه لطفا ساعت با کریستال خارجی و سون سگمنت چهارتایی رو هم بزارید
واقعا گلی
نویسنده این مطلب
سلام
مطلب ۷s به صورت جدا و ساعت با کریستال به صورت جدا توی سایت هستش…..