میکرو لایب

باینری به سون سگمنت در کدویژن

در این پروژه با میکرو کنترلر مگا ۱۶ و کامپایلر کدویژن اعداد باینری هشت بیتی که به پورت A وصل هست در سه سون سگمنت نشان داده می شود برای سادگی کد از سون سگمنتهای تکی معمولی استفاده شده و از روش مالتی پلکس سون سگمنت در این پروژه استفاده نشده است.

توضیحات کد ها:

این کد کانفیگ های مربوط به مگا ۱۶ را در کامپایلر بارگزاری کرده و مگا ۱۶ را به کامپایلر می شناساند تا ترجمه کد ها متناسب با میکرو کنترلر مگا ۱۶ صورت گیرد.

در هنگام ایجاد پروژه و انتخاب نام میکرو کنترلر این تکه کد توسط خود کامپایلر اضافه شده و نیازی به وارد کردن دستی نمی باشد.

برای نمایش یک عدد هشت بیتی که مقداری بین صفر تا ۲۵۵ دارد نیاز به سه رقم سون سگمنت هست

سون سگمنت اولی از سمت چپ همان صدگان است دومی دهگان و سومی یکان می باشد

سون سگمنت صدگان به پورت C وصل شده و باید خروجی باشد در صورتی که بخواهیم یک پورت خروجی باشد از PORT و برای ورودی  از PIN استفاده می کنیم

برای اینکه کد شکل خوانایی داشته باشد با استفاده از define نام پورت ها را تغییر دادیم

نام پورت C که سون سگمنت صدگان وصل هست در اینجا به sadgan تغییر داده شده است

نام پورت D که سون سگمنت دهگان وصل هست در اینجا به dahgan تغییر داده شده است

نام پورت B که سون سگمنت یکان وصل هست در اینجا به yekan تغییر داده شده است

و نام پورت A که هشت بیت باینری وصل شده به binary_in تغییر داده شده و دقت کنید که چون پورت A به عنوان وردی است به جای PORT از PIN استفاده شده است.

دستور بالا یک متغیر شامل ۱۰ عضو از نوع ۸ بیتی و در بازه مثبت صفر تا ۲۵۵ را تعریف می کند

عبارت unsigned قبل از char نشانگر این است که متغیری که تعریف می کنیم شامل اعداد منفی نیست و در بازه مثبت صفر تا مثبت ۲۵۵ با این متغیر کار خواهیم کرد

اگر unsigned را حذف کنید چون در اینجا از نوع متغیر char استفاده کرده ایم اعداد منهای ۱۲۸ تا مثبت ۱۲۷ را شامل خواهد بود و در صورتی که قبل از نوع متغیر عبارت unsigned اضافه شود متغیر اعداد ۰ تا ۲۵۵ را شمال می شود. برای تعریف متغیر هشت بیتی باید از char استفاده کنید. ما می توانسیم نوع متغیر را ۱۶ بیتی تعریف کنیم ولی این کار تنها حافظه رم میکرو کنترلر را اشغال خواهد کرد و به جز این کمکی به ما نخواهد کرد پس در هنگام تعریف متغیر ، باید بسته به نیاز متغیر ها را تعریف کنیم

بنابراین در کد متغیر data_segment که شامل ده عضو و از نوع char هست با توجه به unsigned که قبل از char به کار رفته ، نهایتا می توانیم اعداد ۰ تا ۲۵۵ را به عضو های این متغیر نسبت دهیم.

برای دسترسی به عضو های آرایه از سمت چپ و از صفر شروع به شمردن عضو می کنیم که شماره هر عضو اندیس همان عضو بوده و با اندیس شناخته می شوند

به عنوان مثال برای دسترسی به اولین عضو ، اندیس صفر را به کار می بریم:

اندیس ۰ مقدار ۶۳ را در خود ذخیره کرده است

و برای دسترسی به ششمین عضو اندیس ۶ را به کار می بریم:

اندیس ۶ مقدار  ۱۰۹ را در خود ذخیره کرده است

بنابراین به این صورت می توانیم یه آرایه ده عضوی تعریف کرده و مقدار ها را در عضو ها ذخیره کنیم

برای تعریف یک آرایه ۱۲ عضوی به صورت زیر عمل می کنیم

با نوع متغیر و اندیس آشنا شدیم

