جستجو کردم ولی به نتیجه ای نرسیدم.وقتی در کد ویزاردinterrupt را فعال می کنیم تابع read_adc دیگر تعریف نمیشود.پس هنگامی که وقفه اتفاق افتاد چطوری مقدار پایه های مختلف ADC را بفهمیم؟
اطلاعیه
Collapse
No announcement yet.
کمک در مورد ADC و interrupt در کدویژن
Collapse
X
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
سلام دایی جان
وقتی اینتراپت رو فعال می کنی یه روتین اینتراپت به اول برنامه اضافه میشه.
اگه نگاهی به داخل این روتین بندازی دستور زیر رو می بینی:
adc_data=ADCW
یعنی خودش برنامه خوندن از ADC رو نوشته و مقدار ADC رو داخل متغیر adc_data ریخته.با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
برای مثال در ATMega16 که 8 تا ADC داره چطوری مثلا ADC دوم و پنجم رو بخونیم؟
یه سوال دیگه:با تابع read_adc در حلقه while(1) برنامه مقدار ADC رو می خونم و رو صفحه نمایش میدم.ولی ثابت نیست و تغییرات عجیبی داره.قاعدتا نباید از 1023 بالاتر بره ولی 2000 یا 3000 هم نشون میده.
دیدگاه
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
اینم کد برنامم:
کد:while (1) { // Place your code here a=read_adc(0); itoa(a,s1); lcd_puts(s1); lcd_gotoxy(8,0); a=read_adc(1); itoa(a,s1); lcd_puts(s1); lcd_gotoxy(0,1); a=read_adc(2); itoa(a,s1); lcd_puts(s1); lcd_gotoxy(8,1); a=read_adc(3); itoa(a,s1); lcd_puts(s1); delay_ms(100); }
دیدگاه
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
وقتی اینتراپت ADC رو فعال کردی باید توی روتین اینتراپت بخونی. بعد از خوندن توی همون روتین اینتراپت می تونی کانال دلخواهتو انتخاب کنی.
توی برنامه بالا هم که بدون اینتراپته باید( lcd_gotoxy(0,0 رو اول روتین داخل while بنویسی.با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.
دیدگاه
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
با تشکر از شما دوست عزیز.خوب چطوری توی روتین کانال دلخواهم رو انتخاب کنم؟مثلا بنویسم adc_data[0] .
در برنامه بالا هم جای lcd_gotoxy درسته چون من در هر لحظه 4 تا ADC رو می خونم و تو 4 جای مختلف صفحه نشون میدم.از این بابت درسته و کار هم کرده.
در ضمن با انتخاب کردن دقت 8 بیتی و noise canceler مشکل بر طرف شد.
دیدگاه
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
نه دایی
اگه بدود اینتراپت کار کرده باشی می بینی در روتین خوندن از ADC خط اول نوشته :( ADMUX=adc_input | (ADC_VREF_TYPE & 0xff
همین دستور رو می تونی در روتین اینتراپت بکار ببری.
روتین LCD کدویژن یه مشکلی داره:
وقتی یه عدد 4 رقمی رو توی یه جای LCD می نویسه چهار خانه اشغال می کنه. وقتی این عدد 2 رقمی بشه دو خونه از 4 رقم قبلی رو پاک نمی کنه و همونجور می مونه.
مثلا داری 1020 چاپ می کنی و بعد می خوای همونجا 300 چاپ کنه. بجای 300 می نویسه 1300 !!!
یعنی رقم 1 عدد 1020 سر جای خودش می مونه و پاک نمیشه.
یه راهش اینه که آخر while یه دستور پاک کردن کل LCD بزاری. اما این باعث چشمک زدن LCD میشه.
راه دوم که من همیشه بکار می برم اینه که توی همون خونه یه رشته چهار رقمی خالی چاپ کنی.
lcd_puts(" "example
با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.
دیدگاه
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
اگه بدود اینتراپت کار کرده باشی می بینی در روتین خوندن از ADC خط اول نوشته :( ADMUX=adc_input | (ADC_VREF_TYPE & 0xff
همین دستور رو می تونی در روتین اینتراپت بکار ببری.
بازم ممنون.
دیدگاه
-
پاسخ : کمک در مورد ADC و interrupt در کدویژن
هر جای برنامه که دوست داری 3 خط زیر رو بنویس دایی:
این 3 خط یعنی کانال 2 رو انتخاب کردی و 10 میکرو ثانیه صبر کردی و بعد دستور شروع به کار ADC رو دادی.ADMUX=2 | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
بعد از اینکه ADC کار تبدیل رو انجام داد اینتراپت ADC رو روشن می کنه. داخل روتین اینتراپت هم می تونی مقدار ADCW رو بخونی.
بعدش توی همون روتین اینتراپ می تونی دوباره 3 خط بالا رو بنویسی و بجای 2 هر کانال دیگه ای که دوست داری بزاری.با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.
دیدگاه
دیدگاه