این سری آموزش های میکروکنترلر AVR که به جرات می توان آنها را کاملترین آموزشهای موجود دانست با صرف هزینه زیاد و با کیفیت و جزییات بالا توسط استاد ارجمند جناب آقای کینژاد تهیه شده است و به صورت رایگان در اختیار عموم قرار گرفته است.
سیسوگ در قسمت پنجم آموزش میکروکنترلر AVR توضیحاتی به صورت خلاصه درمورد امکانات موجود در سخت افزار AVR بیان کرد، حال در این قسمت از آموزش میکروکنترلر AVR میخواهیم با نوشتن برنامه هایی، مراحل راه اندازی یک دیکودر BCD به 7segment را به وسیله ی کامپایلرهای بسکام و کدویژن بررسی کنیم.
در ابتدا به معرفی مختصری در مورد سون سگمنت میپردازیم. سون سگمنت قطعه ای است که معمولاً به عنوان نمایشگر اعداد (از 0 تا 9) و برخی حروف انگلیسی به کار میرود. همچنین قابلیت نمایش برخی نمادها مانند مساوی، سه خط موازی و نقطه را دارد. معمولا از نقطه که در پایین قطعه در کنار سگمنت هشتم قرار دارد به عنوان ممیز استفاده میشود. همچنین مواردی مانند چشمک زدن، چرخش سگمنت ها و … امکان نشان دادن اطلاعات بسیاری را از طریق این قطعه فراهم میکند.
از دیگر ویژگی های این قطعه داشتن مقاومت خوب نسبت به شرایط محیطی اطراف میباشد که این قطعه را برای استفاده در محیط های صنعتی مناسب کرده است. همچنین دارای دید خیلی خوب از فاصله زیاد و زاویه های متفاوت است،که یک حسن نسبت به LCD های مرسوم به حساب میآید.
در واقع ساختمان داخلی سون سگمنت از LEDهایی تشکیل شده است که یا به صورت آند مشترک و یا به صورت کاتد مشترک به یکدیگر متصل هستند، از همین رو سون سگمنت ها به دو دسته کاتد مشترک و آند مشترک تقسیم بندی میشوند.
در کاتد مشترک سیگنال HIGH و در آند مشترک سیگنال LOW سبب روشن شدن سگمنت ها میشود. برای اتصال سون سگمنت به میکروکنترلر از مقاومت برای محدود کردن جریان استفاده میشود. برای محاسبه این مقاومت باید مقدار افت ولتاژ روی سون سگمنت را بدانیم، که این مقدار در هر سون سگمنت متفاوت میباشد.
(ولتاژ پورت – ولتاژ سگمنت) / مقاومت = جریان هر سگمنت
مقدار جریان مورد نیاز سگمنت به نوع ساخت و اندازه آن بستگی دارد. مثلا یک سون سگمنت نور بیشتر و دیگری نور کمتری دارد. به صورت معمول برای سون سگمنت های کوچک مقاومتی در حد چند صد اهم کفایت میکند.
در شکل زیر پورت B به عنوان خروجی و 4 پین اول پورت A به عنوان ورودی در نظر گرفته شده است، با توجه به این که از طریق 4 بیت امکان نمایش 16 حالت یعنی اعداد از 0 تا 15 یا 0 تا F در مبنای هگزا دسیمال وجود دارد، اگر بخواهیم این دیکودر را به عنوان تبدیل کننده BCD به سون سگمنت استفاده کنیم (اعداد BCD شامل 0 تا 9 هستند)، باید برای حالت های 10 تا 15 هم پیش بینی هایی به عمل آید. در این برنامه بعد از عدد 9 نقطه سون سگمنت روشن میشود.
کامپایلر کدویژن:
برای نوشتن برنامه به وسیله کامپایلر کدویژن طبق آموخته های قبلی عمل میکنیم.
در خط اول برنامه نوع میکروکنترلر را مشخص میکنیم.
1 | #include<mega32.h> |
در خط بعدی کدهای سون سگمنت نوشته شده است که با توجه به جدول زیر میتوان روش بدست آوردن این کدها را پیدا کرد.
در این خط برنامه یک آرایه با 11 عنصر تعریف میشود. اجزای این آرایه از نوع بایت هستند که با عبارت unsigned char مشخص میشوند. در ابتدای این خط از کلمه flash استفاده میشود، بدین معنا که اجزای این آرایه در هنگام پروگرام شدن بر روی حافظه flash ذخیره میشوند.
همانطور که قبلا اشاره شد، دیتاهایی که قرار است در طول برنامه مقدار آنها ثابت بماند و تغییری نکند، باید در حافظه flash پروگرام نمود. همچنین اگر در تعریف آرایه نوع حافظه مشخص نشود، آرایه در حافظه SRAM ذخیره میشود و برای مثال در این برنامه عملا 11بایت از حافظه اشغال میشود. این مساله در این برنامه مشکلی ایجاد نمیکند ولی در برنامههای وسیعتر که مصرف حافظه بیشتر میشود، روش اصولی دربرنامه نویسی استفاده از حافظه SLASH میباشد.
در ادامه برنامه تابع main را تعریف میکنیم، در این تابع باید متغییر برنامه را مشخص نماییم. در این برنامه متغییر ما کدهای سون سگمنت میباشند که از نوع بایت هستند پس به صورت ;unsigned char bcd تعریف میشوند.
همچنین باید پورت B به عنوان خروجی در نظر گرفته شود که از تساوی DDRB=0XFF استفاده میشود.
در ادامه، حلقه while استفاده میشود که برنامه داخل این حلقه باید به صورت مداوم اطلاعات را از روی PORTA بخواند و کد معادل سون سگمنت را در خروجی PORTB قرار دهد و این کار به صورت دائم در حال انجام است.
عبارت بعدی در حلقه while یعنی ( bcd = (PINA&0x0f بدین منظور است که 4 بیت پایین PORTA مورد استفاده قرار بگیرد و اگر 4 بیت بالا وضعیتی خارج از محدوده استفاده ما داشتند مقدار آنها صفر قرار داده شود.
خط بعدی دستور if میباشد، این دستور بیانگر این است که اگر مقدار bcd کمتر از 10 باشد، کد معادل آن در آرایه bcd_7seg نمایش داده شود. یعنی مقدار bcd که در آرایه bcd_7seg قرار میگیرد متناظر با خود bcd میباشد. یعنی اگر bcd=0 باشد [bcd_7seg[0 برابر 0x3f خواهد بود.
حال اگر عدد ما از 10 بیشتر بود برنامه وارد خط else میشود و عضو 11ام آرایه که منظور نقطه 7سگمنت میباشد روشن خواهد شد.
در نهایت هم حلقه های باز شده بسته خواهند شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #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 را حذف کنیم.
1 | 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 به صورت زیر نوشته میشود.
1 | lookup( ایندکس,اسم جدول) |
و در ادامه به همین روش ادامه مییاید که با توجه به برنامه نوشته شده در زیر میتوانید اطلاعات بیشتری را کسب کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | $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 به آشنایی با منابع کلاک میپردازد. با سیسوگ همراه باشید.
با سلام
کد هگز عدد 2 (0x5b) می باشد ولی در برنامه کدویژن (0x58) نوشته شده که عدد c رانشان میدهد. (خط3)
و کمی در مورد خط 17 کدویژن میشه توضیح بدین؟
چیزی که متوجه شدم همزمان 4 پین اول پورت A به عنوان ورودی و مقدارش داخل bcd ریخته میشه؟
توی کد کدویژن مقدار ۵۸ بود – ولی کد بیسیک بله حق با شما بود – کد اصلاح شد
بله درست متوجه شدید – چهار بیت پایین از ورودی پورت b خوانده میشه و توی متغییر bcd ذخیره میشه
سلام
خط 17 برنامه بسکام نباید Lookup باشه؟؟
سلام
بله دوست عزیز همینطوره ؛متشکر از شما برای تذکر
برنامه اصلاح شد.