کلیه مطالب این کانال به جز مواردی که صریحا در متن آن ذکر شود، جنبه تالیفی دارد و از جایی کپی نشده و تجارب و دانسته هایی است که بدون هیچ انتظار و چشم داشتی در اختیار دوستان قرار داده می شود. بنابراین از دوستان گرامی درخواست می شود پست ها را تنها بصورت فوروارد در کانال های دیگر قرار دهند و از کپی کردن مطالب خودداری کنند.
@KnowledgePlus
@KnowledgePlus
در ارتباط rs485 هنگامی که بایتی ارسال می شود و سمت مقابل باید پاسخ دهد، به دلیل یک طرفه بودن ارتباط باید تاخیر کافی در پاسخ دادن سمت مقابل لحاظ شود تا فرستنده فرصت داشته باشد وضعیت خود را به گیرنده تغییر دهد و قبل از تغییر وضعیت از فرستنده به گیرنده، ارسال پاسخ از سمت مقابل آغاز نشود. همچنین کدنویسی بخش فرستنده باید به گونه ای باشد که بعد از ارسال و برای دریافت پاسخ، در حداقل زمان ممکن جهت خط به عنوان گیرنده تغییر داده شود و مواردی مانند وقوع یک وقفه نتواند تاخیری را در این تغییر جهت از فرستنده به گیرنده ایجاد کند.
@KnowledgePlus
@KnowledgePlus
نکته طراحی مدار:
در IC های Gate driver سری IR2xxx مانند IR2113، رعایت یکسری نکات فراتر از آنچه در datasheet نوشته شده برای جلوگیری از روشن شدن ناخواسته سوییچ بخش high side در هنگام روشن شدن مدار و سوختن احتمالی سوییچ های قدرت لازم است. در این رابطه به توضیحات فایل pdf زیر مراجعه کنید
https://www.irf.com/technical-info/designtp/dt99-7.pdf
@KnowledgePlus
در IC های Gate driver سری IR2xxx مانند IR2113، رعایت یکسری نکات فراتر از آنچه در datasheet نوشته شده برای جلوگیری از روشن شدن ناخواسته سوییچ بخش high side در هنگام روشن شدن مدار و سوختن احتمالی سوییچ های قدرت لازم است. در این رابطه به توضیحات فایل pdf زیر مراجعه کنید
https://www.irf.com/technical-info/designtp/dt99-7.pdf
@KnowledgePlus
نکته مهم در برنامه نویسی:
یکی از موارد مهم در کدنویسی که عدم توجه به آن می تواند منجر به اشکالات غیر تکراری و با عملکرد به ظاهر تصادفی در اجرای برنامه شود، دسترسی به متغیرها از دو سطح مختلف برنامه است. منظور از دو سطح مختلف برنامه، حلقه اصلی و یک وقفه و یا دو سطح وقفه مختلف است. دسترسی از سطوح مختلف به یک متغیر در صورتی که یک سطح از برنامه مقدار متغیر را تغییر دهد، در صورت عدم توجه برنامه نویس به تبعات این نوع دسترسی می تواند در عملکرد برنامه خطاهایی را ایجاد کند.
برای توضیح بیشتر فرض کنید در AVR به یک متغیر چهار بایتی در حلقه اصلی برنامه و یکی از وقفه ها دسترسی وجود داشته باشد، به نحوی که حلقه اصلی مقدار این متغیر را تغییر دهد. به عنوان مثال عددی، اگر یک متغیر چهار بایتی دارای مقدار 0x10ff0000 باشد و لازم باشد در حلقه اصلی با متغیر چهار بایتی دیگری با مقدار 0x00010000 جمع شود و در محل متغیر اولیه ذخیره شود که حاصل این جمع در نهایت 0x11000000 خواهد بود. اما با توجه به هشت بیتی بودن ساختار AVR این جمع بصورت بایت به بایت انجام و ذخیره سازی می شود . حال اگر فرض کنیم وقفه ای در بین ذخیره سازی این متغیر و بعد از ذخیره سازی سه بایت با ارزش کمتر پذیرفته شود و در روتین آن وقفه مقدار این متغیر از حافظه خوانده شود، در این وضعیت مقدار متغیر 0x10000000 خوانده خواهد شد چون بایت با ارزش بیشتر که قبلا 0x10 بوده و اکنون باید 0x11 باشد، هنوز ذخیره سازی نشده است. بنابراین مقدار خوانده شده صحیح نخواهد بود و می تواند باعث خطا در عملکرد برنامه شود. شبیه همین مثال را می توان برای تغییر مقدار یک متغیر توسط روتین وقفه و قضاوت اشتباه روی مقدار متغیر در حلقه اصلی مطرح کرد.
بطور کلی در این نوع دسترسی ها که از دو سطح مختلف برنامه انجام می شود، باید در شیوه کدنویسی مراقب چنین خطاهای احتمالی باشیم که یک روش برای جلوگیری از چنین خطاهایی این است که قبل از انجام عملیات روی این نوع متغیرها، وقفه هایی که می توانند منجر به چنین تغییراتی شوند بصورت موقت غیر فعال و بعد مجددا فعال شوند.
* مطلب اخیر تجربه ای است که در جریان چند صد هزار خط برنامه نویسی و انجام پروژه های متعدد حاصل شده است.
@KnowledgePlus
یکی از موارد مهم در کدنویسی که عدم توجه به آن می تواند منجر به اشکالات غیر تکراری و با عملکرد به ظاهر تصادفی در اجرای برنامه شود، دسترسی به متغیرها از دو سطح مختلف برنامه است. منظور از دو سطح مختلف برنامه، حلقه اصلی و یک وقفه و یا دو سطح وقفه مختلف است. دسترسی از سطوح مختلف به یک متغیر در صورتی که یک سطح از برنامه مقدار متغیر را تغییر دهد، در صورت عدم توجه برنامه نویس به تبعات این نوع دسترسی می تواند در عملکرد برنامه خطاهایی را ایجاد کند.
برای توضیح بیشتر فرض کنید در AVR به یک متغیر چهار بایتی در حلقه اصلی برنامه و یکی از وقفه ها دسترسی وجود داشته باشد، به نحوی که حلقه اصلی مقدار این متغیر را تغییر دهد. به عنوان مثال عددی، اگر یک متغیر چهار بایتی دارای مقدار 0x10ff0000 باشد و لازم باشد در حلقه اصلی با متغیر چهار بایتی دیگری با مقدار 0x00010000 جمع شود و در محل متغیر اولیه ذخیره شود که حاصل این جمع در نهایت 0x11000000 خواهد بود. اما با توجه به هشت بیتی بودن ساختار AVR این جمع بصورت بایت به بایت انجام و ذخیره سازی می شود . حال اگر فرض کنیم وقفه ای در بین ذخیره سازی این متغیر و بعد از ذخیره سازی سه بایت با ارزش کمتر پذیرفته شود و در روتین آن وقفه مقدار این متغیر از حافظه خوانده شود، در این وضعیت مقدار متغیر 0x10000000 خوانده خواهد شد چون بایت با ارزش بیشتر که قبلا 0x10 بوده و اکنون باید 0x11 باشد، هنوز ذخیره سازی نشده است. بنابراین مقدار خوانده شده صحیح نخواهد بود و می تواند باعث خطا در عملکرد برنامه شود. شبیه همین مثال را می توان برای تغییر مقدار یک متغیر توسط روتین وقفه و قضاوت اشتباه روی مقدار متغیر در حلقه اصلی مطرح کرد.
بطور کلی در این نوع دسترسی ها که از دو سطح مختلف برنامه انجام می شود، باید در شیوه کدنویسی مراقب چنین خطاهای احتمالی باشیم که یک روش برای جلوگیری از چنین خطاهایی این است که قبل از انجام عملیات روی این نوع متغیرها، وقفه هایی که می توانند منجر به چنین تغییراتی شوند بصورت موقت غیر فعال و بعد مجددا فعال شوند.
* مطلب اخیر تجربه ای است که در جریان چند صد هزار خط برنامه نویسی و انجام پروژه های متعدد حاصل شده است.
@KnowledgePlus
نکته آموزشی:
در XMEGA با استفاده از DMA می توان محتوای رجیسترهای کنترل کننده سخت افزار را با کپی کردن بخشی از حافظه که قبلا بصورت مناسب مقداردهی شده و بدون مقدار دهی مستقیم تغییر داد. با استفاده از این تکنیک می توان عملکرد های خاصی را در کمترین زمان پیاده سازی کرد. مثلا فرض کنیم که لازم باشد با وارد شدن لبه پالس به یکی از پین ها، یکی از پورت ها از حالت ورودی به خروجی تغییر وضعیت دهد. برای این کار به غیر از استفاده از روش وقفه یا polling و اجرای کد که روش کند و زمان بری است، می توان از DMA استفاده کرد به نحوی که لبه بالا رونده به عنوان فرمان DMA عمل کند و مقدار مناسب برای خروجی شدن پورت که از قبل در حافظه نوشته شده، توسط DMA در رجیستر جهت پورت نوشته شود.
@KnowledgePlus
در XMEGA با استفاده از DMA می توان محتوای رجیسترهای کنترل کننده سخت افزار را با کپی کردن بخشی از حافظه که قبلا بصورت مناسب مقداردهی شده و بدون مقدار دهی مستقیم تغییر داد. با استفاده از این تکنیک می توان عملکرد های خاصی را در کمترین زمان پیاده سازی کرد. مثلا فرض کنیم که لازم باشد با وارد شدن لبه پالس به یکی از پین ها، یکی از پورت ها از حالت ورودی به خروجی تغییر وضعیت دهد. برای این کار به غیر از استفاده از روش وقفه یا polling و اجرای کد که روش کند و زمان بری است، می توان از DMA استفاده کرد به نحوی که لبه بالا رونده به عنوان فرمان DMA عمل کند و مقدار مناسب برای خروجی شدن پورت که از قبل در حافظه نوشته شده، توسط DMA در رجیستر جهت پورت نوشته شود.
@KnowledgePlus
نکته طراحی مدار:
جریانی که برای سوییچ های نیمه هادی قدرت مانند ماسفت و IGBT به عنوان جریان مجاز ذکر می شود، مربوط به دمای مشخصی است و با افزایش دما، حداکثر جریان مجاز کاهش می یابد. مثلا در اطلاعات ماسفت IRF640 جریان پیوسته 18A در دمای 25C به عنوان حداکثر جریان مجاز ذکر شده است. اما برای همین ماسفت حداکثر جریان مجاز در دمای 100C تنها 11A است. یا به عنوان مثال دیگر حداکثر جریان برای ماسفت IRFP460 در دمای 25C برابر 20A و در دمای 100C تنها 13A است. بنابراین در طراحی مدار با استفاده از این نوع سوییچ ها باید به مسئله کاهش جریان مجاز در شرایط افزایش دما توجه کنیم.
@KnowledgePlus
جریانی که برای سوییچ های نیمه هادی قدرت مانند ماسفت و IGBT به عنوان جریان مجاز ذکر می شود، مربوط به دمای مشخصی است و با افزایش دما، حداکثر جریان مجاز کاهش می یابد. مثلا در اطلاعات ماسفت IRF640 جریان پیوسته 18A در دمای 25C به عنوان حداکثر جریان مجاز ذکر شده است. اما برای همین ماسفت حداکثر جریان مجاز در دمای 100C تنها 11A است. یا به عنوان مثال دیگر حداکثر جریان برای ماسفت IRFP460 در دمای 25C برابر 20A و در دمای 100C تنها 13A است. بنابراین در طراحی مدار با استفاده از این نوع سوییچ ها باید به مسئله کاهش جریان مجاز در شرایط افزایش دما توجه کنیم.
@KnowledgePlus
نکته ای در کار با LCD های گرافیکی رنگی:
در اتصال LCD های گرافیکی رنگی به میکروکنترلرها به دلیل حجم بالای اطلاعاتی که برای نمایش یک صفحه باید به LCD ارسال شود و برای بالا بردن سرعت نمایش صفحه، علاوه بر رعایت یکسری موارد در نحوه کدنویسی که باید در فرصت دیگری به آن پرداخته شود، فراموش نکنیم که سطح Optimization کامپایلر را در وضعیت بهینه سازی برای حداکثر سرعت تنظیم کنیم.
@KnowledgePlus
در اتصال LCD های گرافیکی رنگی به میکروکنترلرها به دلیل حجم بالای اطلاعاتی که برای نمایش یک صفحه باید به LCD ارسال شود و برای بالا بردن سرعت نمایش صفحه، علاوه بر رعایت یکسری موارد در نحوه کدنویسی که باید در فرصت دیگری به آن پرداخته شود، فراموش نکنیم که سطح Optimization کامپایلر را در وضعیت بهینه سازی برای حداکثر سرعت تنظیم کنیم.
@KnowledgePlus
نکته آموزشی:
در صفحه کلیدهای ماتریسی، فشار دادن توام بیش از دو کلید بسته به محل سطر و ستون می تواند منجر به اشتباه در تشخیص کلیدهای فشار داده شده شود (به این پدیده Ghosting گفته می شود). یک روش عمومی برای برطرف کردن این پدیده، سری کردن دیود با هر کلید در جهت متناسب است.
@KnowledgePlus
در صفحه کلیدهای ماتریسی، فشار دادن توام بیش از دو کلید بسته به محل سطر و ستون می تواند منجر به اشتباه در تشخیص کلیدهای فشار داده شده شود (به این پدیده Ghosting گفته می شود). یک روش عمومی برای برطرف کردن این پدیده، سری کردن دیود با هر کلید در جهت متناسب است.
@KnowledgePlus
گیربکس الکترونیکی در سرو موتورها:
در درایورهای سرو موتور صنعتی، از طریق تنظیم ضرایبی می توان تعداد تقسیمات در یک دور موتور را متفاوت از دقت ناشی از انکودر موتور تعریف کرد. به عنوان مثال در سرو موتورهای سری Delta-B2 که تعداد تقسیمات در یک دور موتور 160000 قسمت است، از طریق تنظیم پارامترهای P1-44 و P1-45 می توان به تقسیمات متفاوتی رسید که تقسیمات نهایی در یک دور موتور برابر حاصلضرب 160000 ضرب در P1-45 تقسیم بر P1-44 خواهد بود (تاکید می شود که P1-44 در مخرج کسر قرار دارد). در این درایور، نسبت P1-44/P1-45 به عنوان گیربکس الکترونیکی نامیده می شود و کسری است که در تعداد پالس ورودی ضرب می شود. به همین دلیل در محاسبه تقسیمات موتور، صورت این کسر در مخرج محاسبه قرار می گیرد. به عنوان مثال عددی، با تنظیم مقدار P1-44 برابر 16 و P1-45 برابر 1 تعداد تقسیمات برابر 160000x1/16=10000 قسمت در دور است و اعمال 10000 پالس باعث چرخش موتور به میزان یک دور می شود. به همین ترتیب می توان با تنظیم مناسب این پارامترها، سایر تقسیمات دلخواه برای یک دور موتور را ایجاد کرد. برای سرو موتورهای دیگر هم شبیه همین پارامترها به عنوان گیربکس الکترونیکی با نام های دیگر وجود دارد. در برخی از درایورهای استپر موتور با موتور انکودر دار هم امکان تنظیم گیربکس الکترونیکی می تواند وجود داشته باشد.
@KnowledgePlus
در درایورهای سرو موتور صنعتی، از طریق تنظیم ضرایبی می توان تعداد تقسیمات در یک دور موتور را متفاوت از دقت ناشی از انکودر موتور تعریف کرد. به عنوان مثال در سرو موتورهای سری Delta-B2 که تعداد تقسیمات در یک دور موتور 160000 قسمت است، از طریق تنظیم پارامترهای P1-44 و P1-45 می توان به تقسیمات متفاوتی رسید که تقسیمات نهایی در یک دور موتور برابر حاصلضرب 160000 ضرب در P1-45 تقسیم بر P1-44 خواهد بود (تاکید می شود که P1-44 در مخرج کسر قرار دارد). در این درایور، نسبت P1-44/P1-45 به عنوان گیربکس الکترونیکی نامیده می شود و کسری است که در تعداد پالس ورودی ضرب می شود. به همین دلیل در محاسبه تقسیمات موتور، صورت این کسر در مخرج محاسبه قرار می گیرد. به عنوان مثال عددی، با تنظیم مقدار P1-44 برابر 16 و P1-45 برابر 1 تعداد تقسیمات برابر 160000x1/16=10000 قسمت در دور است و اعمال 10000 پالس باعث چرخش موتور به میزان یک دور می شود. به همین ترتیب می توان با تنظیم مناسب این پارامترها، سایر تقسیمات دلخواه برای یک دور موتور را ایجاد کرد. برای سرو موتورهای دیگر هم شبیه همین پارامترها به عنوان گیربکس الکترونیکی با نام های دیگر وجود دارد. در برخی از درایورهای استپر موتور با موتور انکودر دار هم امکان تنظیم گیربکس الکترونیکی می تواند وجود داشته باشد.
@KnowledgePlus
نکته ای در برنامه نویسی اسمبلی AVR و XMEGA:
برای صرفه جویی و کوتاه تر کردن زمان اجرای برنامه در کاربردهای بسیار Time critical که صرفه جویی در دستورالعمل ها و بهینه بودن کد مهم است، می توان یکی از رجیسترهای ترجیحا R2 تا R15 را در ابتدای برنامه با صفر مقداردهی کرد و در طول برنامه هر جا که نیاز به مقداردهی با صفر باشد از این رجیستر استفاده کرد. در اینصورت در برنامه های بزرگ، نیاز به تکرار مداوم دستور clr در نقاط مختلف کد برای صفر کردن رجیسترها برطرف می شود که حذف این دستورات clr باعث صرفه جویی هر چه بیشتر در زمان می شود.
@KnowledgePlus
برای صرفه جویی و کوتاه تر کردن زمان اجرای برنامه در کاربردهای بسیار Time critical که صرفه جویی در دستورالعمل ها و بهینه بودن کد مهم است، می توان یکی از رجیسترهای ترجیحا R2 تا R15 را در ابتدای برنامه با صفر مقداردهی کرد و در طول برنامه هر جا که نیاز به مقداردهی با صفر باشد از این رجیستر استفاده کرد. در اینصورت در برنامه های بزرگ، نیاز به تکرار مداوم دستور clr در نقاط مختلف کد برای صفر کردن رجیسترها برطرف می شود که حذف این دستورات clr باعث صرفه جویی هر چه بیشتر در زمان می شود.
@KnowledgePlus
نکته طراحی مدار:
در مدل واقعی ماسفت، خازن هایی بین گیت سورس و گیت درین و سلف های سری در مسیر درین و سورس مدل می شوند که در مدارات قدرت با نوسانات سریع، وجود این مدل غیر ایده آل یکسری ضرورت ها را در طراحی مدار ایجاب می کند. در این رابطه یکی از مواردی که می تواند از سوختن ماسفت به دلیل سرایت ولتاژ های ناخواسته به گیت ناشی از همین مدل غیر ایده آل جلوگیری کند، قرار دادن یک دیود زنر به موازات گیت سورس با ولتاژی بالاتر از ولتاژ فرمان به گیت است (مثلا یک زنر 15v در شرایطی که پالس 12v به گیت اعمال می شود).
@KnowledgePlus
در مدل واقعی ماسفت، خازن هایی بین گیت سورس و گیت درین و سلف های سری در مسیر درین و سورس مدل می شوند که در مدارات قدرت با نوسانات سریع، وجود این مدل غیر ایده آل یکسری ضرورت ها را در طراحی مدار ایجاب می کند. در این رابطه یکی از مواردی که می تواند از سوختن ماسفت به دلیل سرایت ولتاژ های ناخواسته به گیت ناشی از همین مدل غیر ایده آل جلوگیری کند، قرار دادن یک دیود زنر به موازات گیت سورس با ولتاژی بالاتر از ولتاژ فرمان به گیت است (مثلا یک زنر 15v در شرایطی که پالس 12v به گیت اعمال می شود).
@KnowledgePlus
معرفی یک سایت مفید برای یافتن قیمت جهانی و فروشنده های قطعات الکترونیک:
https://www.findchips.com
@KnowledgePlus
https://www.findchips.com
@KnowledgePlus
نکاتی از زبان برنامه نویسی c:
عبارت:
char *f(char);
معرف تابعی با نام f با ورودی از نوع char و مقدار بازگشتی از نوع اشاره گر به char است.
عبارت:
char (*f)(char);
معرف اشاره گری با نام f به تابعی با ورودی از نوع char و مقدار بازگشتی از نوع char است.
عبارت:
char * (*f)(char);
معرف اشاره گری با نام f به تابعی با ورودی از نوع char و مقدار بازگشتی از نوع اشاره گر به char است.
عبارت:
char * (*f)(char *);
معرف اشاره گری با نام f به تابعی با ورودی از نوع اشاره گر به char و مقدار بازگشتی از نوع اشاره گر به char است.
@KnowledgePlus
عبارت:
char *f(char);
معرف تابعی با نام f با ورودی از نوع char و مقدار بازگشتی از نوع اشاره گر به char است.
عبارت:
char (*f)(char);
معرف اشاره گری با نام f به تابعی با ورودی از نوع char و مقدار بازگشتی از نوع char است.
عبارت:
char * (*f)(char);
معرف اشاره گری با نام f به تابعی با ورودی از نوع char و مقدار بازگشتی از نوع اشاره گر به char است.
عبارت:
char * (*f)(char *);
معرف اشاره گری با نام f به تابعی با ورودی از نوع اشاره گر به char و مقدار بازگشتی از نوع اشاره گر به char است.
@KnowledgePlus
نکاتی از زبان برنامه نویسی c:
عبارت:
char *a[10];
معرف یک آرایه به نام a با 10 عضو است که اعضای آرایه از نوع اشاره گر به char هستند.
عبارت:
char (*a)[10];
معرف یک اشاره گر به نام a است که به آرایه ای با 10 عضو از نوع char اشاره می کند.
@KnowledgePlus
عبارت:
char *a[10];
معرف یک آرایه به نام a با 10 عضو است که اعضای آرایه از نوع اشاره گر به char هستند.
عبارت:
char (*a)[10];
معرف یک اشاره گر به نام a است که به آرایه ای با 10 عضو از نوع char اشاره می کند.
@KnowledgePlus
نکته آموزشی:
در ارتباط USART با طول دیتای 9 بیتی ، بیت نهم می تواند به عنوان شاخص تعیین کننده Command یا Data بودن 8 بیت دیگر بکار رود. از این بیت از طریق کدنویسی مناسب حتی می توان برای reset کردن و شروع مجدد ارتباط هایی استفاده کرد که ارتباط در وسط تبادل دیتا قطع شده باشد.
@KnowledgePlus
در ارتباط USART با طول دیتای 9 بیتی ، بیت نهم می تواند به عنوان شاخص تعیین کننده Command یا Data بودن 8 بیت دیگر بکار رود. از این بیت از طریق کدنویسی مناسب حتی می توان برای reset کردن و شروع مجدد ارتباط هایی استفاده کرد که ارتباط در وسط تبادل دیتا قطع شده باشد.
@KnowledgePlus
توصیه ای برای علاقه مندان به برنامه نویسی:
هرچند مطالعه و تحلیل برنامه ها و مثال های آماده می تواند برای درک نحوه برنامه نویسی صحیح و اصولی مفید باشد. اما یک فرد مبتدی تنها با مطالعه و تحلیل برنامه های آماده یا copy/paste کردن کد های موجود نمی تواند به مهارت حرفه ای در برنامه نویسی برسد. به اینگونه افراد توصیه می شود که علاوه بر تحلیل کدهای آماده، به عنوان تمرین سعی کنند برخی کد های مورد نیاز برای انجام عملیات مختلف را حتی در صورت موجود بودن، شخصا بنویسند و حاصل کار خود را با کدهای موجود مقایسه کنند تا در مرور زمان بتوانند به تسلط و تجربه کافی دست یابند. به بیان دیگر، با خواندن و تحلیل کردن کد به تنهایی نمی توان برنامه نویس شد و برنامه نویس باید شخصا روی نوشتن کدها تمرین زیادی را انجام دهد.
@KnowledgePlus
هرچند مطالعه و تحلیل برنامه ها و مثال های آماده می تواند برای درک نحوه برنامه نویسی صحیح و اصولی مفید باشد. اما یک فرد مبتدی تنها با مطالعه و تحلیل برنامه های آماده یا copy/paste کردن کد های موجود نمی تواند به مهارت حرفه ای در برنامه نویسی برسد. به اینگونه افراد توصیه می شود که علاوه بر تحلیل کدهای آماده، به عنوان تمرین سعی کنند برخی کد های مورد نیاز برای انجام عملیات مختلف را حتی در صورت موجود بودن، شخصا بنویسند و حاصل کار خود را با کدهای موجود مقایسه کنند تا در مرور زمان بتوانند به تسلط و تجربه کافی دست یابند. به بیان دیگر، با خواندن و تحلیل کردن کد به تنهایی نمی توان برنامه نویس شد و برنامه نویس باید شخصا روی نوشتن کدها تمرین زیادی را انجام دهد.
@KnowledgePlus
نکته آموزشی:
یک تفاوت قابل توجه در نحوه ارتباط با LCD های کاراکتری مبتنی بر کنترلر HD44780 و شبیه آن و همچنین LCD های گرافیکی مبتنی بر کنترلر KS0108 نسبت به LCD های گرافیکی مبتنی بر کنترلر T6963C این است که در دو نوع LCD اول، امکان ارتباط بصورت یک طرفه و بدون نیاز به خواندن اطلاعات با قرار دادن تاخیر کافی بین نوشتن بایت های مختلف وجود دارد. اما در ارتباط با LCD های گرافیکی مبتنی بر کنترلر T6963C ضروری است که امکان ارتباط دو طرفه فراهم باشد و علاوه بر نوشتن اطلاعات به LCD، قابلیت خواندن اطلاعات از LCD هم وجود داشته باشد.
@KnowledgePlus
یک تفاوت قابل توجه در نحوه ارتباط با LCD های کاراکتری مبتنی بر کنترلر HD44780 و شبیه آن و همچنین LCD های گرافیکی مبتنی بر کنترلر KS0108 نسبت به LCD های گرافیکی مبتنی بر کنترلر T6963C این است که در دو نوع LCD اول، امکان ارتباط بصورت یک طرفه و بدون نیاز به خواندن اطلاعات با قرار دادن تاخیر کافی بین نوشتن بایت های مختلف وجود دارد. اما در ارتباط با LCD های گرافیکی مبتنی بر کنترلر T6963C ضروری است که امکان ارتباط دو طرفه فراهم باشد و علاوه بر نوشتن اطلاعات به LCD، قابلیت خواندن اطلاعات از LCD هم وجود داشته باشد.
@KnowledgePlus
برای برطرف کردن نوسانات قرائت شده در اتصال تاچ های مقاومتی بصورت مستقیم به ADC، روش میانگین گیری از مختصات خوانده شده با تعداد نمونه کافی می تواند نوسانات را تا حد زیادی برطرف کند.
@KnowledgePlus
@KnowledgePlus
نکته ای در برنامه نویسی:
در گرد کردن اعداد میانی بین دو عدد با استفاده از توابع هر زبان برنامه نویسی، باید به روش مورد استفاده برای گرد کردن توجه کنیم تا خطای ناخواسته ای در محاسبات ایجاد نشود. به عنوان توضیح بیشتر، عملیات گرد کردن یا Rounding برای نقاط میانی بر دو نوع است. در نوع اول که در اصطلاح
Rounding away from zero
گفته می شود، گرد کردن به سمت اعداد دورتر از صفر است. در این روش به عنوان مثال حاصل گرد کردن 1.5 برابر با 2 و حاصل گرد کردن 2.5 برابر 3 است. در روش دیگر که در اصطلاح
Banker's rounding
گفته می شود، گرد کردن به سمت عدد نزدیک تر است. نکته مهم در این روش این است که برای اعداد میانی، گرد کردن به سمت عدد زوج انجام می شود. بنابراین با این روش، حاصل گرد کردن 1.5 برابر 2 و حاصل گرد کردن 2.5 باز هم برابر 2 خواهد بود. به عنوان نمونه در visual basic 6.0 گرد کردن با تابع Round بر اساس روش banker's rounding عمل می کند و عدم توجه به روش مورد استفاده می تواند باعث ایجاد خطا در محاسبات شود.
@KnowledgePlus
در گرد کردن اعداد میانی بین دو عدد با استفاده از توابع هر زبان برنامه نویسی، باید به روش مورد استفاده برای گرد کردن توجه کنیم تا خطای ناخواسته ای در محاسبات ایجاد نشود. به عنوان توضیح بیشتر، عملیات گرد کردن یا Rounding برای نقاط میانی بر دو نوع است. در نوع اول که در اصطلاح
Rounding away from zero
گفته می شود، گرد کردن به سمت اعداد دورتر از صفر است. در این روش به عنوان مثال حاصل گرد کردن 1.5 برابر با 2 و حاصل گرد کردن 2.5 برابر 3 است. در روش دیگر که در اصطلاح
Banker's rounding
گفته می شود، گرد کردن به سمت عدد نزدیک تر است. نکته مهم در این روش این است که برای اعداد میانی، گرد کردن به سمت عدد زوج انجام می شود. بنابراین با این روش، حاصل گرد کردن 1.5 برابر 2 و حاصل گرد کردن 2.5 باز هم برابر 2 خواهد بود. به عنوان نمونه در visual basic 6.0 گرد کردن با تابع Round بر اساس روش banker's rounding عمل می کند و عدم توجه به روش مورد استفاده می تواند باعث ایجاد خطا در محاسبات شود.
@KnowledgePlus
در پاسخ به دوستانی که برای انتخاب مسیر خود در کار کردن با خانواده های مختلف میکروکنترلر و ابزارهای برنامه نویسی سردرگم هستند، معمولا این پاسخ ارائه می شود که برای رهایی از سردرگمی و فراهم شدن امکان قضاوت بهتر، یک "با" را از سوال ذهنی خود حذف کنید. اگر بجای این سوال که "باید با چه کار کنم؟" بیشتر روی این سوال متمرکز شویم که "باید چکار کنم؟" آنگاه با مشخص شدن هدف و کار مورد نظر برای انجام دادن، ابزارهای سخت افزاری و نرم افزاری به شکل مشخص تری قابل انتخاب خواهند بود. به عبارت دیگر، در صورتی که نیاز جاری را بشناسیم بهتر می توانیم ابزار مناسب را برای رفع این نیاز انتخاب کنیم.
@KnowledgePlus
@KnowledgePlus