خانه > آموزش > ساختار داخلی میکروکنترلر ها

ساختار داخلی میکروکنترلر ها

در قسمت قبلی آموزش با تعریف میکروکنترلر و کاربردها و نحوه عملکرد کلی آن آشنا شدیم. در این آموزش قصد داریم با ساختار داخلی و اجزای میکروکنترلر   AVRو نحوه اتصال آن ها به یکدیگرآشنا شویم. در شکل زیر نمایی از جزئیات میکروکنترلر AVR را مشاهده می کنید:

AVR microcontroller

بخش خاکستری شامل CPU میکروکنترلر می باشد. بر طبق آموخته های قسمت قبلی آموزش بخش های خارج از CPU یا حافظه اند و یا ادوات جانبی. که در شکل فوق هم این قضیه صدق می کند. شکل فوق را می تون به صورت زیر خلاصه کرد:

AVR microcontroller detail

تمام ادوات جانبی در قسمت آبی رنگ خلاصه شده اند. به دلیل اهمیت ویژه پالس ساعت، آن را از دیگر ادوات جانبی مجزا نمودیم. پالس ساعت در حقیقت نقش ضربان قلب را برای میکروکنترلر مشخص می کند و تعیین کننده سرعت اجرای دستورات توسط میکروکنترلر است. میکروکنترلرهای AVR قابلیت کار با حداکثر فرکانس 16 مگاهرتز را دارا هستند. همچنین مشخص است که در میکروکنترلر AVR سه نوع متفاوت از حافظه وجود دارد. در بخش های بعدی آموزش ن شاالله در مورد کاربرد این حافظه ها بیشتر صحبت می کنیم. اما یک CPU چگونه به حافظه و ادوات جانبی متصل شده و با آنها تبادل داده دارد.

اتصال حافظه به CPU

اتصالات یک حافظه نمونه در شکل زیر داده شده است. همانطور که در شکل مشخص است پایه های VCC و GND باید به ترتیب به پایه های مثبت(5 ولت) و منفی(صفر ولت) منبع تغذیه متصل شوند. 8 پایه D0 تا D7 پایه های داده می باشند و n پایه A0 تا An-1 هم پایه های آدرس می باشند. پایه  پایه انتخاب تراشه می باشد که برای اینکه از روی حافظه بخوانیم یا بر روی آن چیزی بنویسیم باید این پایه را به صفر منطقی متصل کنیم(علامت بار بر روی CS بیانگر این نکته است که برای فعال کردن این پایه باید آن را به صفر منطقی متصل کنیم). حال اگر بخواهیم بر روی تراشه مقداری را بنویسیم باید پایه  را و اگر قصد خواندن از حافظه را داشته باشیم پایه  را به صفر منطقی متصل نماییم.

AVR microcontroller memory pinout

نکته: تعداد پایه های آدرس به طول حافظه و تعداد پایه های داده به عرض حافظه بستگی دارد. برای مثال فرض کنید حافظه ای به شکل زیر داریم که عرض آن 8 بیت و طول آن 1 کیلوبایت باشد.

memory dimension

برای ارتباط با این حافظه بدیهی است که به 8 پایه داده نیاز داریم چرا که تمامی خانه های حافظه 8 بیتی می باشند. حال به چند پایه آدرس نیاز داریم؟ برای یافتن جواب این سوال باید ببینیم که چند پایه آدرس می­خواهیم تا بتوانیم به تک تک خانه های حافظه به صورت مستقل اشاره کنیم. به عبارتی دیگر باید ببینیم با چند بیت می توانیم در مبنای باینری از صفر تا 1023 بشماریم؟ برای این کار کافیست 1023 را به مبنای باینری تبدیل کنیم که می شود: 1111111111. بنابراین برای این کار به حداقل 10 پایه آدرس A0 تا A9 نیازمند هستیم. بنابراین برای ارتباط به چنین حافظه ای به یک CPU نیاز داریم که 8 خط داده و حداقل 10 خط آدرس داشته باشد. شکل زیر اتصال یک CPU به چنین حافظه ای را نمایش می­دهد.

