نمونه هایی از برنامه های استودیو Avr در اسمبلر. برنامه نویسی عملی میکروکنترلرهای Atmel AVR به زبان اسمبلی

مقدمه میکروکنترلرها، وقوع و کاربرد آنها
تاریخچه میکروکنترلرها
الکترونیک به سبک یونانی
چرا AVR؟
بعدش چی؟

بخش اول. اصول کلی طراحی و عملکرد ATMEL AVR

فصل 1 بررسی اجمالی میکروکنترلرهای Atmel AVR

خانواده های AVR
ویژگی های خاص استفاده عملی MK AVR

فصل 2. ترتیب کلی، سازماندهی حافظه، ساعت، تنظیم مجدد

حافظه برنامه
حافظه داده (RAM، SRAM)
حافظه داده غیر فرار (EEPROM)
روش های کلاکینگ
بازنشانی کنید
ویژگی های اتصال حافظه خارجی اضافی

فصل 3. مقدمه ای بر لوازم جانبی

پورت های ورودی/خروجی
تایمر-کنتر
مبدل آنالوگ به دیجیتال
پورت های سریال
UART
رابط SPI
رابط TWI (12C)
جهانی رابط سریال USI

فصل 4 وقفه ها و حالت های ذخیره انرژی

قطع می کند
انواع وقفه ها
حالت های ذخیره انرژی
مصرف MK AVR
حالت های مصرف و صرفه جویی انرژی MK AYR

قسمت دوم. برنامه نویسی میکروکنترلرهای ATMEL AVR

فصل 5. اصول کلی برنامه نویسی AVR خانواده MK

اسمبلر یا سی؟
راه ها و روش های برنامه نویسی AVR
ویرایشگر کد
درباره AVR Studio
چیدمان مونتاژ کننده
برنامه نویسان
درباره فایل های هگز
دستورات، دستورالعمل‌ها و نمادگذاری اسمبلی AVR
اعداد و عبارات
دستورالعمل ها و توابع
ساختار کلی یک برنامه AVR
وقفه در رسیدگی
تنظیم مجدد
ساده ترین برنامه
تاخیر انداختن
برنامه شمارنده
استفاده از وقفه ها
تاخیر تایمر
برنامه شمارنده وقفه
درباره بیت های پیکربندی

فصل 6 سیستم فرمان AVR

دستورات انتقال و ثبت SREG را کنترل کنید
دستورات عبور را بررسی کنید
دستورات منطقی
دستورالعمل های شیفت و عملیات بیت
دستورات برای عملیات حسابی
دستورات انتقال داده
دستورات کنترل سیستم
اجرای رویه های معمولی در اسمبلر
درباره متغیرهای پشته، محلی و سراسری

فصل 7 عملیات حسابی

عملیات حسابی استاندارد
ضرب اعداد چند رقمی
تقسیم چند رقمی
عملیات با اعداد کسری
مولد اعداد تصادفی
عملیات با اعداد در قالب BCD
اعداد منفی در MK

فصل 8 برنامه نویسی تایمر

تایمر 8 و 16 بیتی
تشکیل مقدار را تنظیم کنیدفرکانس ها
شمارش معکوس
تصحیح زمان دقیق
فرکانس متر و پریود متر
فرکانس سنج
پریودومتر
کنترل نشانگر دینامیکی
نشانگرهای LED و اتصال آنها
برنامه نويسي نشانه پویا
تایمر در حالت PWM

فصل 9 استفاده از EEPROM

بار دیگر در مورد ایمنی داده ها در EEPROM
EEPROM را بنویسید و بخوانید
ذخیره ثابت ها در EEPROM

فصل 10 مقایسه کننده آنالوگ و ADC

عملیات آنالوگ به دیجیتال و خطاهای آنها
کار با مقایسه کننده آنالوگ
ادغام ADC روی مقایسه کننده
اصل عملیات و فرمول های محاسباتی
یکپارچه سازی برنامه ADC
ADC داخلی
مثال ADC
برنامه

فصل 11 برنامه نویسی SPI

عملیات اساسی از طریق SPI
گزینه سخت افزاری
گزینه نرم افزاری
درباره انواع حافظه های غیر فرار
نوشتن و خواندن فلش مموری از طریق SPI
برنامه تبادل حافظه 45DB011B از طریق SPI
نوشتن و خواندن فلش کارت
اتصال کارت های MMS
صدور دستورات و مقداردهی اولیه MMC
نوشتن و خواندن MMS

فصل 12. رابط TWI (12C) و کاربرد عملی آن

پروتکل پایه 12C
شبیه سازی نرم افزار پروتکل 12C
نوشتن داده ها در حافظه خارجی غیر فرار
تغییر حالت ها با حافظه AT24
برنامه
ساعت با رابط 12C
ثبت داده ها
خواندن داده ها

فصل 13 برنامه نویسی UART/USART

مقداردهی اولیه UART
ارسال و دریافت داده
نمونه ای از تنظیم ساعت DS1307 با استفاده از UART
تکنیک های محافظت در برابر خرابی های ارتباطی
حتی برابری
نحوه سازماندهی تبادل صحیح
ویژگی های اضافی USART
پیاده سازی رابط های RS-232 و RS-485
مبدل های سطح برای RS-232
RS-485

فصل 14 حالت های ذخیره انرژی و تایمر نگهبان

برنامه نویسی صرفه جویی در مصرف انرژی
نمونه ای از ابزاری که با باتری کار می کند
اصلاح برنامه
با استفاده از تایمر نگهبان

