AVR, آموزش, توصیه شده, مقاله

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

آموزش میکروکنترلر AVR - قسمت دوم

آموزش میکروکنترلر AVR – قسمت دوم ;

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

سیسوگ در قسمت اول مجموعه آموزش میکروکنترلر AVR  مطرح کرد، برنامه نوشته شده نهایتاً توسط کامپایلر مورد استفاده به دستورالعمل‌های قابل فهم برای CPU تبدیل می‌­شود. این دستورالعمل‌ها باید در حافظه فلش ذخیره شود که این‌کار توسط دستگاه پروگرامر انجام می‌شود. هرچند که برخی از شماره‌های AVR این قابلیت را دارند که در حین اجرای برنامه اطلاعات را بنویسند.

اطلاعاتی که در جریان اجرای برنامه تولید می­‌شوند می‌توانند توسط CPU در حافظه EEPROM ذخیره شوند، اگر لازم باشد مقدار اولیه‌ای در EEPROM ذخیره شود این‌کار توسط پروگرامر انجام می­‌شود.

حداکثر ظرفیت FLASH که در میکروکنترلرهای معمول AVR وجود دارد 256KB هست و حداکثر ظرفیت EEPROM برابر 4KB می‌باشد.

همچنین اشاره شد مقادیری که لازم است در حین اجرای برنامه به صورت موقت ذخیره شوند، در مرحله اول در رجیسترهای داخلی R0 تا R31 و در مرحله بعد وقتی که این ظرفیت حافظه کافی نبود در SRAM  ذخیره می‌شود. مقدار حداکثر حافظه SRAM برابر 16KB است.

در خانواده­ AVR، شماره­ ATMEGA1284 که یک شماره به خصوص است، دارای 40 پایه DIP و 128KB حافظه FLASH می‌باشد. که از لحاظ توانمندی‌ها شماره متفاوتی می­‌باشد. متاسفانه طیف وسیعی از شماره‌های AVR در دسترس نیست و برخی از شماره‌های موجود عبارتند از ATMEGA8 ,ATMEGA16 ,ATMEGA32 و… که بیشترین کاربرد برای این شماره‌ها می­‌باشد.

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

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

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

بحث بعدی که در آموزش میکروکنترلر AVR می‌خواهیم به آن بپردازیم، CLOCK میکروکنترلر است که می‌تواند به صورت پیش ­فرض از اسیلاتور داخلی میکروکنترلر تامین شود، هم‌چنین می­‌تواند با تغییر بخشی به نام فیوز بیت بر روی منابع کلاک دیگر و یا با استفاده از کریستال خارجی تامین شود.

باور عمومی بر این است که حداکثر کلاک خانواده‌های AVR برابر 16MHZ است ولی این‌طور نیست، شماره‌هایی نیز هستند که تا  20MHZ کلاک می‌پذیرند که بحثی فراتر از بحث OVER CLOCK دارد. به این معنی که یک فرکانسی را کارخانه سازنده به عنوان حداکثر فرکانس کلاک تعیین می‌کند و عملکرد همه­ بخش‌های داخلی میکروکنترلر را گارانتی می­‌کند، و اگر فرکانس از این بالاتر رفت به این معنا نیست که فوراً میکروکنترلر از کار بیفتد ولی در شرایط گارانتی قرار نمی‌گیرد.

پس بنابراین حداکثر فرکانس CLOCK برای برخی شماره­‌های AVR برابر 20MHZ و برای میکروکنترلرهای معمول موجود در بازار 16MHZ است. با مراجعه به دیتا شیت می­‌بینید که حداکثر فرکانس اعمال شده به میکروکنترلرهای خاص 20MHZ می‌­باشد.

بحث دیگر که در آموزش میکروکنترلر AVR مورد توجه است محدوده تغذیه AVR می­‌باشد،که به صورت معمول بین 4.5 الی 5.5 ولت می‌باشد. سری دیگری از میکروکنترلرها هستند که یک پسوند L در انتها دارند که نشان دهنده­ محدوده تغذیه گسترده‌­تر هستند، با این تفاوت که کلاک آنها نصف می­‎شود. مثلاً اگر ATMEGA32 ،16MHZ  کلاک را بپذیرد ATMEGA32L ، 8MHZ را می‌پذیرد. ولی این بحث متحول شده و سری جدیدتری به نام سری A وارد بازار شده است که محدوده کلاک در همان محدوده حداکثر است و محدوده تغذیه در محدوده تغذیه سری L است یعنی به طور تقریب بین 2.7 الی 5.5 ولت است.

