آموزش میکروکنترلر AVR قسمت 6: پیاده‌سازی دکودر BCD-7segment با کدویژن و بسکام

0
128
پیاده سازی دکودر BCD-7segment
پیاده سازی دکودر BCD-7segment

آموزش میکروکنترلر 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 به آشنایی با منابع کلاک می‌پردازد. با ما همراه باشید.

 

 

منبع: ‌سیسوگ

برای این مقاله نظر بگذارید:

لطفا دیدگاه خود را بنویسید
لطفا نام خود را وارد کنید