APPS

پیوست 1. پارامترهای اصلی میکروکنترلرهای Atmel AVR

ضمیمه 2 دستورات Atmel AVR
دستورات حساب و منطق
دستورات عملیات بیت
دستورات مقایسه
کنترل دستورات انتقال
دستورالعمل های فراخوانی بدون قید و شرط و زیر روال
از چک و دستورالعمل های شعب مشروط صرف نظر کنید
دستورات انتقال داده
دستورات کنترل سیستم

پیوست 3 متون برنامه
برنامه نمایشی ارتباطی حافظه فلش 45DB011B از طریق رابط SPI
رویه های تبادل روی رابط 12C

پیوست 4 ارتباط با کامپیوتر شخصیو اشکال زدایی برنامه ها از طریق UART
کار با پورت COM در دلفی
پورت COM و Windows API
کار با COM از طریق اجزای آماده
نصب خط RTS در داس و ویندوز
برنامه COM2000
اشکال زدایی برنامه ها با برنامه ترمینال

ضمیمه 5 واژه نامه اختصارات و اصطلاحات رایج
مطابقت اصطلاحات به زبان روسی با ترجمه آنها به انگلیسی
مطابقت اصطلاحات به زبان انگلیسی با ترجمه آنها به روسی

ادبیات
نمایه موضوعی


بنابراین، امیدوارم یک خواننده با وجدان قبلاً یک برنامه نویس، یک برد آزمایشی مونتاژ کرده باشد و همچنین نرم افزار مورد نیاز را نصب و پیکربندی کرده باشد.

حالا با نوشتن اولین مقاله از این مجموعه، متوجه شدم که کمی هیجان زده شدم و همان اشتباه پیشینیانم را انجام دادم و عبارت "برای مبتدیان" را گذاشتم. درست تر است که مبحث "برای مبتدیان برنامه نویسی در اسمبلر" را فرموله کنیم، یعنی فرض می کنم که خواننده در حال حاضر حداقل یک ایده سطحی از چیستی میکروکنترلر دارد، در غیر این صورت ما را به یک زمان زیادی برای آشنایی با این موضوع است. برای کسانی که کاملاً با آنها ناآشنا هستند، می توانم مجموعه ای از مقالات S. Ryumik "AVR Microcontrollers" را توصیه کنم که به نظر من کاملاً شگفت انگیز است که در مجله Radioamator (شماره های 1-11 برای سال 2005) منتشر شده است. در این چرخه، ATmega8 به عنوان کنترل کننده پایه انتخاب می شود، اما به طور کلی گره های عملکردیکنترلر فوق و ATtiny13 عملا یکسان هستند.

برای آشنایی مستقیم با میکروکنترلر ATtiny13 کتاب A.V. Evstifeeva "ریزکنترلرهای AVR از خانواده کوچک. راهنمای کاربر" (مسکو: انتشارات Dodeka-XXI، 2007. - 432 ص). این شامل دیتاشیت های ترجمه شده و سیستماتیک شده برای طیف وسیعی از کنترلرهای کوچک است و به نظر من باید یک دسکتاپ برای کسانی باشد که درگیر برنامه نویسی میکروکنترلر هستند.

با این حال، با پیشرفت داستان، اطلاعاتی در مورد آن دسته از گره‌ها و ماژول‌های کنترل‌کننده که در برنامه‌های نوشته شده استفاده خواهند شد، ارائه خواهم کرد.

اما همه اینها یک انحراف غزلی است. بیایید بلافاصله به داستان برگردیم.

کنترلر ATtiny13 علیرغم اندازه کوچکش، بسیار خوب است ویژگی های عملکردی. و تعداد کمی از نتیجه‌گیری‌ها بیشتر از تعداد عملکردهایی است که هر یک از آنها انجام می‌دهند. پین اوت و توضیحات پین ها در زیر ارائه شده است:

جدول برگرفته از کتاب فوق الذکر A.V. اوستیفیف.

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

همانطور که از شکل و جدول مشخص است، همه خروجی ها به استثنای خروجی های برق دارای نام PB هستند که عبارتند از شماره سریال. این یعنی چی؟ تمامی خروجی های کنترلر برای راحتی کار با آنها توسط 8 قطعه ترکیب شده اند و برای هر گروه 8 خروجی سه رجیستر ورودی-خروجی ویژه اختصاص داده شده است. به طور کلی، مفهوم ثبات هنگام کار با کنترلرها، به ویژه در اسمبلر، کلیدی است. بیایید نگاهی دقیق تر به هر یک از سه رجیستر فوق الذکر بیندازیم. همه آنها سلول های یک بایتی در حافظه کنترلر هستند. هر بیت از آنها مربوط به یکی از خروجی های کنترلر است و شماره بیت موجود در رجیستر با شماره خروجی مطابقت دارد (به عنوان مثال، بیت 0 مسئول خروجی PB0، بیت اول - برای PB1 و غیره است). همه رجیسترها نام خود را دارند که هنگام نوشتن برنامه به آنها اشاره می شود. این نام ها چیست؟

1. رجیستر DDRB مسئول جهت انتقال اطلاعات هر خروجی کنترلر است. اگر هر بیت از این ثبات برابر با "0" باشد، پین مربوطه یک ورودی و اگر "1" - پس از آن یک خروجی خواهد بود. علاوه بر این، هر خروجی به صورت جداگانه و در هر نقطه از برنامه پیکربندی می شود. این بدان معناست که در شرایط مختلف یا در زمان‌های مختلف، می‌توان یک پین را به‌عنوان ورودی یا خروجی و مستقل از سایر پایه‌ها پیکربندی کرد.