cpu+memory

حال اگر بخواهیم با استفاده از چنین پردازنده ای مقدار باینری 00101101 را در خانه 97 این حافظه ذخیره کنیم باید به این صورت عمل کنیم:  ابتدا باید  CPU مقدار 0001100001 (97 در مبنای دو)  را برروی پایه های آدرس قراردهد. سپس پایه های  و  را صفر کرده و بعد از آن پایه های داده را برابر 00101101 قرار می دهد. بعد از یک مکث برای بارگیری مقدار فوق در حافظه(این زمان بستگی به سرعت حافظه دارد) پایه های  و  را دوباره یک نماید.

اتصال ابزارهای ورودی/خروجی (I/O)

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

بدیهی است که اگر بخواهیم برای اتصال هر یک از این ابزارها را با خطوط داده و آدرس جداگانه به CPU اتصال دهیم تعداد پایه­های CPU به شدت افزایش پیدا می­کند.

cpu to io

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

cpu to io2

با این روش CPU با استفاده از پایه های آدرس مشخص می ­کند که قصد ارتباط با کدامیک از ابزارهای ورودی و خروجی  را دارد. بعد با استفاده از پایه های Read و Write تصمیم می­گیرد که در ابزار مورد نظر قصد خواندن یا نوشتن دارد. در نهایت داده مورد نظر را از روی باس داده می­خواند یا بر روی آن می­نویسد.

حال اگر بخواهیم همزمان CPU را هم به حافظه و هم به ادوات جانبی وصل کنیم چطور؟ یک روش می تواند استفاده از ساختار زیر باشد:

cpu to io memory

اما در این صورت خانه 0 حافظه با ادوات جانبی 0 با هم تداخل آدرس دارند و اصل منحصر به فرد بودن آدرس زیر سوال می رود. برای فایق آمدن بر این مشکل می توان یک خط به باس کنترل اضافه کرد:

peripheral IO

خط کنترل جدید با رنگ قرمز انتخابگر حافظه یا ادوات جانبی است. که CPU هر وقت قصد خواندن/نوشتن روی حافظه(ادوات جانبی) دارد آن را 0(1) می کند. روش دیگری که بیشتر در سیستم های میکروکنترلری استفاده می شود به صورت شکل زیر است:

memory mapped IO

در این روش دیگر نیازی به خط اضافه در باس آدرس نیست. به جای آن آدرس ادوات جانبی را از انتهای حافظه شماره گذاری می کنیم. مثلا برای شکل فوق خنه های حافظه از 0 تا 15 شماره گذاری شده اند و ادوت جانبی هم از 16 به بعد. در این صورت دیگر تداخل آدرسی بین حافظه و ادوات جانبی به وجود نمی آید. فقط باید یک مدار منطقی در پایه CS حافظه طوری طراحی کنیم که به ازای آدرس های 0 تا 15 خروجی 0 و برای آدرس های بالای 15 خروجی 1 بدهد. با این کار به طور خودکار حافظه برای آدرس های بالای 16 غیرفعال می شود. به این مدار منطقی که به سادگی قابل طراحی است دیکدر آدرس می گویند که در اینجا قصد ورود به آن را نداریم. این روش در میکروکنترلرهای امروزی بسیار به کار می رود و به آن ورودی/خروجی حافظه نگاشتی یا Memory Mapped I/O می گویند.

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

در آماده سازی این بخش از فصل صفر کتاب avr microcontroller and embedded systems using assembly and c نوشته آقای مزیدی استفاده شده است. 

دانلود منبع فوق

نظرات و سوالات را در پایین همین مطلب عنوان فرمایید.

موفق باشید.

یاعلی.

 

درباره ی مدیر سایت

پاسخ دهید

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