البته این محدوده تغذیه مربوط به تمام شماره‌ها نیست و میکروکنترلرهایی هستند که محدوده تغذیه آن‌ها بین 1.8 تا 5.5 ولت می‌­باشد.مثلاً در ATTINY43U که محدوده تغذیه­‌شان از 0.7 ولت شروع می­‌شود. هم‌چنین شماره­‌ای در AVR وجود دارد که حداکثر تغذیه آن 18 ولت می­‌باشد مثل ATMEGA16HVB. دلیل آن وجود رگولاتور در داخل میکروکنترلر می­‌باشد. بنابراین محدوده تغذیه بسیار گسترده می­‌باشد.

یک سری از شماره­‌هایی هستند که علاوه بر ATEMEGA و ATTINY های معمول کمتر شناخته شده‌­اند. برای مثال AT90CAN ,AT90PWM ,AT90USB و دوسری ازخانواده AVR هستند که خیلی موجود نمی‌باشند. گروهی هستند که در کل برای کنترل باطری و کنترل بر پروسه باطری استفاده می­‌شوند و گروهی دیگر برای دماهای بالا مثلاً تا 125 و 150 درجه مورد استفاده قرار می‌گیرند.

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

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

فرض می‌کنیم که 1 پین یا 8 پین وجود دارد که می‌تواند ورودی یا خروجی باشند، چطور یک CPU می‌تواند بر اساس برنامه­‌ای که روی حافظه‌ فلش نوشته شده است روی پین خروجی اطلاعات را بنویسد و اعمال کند و هم‌چنین چطور می‌تواند اطلاعات را از دنیای خارج بخواند؟

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

یک میکروکنترلر را در یک پکیج DIP با تعدادی پایه فرض کنید، مثل یک شماره سنتی ATMEGA8515 که از لحاظ پین کاملاً منطبق با 8051 می‌باشد. تنها تفاوتی که باید رعایت شود در منطق ریست این دو میکروکنترلر است در واقع 8051 با HIGH ریست می‌شود ولی 8515 با LOW ریست می­‌شود.

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

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

حال با فرض اینکه کلاک ATMEGA8515 از اسیلاتور داخلی تامین می­‌شود، می‌خواهیم برنامه‌ای بنویسیم که بتواند پین‌های این میکروکنترلر را به صورت خروجی HIGH/LOW کند، یا بتواند محتوای پین‌هایی را که به صورت ورودی هستند بخواند و مشخص کند که HIGH هستند یا LOW ؟

جواب به این صورت توضیح داده می­‌شود که آدرس مشخصی در فضای SRAM وجود دارد که اگر در آن آدرس مشخص، اطلاعات نوشته شود نتیجه­ آن به صورت تغییر سخت‌افزاری در پین مورد نظر اعمال می­‌شود. در نقطه مقابل اگر ما ورودی داشته باشیم یعنی بخواهیم اطلاعاتی را به یکی از پین‌ها به عنوان ورودی اعمال کنیم باز آدرسی در فضای SRAM  وجود دارد. این آدرس توسط CPU و برنامه‌ای که پروگرامر روی حافظه FLASH نوشته است خوانده می‌شود. میکروکنترلر از زمانی که شروع به کار می‌کند از آدرس مشخصی که می‌تواند هر آدرسی باشد شروع به خواندن می­‌کند. در جریان EXECUTE تصمیم برنامه‌نویس بر این است که پین مورد نظر را HIGH یا LOW کند، باید برنامه‌ نوشته شده پیش‌بینی شده باشد که در آن آدرس SRAM ( که هر آنچه در آن نوشته شود به صورت واقعی روی آن پین منعکس می‌شود ) مقدار لازم نوشته شود.

در خانواده AVR، اعمال توسط رجیسترهای R0 تا R31 که 32 بایت هستند انجام می­‌شوند، بعضی از این رجیسترها مزیت‌های خاصی نسبت به بقیه دارند مثلاً اگر دو عدد در هم ضرب شوند نتیجه آن حتماً در R0 و R1 قرار می­‌گیرد، و یا دسترسی به حافظه‌­هایی مثل SRAM توسط 6 رجیستر انتهایی صورت می­‌گیرد. پس باید بدانیم که آدرس R0 تا R31 حافظه داخلی AVR در اختیار رجیسترها می‌­باشد.