2. رجیستر PINB شامل وضعیت فعلیهمه خروجی ها: اگر ولتاژ به خروجی اعمال شود، یک "1" منطقی به بیت مربوطه نوشته می شود، اگر ولتاژ وجود نداشته باشد، یک منطقی "0" نوشته می شود. این ثبات عمدتاً برای خواندن وضعیت پینی که در حالت ورودی است استفاده می شود.

3. ثبت نام PORTB بسته به جهت انتقال اطلاعات یک عملکرد دوگانه را انجام می دهد. اگر پین به عنوان یک خروجی دیجیتال کار می کند، پس نوشتن یک "1" به هر بیت از ثبات PORTB باعث می شود ولتاژ روی پایه مربوطه ظاهر شود و نوشتن "0" باعث ناپدید شدن ولتاژ می شود. بنابراین، در حالت خروجی، این ثبات است که وضعیت هر خروجی را تعیین می کند. در حالت ورودی دیجیتالنوشتن یک "1" منطقی به هر بیت باعث می شود که مقاومت کششی داخلی به پین ​​مربوطه متصل شود و با نوشتن یک "0" آن را خاموش کنید. این چیز چیست - "مقاومت کشش"، و برای چیست؟ اگر پین به عنوان یک ورودی دیجیتال عمل می کند، پس مقاومت بافر ورودی به اندازه کافی بالا است و جریان ورودی بسیار کم است. بنابراین، هرگونه تداخل الکتریکی می تواند منجر به تغییر خود به خود خروجی به حالت دلخواه شود. برای جلوگیری از این اتفاق، مقاومتی با مقاومت چند ده کیلو اهم بین ورودی و منبع تغذیه وصل می‌شود و پتانسیل ورودی را به ولتاژ تغذیه «بالا می‌کشد» (از این رو نام آن است). جریانی که از این مقاومت می گذرد به اندازه ای کوچک است که با بقیه مدار تداخل نداشته باشد، اما به اندازه ای بزرگ است که از تعویض تصادفی پین جلوگیری کند. ما اغلب هنگام کار با دکمه‌ها از مقاومت‌های pull-up استفاده می‌کنیم، زیرا هنگامی که آنها فشار داده نمی‌شوند، پین‌هایی که به آن‌ها متصل هستند در واقع در هوا "آویزان" هستند و در معرض زمزمه قرار می‌گیرند.

لازم به ذکر است که در هنگام روشن شدن همه رجیسترها به 0 تنظیم می شوند و هر پین به عنوان یک ورودی دیجیتال بدون مقاومت pull-up عمل می کند.

اکنون که ما حداقل ایده ای در مورد آنچه برای کار با ورودی های کنترلر لازم است داریم، زمان آن رسیده است که نحوه کار با آنها را بیاموزیم.

بیایید اولین خود را بنویسیم برنامه کاریدر اسمبلر ابتدا یک الگوریتم کامل برای ایجاد یک پروژه جدید ارائه خواهم کرد، اما در آینده آن را حذف می کنم و فقط روی متن برنامه تمرکز می کنم.

1. به پوشه asm بروید، یک پوشه جدید در آن ایجاد کنید. تغییر نام به نام مناسب برای ما. برای قطعیت، آنها را با شماره گام خود صدا خواهم زد. در این مورد "گام 2".

2. کلیک راستبر روی فایل build.bat کلیک کنید و مسیر فایل منبع را به پوشه ای که به تازگی ایجاد شده است (step2) تغییر دهید. پس از آن محتوای من به این شکل است:

"F:\Prog\AVR\asm\avrasm32 -fI %F:\Prog\AVR\asm\step2\main.asm
مکث"

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

3. به پوشه Asmedit رفته و برنامه ASM_Ed.exe را اجرا کنید

4. در پنجره باز شده متن برنامه را بنویسید. من در مورد این نکته با جزئیات بیشتری صحبت خواهم کرد ، زیرا این نکته اصلی در درس امروز ما و همچنین در موارد بعدی است.

متن برنامه اسمبلی چیست؟ ممکن است شامل چندین عنصر باشد که بر اساس قوانین خاصی نوشته شده اند:

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

دستورالعمل هایی که هر کدام با کاراکتر "." شروع می شود.

برچسب‌ها، مکان‌هایی در برنامه هستند که به‌طور دلخواه توسط کاربر نام‌گذاری شده‌اند و ممکن است نیاز به پیمایش داشته باشند. هر برچسب با یک کاراکتر ":" پایان می یابد.

نظراتی که با ";" شروع می شوند. تمام متن از ابتدای نظر تا انتهای خط هنگام ایجاد فایل هگز نادیده گرفته می شود و می تواند کاملاً دلخواه باشد.

خطوط خالی برای ساختار و خوانایی بهتر برنامه.

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

با استفاده از این قوانین، برنامه ای می نویسیم که با نگه داشتن دکمه SB1، LED2 را روشن می کند و در صورت آزاد شدن دکمه، آن را خاموش می کند. متن برنامه در زیر نشان داده شده است:

شامل "F:\Prog\AVR\asm\Appnotes\tn13def.inc"
sbi DDRB, 4 ;РВ4 - خروجی (LED2)
sbi PORTB، 2؛ مقاومت pull-up را روی PB2 روشن کنید (دکمه SB1)
sbic PINB, 2 ;اگر PB2=0 (دکمه فشار داده شده)، از مرحله بعدی رد شوید. رشته
sbi PORTB، 4 ؛ PB4 روی 1 تنظیم شده (LED خاموش)
sbis PINB, 2 ;اگر PB2=1 (دکمه آزاد شد)، از مرحله بعدی رد شوید. رشته
cbi PORTB, 4 ؛ PB4 را روی 0 تنظیم کنید (LED روشن)

بیایید آن را با جزئیات بیشتری تجزیه و تحلیل کنیم. خط اول شامل دستورالعمل "شامل" است که طبق قوانین بالا با یک نقطه در ابتدا نوشته شده است. هدف آن گنجاندن فایل مشخص شده پس از آن در متن برنامه است. همانطور که در مرحله اول گفتم ما به فایل "tn13def.inc" نیاز داریم. در این خط، باید مسیر محل پوشه Appnotes را در رایانه خود تغییر دهید. چرا باید این فایل را اضافه کنیم؟ یک خواننده کنجکاو می تواند به آن نگاه کند و محتوای آن را بخواند، اما، به احتمال زیاد، در ابتدا کمی در آنجا متوجه می شود. در ضمن، من می گویم که حاوی تطابق نام های ثبات است که اسمبلر به طور پیش فرض آنها را نمی داند، با آدرس های فیزیکی آنها در کنترلر.

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

دستور sbi دو عملوند دارد: اولی نام ثبات و دومی شماره بیت است. در نتیجه اجرای آن، بیت مشخص شده در ثبات مشخص شده روی "1" تنظیم می شود.

دستور cbi از نظر نحوی مشابه دستور فوق است و دقیقاً عملکرد مخالف را انجام می دهد - بیت مشخص شده در ثبات مشخص شده را به "0" بازنشانی می کند.

دستور sbis نیز از نظر نحوی مشابه دستور بالا است. اما برخلاف آنها هیچ عملیاتی با رجیسترها انجام نمی دهد و فقط وضعیت بیت مشخص شده را در ثبات مشخص شده بررسی می کند و اگر برابر با "1" باشد از خط زیر دستور رد می شود. در غیر این صورت خط بعدی و بقیه بعد از آن اجرا می شود.

دستور sbis مخالف دستور sbis است. اگر بیت ثبت شده مشخص شده "0" باشد، خط بعدی را رد می کند.

حالا با جمع بندی تمام موارد بالا، سعی می کنیم الگوریتم برنامه را درک کنیم. برای شروع، من این کار را به معنای واقعی کلمه خط به خط انجام خواهم داد.

1 خط. دستورالعمل include شامل فایل tn13def.inc حاوی تعاریف ثبت است.

2 خط. دستور sbi "1" را در بیت 4 رجیستر DDRB تنظیم می کند، بنابراین پین PB4 را به خروجی تغییر می دهد. اگر به نمودار برد (شکل 1 مرحله قبل) نگاه کنید، می بینید که LED2 به این پین وصل شده است. بعد از دستور و علامت ";" یک نظر نوشته شده است که به طور خلاصه معنای اقدامات انجام شده در خط را توضیح می دهد.

3 خط. همان دستور sbi "1" را در بیت 2 رجیستر PORTB تنظیم می کند و مقاومت کشش داخلی را به پین ​​PB2 که دکمه SB1 به آن متصل است وصل می کند. از آنجایی که وضعیت بیت 2 رجیستر DDRB را تغییر ندادیم، این پین به عنوان ورودی باقی خواهد ماند، که دقیقا همان چیزی است که ما نیاز داریم.

4 خط. دستور sbic وجود یک "0" منطقی را در ورودی PB2 با استفاده از ثبات PINB بررسی می کند. اگر به نمودار دقت کنید، می بینید که دکمه ها با فشار دادن، خروجی مربوطه را با یک سیم مشترک می بندند. این یک تکنیک استاندارد است، زیرا هنگامی که دکمه آزاد می شود، به دلیل مقاومت کششی یک "1" منطقی در خروجی وجود دارد و هنگامی که دکمه فشار داده می شود، به دلیل اتصال "0" منطقی ظاهر می شود. خروجی به یک سیم مشترک بنابراین، اگر روی خروجی PB2 یک "0" منطقی وجود داشته باشد، یعنی دکمه فشار داده شود، از خط بعدی می گذریم و اگر دکمه آزاد شد، آن را اجرا می کنیم.

5 خط. در آن، دستور sbi یک "1" منطقی را در بیت 4 از رجیستر PORTB تنظیم می کند، در نتیجه LED2 را خاموش می کند. یک خواننده خورنده ممکن است تعجب کند که چرا اگر به خروجی ولتاژ اعمال کنیم LED خاموش می شود. پاسخ در نمودار نهفته است. آند LED به سیم برق و کاتد به خروجی کنترلر متصل است. بنابراین، اگر ولتاژی به خروجی اعمال شود، پتانسیل آند و کاتد برابر می شود و LED خاموش می شود. اگر خروجی "0" منطقی داده شود، ولتاژ به LED اعمال می شود و روشن می شود. بنابراین، یک جفت خط 4 و 5 با رها شدن دکمه، LED2 LED را خاموش می کند.

6 خط. متضاد معنی 4. دستور sbis وجود یک "1" منطقی را در ورودی PB2 بررسی می کند، یعنی بررسی می کند که آیا دکمه آزاد شده است یا خیر. اگر دکمه رها شود، خط بعدی حذف می شود و خط بعدی به خط بعدی پرش می شود. اما از آنجایی که خط 7 آخرین است، به خط 2 می پرد. اگر دکمه فشار داده شود، خط 7 اجرا می شود.

7 خط. مقابل 5. با دستور cbi، بیت 4 از رجیستر PORTB به "0" بازنشانی می شود و در نتیجه LED2 روشن می شود. بنابراین، یک جفت خط 6 و 7 با فشار دادن دکمه SB1 LED2 را روشن می کند.

همانطور که می بینید، ما کار خاصی انجام ندادیم. با استفاده از دانش تنها 3 ثبات و 4 دستورالعمل، اولین برنامه خود را نوشتیم. بعد با او چه کنیم اگر فراموش نکرده اید، ما به نوشتن الگوریتم ایجاد برنامه ادامه می دهیم.

5. پس از نوشتن متن برنامه در پنجره ویرایشگر، آیتم منوی "File" را انتخاب کنید و در لیست باز شده روی "Save As ..." کلیک کنید. در پنجره ذخیره فایل، پوشه step2 را که ایجاد کردیم انتخاب کنید و نام فایل "main" را مشخص کنید، زیرا این نام توسط ما در فایل "build.bat" مشخص شده است.

پس از ذخیره، پنجره برنامه باید به شکل زیر باشد:

6. یک فایل هگز ایجاد کنید. برای انجام این کار، دکمه "II" را در نوار ابزار فشار دهید. پنجره زیر باید ظاهر شود:

به ما اطلاع می دهد که اسمبلی بدون خطا انجام شد و فایل سیستم عامل "main.hex" با حجم 6 کلمه یعنی 12 بایت ایجاد شد. توجه داشته باشم که یک برنامه مشابه در C حداقل 5 برابر حجم بیشتری دارد.

7. پس از وارد شدن به پوشه step2، اضافه ای را در آن به صورت فایل main.hex تازه ایجاد شده در آن پیدا می کنیم که اکنون می تواند توسط هر برنامه نویسی به کنترلر دوخته شود، که برای مشاهده نتایج باید انجام شود. برنامه ای که نوشته ایم پس از فلش کردن کنترلر، اگر مدار به درستی مونتاژ شده باشد، همه چیز باید طبق الگوریتمی که توسعه داده ایم کار کند: وقتی دکمه ها آزاد می شوند، LED2 LED باید خاموش باشد و در حالی که دکمه SB1 پایین نگه داشته شده است، باید روشن باشد.

قبل از مرحله بعدی، پیشنهاد می کنم کارهای زیر را انجام دهید:

1. پردازش فشار دادن دکمه SB2 را با الگوریتم مخالف به برنامه اضافه کنید: وقتی دکمه SB2 آزاد شد LED1 LED باید روشن شود و وقتی فشار داد باید خاموش شود.

2. برنامه ای بنویسید تا LED2 را با هر دو دکمه کنترل کند. هنگامی که دکمه SB1 فشار داده می شود، LED باید روشن شود و تا زمانی که دکمه SB2 فشار داده شود روشن بماند، که تا زمانی که SB1 بعدی فشار داده شود خاموش می شود.

هر کس عصر بخیر! من از دنیایی دنج به نام "مونبلر" پخش می کنم. بگذارید توضیح دهم موضوع در مورد چیست. میکروکنترلرهای AVR- و من هنوز نمی دانم که آیا این پست برای کسانی که می خواهند از اسمبلر برای هر کار دیگری استفاده کنند مفید باشد یا خیر. واقعیت این است که همین چند روز پیش من شروع به یادگیری اسمبلر از ابتدا کردم - شما باید یک دستگاه بسازید - و تصمیم گرفتم خودم همه چیز را در آن انجام دهم. بنابراین، یک روز متوجه شدم که یادگیری اسمبلر کاملا بی فایده است!اسمبلر فقط قابل درک است! یعنی برای همه کسانی که می خواهند در اسمبلر برنامه نویسی کنند، اکیداً توصیه می کنم که با جزئیات نحوه عملکرد فیزیکی میکروکنترلر را درک کنید و سپس پیچیدگی های دستورات را مطالعه کنید.
بنابراین، احتمالاً یک سری مقالات کوچک را شروع خواهم کرد که در آن از همان ابتدا خواهم گفت دقیقا چطورمن چیزهای خاصی را در برنامه نویسی به زبان اسمبلی فهمیدم - فکر می کنم برای کسانی که اصلاً نمی دانند ASM چیست، من از زبان کسانی که به خوبی در این زمینه کاوش می کنند یک چنین "مترجم" خواهم بود.

