AVR, توصیه شده, دوره آموزش کاربردی میکروکنترلر AVR, میکروکنترلر

جلسه ششم: نوشتن برنامه‌هایی با کامپایلرهای کدویژن به منظور پیاده سازی یک دیکدر BCD to 7segment

آموزش نوشتن برنامه‌هایی با کامپایلرهای کدویژن به منظور پیاده سازی یک دیکدر BCD to 7-segment

خلاصه کلی: در این جلسه توضیحاتی در مورد ساختارکلی 7segment و نحوه کار با آن ارائه می کنیم و در ادامه کد برنامه BCD to 7segment را در کامپایلر کدویژن می نویسیم و بطور مفصل آن را توضیح خواهیم داد.

7segment چیست؟

قطعه ای است که به عنوان نمایشگر استفاده می‌شود و رقم ها و کاراکترهای از 0 تا 9 و حروفی مثل A,B,C,…,I,J,L,N,O,P,Q,R,S,T,U,V,…,Z و همچنین، نمادهایی مثل =, ≡  را می توان به کمک آن نمایش داد.

از کاربرد دیگر آن استفاده در چشمک زدن و چرخش segmentها هست که نمای جذابی به وجود می‌آورد.

7segment در دو نوع آند مشترک و کاتد مشترک موجود است. در واقع 7segment تشکیل شده از led هایی که بصورت داخلی آند یا کاتد آنها بهم متصل است. در کاتد مشترک سیگنال های High سبب روشن شدن segment ها و در آند مشترک عکس این قضیه برقرار است.

شاید برای شما مفید باشد: آموزش AVR از مقدماتی تا پیشرفته

ویژگی های 7segment

این قطعه مقاومت بسیار خوبی نسبت به شرایط ومحیط اطراف دارد و گزینه خوبی برای استفاده در محیط های صنعتی به‌شمار می‌رود. مشاهده این قطعه از فواصل نسبتا زیاد و از زوایای مختلف به راحتی میسر است.

اپراتورهایی که در محیط های صنعتی فعالیت دارند، گاهی باید از فاصله نسبتا زیادی ارقام نمایش داده شده روی 7segment را مشاهده کنند که به راحتی این امکان فراهم شده است.

به شکل زیر توجه کنید، در اینجا 7segment استفاده شده از نوع کاتد مشترک است که از طریق مقاومتهایی به پورت B درمیکرو متصل شده است. این مقاومت ها وظیفه محدودسازی جریان را برعهده دارند.

اینکه هر 7segment به چه جریانی نیازدارد، به اندازه و نوع ساخت آن بستگی دارد، اما بصورت کلی برای 7segment های رایج، مقاومتی در حد چند صد اهم کفایت می کند.

شکل 1-6

در شکل بالا پورت B به عنوان خروجی و چهار پورت A به عنوان ورودی هستند. چون ورودی 4 پورت است پس 16 حالت دیتای ورودی بصورت هگزا دسیمال خواهیم داشت.

نکته: اعداد BCD از صفر تا 9 را شامل می‌شوند و اگر بخواهیم با میکرو مبدل BCD به 7segment بسازیم، برای حروف A – F باید یک پیش بینی به عمل آوریم.

کد نویسی دیکدر BCD to 7segment

پیش بینی به این صورت است که اگر از رقم صفر تا 9 در ورودی قرار بگیرد، همین اعداد روی 7segment نمایش داده می‌شوند. اما از اعداد 10 به بعد  نقطه DP روی 7segment طبق خواسته برنامه روشن می شود.

کد برنامه به شکل زیر خواهد بود:

در خط 1 نوع میکرو کنترلر mega32 تعیین شده است.

در خط بالا کدهای 7segment محاسبه شده اند و داخل یک آرایه 11 عنصری قرار گرفته اند.

بطور مثال، فرض کنید در نظر داریم عدد صفر را بر روی 7segment نشان دهیم چه سگمنت هایی را از بین سگمنت های ,DP A,B,C,D,E,F,G طبق شکل 1-6 باید روشن کنیم؟

مطابق شکل بالا نیاز به روشن کردن سگمنت های A,B,C,D,E,F داریم یعنی همه segment ها بجز G و DP.

فرض کنید PB0 تا PB7 در شکل 1 به ترتیب به سگمنت های A  تا  DP متصل شده اند، پس برای نمایش عدد صفر خواهیم داشت:

 که معادل کد 3F است.

نکته مهمی که در تعریف آرایه وجود دارد این است که از حافظه flash برای ذخیره سازی آن استفاده شده است. flash جزو استانداردهای زبان C نیست، بلکه به این معناست که اعضای آرایه هنگام پروگرام شدن میکرو روی حافظه فلش پروگرام می‌شوند.

در طول برنامه بهتر است دیتاهایی که قرار است ثابت بمانند و تغییر نکنند را بصورت قراردادن flash قبل از نام متغیر تعریف کنیم و به این شکل ما کامپایلر را متوجه می کنیم که اطلاعات را باید در حافظه flash ذخیره کند.

اگر flash قبل از متغیر ثابت نوشته نشود، این آرایه در طول اجرای برنامه در حافظه SRAM ذخیره می‌شود و 11 بایت  از SRAM را اشغال می کند.

بهتر است برای ذخیره کردن دیتاهای ثابت از حافظه flash استفاده کنید.

در این خط از کد متغیر bcd با طول 1 بایت داخل تابع main تعریف شده است. ممکن است این تعریف سازی متغیر bcd در خارج از تابع main انجام شود که در این صورت، نوع ذخیره سازی در حافظه و امکان دیده شدن آن توسط بقیه توابع متفاوت خواهد بود.

در این خط پورت B بصورت خروجی تعریف شده است.

در خط 12 تنها 4 پورت از پورت A به عنوان ورودی تعریف شده و پورتهای PA4,….,PA7 وضعیت مشخصی ندارند و حتی می توانند float باشند اما برای حل این وضعیت می توان عدد خوانده شده در ورودی را با مقدار  0F بصورت & شده در bcd قرار دهید که در این حالت 4 بیت پرارزش پورت A در صفر ضرب و خنثی خواهند شد و 4 بیت کم ارزش پورت A یا همان ورودی در F یا 1 ضرب می‌شوند.

در خط 13 شرطی تعریف شده که به این صورت است: اگر عدد ورودی از 10 کوچکتر باشد در نظر داریم که کد معادل آن عدد در 7segment نمایش داده شود که این کار از طریق برابر قرار دادن پورت B با عنصری از آرایه bcd – 7seg  که متناظر با عدد واقع در bcd است، امکان پذیر است.

اگر ورودی از 10 بیشتر باشد، ئارد خط آخر کد می شویم و عنصر 11  ام آرایه احضار می شود؛ یعنی نقطه DP روشن می شود.

نکته:

اگر می خواستیم بجای دیکدر BCD to 7segment یک دیکدر هگزا دسیمال به 7segment بسازیم، یعنی 7segment حروف A-F را هم نمایش دهد، کافیست برنامه بصورت زیر اصلاح شود:

در کد بالا بجای آخرین عنصر آرایه یعنی 0x80 باید کدهای معادل A-F را مشابه قبل محاسبه و جایگذاری کنیم.

برای نمایش A چه segment هایی باید روشن شوند؟ کد معادل آن چیست؟

 

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *