آموزش میکروکنترلر AVR قسمت دوم : کلاک میکروکنترلر و بلوک I/O

0
599
کلاک میکروکنترلر و بلوک I/O
کلاک میکروکنترلر و بلوک I/O

آموزش میکروکنترلر AVR

در قسمت اول مجموعه آموزش میکروکنترلر AVR مطرح کردیم، برنامه‌ی نوشته‌شده نهایتاً توسط کامپایلر مورداستفاده به دستورالعمل‌های قابل‌فهم برای CPU تبدیل می‌­شود. این دستورالعمل‌ها باید در حافظه فلش ذخیره‌شود که این‌کار توسط دستگاه پروگرامر انجام می‌شود. هرچند که برخی‌از شماره‌های AVR این قابلیت را دارند که درحین اجرای برنامه اطلاعات را بنویسند. اطلاعاتی که درجریان اجرای برنامه تولید می­‌شوند می‌توانند توسط CPU در حافظه EEPROM ذخیره‌شوند، اگر لازم‌باشد مقدار اولیه‌ای در EEPROM ذخیره‌شود این‌کار توسط پروگرامر انجام می­‌شود. حداکثر ظرفیت FLASH که در میکروکنترلرهای معمول AVR وجود دارد ۲۵۶KB هست و حداکثر ظرفیت EEPROM برابر ۴KB می‌باشد. همچنین اشاره‌شد مقادیری که لازم‌است درحین اجرای برنامه به‌صورت موقت ذخیره‌شوند، در مرحله‌ی اول در رجیسترهای داخلی R0 تا R31 و در مرحله‌ی بعد وقتی که این ظرفیت حافظه کافی نبود در SRAM ذخیره می‌شود. مقدار حداکثر حافظه SRAM برابر ۱۶KB است. در خانواده­ AVR، شماره­ ATMEGA1284 که یک شماره به‌خصوص است، دارای ۴۰ پایه DIP و 128KB حافظه FLASH می‌باشد. که ازلحاظ توانمندی‌ها شماره متفاوتی می­‌باشد. متاسفانه طیف وسیعی از شماره‌های AVR دردسترس نیست و برخی‌از شماره‌های موجود عبارتند از ATMEGA8 ,ATMEGA16 ,ATMEGA32 و… که بیشترین کاربرد برای این شماره‌ها می­‌باشد.

میکروکنترلر Atmega1284
میکروکنترلر Atmega1284

 

CLOCK میکروکنترلر

بحث‌بعدی که در آموزش میکروکنترلر AVR می‌خواهیم به آن بپردازیم، CLOCK میکروکنترلر است که می‌تواند به‌صورت پیش‌­فرض از اسیلاتور داخلی میکروکنترلر تامین شود، هم‌چنین می­‌تواند با تغییر بخشی به‌نام فیوزبیت برروی منابع کلاک دیگر و یا بااستفاده‌از کریستال خارجی تامین‌شود. باورعمومی بر این است که حداکثر کلاک خانواده‌های AVR برابر ۱۶MHZ است ولی این‌طور نیست، شماره‌هایی نیز هستند که تا ۲۰MHZ کلاک می‌پذیرند که بحثی فراتر از بحث OVER CLOCK دارد. به این‌معنی که یک فرکانسی را کارخانه سازنده به‌عنوان حداکثر فرکانس کلاک تعیین می‌کند و عملکرد همه­ بخش‌های داخلی میکروکنترلر را گارانتی می­‌کند، و اگر فرکانس از این بالاتر رفت به این‌معنا نیست که فوراً میکروکنترلر از کار بیفتد ولی در شرایط گارانتی قرار نمی‌گیرد. پس بنابراین حداکثر فرکانس CLOCK برای برخی شماره­‌های AVR برابر ۲۰MHZ و برای میکروکنترلرهای معمول موجود در بازار ۱۶MHZ است. با مراجعه‌به دیتاشیت می­‌بینید که حداکثر فرکانس اعمال‌شده به میکروکنترلرهای خاص ۲۰MHZ می‌­باشد. بحث‌دیگر که در آموزش میکروکنترلر AVR مورد‌توجه است محدوده تغذیه AVR می­‌باشد، که به‌صورت معمول بین ۴.۵ الی ۵.۵ولت می‌باشد. سری دیگری از میکروکنترلرها هستند که یک پسوند L در انتها دارند که نشان‌دهنده­ محدوده تغذیه گسترده‌­تر هستند، با این‌تفاوت که کلاک آنها نصف می­‎شود. مثلاً اگر ATMEGA32 ،۱۶MHZ کلاک را بپذیرد ATMEGA32L ،۸MHZ را می‌پذیرد. ولی این بحث متحول شده و سری جدیدتری به نام سری A وارد بازار شده‌است که محدوده کلاک در همان محدوده حداکثر است و محدوده تغذیه در محدوده تغذیه سری L است یعنی به طور تقریب بین ۲.۷ الی ۵.۵ ولت است. البته این محدوده تغذیه مربوط‌به تمام شماره‌ها نیست و میکروکنترلرهایی هستند که محدوده تغذیه آن‌ها بین ۱.۸ تا ۵.۵ ولت می‌­باشد.مثلاً در ATTINY43U که محدوده تغذیه­‌شان از ۰.۷ولت شروع می­‌شود. هم‌چنین شماره­‌ای در AVR وجود دارد که حداکثر تغذیه آن ۱۸ولت می­‌باشد مثل ATMEGA16HVB. دلیل آن وجود رگولاتور در داخل میکروکنترلر می­‌باشد. بنابراین محدوده تغذیه بسیار گسترده می­‌باشد. یکسری‌از شماره­‌هایی هستند که علاوه‌بر ATEMEGA و ATTINY های معمول کمتر شناخته شده‌­اند. برای‌مثال AT90CAN ,AT90PWM ,AT90USB و دوسری ازخانواده AVR هستند که خیلی موجود نمی‌باشند. گروهی هستند که درکل برای کنترل باطری و کنترل‌بر پروسه باطری استفاده می­‌شوند و گروهی‌دیگر برای دماهای بالا مثلاً تا ۱۲۵ و ۱۵۰درجه مورداستفاده قرار می‌گیرند.

INPUT/OUTPUT

برای ارتباط CPU با دنیای خارج از این بلاک استفاده می‌شود. این ارتباط می­‌تواند در قالب یک پین I/O معمول باشد که توسط CPU می‌توان اطلاعات را روی آن نوشت و یا اطلاعات آن را بخواند. این بلاک می‌تواند توسط بلاک‌های پیشرفته‌­تری مثل ارتباط USART ,TWI ,SPI و… باشد.

یک CPU چگونه می‌تواند با ورودی و خروجی‌های خود ارتباط برقرار کند؟

فرض می‌کنیم که ۱ پین یا ۸ پین وجود دارد که می‌تواند ورودی یا خروجی باشند، چطور یک CPU می‌تواند براساس برنامه­‌ای که روی حافظه‌ فلش نوشته‌شده‌است روی پین خروجی اطلاعات را بنویسد و اعمال کند و هم‌چنین چطور می‌تواند اطلاعات را از دنیای خارج بخواند؟ پاسخ اینجاست که ارتباط CPU با دنیای خارج از طریق آدرس­‌های به‌خصوصی در فضای SRAM انجام می‌گیرد. باید توجه‌داشت که وقتی بحث SRAM پیش می‌آید منظور آن فضای عمومی که می­‌تواند برای ذخیره­‌ اطلاعات به‌کار رود نیست، بلکه بخشی‌از حافظه­‌ای است که وقتی تغذیه قطع می­‌شود مقادیر آن پاک می‌شود و به با ریست‌شدن به مقداراولیه باز می‌گردد. یک میکروکنترلر را در یک پکیج DIP با تعدادی پایه فرض‌کنید، مثل یک شماره سنتی ATMEGA8515 که ازلحاظ پین کاملاً منطبق با ۸۰۵۱ می‌باشد. تنها تفاوتی که باید رعایت‌شود در منطق ریست این دو میکروکنترلر است در واقع ۸۰۵۱ با HIGH ریست می‌شود ولی ۸۵۱۵ با LOW ریست می­‌شود.

میکروکنترلر Atmega8515
میکروکنترلر Atmega8515

 