حال مقدار هر یک از عضوها اینکه چگونه و از کجا بدست آمده اند به توضیح آن می پردازیم

هر سون سگمنت از ۷ رقم دیجیت یا LED تشکیل شده است که این LED ها از A تا G نام گذاری شده اند تصویر زیر را ببینید:

 

پایه های A تا G هر سه سون سگمنت به ترتیب به بیت ۰ تا ۷ پورت مورد نظر وصل شده اند.

دو نوع سون سگمنت وجود دارد

۱-کاتد مشترک

۲-آند مشترک

کاتد مشترک: فعال ساز این نوع سون سگمنت به زمین وصل می شود و پایه های A تا G برای فعاسازی نیاز به سطح منطقی ۱ یا ۳٫۳ ولت دارند

آند مشترک: فعالساز این نوع سون سگمنت به پاور یا ۱ منطقی یا ۳٫۳ ولت وصل می شود و پایه های A تا G برای فعال شدن نیاز به زمین یا صفر منطقی یا صفر ولت دارند.

بنابراین فرقی که بین دو نوع سون سگمنت آند مشترک و کاتد مشترک وجود دارد باعث می شود که در قسمت دیتا و فعالسازی سون سگمنت ها دقت لازم را بکنیم و کد های متناسب با نوع سون سگمنت مورد استفاده بنویسیم

برای راحتی کار و درک بهتر موضوع در این پروژه ما از سون سگمنت کاتد مشترک استفاده کردیم یعنی بخش فعالساز سون سگمنت ها به زمین متصل شده اند و برای نمایش اعداد یا ارقام و یا حتی حروف می توانیم پایه های A تا G را به یک منطقی وصل کنیم.

در سون سگمنت ها برای نمایش یک عدد باید پایه های A تا G متناسب به نوع سون سگمنت باید تغیییر وضعیت دهند

برای سون سگمنت کاتد مشترک فرض کنید عدد یک را می خواهیم در سون سگمنت نمایش دهیم طبیعتا باید B و C برای با یک منطقی شوند و ما بقی برابر با صفر به صورت زیر

GFEDCBA= 0000110

این همان مقدار باینری هست که به صورت هشت بیتی می نویسیم:

۰b00000110

و در نهایت مقدار دیتای سون سگمنت برای نمایش عدد ۱ برابر با ۶ دهدهی خواهد بود

که اگر برگردید و یه نیم نگاهی به متغیر data_segment بیندازید می بینید که اندیس ۱ برابر است با ۶ ، و اگر ما اندیس یک را فراخوانی بکنیم مقدار یک در سون سگمنت نشان داده خواهد شد.

جدول زیر دیتای اعداد صفر تا نه را برای سون سگمنت کاتد مشترک نشان می دهد.

تابع اصلی:

در زبان C هر برنامه باید شامل تابع اصلی main باشد در هنگام ایجاد پروژه این تابع به صورت خودکار ایجاد می شود که کدها در داخل این تابع نوشته می شوند

تابع ها با یک کروشه باز و در آخر با یک کروشه بسته می شوند.

تعیین پورت های ورودی ، خروجی:

رجیستر DDRX پایه های میکروکنترلر را پیکره بندی می کند که در حالت ورودی باشد یا خروجی

به عنوان مثال اگر شما یک LED را به PORTA.0 وصل کنید ابتدا باید توسط رجیستر DDRX پایه را به عنوان خروجی تعریف کنید و سپس اقدام به روشن کردن LED کنید

به دو صورت می توانید از رجیستر DDRX استفاده کنید در تکه کد زیر خط اول ، پیکره بندی تمامی پایه های پورت مورد نظر را نشان می دهد و خط دوم  تنها یک پایه از پورت را پیکره بندی می کند :

اگر DDRA.0 برابر با یک قرار داده شود PORTA.0 به عنوان خروجی تعریف می شود و اگر برابر با صفر قرار داده شود پایه به عنوان ورودی تعریف خواهد شد

در کد زیر پایه های PORTB.4 تا PORTB.7 به صورت خروجی و پایه های PORTB.0 تا PORTB.3 به صورت ورودی پیکره بندی شده اند.

می توانید همین کد را به صورت زیر بنویسید  فرق کد بالا با کد زیر در این است که در کد بالا برای پیکره بندی از مقدار معادل هگز استفاده شده ولی در کد زیر از معادل باینری استفاده شده است:

