باسلام خدمت همه
من نشستمو تقریبا هرچی اطلاعات درمورد تایمر صفر بود رو خوندم و نشستم بصورت زیر حساب کردم که :
/*
1: 8000000/64=125000Hz
2: 1/125000=8us
3: 8us*250=2ms ==> TCNT0=(256-250)=6
4: (1sec=1000ms ==> 1000/2ms=250 ==> if(c>=500
*/
با این حساب من با تایمر 0 بعد از 250 شمارش یه زمان 2 میلی ثانیه ای درست میکنم حالا اگه 500 بار این اتفاق بیافته میشه یک ثانیه
میخوام بدونم که چطور میشه این 500 بار شمارشو مثلا با تایمر 1 یا 2 بصورت کانتر انجام بدم و توی برنامم از وقفه این تایمر/کانتر بعنوان 1 ثانیه استفاده کنم .
اصلا اینکار امکان پذیر هستش ؟
لازمه توضیح بدم که از کدویژن 3.12 دارم استفاده میکنم و برنامه نویسی زبان C رو تقریبا سه هفتس شرو کردمو وارد نیستم ( تمام این مدت داشتم با سنسور 18B20 سروکله میزدم که خوشبختانه تونستم ازش جواب بگیرم) لطفا اگر ممکنه یه نمونه از این چیزی که گفتم برام مثال بزنید و بهم توضیح بدید ( البته اگر اینی که گفتمو میشه انجام داد ) .
باتشکر
اینتراپت سراسری رو فعال کن و
کد:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x06;
waitv++;
}
void wait()
{
TCNT0=0;
TIMSK|=(1<<TOIE0);
waitv=0;
while(waitv<500);
TIMSK&=~(1<<TOIE0);
حالا چرا از تایع delay خود کدویژن استفاده نمی کنی؟! اونم دقیق هست ها
دوباره سلام
آقا بابت کمکت ممنونم ( البته راستش خیلی سر در نیاوردم ) ولی خب یه ایده ای به ذهنم رسید که راحت تر بودش ، به این صورت که :
کد:
while (1){
if(c==500) {
second++;
if(second==60){
minute++;
second=0;
if(minute==60){
hour++;
minute=0;
if(hour==24){
hour=0;
}
}
}
sprintf(lcd_buffer,"Time = %d:%d:%d",hour,minute,second);
lcd_clear();
lcd_puts(lcd_buffer);
c=0;
}
}
حالا یه مشکل کوچولو دارم ، اونم اینه که موقع نمایش که با Sprintf قالب بندیش کردم عددامو بصورت تک رقمی نشون میده و موقعی که شمارش به دورقم رسید میادو رقم جدیدو اضافه میکنه برا همین میخوام بپرسم که :
- پطور میشه اعدادو جوری نشون داد که هرکدوم دو رقم دو رقم باشن از همون اول ؟ یعنی : 00:00:00
اتفاقی که میوفته اینه که هر 2 میلی ثانیه تایمر وقفش فعال میشه و یه متغییری رو زیاد می کنه وقتی 500 بار این عمل تکرار بشه 1 ثانیه وقفه ایجاد شده.
برای مشکل طول میدان این کارو بکن
کد:
sprintf(lcd_buffer,"Time = %2d:%2d:%2d",hour,minute,second);
برای اطلاع از فرمت بندی خروجی ها در C به این لینک برو
سلام سلام
خیلی خیلی ممنون که کمکم میکنی ، الان جای نشان دادن کاراکترای نمایش دورقمی شده و دیگه روی ال سی دی اعدادم جابجا نمیشن ولی هنوز یه عیب کوچولوی دیگه وجود داره .
اعداد بصورت : 0 :0 :0 نشون داده میشن و قسمت خالی وقتی عدد دورقمی میشه نشون داده میشه
چطور میشه کاری کرد که همون اول 00:00:00 باشن و موقع شمارش وقتی عدد تک رقمی هم که هست قسمت دهگانش وجود داشته باش؟ یعنی بعنوان مثال : 26:01:08
ربطی به نوع تعرف متغییرهام داره ؟ من اونارو unsigned char second,minute,hour; تعریف کردم
مثلا موقع تعریف متغییرشون میشه گفت دورقمی باشن ؟ اصلا اگه باشن چطور باید بصورت 00 مقدار دهی بشن چون در این صورت هم احتمالا رقم اولو فقط نشون میده !
- احتمالا باید یه نکته توی نوشتن برنامه باشه چون وقتی برای نمای اعشار %f میزنیم اگه براش رقم اعشار تعیین کنیم خودش به اندازه رقم های تعیین کرده ما صفر میزاره ولی اینحا با 2d اینکارو نکردش، ممنون میشم اگه نظرتونو بگید .
دوباره سلام
آقا behzady بگمونم مشکل حل شد ، توی همون لینکی که برای اطلاع از " فرمت بندی خروجی ها در C " گذاشته بودید برام بین نمونه کدهاش دیدم بعضی جاها قبل تعیین کردن ارقام ، 0 گذاشته منم امتحان کردم دیدم که جواب داد . حالا شما هم لطف کن بگو نظر شما هم همین هستش و این راه اصولیشه ؟
سلام
دوباره به یه مشکل برخوردم ، میشه ینفر یه مثال برام بزنه که باهاش یه عدد اعشاریو توی حافظه EEPROM ذخیره کنه ؟
خیلی گشتم اما انگار عملا نمیشه ازش جواب گرفت . یعنی میدونم باید یه متغییر از نوع فلوت توی EEPROM تعریف کنم و بعد از نوشتن توش حدود 4 میلی ثانیه صبر کنم و بعد ادامه برنامه اما انگار اعشاری نمیشه ذخیره کرد نمیدونم چرا !!!!
کسی تجربه برخورد با همچین چیزیو داره ؟ میتونین یه چیز عملی برام مثال بزنین ؟
ممنون