حال با فرض‌اینکه کلاک ATMEGA8515 از اسیلاتور داخلی تامین می­‌شود، می‌خواهیم برنامه‌ای بنویسیم که بتواند پین‌های این میکروکنترلر را به‌صورت خروجی HIGH/LOW کند، یا بتواند محتوای پین‌هایی را که به‌صورت ورودی هستند بخواند و مشخص‌کند که HIGH هستند یا LOW؟ جواب به این‌صورت توضیح داده می­‌شود که آدرس مشخصی در فضای SRAM وجود دارد که اگر در آن آدرس مشخص، اطلاعات نوشته‌شود نتیجه­ آن به‌صورت تغییر سخت‌افزاری در پین موردنظر اعمال می­‌شود. در نقطه مقابل اگر ما ورودی داشته‌باشیم یعنی بخواهیم اطلاعاتی را به یکی‌از پین‌ها به‌عنوان ورودی اعمال‌کنیم باز آدرسی در فضای SRAM وجود‌دارد. این آدرس توسط CPU و برنامه‌ای که پروگرامر روی حافظه FLASH نوشته است خوانده می‌شود. میکروکنترلر از زمانی که شروع‌به‌کار می‌کند از آدرس مشخصی که می‌تواند هر آدرسی باشد شروع‌به خواندن می­‌کند. در جریان EXECUTE تصمیم برنامه‌نویس بر این است که پین موردنظر را HIGH یا LOW کند، باید برنامه‌‌ی نوشته‌شده پیش‌بینی شده‌باشد که در آن آدرس SRAM ( که هرآنچه در آن نوشته‌شود به‌صورت واقعی روی آن پین منعکس می‌شود) مقدار لازم نوشته‌شود.در خانواده AVR، اعمال توسط رجیسترهای R0 تا R31 که ۳۲ بایت هستند انجام می­‌شوند، بعضی‌از این رجیسترها مزیت‌های خاصی نسبت‌به بقیه دارند مثلاً اگر دوعدد درهم ضرب شوند نتیجه آن حتماً در R0 و R1 قرار می­‌گیرد، و یا دسترسی‌به حافظه‌­هایی مثل SRAM توسط ۶ رجیستر انتهایی صورت می­‌گیرد. پس باید بدانیم که آدرس R0 تا R31 حافظه داخلی AVR در اختیار رجیسترها می‌­باشد.

بلوک I/O

قسمت بعدی در آموزش میکروکنترلر AVR که نقش بسیارمهمی دارد بلوک I/O می‌باشد،که ارتباط بین CPU و سخت‌افزار، فعال‌کردن سخت‌افزار، غیرفعال‌کردن سخت‌افزار، ارسال اطلاعات، دریافت اطلاعات، تغییروضعیت اطلاعات و… را فراهم می‌سازد. این ناحیه یک ناحیه بسیارحساسی است که هرگونه غلط نوشتن اطلاعات در این ناحیه می‌­تواند منجربه یک عملیات سخت‌افزاری شود. محدوده این بلوک درمبنای هگز، از 20$ تا 5F$ می‌باشد.که ۶۴بایت از حافظه را دارا می‌­باشد. اگر دنبال این هستیم که ببینیم CPU چطور ازطریق سخت‌افزار می­‌تواند با برنامه ارتباط داشته‌باشد باید این بلوک را به‌طور کامل بشناسیم. یکی‌از ابزار‌های برنامه‌نویسی که خیلی موردتوجه هست کامپایلر CODEVISION می‌­باشد، و دلیل آن دارابودن قابلیتی به‌نام CodeWisard می­‌باشد که عدددهی به بلوک I/O را به‌صورت خودکار انجام می­‌دهد. در بعضی‌از شماره‌­های AVR مانند ATMEGA64 و ATMEGA128 که سخت‌افزار‌های جانبی آن‌ها گسترده­‌تر است، ۶۴بایت اختصاص‌یافته به فضای I/O کافی نیست، یعنی آدرس 5F$ نهایت آدرسی نیست که اگر در آن برنامه نوشته‌شود روی برنامه تاثیر بگذارد بلکه ادامه این آدرس هم روی سخت‌افزار تأثیر می‌گذارد. تفاوت بین یک برنامه‌نویسی اسمبلی با برنامه‌نویسی (HIGHLEVELC,PASCAL,BASIC و…)در این است که یک برنامه‌نویس اسمبلی باید تمام مراقبت‌ها را برعهده بگیرد و بار برنامه‌نویسی کاملاً به دوش ذهن برنامه‌نویس است که حسن‌ها و عیب‌های خود را دارا می­‌باشد. در هر جایگاهی نیاز است که با زبان مختص همان مورد برنامه‌نویسی شود. مثلاً در یک جا باید خودمان دستورالعمل‌های قابل‌فهم برای CPU را مشخص‌کنیم و در جایگاه دیگر باید از دستورات کلی‌تر استفاده‌کنیم. کامپایلر استفاده‌شده مشخص می­‌کند که برنامه نوشته‌شده معادل چند دستور قابل‌فهم برای CPU هست.

نتیجه

برای ارتباط با سخت‌افزار و اطلاع از وضعیت سخت‌افزار و تاثیرگذاری برروی سخت‌افزار باید بلوک I/O به‌صورت کامل شناخته‌شود.

در قسمت سوم آموزش میکروکنترلر AVR درباره رجیسترهای پورت در ATMEGA16 و ATMEGA32 بیشتر صحبت خواهیم‌کرد. با ما همراه باشید.

 

منبع:‌سیسوگ

مطلب قبلیآموزش میکروکنترلرSTM32 قسمت 15:راه‌اندازی RTC در CORTEXM4
مطلب بعدیباتری پشتیبان برای انواع کارتخوان به‌همراه سورس کامل

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید