50 Note Advanced C Programming Avr Microcontrollers
50 Note Advanced C Programming Avr Microcontrollers
www.avrlib.ir
محصول رایگان
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
متغیرهای نوع charهمیشه ۸بیتی هستند .اما سایز متغیرهای نوع intبسته به نوع کامپایلر لزوما ۱۶بیت نیست - ۱سایز متغیرهای : int
(حداقل سایز این نوع متغیر ۱۶بیت است).
در ارتباط rs485هنگامی که بایتی - ۲تغییر مود فرستنده به گیرنده در ارتباط : RS485
ارسال می شود و سمت مقابل باید پاسخ دهد ،به دلیل یک طرفه بودن ارتباط باید تاخیر کافی در پاسخ دادن سمت مقابل لحاظ شود تا فرستنده فرصت داشته باشد وضعیت خود را به
گیرنده تغییر دهد و قبل از تغییر وضعی ت از فرستنده به گیرنده ،ارسال پاسخ از سمت مقابل آغاز نشود .همچنین کدنویسی بخش فرستنده باید به گونه ای باشد که بعد از ارسال و برای
دریافت پاسخ ،در حداقل زمان ممکن جهت خط به عنوان گیرنده تغییر داده شود و مواردی مانند وقوع یک وقفه نتواند تاخیری را در این تغییر جهت از فرستنده به گیرنده ایجاد کند.
در میکروکنترلرهایی که پین ریست آنها نیز می توانند به عنوان پین I/Oمورد استفاده قرار گیرد .اگر با تنظیم فیوز بیت مورد نظر ان پین - ۳پین ریست :
ریست از کار بیفتد و به عنوان I/Oمورد استفاده قرار بگیرد .توسط پروگرمر های عادی قابل بازگردانی نخواهد بود.
توابع printfو scanfو توابع مشابه این دو در محیط کامپایلرهای زبان سی حافظه های زیادی را از کد هگز - ۴توابع printfو : scanf
اشغال می کنند لذا تا زمانی که مجبور نشدید از این توابع استفاده ننمایید و حتی االمکان در صورت استفاده مود توابع را در حالت intقرار دهید.
فرق بین debugو releaseدر محیط های برنامه نویسی این است - ۵فرق بین DEBUGو: RELEASE
که تازمانی که پروژه شما در مرحله تست و خطا است شما از مود debugو زمانی که پروژه به اتمام رسید و شما قصد داشتید که آنرا در حالت نهایی منتشر کنید از مود releaseاستفاده
می کنید.
برای ارتباط با مموری کارت ها مانند SD Card / MMC card , ….می توانید از کتابخانه ی fatfsو یا کتابخانه petitfatاستفاده - ۶کتابخانه: Fat
نمایید .این کتابخانه بسیار کامل و بسیار تخصصی طراحی شده است .برای دانلود این کتابخانه می توانید به آدرس سایت دوست ژاپنی خوش سلیقه مان مراجعه نمایید. www.elm-
chan.org
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
اگر نیاز باشد تا به میکروکنترلرتان حافظه های خارجی مانند eepromو یا SRAMخارجی را وصل کنید بهتر - ۷طبقه بندی اطالعات :
است با استاده از روش جدول fatبه طبقه بندی اطالعات مورد نظر خودتان بپردازید.
در میکروکنترلرهایی که نمی توان مستقیما SRAMهای خارجی را به آن وصل نمود با توجه به اینکه وصل کردن یک - SRAM ۸خارجی :
SRAMبه آن تعداد زیادی از پایه ها را به هدر خواهد داد لذا می توان با ترفندی ساده کالک و دیتا را کنترل نمود و در تعداد پایه ها را به حداقل رساند.
در عملیات ADCباید جهت درست خواندن مقدار آنالوگ فرکانس خواندن نمونه ها را حداقل دو برابر فرکانس ورودی در نظر - ۹فرکانس: ADC
گرفت.
با برنامه نویسی مناسب میکرو : Multi Processor Communication Mode۱۰
کنترلر در مود MPCMمی توان از عملیات مستر واسلیوی یوزارت استفاده نمود.
با توجه به اینکه میکروکنترلرهای سری مگا و تاینی عموما فاقد RTCداخلی هستند ،لذا می توان این مهم را توسط تایمر ۲و با - RTC ۱۱داخلی :
وصل کردن یک کریستال ۳۲۷۶۸هرتزی به این تایمر و انجام برنامه نویسی مناسب این کار را انجام داد .فقط باید در نظر داشت که به محض قطع شده منبع تغذیه این تایمر از کار خواهد
افتاد .لذا در کاربردهایی که منبع تغذیه قطع نمی شود این موضوع بسیار مناسب خواهد بود.
ماژول داخلی SPIدر میکرو کنترلرهای اتمل بر خالف دیگر ماژول ها مانند TWIو یا USARTیک پروتکل خام است که در آن آدرس : SPI :۱۲
دهی ،بیت پریتی و کشف خطا پیش بینی نشده است .برعکس این کا باعث یک مزیت بزرگ در آن شده است و ان اینکه طراح به دلخواه خود می تواند پروتکل دلخواه خود را با حداکثر
سرعت ۴/۱سرعت کالک سی پی یو تعریف نمود .آدرس دهی ،کشف خطا ،کد کردن دیتا و … ازمزیت های خاص این پروتکل است.
در شیفت دادن بیتی به چپ و یا راست حداکثر می توان ۱۶بیت را شیفت داد. - ۱۳عملیات شیفت بیتی :
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
در ارتباط با ال سی دی های گرافیکی و رنگی که نیاز به تغییر آنی و سریع دارند باید نوع - ۱۴ال سی دی گرافیکی و رنگی :
کامپایل را در حداکثر سرعت قرار داد.
در محیط برنامه نویسی اتمل استودیو برای تعریف ثوابتی که قرار است در چندین فایل - ۱۵تعریف ثوابت در اتمل استودیو :
هدر و چندین فایل سی مورد استفاده قرار بگیرند می توان به راحتی از مسیر زیر و با یک بار تعریف آن را انجام داد :ابتدا ALT+F7را فشار دهید .سپس از منوی سمت چپ
Toolchainو سپس AVR/GNU C Compilerو سپس Symbolsرا انتخاب و ثابت را در آن تعریف کنید به عنوان مثال کاربردی ترین تعریف فرکانس میکرو است که در این
در سری های مگا و تاینی میکروکنترلرهای شرکت اتمل نمی توان اولویت وقفه ها را تعیین کرد ولی در سری ایکسمگا این کار - ۱۶اولویت وقفه ها :
به راحتی قابل انجام است و با تعیین اولویت وقفه ها می توان از روند اینتراپت مطمئن شد.
برای چک کردن منبع ریست در میکروکنترلرهای ای وی آر از رجیستر MCUCSRاستفاده نمود .و با تعیین بیت یک شده نوع منبع - ۱۷منابع ریست :
ریست را تعیین نمود.
به هنگام ارسال و یا دریافت دیتا در ماژول های مختلف یوزارت i2c , 1wire , spi ،باید از سیستم timeout - ۱۸سیستم : timeout
استفاده نمود .برای پیاده سازی این روش می توان از وقفه تایمر استفاده نمود و با یک کردن یک فلگ در تایم زمانی مورد نظر از داخل حلقه whileبیرون آمد.
برای تشخیص صحت درستی دیتای ارسالی بین دو دستگاه و یا میکروکنترلر می توان از روش checksumاستفاده نمود .این روش بسیار ساده : - CRC ۱۹
بوده و تشخیص دیتای خطا در آن مشکل است و فقط دیتای خطا را تشخیص می دهد و توسط آن نمی توان بیت خطا را در یک بایت تشخیص داد .روش دیگر استفاده از بیت parity
است این روش هم به نوبه خود مفید است اما روش ساده ای است .روش دیگر استفاده از روش CRCاست .این ترفند شامل CRC8 , CRC16 , CRC32 , CRC64است و روش
برای اجرا کردن توابع وقفه بدون پیش آمدن - ۲۰اجرای وقفه بدون به وجود آمدن شرایط وقفه :
شرایط وقفه و یا فلگ های مرتبط میتوان از روش ریست نرم افزاری استفاده نمود .فرض کنید تابع وقفه ای نوشته شده اما اصال این وقفه در تابع mainپیکر بندی نشده است .حال به
نظر شما برای اجرای این تابع در هر لحظه دلخواه چه باید کرد ؟ راه حل کامال اصولی و قابل اجرا استفاده از روش ریست نرم افزاری است .برای فهمیدن این روش می توانید در محصوالت
رایگان سایت به دنبال محصول ” چگونه می توان میکرو را ریست نرم افزاری کرد ” بگردید و با دانلود رایگان آن و مطالعه تمام بحث های آن به این ترفند ناب دست پیدا کنید.
در ارتباط USARTبا طول دیتای ۹بیتی ،بیت نهم می تواند به عنوان شاخص تعیین کننده Commandیا Dataبودن ۸ - ۲۱ارتباط یوزارت :
بیت دیگر بکار رود .از این بیت از طریق کدنویسی مناسب حتی می توان برای resetکردن و شروع مجدد ارتباط هایی استفاده کرد که ارتباط در وسط تبادل دیتا قطع شده باشد.
برای پیاده سازی پورت USBدر میکروکنترلرهایی که این ماژول سخت افزاری را بر روی خود ندارند می توان از درایور - USB ۲۲نرم افزاری :
نرم افزاری این ماژول استفاده نمود .این ماژول فقط نیاز به یک وقفه خارجی و یک پین آزاد جهت ارتباط دارد.
عموما در سیستم کامند برنامه نویس می تواند با تعاریف قراردادی کامند های مورد نظر به ارسال و دریافت مستر اسلیوی بپردازد. - ۲۳سیستم کامند :
یکی از پروتکل های قدرتمند تحت ماژول یوزارت ،پروتکل مودباس است .این پروتکل را به راحتی میتوان بر روی اغلب - ۲۴پروتکل مودباس :
میکروکنترلرها پیاده نمود و توسط آن یک سیستم کامندی استاندارد را تعریف نمود و مورد بهره برداری قرار داد.
برای ریست کردن میکرو کنترلر به صورت خود خواسته می توان به چندین روش این کار را انجام داد : - ۲۵ریست نرم افزاری میکرو :
اولین روش استفاده از پین خارجی است – راه حل دوم استفاده از تایمر واچ داگ و یا سگ نگهبان است و راه حل سوم استفاده از ریست نرم افزاری است .راه حل سوم توسط کدهای
برنامه نویسی به راحتی قابل اجرا است و نیازمند زمان TimeOutنیست و در همان لحظه عملیات ریست را انجام میدهد.
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
برای پیاده سازی عملکردهای DACدر میکروکنترلرهایی که این قابلیت را در - ۲۶پیاده سازی نرم افزاری : DAC
درون خود ندارند می توان از خروجی تایمرها استفاده نمود بدین صورت که با کنترل میزان دیوتی سایکل ،موج دلخواه و یا سیگنال آنالوگ دلخواه را تولید نمود.
برای ایجاد فرکانس های دقیق مانند فرکانس های صوتی می توان از سری میکرو - ۲۷ایجاد فرکانس های صوتی دقیق :
کنترلرهای تاینی استفاده نمود .به عنوان مثال تاینی ۲۵و تاینی ۴۵و تاینی ۸۵و تاینی ۸۶۱برای این کار بسیار مناسب هستند .این میکرو کنترلرها دارای تایمر با فرکانس ۶۴مگاهرتزی
هستند که در حالت عادی دارای دقت ۸برابری نسبت به فرکانس های ۸مگاهرتزی است.
با یک تایمر در میکروکنترلر ،به تعداد واحدهای compareدر آن تایمر می توان - ۲۸ایجاد پالس های دلخواه با تایمر :
پایه ) (baseزمانی مستقل از هم ایجاد کرد .مثال اگر یک تایمر دارای سه واحد مقایسه باشد ،از طریق این تایمر و وقفه های مقایسه یا بررسی flagهای آن می توان سه پایه زمانی
مختلف و مستقل از هم را ایجاد کرد .برای این کار باید تایمر در مد نرمال خ ود قرار بگیرد و بعد از هر بار عملیات مقایسه ،بسته به زمان مورد نیاز مقدار مشخصی با رجیستر مقایسه جمع
شود.
قرار دادن خازن های بزرگ (مثال ۱۰۰۰میکروفاراد) در خروجی رگوالتورهای سری ۷۸و رگوالتورهای مشابه در زمان خاموش - ۲۹رگوالتور : ۷۸۰۵
شدن مدار و در صورتی که ولتاژ ورودی رگوالتور سریع تر از ولتاژ خروجی آن افت کند ،به دلیل تخلیه خازن از طریق پین خروجی رگوالتور می تواند باعث سوختن آن شود .بنابراین در
صورت وجود خازن های بزرگ در خروجی این نوع رگوالتورها باید یک دیود بصورت معکوس از خروجی به ورودی رگوالتور متصل شود تا مسیر دشارژ خازن را فراهم کند و مانع از سوختن
احتمالی آن شود.
در صورت نیاز به وجود مقاومت pull upدر پین ورودی - ۳۰مقاومت های pullupو : pulldown
میکروکنترلر ،فعال کردن این مقاومت بصورت داخلی ممکن است به تنهایی در محیط های پر نویز کافی نباشد و در مواقعی الزم است مقاومت pull upبا مقدار مناسب بصورت خارجی
قرار داده شود .همچنین در صورت نیاز به مقاومت pull downبرای خانواده هایی که امکان فعال کردن این نوع مقاومت در آنها وجود دارد ،در شرایط پرنویز ممکن است الزم باشد این
در AVRبرای جلوگیری از پاک شدن eepromداخلی باید Brownout detectionفعال شود و سطح ولتاژ آن با توجه به مقدار تغذیه، : - eeprom ۳۱
در باالترین سطح ممکن تنظیم شود.
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
در کاربردهای صنعتی و پر نویز بهتر است پین resetبعد از برنامه ریزی میکروکنترلر بصورت مستقیم از طریق - ۳۲ریست خارجی میکرو :
جامپر یا لحیم کاری (بسته به نوع میکروکنترلر و منطق این پین) به vccیا gndاتصال کوتاه شود.
برای جلوگیری از پاک شدن یا نوشته شدن اطالعات ناخواسته بر اثر نویز و نوسانات در eepromهای خارجی مانند - eeprom ۳۳خارجی :
سری ۲۴بهتر است پین write protectبه یکی از پین های میکروکنترلر متصل شود و با کد نویسی مناسب در تمام زمان ها به غیر از لحظات نوشتنeeprom ،در وضعیت محافظت
با توجه به immediateو فوری بودن تغییر مقدار رجیستر compareدر مد CTCتایمرهای ، AVRتغییر مقدار - ۳۴مود CTCتایمر :
رجیستر مقایسه می تواند منجر به ایجاد سیکل های ناخواسته برای صفر شدن تایمر کانتر شود .برای درک بهتر ،فرض کنید تایمر شماره یک در مد CTCقرار داشته باشد و OCR1A
برابر ۲۰۰باشد و مقدار فعلی تایمر برابر ۱۰۱باشد .اگر در این وضعیت مقدار OCR1Aبه ۱۰۰تغییر کند ،به دلیل تاثیر فوری این تغییر مقدار ،تایمر به شمارش خود تا ۶۵۵۳۵ادامه
می دهد و بعد مجددا صفر می شود تا در سیکل بعدی مقدار ۱۰۰اثرگذار باشد .بنابراین در فرض این مثال ،تعداد کالک الزم برای صفر شدن تایمر به دلیل تغییر مقدار ، OCR1Aبسیار
بیشتر از مقدار مورد انتظار خواهد بود که در عملیات زمان گیری ،وقوع این شرایط باعث ایجاد خطا در زمان گیری می شود .تغییر مقدار رجیستر مقایسه در مد CTCتایمرهای، AVR
می تواند باعث عملکرد ناخواسته در تعداد کالک الزم برای صفر شدن مقدار تایمر کانتر شود.
اگر در تایمری از میکروکنترلر مورد استفاده ،مدی از fast pwmوجود داشته باشد که مقداز TOP - ۳۵مود fast PWMتایمر :
تایمر کانتر قابل تنظیم باشد ،برای اجتناب از مشکل فوق بجای مد CTCمی توان از این نوع fast pwmاستفاده کرد .مثال در mega64مدهای ۱۴و ۱۵تایمر کانترهای ۱و ۳چنین
خاصیتی دارند .در مد ۱۵مقدار TOPبرابر OCR1Aاست و با توجه به اینکه در این مد ،عملیات updateبصورت immediateنیست و از مکانیزم double bufferingاستفاده
می شود ،بنابراین مشکل بوجود آمده در مد CTCدر مقداردهی به OCR1Aدر صورت استفاده از مد ۱۵دیگر بوجود نخواهد آمد.
در کد نویسی برای هر گونه ارتباطی که انتظار برای پاسخ سمت مقابل وجود دارد ،باید مکانیزم timeoutدر انتظار - ۳۶سیستم : timeout
برای دریافت در نظر گرفته شود تا در صورت قطع ارتباط و عدم پاسخ سمت مقابل ،برنامه در یک حلقه بی نهایت انتظار قرار نگیرد .منظور از timeoutاین است که اگر سمت مقابل برای
مدت مشخصی پاسخ نداد ،اجرای برنامه از حلقه انتظار خارج شود و روتین مناسب خطا اجرا شود.
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
در کدنویسی برای میکروکنترلرها ،برای خودداری از استفاده از متغیرها و محاسبات اعشاری که در مواردی می تواند - ۳۷محاسبات اعشاری :
منجر به طوالنی شدن زمان اجرای برنامه یا افزایش حجم آن شود ،یک روش این است که اگر تعداد مشخصی از اعداد بعد از ممیز مورد نظر باشد ،کلیه اعداد را با مقیاسی در نظر بگیریم
که همه اعداد اعشاری به صحیح تبدیل شوند و محاسبات بصورت صحیح انجام شوند و در نهایت هنگام نمایش و ارسال و … ،ممیز را در محل مناسب قرار دهیم .به عنوان مثال اگر در اعداد
و متغیرهای مورد استفاده تا دو رقم اعشار مورد نظر باشد ،می توان عددها و متغیرها را از همان ابتدا با مقیاس صد برابر در نظر گرفت و در نهایت ممیز را در محل مناسب اعمال کرد .مثال
بجای حاصلضرب ۱٫۹۹در ۲٫۱می توان با صد برابر در نظر گرفتن اعداد ،حاصلضرب ۱۹۹در ۲۱۰را محاسبه کرد و در نهایت برای نمایش نتیجه ،چهار رقم ممیز در نظر گرفت .در اینحالت
روش حذف صفرهای اضافه سمت راست هم می تواند مورد استفاده قرار بگیرد .چنانکه در همین مثال بجای ۴٫۱۷۹۰به عنوان نتیجه می توان صفر اضافه سمت راست را حذف کرد و
در ارتباط rs485هنگامی که بایتی ارسال می شود و سمت مقابل باید پاسخ دهد ،به دلیل یک طرفه بودن ارتباط باید - ۳۸ارتباط : RS485
تاخیر کافی در پاسخ دادن سمت مقابل لحاظ شود تا فرستنده فرصت داشته باشد وضعیت خود را به گیرنده تغییر دهد و قبل از تغییر وضعیت از فرستنده به گیرنده ،ارسال پاسخ از سمت
مقابل آغاز نشود .همچنین کدنویسی بخش فرستنده باید به گونه ای باشد که بعد از ارسال و برای دریافت پاسخ ،در حداقل زمان ممکن جهت خ ط به عنوان گیرنده تغییر داده شود و
مواردی مانند وقوع یک وقفه نتواند تاخیری را در این تغییر جهت از فرستنده به گیرنده ایجاد کند.
یکی از موارد مهم در کدنویسی که عدم توجه به آن می تواند منجر به - ۳۹مقدار دهی رجیستر های چند بایتی :
اشکاالت غیر تکراری و با عملکرد به ظاهر تصادفی در اجرای برنامه شود ،دسترسی به متغیرها از دو سطح مختلف برنامه است .منظور از دو سطح مختلف برنامه ،حلقه اصلی و یک وقفه و
یا دو سطح وقفه مختلف است .دسترسی از سطوح مختلف به یک متغیر در صورتی که یک سطح از برنامه مقدار متغیر را تغییر دهد ،در صورت عدم توجه برنامه نویس به تبعات این نوع
دسترسی می تواند در عملکرد برنامه خطاهایی را ایجاد کند .برای توضیح بیشتر فرض کنید در AVRبه یک متغیر چهار بایتی در حلقه اصلی برنامه و یکی از وقفه ها دسترسی وجود
داشته باشد ،به نحوی که حلقه اصلی مقدار این متغیر را تغییر دهد .به عنوان مثال عددی ،اگر یک متغیر چهار بایتی دارای مقدار x10ff0000 ۰باشد و الزم باشد در حلقه اصلی با متغیر
چهار بایتی دیگری با مقدار x00010000 ۰جمع شود و در محل متغیر اولیه ذخیره شود که حاصل این جمع در نهایت x11000000 ۰خواهد بود .اما با توجه به هشت بیتی بودن
ساختار AVRاین جمع بصورت بایت به بایت انجام و ذخیره سازی می شود .حال اگر فرض کنیم وقفه ای در بین ذخیره سازی این متغیر و بعد از ذخیره سازی سه بایت با ارزش کمتر
پذیرفته شود و در روتین آن وقفه مقدار این متغیر از حافظه خوانده شود ،در این وضعیت مقدار متغیر x10000000 ۰خوانده خواهد شد چون بایت با ارزش بیشتر که قبال x10 ۰بوده و
اکنون باید x11 ۰باشد ،هنوز ذخیره سازی نشده است .بنابراین مقدار خوانده شده صحیح نخواهد بود و می تواند باعث خطا در عملکرد برنامه شود .شبیه همین مثال را می توان برای
تغییر مقدار یک متغیر توسط روتین وقفه و قضاوت اشتباه روی مقدار متغیر در حلقه اصلی مطرح کرد .بطور کلی در این نوع دسترسی ها که از دو سطح مختلف برنامه انجام می شود ،باید
در شیوه کدنویسی مراقب چنین خطاهای احتمالی باشیم که یک روش برای جلوگیری از چنین خطاهایی این است که قبل از انجام عملیات روی این نوع متغیرها ،وقفه هایی که می توانند
منجر به چنین تغییراتی شوند بصورت موقت غیر فعال و بعد مجددا فعال شوند.
برای آنکه بتوان یک سروو موتور را کنترل کرد باید فرکانس ۵۰هرتز با دیوتی سایکل مشخصی را تولید نمود .گاهی - ۴۰کنترل سروو موتور :
ممکن است نیاز باشد تا این کار را توسط یک تایمر ۸بیتی ایجاد نمود .از آنجایی که تایمر های ۸بیتی ممکن است خاصیت مقایسه ای را در درون خود نداشته باشند می توان این کار را
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
به صورت مجازی انجام داد .در این روش برن امه نویس می تواند به صورت مجازی و توسط کدهای برنامه واحد های مقایسه را تولید و در آن واحدهای مقایسه عملیات تولید موج را انجام
دهد به عنوان مثال توسط یک تایمر ۸بیتی و فقط با فعال کردن وقفه سرریز تایمر می توان سه عدد استپر را روی هر پین دلخواهی کنترل نمود.اگر بخواهیم به صورت خالصه توضیح
دهیم می توانیم بگوییم که باید موج PWMبا دیوتی سایکل دلخواه به صورت مجازی تولید گردد.
برای کنترل غیر دقیق مانند کنترل نور یک المپ و یا ساخت یک دیمر می توان از PWMمجازی استفاده نمود که - PWM ۴۱نرم افزاری :
در این روش براحتی میتوان از تمامی پین ها به عنوان خروجی PWMاستفاده نمود.
در اغلب میکروکنترلرهای تاینی حداکثر فرکانس MCUفرکانس ۲۰مگاهرتز است که این فرکانس در - ۴۲حداکثر فرکانس میکرو :
میکروکنترلرهای سری مگا در حداکثر خود مقدار ۱۶مگاهرتز است لذا در استفاده های خاص میتوان از این میکروکنترلرها استفاده نمود.
برای پیاده سازی ماژولهای ارتباطی مانند SPI, - ۴۳پیاده سازی نرم افزاری ماژول های ارتباطی :
Usart , TWIمواقعی که این ماژول های به صورت سخت افزاری در دسترس نیستند می توان به روش پیاده سازی نرم افزاری استفاده نمود در این روش دقت کار ماژول نرم افزاری
برای طراحی عمر مفید برای دستگاه های مبتنی بر میکروکنترلرهای - ۴۴قفل نرم افزاری و قفل سخت افزاری :
AVRمی توان از تایمر ها کمک گرفت بدین گونه که با ست کردن وقفه یک تایمر در تایم زمانی مثال ۲۰میلی ثانیه ،با هر بار رخ دادن وقفه یک شمارش به مقدار شمارنده تایمر اضافه
شود و به محض رسیدن به عدد خاص تایمر از کار بیفتد و عملیات شمارش به اتمام برسد و در صورت نیاز برنامه در درون یک حلقه گیر کند و یا اینکه مدام خودش را ریست نرم افزاری
کند .همچنین برای طراحی قفل سخت افزاری می توان به روش مشابه عمل کرد بدین گونه که مثال کاربر با هر بار کار کردن با دستگاه یک شمارنده زیاد شود و به محض رسیدن به عدد
خاص دستگاه از کار بیفتد دقیقا شاید شبیه چیزی که در patternکدهای گوشی های اندرویدی می بینیم که بعد از ۵بار اشتباه زدن الگو دستگاه موقتا از کار می افتد .اما با این تفاوت
در هنگاه ارسال دیتا بین دو دستگاه اگر بخواهید دیتای مورد نظر خود را کد کنید در ساده ترین راه حل - ۴۵کد کردن دیتای ارسالی :
پیشنهادی می توانید آنها را Notکنید و یا اینکه می توانید انها را با مقدار xff Xor ۰کنید که نتیجه معکوس شدن مقادیر صفر ویک خواهد شد و در سمت گیرنده برای دیکد کردن
این دیتا می توانید این دیتا را دوباره با مقدار xff Xor ۰کنید تا دیتای اولیه دوباره ساخته شود.
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
در برنامه نویسی حرفه ای بین این دو جمله تفاوت بسیاری - ۴۶تفاوت a++و ++aدر دستورات شرطی :
است ) : if(a++و ) if(++aدر جمله اول ابتدا متغیر aمقایسه می شود و سپس بعد از مقایسه مقدار آن یک واحد افزایش می یابد .اما در جمله دوم ابتدا مقدار aیک واحد افزایش
می یابد و سپس عمل مقایسه و شرط مورد نظر انجام می شود .با فرض اینکه مقدار اولیه aصفر باشد می توانید متوجه این موضوع شوید که در مقایسه اول نتیجه شرط منفی است و
دستورات بعد از ifاجرا نخواهد شد اما در جمله دوم نتیجه شرط مثبت است و در نتیجه دستورات پیرو این شرط اجرا خواهد شد .لذا برنامه نویس حرفه ای باید به ترکیب این دو دقت
عبارت <<x ۵برابر است با x/32همچنین عبارت >>x ۵برابر است با x*32لذا اگر بخواهید در برنامه نویسی - ۴۷عملیات شیفت بیتی :
خود عددی را در توانهای ۲ضرب یا تقسیم کنید کافی است آنرا به راست یا چپ شیفت دهید.
فرض گنید متغیر aرا به صورت متغیر هشت بیتی char - ۴۸جلوگیری از over flowشدن متغیرها :
عالمت دار تعریف کرده ایم و به آن مقدار اولیه ۱۰۰را داده ایم .حال در برنامه مان قرار است یک متغیر که مقدار آن ۵۰است را با آن جمع نماییم لذا با جمع کرذن این مقدار با مقدار
اولیه انتظار داریم که نتیجه ۱۰۰+۵۰یعنی ۱۵۰شود .اما بر خالف انتظار ما نتیجه مقدار -۱۰۵خواهد شد و این یعنی که متغیر ما over flowشده است .لذا برنامه نویس می تواند یا
خود با نوشتن تابعی جدید جهت جلوگیری از این موضوع خود دست به کار شود و یا اینکه با تعیین مقدار تغییرات متغیر مورد نظر حیطه تغییرات را پیش بینی نماید.
در برنامه نویسی های حرفه ای میکروکنترلرهای avrبا کامپایلرهای زبان سی مانند codevisoionAVR - ۴۹افزایش خوانایی برنامه :
و یا winAVRو AtmelStudioجهت خونایی برنامه رجیسترهای ۸بیتی و ۱۶بیتی که هر بیتشان کار خاصی را رانجام میدهد از متغیرهای خاصی استفاده می شود که در این جا به
چند نمونه از آنها اشاره می شود : bp=bit positionیعنی موقعیت بیت مورد نظر که ممکن است عددی بین ۰تا ۱۵و یا بیشتر باشد( .متغیرهای ۸بیتی – ۱۶بیتی – ۳۲بیتی۶۴ -
بیتی ) . bm=bit maskاین عبارت را درحالت ساده می توان به این صورت ترجمه کرد bm=1<<bpو این یعنی مقدار maskشده یا به توان ۲رسیده شده همان bp .عبارت
بعدی gc= group configurationاین عبارت شبیه bmاست اما با این تفاوت که در این جا ممکن چندین بیت و یا گروهی از بیت ها به چپ شیفت پیدا کرده باشند به عنوان مثال
عبارت >>5 ۳یک نوع gcاست که در این جا ۳بیت مربوط به عدد ۵به مقدار ۳واحد به سمت چپ شیفت پیدات کرده اند .از عبارت gcزمانی استفاده می شود که بخواهیم مثال بیت
های مربوط به تایمر که باید در ان واحد چندین بیت مربوط به یک رجیستر را یک باره تنظیم نماییم استفاده می شود .عبارت gm= group maskبی شباهت به bmاین عبارت تقریبا
همان gcاست با این تفاوت که در این جا تمام بیت های مربوط به عبارت gcتنظیم شده و یک هستند .برای درک بهتر gcو gmفرض کنید که بیت های ۳و۴و ۵رجیستر aکالک
یک تایمر را تنظیم می کند و اگر مقدار این بیت ها در حالت ۰۰۱باشد کالک ۸مگاهرتر انتخاب می شود لذا عبارت gcبرابر خواهد بود با gc=001<<3چون در این جا هر سه بیت را
یک باره برای انتخاب کالک ۸مگاهرتز تنظی می کند .عبارت gmبه این صورت خواهد بود gm= 7<<3چون ماسک شده این سه بیت مقدار ۷را نشان خواهد داد و چون موقعیت این
سه بیت در بیت های ۳و ۴و ۵هستند پس باید ۳بیت هم به سمت چپ شیفت داده شود.
www.avrlib.ir مرجع تخصصی کتابخانه های حرفه ای AVR
برای افزایش دقت ADCزمانی که ولتاژ اعمال شده به مبدل انالوگ به دیجیتال کم بوده می توان ولتاژ مرجع را - ۵۰افزایش دقت ADC :
کم در نظر گرفت به عنوان اگر ولتاژ AVCCمقدار ۵ولت باشد با تغییر مقدار AREFاز ۵ولت به ۱ولت دقت ۵برابر افزایش پیدا خواهد کرد.