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