فوراً باید بگویم که من کم و بیش به پیشنهاد DIHALT وارد این موضوع شدم - بنابراین این مقالات نوعی ترجمه از زبان super-duper-assembly-microcontroller به زبانی قابل فهم برای اکثر مردم خواهد بود. خوب، امیدوارم مربیان در جریان نمایش من را تصحیح کنند و اگر ناگهان چیزی را اشتباه توضیح دادم، مرا اصلاح کنند.
بنابراین اولین نتیجه گیری در مورد اسمبلر که چند روز پیش انجام دادم مرا شوکه کرد - و از ساعت 11 شب تا 5 صبح در مقالات DI HALT نشستم - پس از آن راضی و خوشحال به رختخواب رفتم. برنامه نویسی در اسمبلر برای میکروکنترلرها
چگونه می توان این را حتی ساده تر توضیح داد؟ فکر می کنم باید از هسته شروع کنیم.
***
در ابتدا، ما وارد جزئیات فنی نمی شویم (در مقاله بعدی در مورد آنها صحبت خواهیم کرد) - فقط تصور کنید 3 شخصیت وجود دارد:
1. میکروکنترلر -این استیو انگلیسی است که به روسی آمده است. او کاملا می داند زبان انگلیسی، اما به زبان روسی او اصلاً نمی فهمد - حتی یک کلمه. فقط انگلیسی. او استدلال را از دست داد و متعهد شد که تلویحاً هر کاری را که روس ها از او خواسته اند انجام دهد.
2. مونتاژ کننده -این مترجم واسیا است که مادرش انگلیسی و پدرش روسی است. او هم انگلیسی و هم روسی را به خوبی می داند.
3. ما -این یک روسی است که توسط یک انگلیسی بازدید شده است. خوب، یعنی ما هستیم =) در عین حال، ما کاملاً زبان روسی و (!!!) کمی انگلیسی - فقط کمی، با فرهنگ لغت را می شناسیم.
***
این وضعیت را تصور کنید - یک مرد انگلیسی در اتاق شما روی یک صندلی نشسته است. و شما پشت کامپیوتر خود نشسته اید و این پست را می خوانید که ناگهان پنجره شما باز شد! این بدشانسی است! باد می وزد، پرده تبدیل به بادبان شده است... خوب است آن را ببندی! اما به هر حال، چقدر تنبل است که از روی صندلی بلند شوید، پاهای خود را از واحد سیستم بردارید، آنها را در دمپایی فرو کنید، یک فنجان قهوه (آبجو) کنار بگذارید و به مبارزه با عناصر بروید. و بعد ناگهان متوجه می شوید که ما یک انگلیسی شرط بندی شده در اتاق داریم که وقت رانندگی با او است! و تو خیلی زیبا به او می گویی: «دوست من! لطفاً پنجره را ببند و دوباره می‌توانی روی صندلی بنشینی!» و او می نشیند، با گیجی به شما نگاه می کند و هیچ کاری نمی کند! البته می توانید سوپ کلم را بخورید - اما او هنوز هم شما را درک نمی کند! سپس با دوست مترجم خود واسیلی تماس می گیرید - او می آید و در کنار مرد انگلیسی روی یک صندلی می نشیند. و شما می گویید - ترجمه کنید: "استیو، برو پنجره را ببند و سپس روی صندلی بنشین!" مترجم به انگلیسی ترجمه می کند - انگلیسی می فهمد و می رود پنجره را ببندد و بعد می آید روی صندلی می نشیند.
در این مرحله، شما فقط باید نقش اسمبلر در این زنجیره "We-Assembler-Controller" را درک کنید.
یعنی چگونه همه می توانند بفهمند اسمبلر چیست؟ سپس ادامه می دهیم.
***

بنابراین، ما چنین وضعیتی را ارائه می دهیم. شما به واسیا می گویید - "گوش کن ، خوب ، خلاصه ، چنین چیزی - من ماشین حساب را در خانه فراموش کردم ، 56983 را تقسیم بر 2 کنید و به استیو بگویید که چند بار با مشتش فشار بیاورد" و واسیا روی ماشین حساب حساب می کند و به انگلیسی به استیو می‌گوید: «۲۸۴۹۱ بار مشت‌هایت را فشار بده» نامیده می‌شود "دستورالعمل"- به عبارت دیگر، یک دستورالعمل برای واسیا یک وظیفه است که نتیجه آن اقدام استیو است.

وضعیت دیگری وجود دارد - به واسیا می گویید "به استیو بگو 28491 فشار انجام دهد" و واسیا به سادگی کلمات شما را به انگلیسی ترجمه می کند. نامیده می شود اپراتور

همه چیز ساده است - یک دستورالعمل وجود دارد و یک اپراتور وجود دارد. اپراتور دستورالعمل مستقیم شما است که چه کاری با استیو انجام دهید - در اینجا Vasya فقط درخواست شما را به انگلیسی ترجمه می کند. و دستورالعمل یک وظیفه برای خود واسیا است - و واسیا ابتدا آنچه را که به او گفتید انجام می دهد و سپس بسته به نتیجه، چیزی به استیو می گوید.

حالا ما انگلیسی را مرتب شکنجه می کنیم! اما ابتدا باید با مترجم ما واسیا بیشتر آشنا شوید. شما باید موارد زیر را بدانید - واسیا همیشه به طور ضمنی از شما اطاعت می کند - آنچه به او گفته شده است، او انجام می دهد. ماشین حساب واسیا ارقام اعشاری ندارد - اگر با فشار به مثال نگاه کنید، 56983 \ 2 = 28491.5 - اما واسیا همه چیز را بعد از نقطه اعشار قطع می کند - و او فقط یک عدد صحیح را می بیند - و مهم نیست که آیا 28491.000001 یا 28491.9999999 خواهد بود - برای Vasya این یک انجیر در هر دو مورد 28491 خواهد بود. هیچ چیز گرد نیست. هنوز اطلاعات مهمدر مورد واسیا واسیا ظالم است - او اهمیتی نمی دهد که استیو از انجام فشارهای فشاری بیست و هشت هزار بار خسته شود. به او گفته شد - واسیا ترجمه کرد. و نه تنها ترجمه - بلکه مجبور به انجام آنچه شما خواسته اید. بنابراین اگر استیو در بیست و سه هزار و پانصد و سیزدهمین فشارش بمیرد، کاملاً تقصیر شما خواهد بود.

