آموزش میکروکنترلر 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 و… که بیشترین کاربرد برای این شمارهها میباشد.
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 از اسیلاتور داخلی تامین میشود، میخواهیم برنامهای بنویسیم که بتواند پینهای این میکروکنترلر را بهصورت خروجی 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 بیشتر صحبت خواهیمکرد. با ما همراه باشید.
منبع:سیسوگ