آموزش میکروکنترلر AVR
در قسمت پنجم آموزش میکروکنترلر AVR توضیحاتی بهصورتخلاصه درمورد امکانات موجود در سختافزارAVR بیانکردیم، حال در این قسمت از آموزش میکروکنترلر AVR میخواهیم با نوشتن برنامههایی، مراحل راهاندازی یک دیکودر BCD به 7segment را بهوسیلهی کامپایلرهای بسکام و کدویژن بررسیکنیم.
در ابتدا بهمعرفی مختصری درمورد سونسگمنت میپردازیم. سونسگمنت قطعهای است که معمولاً بهعنوان نمایشگر اعداد (از ۰ تا ۹) و برخی حروف انگلیسی بهکار میرود. همچنین قابلیت نمایش برخی نمادها مانند مساوی، سه خط موازی و نقطه را دارد. معمولا از نقطه که در پایین قطعه درکنار سگمنت هشتم قراردارد بهعنوان ممیز استفاده میشود. همچنین مواردی مانند چشمکزدن، چرخش سگمنتها و… امکان نشاندادن اطلاعات بسیاری را ازطریق این قطعه فراهممیکند.
از دیگر ویژگیهای این قطعه، داشتن مقاومتخوب نسبتبه شرایط محیطی اطراف میباشد که این قطعه را برای استفاده در محیطهای صنعتی مناسبکردهاست. همچنین دارای دید خیلیخوب از فاصلهی زیاد و زاویههای متفاوت است،که یک حسن نسبتبه LCD های مرسوم بهحساب میآید.
درواقع ساختمان داخلی سونسگمنت از LEDهایی تشکیلشدهاست که یا بهصورت آندمشترک و یا بهصورت کاتدمشترک بهیکدیگر متصلهستند، از همینرو سونسگمنتها به دودسته کاتدمشترک و آندمشترک تقسیمبندی میشوند.
01
در کاتدمشترک سیگنال HIGH و در آندمشترک سیگنال LOW سبب روشنشدن سگمنتها میشود. برای اتصال سونسگمنت به میکروکنترلر از مقاومت برای محدودکردن جریان استفادهمیشود. برای محاسبه این مقاومت باید مقدار افت ولتاژ روی سونسگمنت را بدانیم، که این مقدار در هر سونسگمنت متفاوت میباشد.
(ولتاژ پورت – ولتاژ سگمنت) / مقاومت = جریان هر سگمنت
مقدار جریان موردنیاز سگمنت به نوع ساخت و اندازه آن بستگیدارد. مثلا یک سونسگمنت نور بیشتر و دیگری نور کمتری دارد. بهصورت معمول برای سونسگمنتهای کوچک مقاومتی درحد چندصداهم کفایت میکند.
در شکلزیر پورت B بهعنوان خروجی و ۴ پین اول پورت A بهعنوان ورودی درنظرگرفتهشدهاست، باتوجهبه اینکه ازطریق ۴بیت امکان نمایش ۱۶حالت یعنی اعداد از ۰ تا ۱۵ یا 0 تا F درمبنای هگزا دسیمال وجود دارد، اگر بخواهیم این دیکودر را بهعنوان تبدیلکننده BCD به سونسگمنت استفادهکنیم (اعداد BCD شامل ۰ تا ۹ هستند)، باید برای حالتهای ۱۰ تا ۱۵ هم پیشبینیهایی بهعملآید. در این برنامه بعداز عدد ۹ نقطه سونسگمنت روشن میشود.
02
کامپایلر کدویژن:
برای نوشتن برنامه بهوسیله کامپایلر کدویژن طبق آموختههای قبلی عمل میکنیم.
در خط اول برنامه نوع میکروکنترلر را مشخص میکنیم.
#include<mega32.h>
در خطبعدی کدهای سونسگمنت نوشتهشدهاست که باتوجهبه جدولزیر میتوان روش بدستآوردن این کدها را پیداکرد.
03
در این خط برنامه یک آرایه با ۱۱عنصر تعریف میشود. اجزای این آرایه ازنوع بایت هستند که باعبارت unsigned char مشخص میشوند. در ابتدای این خط از کلمه flash استفاده میشود، بدینمعناکه اجزای این آرایه درهنگام پروگرامشدن برروی حافظه flash ذخیره میشوند.
همانطورکه قبلا اشارهشد، دیتاهایی که قرار است در طولبرنامه مقدار آنها ثابتبماند و تغییرینکند، باید در حافظه flash پروگرامنمود. همچنین اگر در تعریف آرایه نوع حافظه مشخص نشود، آرایه در حافظه SRAM ذخیره میشود و برایمثال در این برنامه عملا ۱۱بایت از حافظه اشغال میشود. این مساله در این برنامه مشکلی ایجاد نمیکند ولی در برنامههای وسیعتر که مصرف حافظه بیشتر میشود، روش اصولی در برنامهنویسی استفادهاز حافظه SLASH میباشد.
در ادامه برنامه تابع main را تعریف میکنیم، در این تابع باید متغییر برنامه را مشخصنماییم. در این برنامه متغییر ما کدهای سونسگمنت میباشند که از نوع بایت هستند پس بهصورت ;unsigned char bcd تعریف میشوند، همچنین باید پورت B بهعنوان خروجی درنظرگرفتهشود، که از تساوی DDRB=0XFF استفاده میشود.
در ادامه، حلقه while استفاده میشود که برنامه داخل این حلقه باید بهصورتمداوم اطلاعات را از روی PORTA بخواند و کد معادل سونسگمنت را در خروجی PORTB قراردهد و اینکار بهصورتدائم درحالانجام است.
عبارتبعدی در حلقه while یعنی ( bcd = (PINA&0x0f بدینمنظور است که ۴بیت پایین PORTA مورداستفاده قراربگیرد و اگر ۴بیت بالا وضعیتی خارجازمحدوده استفادهی ما داشتند مقدار آنها صفر قراردادهشود.
خط بعدی دستور if میباشد، این دستور بیانگر این است که اگر مقدار bcd کمتر از ۱۰ باشد، کد معادل آن در آرایه bcd_7seg نمایشدادهشود. یعنی مقدار bcd که در آرایه bcd_7seg قرار میگیرد متناظر با خود bcd میباشد. یعنی اگر bcd=0 باشد [bcd_7seg[0 برابر 0x3f خواهد بود.
حال اگر عدد ما از ۱۰ بیشتر بود برنامه وارد خط else میشود و عضو ۱۱ ام آرایه که منظور نقطه سونسگمنت میباشد، روشنخواهدشد. درنهایت هم حلقههای بازشده بستهخواهندشد.
#include<mega32.h> Flash unsigned char bcd_7seg[11]={0x3f,0x06,0x58,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80}; Void main() { Unsigned char bcd; DDRB=0XFF; While(1) { bcd=(PINA&0X0F); If(bcd<10)PORTB=bcd_7seg[bcd]; Else PORTB=bcd_7seg[10]; } }
حال اگر بخواهیم این برنامه را بهصورتی تغییردهیم که یک دیکودر هگزا دسیمال به سونسگمنت باشد یعنی بتواند حروف a تا f را نمایشدهد کافیست دستور if را بهصورتزیر تغییردهیم و دستور else را حذفکنیم.
PORTB=bcd_7seg[bcd]
همچنین باید در ادامه اجزا آرایه، کدهای مربوط به حروف a تا f را از رویجدول درآورده و اضافهکرد.
کامپایلر بسکام:
در قسمت بعدی، همین برنامه را با کامپایلر بسکام بررسی و تشریح میکنیم. ساختار برنامه بسیار شبیهبه کامپایلر کدویژن میباشد.
در ابتدا بهوسیله دستور ”regfile”m32def.dat$ نوع میکروکنترلر را مشخص میکنیم.
در ادامه نوع فرکانس کریستال مشخص میشود. $crystal=1000000
باید بهوسلیه دستور config PORTB=output پورت B را خروجی قراردهیم و سپس حلقه DO LOOP ایجادشود.
در این حلقه متغییر bcd برابر با PinA قرارداده میشود، سپس مقدار آن با 0F اند میشود. نکتهای که در اینجا وجود دارد این است که برعکس برنامهنویسی C که امکان انجام چندین عملیات ترکیبی در یک دستور وجود دارد در برنامهنویسی یسکام باید این عملیات بهصورت مرحلهبهمرحله انجامگیرد.
ساختار دستور if Then در بسکام:
اگر این دستور بهصورت if then باشد جواب دستور در جلو then نوشته میشود، ولی اگر بهصورت if else باشد باید جواب دستور در خطبعدی نوشتهشود.
در اینجا متغیرها با دستور lookup احضار میشوند. look up table موجود در این برنامه درانتها نوشتهمیشود.
دستور lookup بهصورتزیر نوشته میشود.
lookup( ایندکس,اسم جدول)
و در ادامه بههمین روش ادامه مییاید که باتوجهبه برنامهی نوشتهشده در زیر میتوانید اطلاعاتبیشتری را کسبکنید.
$regfile”m32def.dat” $crystal=1000000 Dim bcd as Byte Config PORTB=output Do Bcd=PINA Bcd=bcd AND &H0F IF bcd<10 THEN PORTB=Lookup(bcd,bcd_7seg) ElSE PORTB=Lookup(10,bcd_7seg) END IF Loop Bcd_7seg: Data &H3f,&H06,&H58. &H4f, &H66, &H6d, &7d, &H08, &H7f, &H6f, &H80
در قسمت هفتم آموزش میکروکنترلر AVR به آشنایی با منابع کلاک میپردازد. با ما همراه باشید.
منبع: سیسوگ