در واقع، فعلاً همین است. در پست بعدی عمیق تر خواهیم کرد - فعلاً فقط درک آن کافی است. فقط این وضعیت را تصور کنید و بفهمید چه چیزی چیست، چه کسی چه نقشی را ایفا می کند و چگونه دستورالعمل با اپراتور متفاوت است.
و سپس سعی خواهیم کرد همه چیز را با نام مناسب خود صدا کنیم و تقریباً بفهمیم که اسمبلر چگونه با میکروکنترلر به صورت بزرگسال کار می کند.

یک کلون از تتریس معروف که در اسمبلر نوشته شده است. این به طور کامل در 512 بایت بخش بوت قرار می گیرد (فقط به 446 بایت فضا نیاز دارد که فقط حداکثر اندازه بوت لودر در MBR است).

MBR - بخشی حاوی کد و داده های لازم برای راه اندازی بعدی سیستم عامل و در اولین بخش های فیزیکی قرار دارد. 446 بایت اول دیسک به کد بوت لودر داده می شود. در این مکان است که TetroOS ضبط می شود.

طبیعتاً به دلیل چنین ویژگی هایی، قبل از هر چیزی بارگذاری می شود سیستم عامل- به هیچ سیستم عاملی نیاز ندارد، به تنهایی کار می کند. بله، درست شنیدید، TetroOS بوت لودر خودش است.

این شکلی است که روی صفحه نمایش به نظر می رسد:

و منبع در بخش بوت به صورت زیر است:

و بله همینطور است تماممنبع آیا به یاد دارید که وزن آن تنها 446 بایت است؟

شما می توانید این "سیستم عامل معجزه" را تحت qemu اجرا کنید، یا حتی آن را به طور واقعی روی پارتیشن بوت دیسک یا فلش درایو نصب کنید.

راه اندازی

فقط qemu را نصب کنید:

sudo apt-get نصب qemu

و اجرا:

دانلود در درایو فلش

تصویر را در فلش درایو کپی کنید. فرض کنید درایو فلش به صورت /dev/sde نصب شده است، باید دستور زیر را اجرا کنید تا TetrOS را در بخش بوت آن بنویسید:

sudo dd if=tetros.img of=/dev/sde

توضیحات بازی

توسعه‌دهنده موفق شد خسته‌کننده‌ترین طراحی را در تنها 512 بایت حافظه جای دهد. هر آجر در بازی رنگ خاص خود را دارد، کنترل توسط دکمه ها انجام می شود، در صورت شکست بازی به پایان می رسد، آجرها به طور تصادفی تولید می شوند… BolgenOS حتی نزدیک هم نبود!

متاسفانه، به دلیل اندازه، برخی از ویژگی ها باید رها می شد. هیچ امتیازی در بازی وجود ندارد، بازی را مجدداً بدون بارگذاری مجدد شروع کنید و نشان دهید که آجر بعدی چه خواهد بود.

نام:برنامه نویسی عملی میکروکنترلرهای Atmel AVR در زبان اسمبلی ویرایش 2

ناشر:"BHV-Petersburg"

سال انتشار: 2011

صفحات: 354

زبان:روسی

قالب: Djvu

اندازه: 12.2 مگابایت

اصول عملکرد، ویژگی های معماری و تکنیک های برنامه نویسی میکروکنترلرهای Atmel AVR روی هم قرار گرفته است.

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

