Slide
Slide

آموزش برنامه نویسی AVR
نویسنده: مسئول فنی در
۱۹ مهر ۱۳۹۲
[ آخرین به روزرسانی در ۲۸ فروردين ۱۳۹۳ ]

در این بخش  چند برنامه به زبان اسمبلی و C برای به کار گرفتن بخش های مختلف AVR آورده شده است. در این برنامه ها چند هدف دنبال می شود. 1- طرح نکات ریز برنامه نویسی  2- فرق یک برنامه نویسی آموزشی و برنامه نویسی حرفه ای (مثال6 و 7 را بخوانید)  3- آموزش پیکربندی AVR که برای برنامه نویسی حرفه ای لازم است، هر چند در نگاه اول خسته کننده است و در مراکز آموزش آماتوری به دلیل پیچیدگی از آن پرهیز می شود.
مثال 1 - پورت A را بخوانید و پس از اضافه کردن 1 واحد به پورت B  منتقل کنید.

 

تعریف جهت پورت ها فراموش نشود

اگر مقدار روی پایه ها را میخواهید حتماً از پین بخوانید.

 

 

 

 

 

 

 

 

مثال 2 - وقفه - برنامه ای بنویسید که با هر بار آمدن لبه بالا رونده روی پایه INT1 به مقدار پورت A یکی اضافه شود.


محل بردار وقفه مهم است.

مقداردهی SP خیلی مهم است.

نوع حساسیت وقفه فراموش نشه.
اینتراپت خصوصی را فعال کنید.
اینتراپت سراسری را فعال کنید.
فکر کنید چرا از PIN نخواندم و باید از PORT خواند.
به جای reti دستورالعمل ret ننویسید.

 

 












 

 

 

 

 

 

 

 

 

مثال 3 - فعال کردن تایمر نگهبان - برنامه ای بنویسید که تایمر نگهبان را با زمان ری ست 32.5ms فعال کند. ( تغذیه سیستم 5v است.) ساختار برنامه اصلی و کدهای تایمر نگهبان را مشخص نمایید.



فلوچارت ( از سایت Atmel گرفته شده است ) در مورد نحوه قرار دادن دستورالعمل WDR آموزنده است. در ضمن به باکس Everything OK دقت کنید. این همان نکته ای است که در قسمت چند نکته نیز گفتم و بعداً در مورد آن صحبت خواهم کرد.


























مثال 4 - غیرفعال کردن تایمر نگهبان - برنامه ای بنویسید که تایمر نگهبان را غیر فعال کند.







توجه کنید ابتدا باید هر دو بیت WDTOE و WDE را یک کنید و پس از آن بیت WDE را صفر کنید.

مثال 5 - یک word از حافظه flash ROM به SRAM منتقل کنید.

پاسخ در مقابل آمده است، و حافظه داده یا SRAM را نیز پس از انتقال داده مشاهده می کنید.

نکات این مثال :
اشاره گر حافظه ROM را باید در 2 ضرب کرد، چون ساختار حافظه ROM به صورت WORD است و اشاره گر Z به صورت بایتی اشاره می کند.
برای محل ذخیره در حافظه RAM باید شما ابتدا دایرکتیو desg. را بکار برده و تعداد بایتی که برای ذخیره داده لازم دارید، با دایرکتیو byte. رزرو کنید.










همانطور که در برنامه مقابل می بینید، در زبان C بسیار ساده است.
برای تعریف یک متغیر در فضای ROM کافیست عبارت flash را بعد از تعریف نوع متغیر بنویسید و اگر چیزی ننویسید، به عنوان داده در SRAM تلقی می شود و اگر خواستید داده ای را در EEPROM تعریف کنید، لازم است عبارت eeprom  را بعدا از تعریف نوع متغیر اضافه کنید.

 

مثال6 – آیا برنامه های زیر در یک پروژه صنعتی ( کار حرفه ای ) قابل استفاده هستند.
برنامه مقابل جهت دریافت داده از پورت سریال به زبان اسمبلی و C در دیتاشیت شرکت ATMEL آورده شده است. همانطور که می بینید، در هر دو مثال ابتدا بیت  RXC که مبین اتمام رسیدن داده است، بررسی می شود، چنانچه داده نرسیده باشد، در انتظار رسیدن داده می ماند.
به نظر شما اگر فرستنده به هر دلیلی داده ای نفرستد، خاموش یا خراب بودن برد فرستنده و یا قطع سیم انتقال چه اتفاقی می افتد. بله سیستم شما در یک لوپ بینهایت می ماند و هنگ می کند. شما باید برنامه را بگونه دیگری بنویسید. به کار گرفتن این برنامه ها به هیچ عنوان در یک کار حرفه ای صحیح نیست.
مثالهای مقابل را شما در غالب کتابهای درسی و Wizard های مختلف می بینید. شما باید توجه داشته باشید، که غالب این کتاب ها و نرم افزار ها قصد آموزش اولیه و آماتوری شما را دارند، و حتی استاد شما در دانشگاه ممکن است برنامه را به همین صورت بنویسید.اما شما هرگز برنامه را اینگونه ننویسید و فقط از نکات آموزنده مثال استفاده کنید.


مثال 7 - اشکال برنامه خواندن از I2C که در برنامه مقابل آمده است. چیست؟

کد مقابل بخشی از Header فایل i2c.h نرم افزار CodeVision است ، که شاید هزاران نفر تا کنون از آن استفاده کرده باشند و متوجه اشکال آن نشده باشند و یا وقتی با کاهش سرعت برنامه و یا هنگ کردن دستگاه خود مواجه شده باشند، هرگز  سراغ Header فایل نرفته باشند. اما همانطور که می بینید، در این برنامه بیت SCL چک می شود و در صورتیکه این بیت صفر باشد، منتظر یک شدن آن می شود ( حلقه i2c_read3 )
حال اگر به هر دلیل این بیت صفر بماند چه اتفاقی می افتد.
من زحمت آقای پاول هیدوک را نمی خواهم زیر سوال ببرم و همیشه گفته و می گویم، ما به عنوان یک مسلمان باید قدر شناس این افراد، در هر کجای عالم که هستند، باشیم.
اما اینجا بحث حرفه ای بودن است.
برای اینکه یک برنامه کامل و حرفه ای بنویسیم، باید عمق بیشتری داشت و با 51 ساعت درس یک ترم ، یک تعویض روغنی هم نمی توان باز کرد.

مثال 8 - چگونه می توان 7 بیت را در یک بایت یا ورد ذخیره کرد؟
byte word













نظرات کاربران
کاربر 1 :    
۱۴ فروردين ۱۳۹۳
۱۴ فروردين ۱۳۹۳
چون قرار است به رجیستر PORT اضافه کنیم پس در هر بار اضافه کردن باید ابتدا مقدار قبلی را خوانده سپس به آن اضافه کرد در صورت استفاده از رجیسترPIN مقدار منطقی که از بیرون میکرو بروی پایه مربوطه قرار گرفته را می خواند.رجیستر PORT مربوط به خروجی است و رجیستر PIN مربوط به ورودی
۱۵ فروردين ۱۳۹۳
مسئول فنی :

در AVR بین PORT و PIN تفاوت است و همانگونه است که شما گفته اید. اما وقتی در حالت کلی صحبت از پورت می شود، یعنی آنچه روی پین ها است، و شما می بینید که می گویند AVR برای مثال 4 پورت A,B,C,D دارد و نمی گویند 4 پورت و 4 پین دارد. دقت شما بسیار عالی است. موفق باشید



نظر بدهید

ایمیل شما پنهان می ماند.