PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل با تایمر2 pic



mahdifah
03-01-2013, 17:00
با سلام و خسته نباشید.
چند وقتی هست که روی تایمر 2 pic گیر کردم و هرکار میکنم که باهاش زمان دقیق درست کنم اصلا نمیشه. یعنی نمیتونم , شدنش که میشه. خیییییییلیم دقیق نمیخوام.مثلا تو 20 یا 30 ثانیه 1 ثانیه عقب یا جلو شد مشکل نداره ولی دیگه نه انقد. من دستم رو میکرو میزارم قشنگ کار میکنه ولی بر میدارم از کار میفته. البته از تایمر صفر و یک هم تو برنامه استفاده میکنم. و وقفه تایمر صفر. ولی میخوام با تایمر 2 یه زمانه دقیقی ایجاد کنم. کسی میتونه کمکم کنه؟ زبان برنامه نویسیم هم ccs هستش.
با تشکر

1nafar
03-01-2013, 23:06
سلام
اینجور مشکلات معمولا به یکی از دو دلیل زیر ایجاد میشن :
توی سخت افزار ار منبع کلاکی غیر از منبع کلاک تعیین شده در برنامه استفاده بشه :
مثلا در برنامه فرکانس کاری برابر با 20 مگا هرتز هست ولی به میکرو کریستال 10 مگا هرتز متصل هست .
توی تایمر ها از متغیر های مشترک استفاده شده باشه .
مثلا یک متغیر به نام a معرفی شده باشه که هم از تایمر دو و هم از یک جای دیگه مقدار بگیره .
اگه برنامتون رو بزارید بهتر میشه نظر داد .

mahdifah
03-01-2013, 23:33
آقا دم شما گرم. حجم برنامم خیلی زیاد بودش واس همین قسمت مربوط به تایمر 2ش رو آپلود کردم.من هم کلاک درست وصل کردم و هم توی برنامم از یه متغییر مشترک استفاده نکردم. اصلا به نظر شما میشه با تایمر 2 زمان دقیق ایجاد کردش؟؟ شما خودتون امتحان کردید؟؟ و اینکه نظرتون راجبه micro c چی هستش؟؟ در مقایسه با ccs بهتر نیستش؟؟
با تشکر

1nafar
04-01-2013, 10:04
سلام
توی تایمر 2 زمان از رابطه ی عدد پریود*(فرکانس cpu /(مد تایمر * مقدار postscale ) ) بدست میاد ،

setup_timer_2 ( T2_DIV_BY_16,250,16);
که توی برنامه شما فرکانس کاری میکرو برابر با 20 مگا هرتز هست که فرکانس cpu میشه 5 مگا هرتز ، با این حساب مقدار زمانی که تایمر میشمره میشه 128 =250*(5000000 /(16* 16 ) ) میلی ثانیه
توی برنامه از وقفه ی تایمر 2 استفاده کردید که بهتره به شکل زیر تغییرش بدید :

void timer2_isr()
{
ll+=1;
if(ll>=100)
{
ll=0;
output_toggle(led);
}
}

برنامه ظاهرا مشکلی نداره اما اگه چند تا مورد زیر رو هم رعایت کنید بهتره :
1- در ابتدای برنامه ( بعد از معرفی کریستال ) از دستور #priority timer2 استفاده کنید .
این دستور وقفه ها رو اولویت بندی میکنه و اگه دو تا وقفه به صورت همزمان ایجاد بشن ، ابتدا وقفه ی معرفی شده توسط دستور مذکور اجرا میشه .

#priority timer2
2- دستور return; رو از زیر برنامه ی تایمر 0 حذف کنید .

mahdifah
04-01-2013, 12:56
پس با این حساب نمیشه با تایمر 2 زمان دقیق درست کرد. درسته؟؟ فکر کنم مشکل از ccs باشه. نظر شما چیه؟؟ من حتی دستم نزدیک آی سی میکنم قشنگ 4یا 5 ثانیه عقب میفته!!!!!!!

mahdifah
04-01-2013, 23:22
کسی میدونه توی ccs با تایمر 2 میشه زمان دقیق ایجاد کردش یا نه؟؟ انصافا یه ماهه گیرم روش!!!!!!!! کمک کنید

mahdifah
05-01-2013, 14:52
آقا ما به این نتیجه رسیدیم که با تایمر صفر و دو و تایمر داخلی اصلا نمیشه زمان دقیق ایجاد کردش. مجبور شدیم کل برنامر تغییر بدیم از همون تایمر 1 استفاده کنیم. مثل ساعت کار میکنه. از کمک همگی ممنونم

mahdifah
06-01-2013, 00:43
آقا ما اشتباه به نتیجه رسیده بودیم. بعد از اینکه کله برناممون پاک کردیم فهمیدیم خییییییلی راحت با تایمر 2 میشه زمان دقیق ایجاد کرد. فقط نباید به رجیستراش دست میزدم و مثل تایمر 1 تنظیمش میکردم!!!!!!
اینم نمونه برنامه. حتی نمیخاس روشنش کنم!!!!!!!



#include <16f873a.h>
#device adc=8
#use delay (clock=20mhz) //you are selecting 'crystal' with hs
#fuses hs,nowdt,noput,nobrownout,protect
//keep case consistent

#define led pin_c5
#use i2c(master,sda=pin_c4,scl=pin_c3)

#include <2408.c>

int8 tick;

#int_timer2
void timer2_isr(void) {
if(++tick>=100) {
tick=0;
output_toggle(led);
}
}

//-------------------------------------------------------------------
void main(void){

setup_timer_0 (rtcc_internal|rtcc_div_256);
setup_timer_2 ( t2_div_by_16,250,16);
enable_interrupts(int_timer2);
enable_interrupts(global);
output_high(led);
//delay is pointless

while(true) {

}
}