7. میکروکنترلرها، وقوع و کاربرد آنها
8. ماقبل تاریخ میکروکنترلرها
10. الکترونیک به سبک یونانی
12. چرا AVR؟
14. بعد چی؟
17. قسمت L اصول کلی طراحی و عملکرد ATMEL AVR
19. فصل 1. بررسی اجمالی میکروکنترلرهای AVR Atmel
21. خانواده های AVR
23. ویژگی های استفاده عملی از MK AVR
23. مصرف
25. برخی از ویژگی های استفاده از AVR در مدارها
27. فصل 2. ترتیب کلی، سازماندهی حافظه، ساعت، تنظیم مجدد
27. حافظه برنامه
29. حافظه داده (RAM، SRAM)
31. حافظه داده غیر فرار (EEPROM)
32. روش های زمان بندی
34. بازنشانی کنید
37. فصل 3. مقدمه ای بر لوازم جانبی
38. پورت های ورودی/خروجی
39. تایمر شمارنده
41. مبدل آنالوگ به دیجیتال
42. پورت های سریال
43. UART
46. ​​رابط SPI
50. رابط TWI (I2C)
50. رابط سریال جهانی USI
53. فصل 4. وقفه ها و حالت های ذخیره انرژی
53. قطع می کند
57. انواع وقفه ها
58. حالت های ذخیره انرژی
61. قسمت دوم. برنامه نویسی میکروکنترلرهای ATMELAVR
63. فصل 5. اصول کلی برنامه نویسی AVR خانواده MK
63. اسمبلر یا سی؟
67. راه و روش برنامه نویسی AVR
67. ویرایشگر کد
68. درباره AVR Studio
70. چیدمان مونتاژ کننده
71. برنامه نویسان
75. درباره فایل های هگز
78. دستورات، دستورالعمل ها و نشانه گذاری اسمبلر AVR
79. اعداد و عبارات
80. دستورالعمل ها و توابع
84. ساختار کلی یک برنامه AVR
85. مدیریت وقفه
89. تنظیم مجدد
90. ساده ترین برنامه
92. تاخیر
94. برنامه شمارنده
96. استفاده از وقفه
97. تایمر تاخیر
98. برنامه شمارنده با استفاده از وقفه
101. درباره بیت های پیکربندی
105. فصل 6، سیستم فرمان AVR
105. دستورات انتقال را کنترل کرده و SREG را ثبت کنید
111. دستورات Check-pass
113. دستورات عملیات منطقی
114. دستورالعمل Shift و عملیات بیت
116. دستورات عملیات حسابی
118. دستورات انتقال داده
122. دستورات کنترل سیستم
123. اجرای رویه های معمولی در اسمبلر
125. درباره متغیرهای پشته، محلی و سراسری
127. فصل 7. عملیات حسابی
128. عملیات حسابی استاندارد
129. ضرب اعداد چند رقمی
131. تقسیم اعداد چند رقمی
134. عملیات با اعداد کسری
136. مولد اعداد تصادفی
138. عملیات با اعداد در قالب BCD
143. اعداد منفی در MK
147. فصل 8. برنامه نویسی تایمر
147. تایمرهای 8 و 16 بیتی
149. تشکیل مقدار فرکانس تنظیم شده
153. شمارش معکوس
158. تصحیح دقیق زمان
160. فرکانس شمار و دوره سنج
160. فرکانس سنج
164. پریودومتر
167. کنترل نشانگر پویا
168. نشانگرهای LED و اتصال آنها
171. برنامه نویسی نشانه پویا
174. تایمر در حالت PWM
179. فصل 9. استفاده از EEPROM
179. بار دیگر در مورد ایمنی داده ها در EEPROM
181. EEPROM را بنویسید و بخوانید
183. ذخیره سازی ثابت ها در EEPROM
187. فصل 10. مقایسه کننده آنالوگ و ADC
187. عملیات آنالوگ به دیجیتال و خطاهای آنها
190. کار با مقایسه کننده آنالوگ
193. یکپارچه سازی ADC روی مقایسه کننده
194. اصل عملیات و فرمول های محاسباتی
198. یکپارچه سازی برنامه ADC
201. ADC داخلی
204. نمونه ای از استفاده از ADC
206. برنامه
215. فصل 11 برنامه نویسی SPI
215. عملیات اساسی از طریق SPI
216. نوع سخت افزار
218. گزینه برنامه
219. درباره انواع حافظه های غیر فرار
221. نوشتن و خواندن فلش مموری از طریق SP!
224. برنامه تبادل با حافظه 45DB011B از طریق SPI
225. نوشتن و خواندن فلش کارت
225. اتصال کارت های MMS
228. صدور دستورات و مقداردهی اولیه MMC
232. نوشتن و خواندن MMC
237. فصل 12. رابط TW1 (I2C) و کاربرد عملی آن
237. پروتکل پایه 1 2 C
240. شبیه سازی نرم افزار پروتکل I 2 C
241. نوشتن داده ها در حافظه خارجی غیر فرار
241. حالت های تبادل با حافظه AT24
243. برنامه
247. ساعت با رابط I 2 C
255. ثبت داده ها
259. خواندن داده ها
261. فصل 13. برنامه نویسی UART/USART
262. مقداردهی اولیه UART
263. ارسال و دریافت داده ها
266. مثالی از تنظیم ساعت DS1307 با استفاده از UART
271. تکنیک های حفاظت در برابر خرابی های ارتباطی
271. چک برابری
273. نحوه سازماندهی یک مبادله صحیح
274. ویژگی های اضافی USART
276. پیاده سازی رابط های RS-232 و RS-485
280. مبدل های سطح برای RS-232
283.RS-485
285. فصل 14. حالت های ذخیره انرژی و تایمر نگهبان
286. برنامه نویسی حالت صرفه جویی در مصرف برق
287. نمونه ابزاری که با باتری کار می کند
289. پالایش برنامه
293. استفاده از تایمر نگهبان
299. ضمائم
301. پیوست 1. پارامترهای اصلی میکروکنترلرهای Atmel AVR
309 ضمیمه 2 دستورات Atmel AVR
310. دستورات حسابی و منطقی
311. دستورات عملیات بیت
312. دستورات مقایسه
313. دستورات انتقال را کنترل کنید
313. دستورالعمل برای پرش بی قید و شرط و فراخوانی زیر برنامه ها
314. دستورات چک پرش و دستورات پرش شرطی
315. دستورات انتقال داده
316. دستورات کنترل سیستم
317. پیوست 3. متون برنامه ها
317. برنامه نمایشی برای تبادل داده با حافظه فلش 45DB011B از طریق رابط SPI
321. رویه های تبادل روی رابط I2C
329. پیوست 4. تبادل داده با رایانه شخصی و برنامه های اشکال زدایی از طریق UART
329. کار با پورت COM در دلفی
335. نصب خط RTS در داس و ویندوز
337. برنامه COM2000
339. اشکال زدایی برنامه ها با شبیه ساز ترمینال
341. پیوست 5. واژه نامه اختصارات و اصطلاحات رایج
347. ادبیات
349. نمایه موضوعی