ايران ويج

نسخه‌ی کامل: کمک در مورد سنجش زمان توسط تایمر 0 و 1 در مگا 8 و کدویژن
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
باسلام خدمت همه

من نشستمو تقریبا هرچی اطلاعات درمورد تایمر صفر بود رو خوندم و نشستم بصورت زیر حساب کردم که :
/*
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 میلی ثانیه صبر کنم و بعد ادامه برنامه اما انگار اعشاری نمیشه ذخیره کرد نمیدونم چرا !!!!

کسی تجربه برخورد با همچین چیزیو داره ؟ میتونین یه چیز عملی برام مثال بزنین ؟
ممنون