بلوک I/O

قسمت بعدی در آموزش میکروکنترلر AVR که نقش بسیار مهمی دارد بلوک I/O می‌باشد،که ارتباط بین CPU و سخت‌افزار ،فعال کردن سخت‌افزار، غیر فعال کردن سخت‌افزار، ارسال اطلاعات، دریافت اطلاعات، تغییر وضعت اطلاعات و … را فراهم می‌سازد. این ناحیه یک ناحیه بسیار حساسی است که هرگونه غلط نوشتن اطلاعات در این ناحیه می‌­تواند منجر به یک عملیات سخت‌افزاری شود.

محدوده این بلوک در مبنای هگز، از 20$ تا 5F$ می‌باشد.که 64 بایت از حافظه را دارا می‌­باشد. اگر دنبال این هستیم که ببینیم CPU چطور از طریق سخت‌افزار می­‌تواند با برنامه ارتباط داشته باشد باید این بلوک را به طور کامل بشناسیم.

یکی از ابزار‌های برنامه‌نویسی که خیلی مورد توجه هست کامپایلر CODEVISION می‌­باشد، و دلیل آن دارا بودن قابلیتی به نام CodeWisard  می­‌باشد که عدد دهی به بلوک I/O را به صورت خودکار انجام می­‌دهد.

در بعضی از شماره‌­های AVR مانند ATMEGA64 و ATMEGA128 که سخت‌افزار‌های جانبی آن‌ها گسترده­‌تر است، 64بایت اختصاص یافته به فضای I/O کافی نیست، یعنی آدرس 5F$ نهایت آدرسی نیست که اگر در آن برنامه نوشته شود روی برنامه تاثیر بگذارد بلکه ادامه این آدرس هم روی سخت افزار تأثیر می‌گذارد.

تفاوت بین یک برنامه نویسی اسمبلی با برنامه نویسی (… و HIGHLEVEL(C,PASCAL,BASIC در این است که یک برنامه‌نویس اسمبلی باید تمام مراقبت‌ها را بر عهده بگیرد و بار برنامه‌نویسی کاملاً به دوش ذهن برنامه‌نویس است که حسن‌ها و عیب‌های خود را دارا می­‌باشد. در هر جایگاهی نیاز است که با زبان مختص همان مورد برنامه‌نویسی شود. مثلاً در یک جا باید خودمان دستورالعمل‌های قابل فهم برای CPU را مشخص کنیم و در جایگاه دیگر باید از دستورات کلی‌تر استفاده کنیم. کامپایلر استفاده شده مشخص می­‌کند که برنامه نوشته شده معادل چند دستور قابل فهم برای CPU هست.

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

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

 

 



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

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

 

نوشته های مشابه

یک دیدگاه در “8”

  1. Avatar پوریا حیدری گفت:

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

    1. N H N H گفت:

      سلام دوست عزیز
      خواهش میکنیم. ممنون از لطف شما

  2. Avatar mahdi.7 گفت:

    سلام
    سایت بسیار پر بار و مطالب بسیار عالی و جذاب و دست اولی دارین برخلاف این چند وقت اخیر که سایت هایی بوجود اومدن بدون محتوای جدید. از مخاطبان قدیمیتون هستم اما کامنت نذاشته بودم تا به حال. واقعا دست مریزاد بهتون میگم و خسته نباشین. خیلی از دوستان منم پیگیر مطالب تلگرام و سایتتون هستن. با قدرت ادامه بدید واقعا کارتون عالیه.

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز ؛ همراهی و همدلی شما دوستان و مخاطب های گرامی برای ادامه مسیر به ما انگیزه میده ، امیدواریم که بتونیم این مسیر رو مثل گذشته و البته بهتر از گذشته طی کنیم.
      امیدوارم که موفق و پیروز باشید.

  3. Avatar محمد گفت:

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

    1. زئوس Zeus زئوس Zeus گفت:

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

  4. Avatar سعید گفت:

    عالی بود . ممنون .یک اشتباه تایپی داشت در ابتدای متن به جای atmega32 نوشته شده 35.

    1. زئوس Zeus زئوس Zeus گفت:

      سلام – بله متشکرم از دقت شما و البته تذکری که دادید ، اصلاح میکنیم.

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

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