به نام خدا : تو این مطلب از آموزش avr ،انشاالله میخوام ۲ تا پروژه با کانتر بزارم براتون و چند تا سوال/مشکل هم بگم بهتون تا برید حالشو ببرید.
آموزش جامع AVR جلسه ۱۷ آموزش Counter
آموزش AVR
جواب : والا با کانتر هم میشه تعداد پالس اعمال شده رو محاسبه کرد، با وقفه خارجی هم میشه، حالا مسئله اینه که کی باید از کدوم استفاده کنیم، در این مورد خودم هم هنوز نمیدونم اگه کسی میدنه به من هم بگه، مثلا برا کار های صنعتی و پروژه های دست حسابی باید از کدوم استفاده کنیم ، حالا اگه چیزی فهمیدم و اگه یادم بود
مطلب وقفه رو هم اگه خوستید میتونید مطلب مقابل رو بخونید : آموزش جامع میکروکنترلر AVR جلسه۳
توجه : بحث کانتر برا تایمر ۰ و ۲ هستش و تو تایمر۲، اون ۲ تا پایه (که تو جلسه ۱۵ دربارش گفتم ) برا بحث ساخت ساعت هستش.
با توجه به متن دیتاشیت مگا ۱۶ برا تایمر ۰ که میگه : "عمل مقایسه در تمام زمان ها رخ میده و مقدار ریجستر OCR0 همیشه با TCNT0 بررسی میشه."
The double buffered Output Compare Register (OCR0) is compared with the Timer/Counter value at all times
و یه متن دیگه دیتاشیت که میگه : "هر موقع مقدار دو ریجستر TCNT0 و OCR0 با هم برابر بشه تو کلاک بعدی وقفه مقایسه رخ میده و فلگ مربوط به مقایسه ۱ میشه"
Whenever TCNT0 equals OCR0, the comparator signals a match. A match will set the Output Compare Flag (OCF0) at the next timer clock cycle. If enabled (OCIE0 = 1 and Global Interrupt Flag in SREG is set), the Output Compare Flag generates an output compare interrupt
با توجه به دو جملسه بالا ببین خودتون میتونید به نتیجه ای برسید، من که هر چی فک کردم متوجه نشدم، حالا تو Eca هم مطرح کردم، بعد این که به جواب رسیدم شما رو هم مطلع میکنم، شما هم اگه میدونید بگید به ما.
موضوع مهم ۲ : یه مورد دیگه اینه که با توجه به این که ما از مد Ctc استفاده میکنیم لذا ریجستر های OCR0 , OCR1A مقدار TOP رو تعیین میکنن و هر موقع مقدار TCNTn با این دو ریجستر برابر بشه وقفه مقایسه رخ میده، و بعد از وقفه مقایسه مقدار TCNTn صفر میشه، حالا موردی که من متوجه نشدم اینه که چرا تو تایمر ۰ وقتی مقدار دو ریجستر با هم برابر میشه وقفه سرریز رخ میده. ، حالا اگه علتش رو فهمیدم اینجا میگم، اگه شما هم میدونید بگید.
شماتیک پروژه :
شماتیک برا جفت پروژه یکسان هستش، فقط با توجه به تایمری که ازش استفاده میکنید، حالت اون کلید رو روی یکی از پایه های T0 ِا T1 قرار بدید.
پروژه کانتر با تایمر ۰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <mega16.h> interrupt[TIM0_COMP] void Timer_Counter0_comp() { PORTA = PORTA + 1; } void main(void) { DDRA = 0XFF; PORTA = 0X00; // TIMER0 // External clock source on T0 pin (rising edge) >>>>> CS00 = 1, CS01 = 1, CS02 = 1 // Mode = CTC >>>>> WGM00 = 0, WGM01 = 1 // Timer/Counter0 Output Compare Match Interrupt Enable >>>>> OCIE0 = 1 TCCR0 = (0<<FOC0) | (0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (1<<CS02) | (1<<CS01) | (1<<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 = 0; #asm("sei") while(1); } |
پروژه کانتر با تایمر ۱
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <mega16.h> interrupt[TIM0_COMP] void Timer_Counter0_comp() { PORTA = PORTA + 1; } void main(void) { DDRA = 0XFF; PORTA = 0X00; // TIMER0 // External clock source on T0 pin (rising edge) >>>>> CS00 = 1, CS01 = 1, CS02 = 1 // Mode = CTC >>>>> WGM00 = 0, WGM01 = 1 // Timer/Counter0 Output Compare Match Interrupt Enable >>>>> OCIE0 = 1 TCCR0 = (0<<FOC0) | (0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (1<<CS02) | (1<<CS01) | (1<<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 = 0; #asm("sei") while(1); } |
دانلود پروژه کانتر با Avr | دو پروژه این مطلب
خوب این مطب هم توم شد، اگه پروژه ای چیزی با کانتر در نظر دارید بگید تا در صورت نیاز انجام بدم و پروژش رو پیوست کنم.
در ضمن اگه متوجه نشدید ، اگه جایی رو مشکل دارید حتما بپرسید، و مطمئن باشید اگه بلد باشم جواب میدم و اگه هم بلد نباشم میگم بلد نیستم .
فعلا یا علی.
مهمان
سلام
کد دستوری که برای تایمر 1 نوشتی اشتباه هستش، لطفا دوباره چک کن .
مهمان
سلام
هیچکدوم از پروزه ها کار نمیکنه
مد سی تی سی انتخاب کردبین چرا پس مقدار ocr0رو صفر کردین؟
مهمان
سلام و خسته نباشید.
من یه کمک از شما می خواستم اگر لطف کنید کمکم کنید ممنون میشم.
من یه انکودر 200 پالس ساختم اما وقتی میخوام پالس هاشو بخونم با atmega32 کلی پالس اضافه میشموره. در واقع زمانی که انکودر هم نمی چرخه بازم میشموره. من برایه شمارش از وقفه خارجی وهم از شمارش گر counter استفاده کردم .اگر میشه به من در نوشتن کدش کمک کنین.
نویسنده این مطلب
سلام
فعلا کاری رو گه گفتم رو انجام بده و کد و شماتیکت رو هم برام آپلود کن(تو پیکو فایل آپلود کن و لینکش رو برام بفرست همینجا)
انکودر های مختلفی من دیدم—مکانیکی، الکترونیکی، 1 تومنی، 100 تومنی، و…
دقیقا بگو، یه عکس و یه لینک از انکودرت برام بفرست.
خب من چطور بدونم مشکل کدار کجاس آخه
مهمان
سلام عالی بود ابن مطلب و مطلب قبلی
ربات تلگرامم جالب شده
استفاده کردم / ممنون
نویسنده این مطلب
سلام
برا ربات اگه نظری داشتید بگید، برا زیبایی سایت هم همین طور