نکته: اعداد باینری با ۰b و اعداد هگز (hex) هم با ۰x شروع می شوند و اگر یک عدد بدون این دو قانون نوشته شوند عدد به صورت دهدهی در نظر گرفته خواهد شد.

شروع حلقه:

حلقه while می تواند یک حلقه به مقدار دلخواه شما ایجاد کند اگر مقدار داخل پرانتز برابر با یک قرار داده شود حلقه بی نهایت اجرا خوهد شد حلقه صاهمث با یک کروشه آغاز شده و با یک کروشه بسته می شود و کدی که می خواهیم به طور مرتب اجرا و یا چک شود در داخل این کروشه های while نوشته می شود در زیر یک حلقه با محدودیت تکرار آورده شده است این حلقه تنها صد بار تکرار خواهد شد و بعد از آن از حلقه خارج خواهد شد.

خواندن مقدار باینری و تفکیک اعداد برای نمایش در سون سگمنتها:

سه عدد متغیر از نوع unsigned char  تعریف کرده بودیم که عبارتند از:

var_yekan که مقدار رقم یکان را در خود ذخیره می کند

var_dagan که مقدار دهگان را در خود ذخیره می کند

var_sadgan که مقدار صدگان را در خود ذخیره می کند

برای بدست آوردن رقم یکان به عنوان مثال عدد  ۲۴۸ را در نظر بگیرید اگر ۲۴۸ را بر عدد ۱۰ تقسیم کنید خارج قسمت برابر با ۲۴ و باقیمانده این تقسیم برابر با هشت خواهد بود 

بنابراین در این تقسیم ، عدد ۸ که همان باقیمانده هست باید برداشته شود و به عنوان یکان سون سگمنت در متغیر var_yekan ذخیره شود.

در زبان C و C++ برای بدست آوردن باقیمانده از % استفاده می شود بنابراین ما توانستیم مقدار یکان را بخوانیم و در متغیر var_yekan ذخیره کنیم.

برای رقم دهگان ابتدا عدد ۲۴۸ (به عنوان مثال) را بر ۱۰ تقسیم کرده سپس مقدار هر چه شد دوباره بر ۱۰ تقسیم کرده و باقیمانده را بر می داریم و در متغیر var_daghan ذخیره می کنیم.

و برای بدست آوردن رقم صدگان هم کافیست مقدار را بر ۱۰۰ تقسیم کرده و حاصل را در متغیر var_sadgan ذخیره کنیم.

بعد از این مراحل و تقسیماتی که بر روی عدد ۲۴۸ داشتیم باید مقدار متغیر ها به صورت زیر باشند:

var_yekan = 8

var_dahgan = 4

var_sadgan = 2

lین متغیر ها به عنوان اندیس برای متغیر data_segment استفاده خواهند شد.

نمایش در سون سگمنت:

در اینجا وقت آن رسیده که بتوانیم مقدار ها را در سون سگمنت نمایش دهیم 

قبلا گفتیم که برای نمایش اعداد در سون سگمنت ابتدا یک متغیر ده ارایه تعریف کردیم و آنها را متناسب با آند مشترک یا کاتد مشترک بودن سون سگمنت از اندیس ۰ تا ۹ مقدار دهی کردیم بدین صورت که اگر اندیس صفر خوانده شود سون سگمنت مقدار ۰ را نشان خواهد داد و اگر اندیس ۶ خوانده شود سون سگمنت مقدار ۶ و همینطور تا اندیس ۹ سون سگمنت مقدار ۹ را به نمایش خواهد گذاشت 

بنابراین در کد بالا اولین خط yekan که معرف PORTC هست و سون سگمنت یکان به این پورت وصل هست برابر با متغیر data_segment با اندیس var_yekan قرار می گیرد و اگر بر فرض مثال مقدار var_yekan را ۸ در نظر بگیریم مقدار هشتمین عضو از متغیر data_segment بر پایه های سون سگمنت یا پورت C ظاهر خواهد شد و در نهایت عدد ۸ را به نمایش در خواهد آورد 

و دو خط آخر برای دهگان و صدگان هم به همین روش تگرار شده است.

می توانید پروژه را از جعبه دانلود دریافت کنید.

منبع:mculibrary.ir

جعبه دانلود
  • برای اجرا نیاز به نرم افزار پروتیوس 8.8 به بالا دارید.

دیدگاه‌ها (0)

*
*

question