آموزش جامع میکروکنترلر AVR – قسمت چهارم ;
این سری آموزشها که به جرات می توان آنها را کاملترین آموزشهای موجود دانست با صرف هزینه زیاد و با کیفیت و جزییات بالا توسط استاد ارجمند جناب آقای کینژاد تهیه شده است و به صورت رایگان در اختیار عموم قرار گرفته است.
سیسوگ در قسمت سوم مجموعه آموزش میکروکنترلر AVR ورودی ، خروجی پورتهای میکروکنترلر را معرفی کرد. در این قسمت میخواهیم برنامه LED که در قسمت قبل راجب آن بحث شد را به زبان C و BASIC بنویسیم، بدین منظور که PINB.0 اول خروجی تعریف شود و در مرحله بعد مقدار HIGH روی آن قرار بگیرد.
برنامه نویسی برای نرمافزار کدویژن:
در خط اول <include<mega32.h# فراخوانی میشود. در واقع mega32.h فایلی در کامپایلر است و تعاریف رجیسترهای mega32 در آن وجود دارد. از طریق includeکردن فایل mega32، کامپایلر متوجه میشود برنامه با atmega32 نوشته شده است.
در خط بعدی تابع main از نوع void تعریف شده است، که به صورت زیر شامل تابع و بدنه تابع میباشد:
1 2 3 4 | Void main() { بدنه تابع }; |
در بدنه تابع رجیسترها و برنامه مورد نظر نوشته میشود.
در ابتدا باید به صورت زیر، پین مورد نظر را خروجی تعریف کنیم:
1 | DDRB=0X01; |
که منظور از جمله بالا این است که PINB.0 برابر با یک و جهت آن خروجی باشد. به جای عبارت بالا میتوان از عبارت زیر نیز استفاده کرد:
1 | DDRB=(1<<DDB0); |
علامت “<< ” در برنامه نویسی به معنای شیفت به چپ محسوب میشود. DDB0 در تعاریف کامپایلر CODEVISION معادل صفر میباشد. پس معنی عبارت بالا این است که 1 به اندازه 0 بیت به سمت چپ شیفت داده شده است،که برابر با یک میباشد،
در خط بعد مقدار PINB.0 را مشخص میکنیم، در این برنامه منظور ما یک کردن این پین میباشد، بنابراین داریم:
1 | PORTB =0X01; |
همچنین به جای عبارت بالا میتوان مانند خط قبل از عبارت زیر استفاده کرد.
1 | PORTB=(1<<PORTB0); |
حال اگر این خط وجود نداشته باشد با توجه به اینکه پین مورد نظر خروجی و مقدار پیش فرض آن 0 است، در نتیجه در خروجی وضعیت low را خواهیم داشت.
خط بعدی حلقه (while(1 است، از آنجا که CPU به صورت مداوم در حال اجرای برنامه است و قرار نیست برنامه دیگری انجام دهد پس باید این برنامه در یک حلقه قرار بگیرد.
در نهایت برنامه ما به صورت زیر جمع بندی میشود:
1 2 3 4 5 6 7 | #include<mega32.h> Void main() { DDRB=0X01; PORTB=0X01; While(1); } |
برنامه نویسی برای نرمافزار بسکام:
حال میخواهیم با زبان بسکام برنامه را بنویسیم. همانند برنامه قبل در مرحله اول و خط اول باید کتابخانه میکروکنترلر مورد نظر فراخوانی شود. به صورت زیر:
1 | $regfile=”m32defdat” |
در دستور بعدی مقدار فرکانس نوسان برای نرم افزار مشخص میشود، البته باید بدانیم که مقدار فرکانس نوسان را نمیشود از طریق برنامه تغییر داد بلکه باید از طریق فیوز بیت ها و دستگاه پروگرامر این کار را انجام داد، ولی حسن آوردن این خط در برنامه این است که اگر تاخیر و عملیاتی در برنامه باشد با اطلاع از فرکانس اسیلاتور سیستم میباشد.
1 | $criystal=1000000 |
حال اگر به جای عدد 1000000 مقدار 8000000 نوشته شود این خط تغییری در وضعیت فرکانس اسیلاتور ایجاد نمیکند، ولی فرق آن این است که اگر قرار باشد از طریق بسکام تاخیری ایجاد شود با لحاظ مقدار این فرکانس نوسان میباشد. پس اگر این عدد اشتباه نوشته شود آن قسمتی از عملیات که مربوط به بسکام است با اختلال مواجه خواهد شود. پس همیشه این عدد باید برابر با فرکانس نوسان واقعی میکروکنترلر باشد که به وسیله پروگرامر و با تنظیم فیوز بیتها تنظیم میشود.
اگر در بسکام بخواهیم پین مورد نظر را تغییر دهیم و خروجی کنیم از دستور config pinB.0=output استفاده میکنیم.
دستور بعدی پین مورد نظر، که به عنوان خروجی لحاظ شده SET میکند. یعنی برابر با یک قرار میدهد.
1 | SET PORTB.0 |
در بسکام دستورات دیگری مثل RESET نیز وجود دارد که پین مورد نظر را 0 قرار میدهد. همچنین دستور toggle برای not کردن استفاده میشود که اگر پین مورد نظر 1بود آن را صفر و بالعکس میکند.
در نهایت این برنامه از دستور Do Loop که همانند دستور while است و در آخر از کلمه end به معنی پایان برنامه استفاده میشود. پس بنابراین برنامه به صورت زیر میباشد:
1 2 3 4 5 6 7 | $regfile=”m32def.dat” $crystal=1000000 configPinB.0=output SetPORTB.0 DO LOOP END |
در قسمت پنجم آموزش میکروکنترلر AVR خلاصه ای از کلیه امکانات موجود در AVR بیان میشود. با سیسوگ همراه باشید.