آموزش جامع میکروکنترلر 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 و… که بیشترین کاربرد برای این شمارهها میباشد.
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 از اسیلاتور داخلی تامین میشود، میخواهیم برنامهای بنویسیم که بتواند پینهای این میکروکنترلر را به صورت خروجی 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 بیشتر صحبت خواهیم کرد. با سیسوگ همراه باشید.
سلام
دست مریزاد
بسیار عالی
سایت منظم و شکیلی دارید
مشخص هست که ساعت ها زمان صرف کردید..
در این برهه زمانی با این مشغله کاری واقعا جای تقدیر و تشکر دارد.
کاری جز تشکر از دست ما ساخته نیست
خسته نباشید
سلام دوست عزیز
خواهش میکنیم. ممنون از لطف شما
سلام
سایت بسیار پر بار و مطالب بسیار عالی و جذاب و دست اولی دارین برخلاف این چند وقت اخیر که سایت هایی بوجود اومدن بدون محتوای جدید. از مخاطبان قدیمیتون هستم اما کامنت نذاشته بودم تا به حال. واقعا دست مریزاد بهتون میگم و خسته نباشین. خیلی از دوستان منم پیگیر مطالب تلگرام و سایتتون هستن. با قدرت ادامه بدید واقعا کارتون عالیه.
سلام دوست عزیز ؛ همراهی و همدلی شما دوستان و مخاطب های گرامی برای ادامه مسیر به ما انگیزه میده ، امیدواریم که بتونیم این مسیر رو مثل گذشته و البته بهتر از گذشته طی کنیم.
امیدوارم که موفق و پیروز باشید.
سلام . متن این اموزش روان نیست در صورتی که بقیه ی مطالب از سطح خوب علمی و نثر روان بهره میبرند بنابراین این مطلب ناخوشایند به نظر میرسد
فقط صرف اگاهی نویسنده عرض شد
سلام دوست عزیز
بله حق با شماست – به دلیل این که متن از روی فیلم نوشته شده به این صورت در اومده ولی حتما اصلاح میکنیم متن رو که خوانا بشه.
متشکرم
عالی بود . ممنون .یک اشتباه تایپی داشت در ابتدای متن به جای atmega32 نوشته شده 35.
سلام – بله متشکرم از دقت شما و البته تذکری که دادید ، اصلاح میکنیم.