فهرست مطالب:

آموزش AVR Assembler 1: 5 مرحله
آموزش AVR Assembler 1: 5 مرحله

تصویری: آموزش AVR Assembler 1: 5 مرحله

تصویری: آموزش AVR Assembler 1: 5 مرحله
تصویری: برنامه نویسی avr گام اول | Programming For AVR microcontroler 2024, جولای
Anonim
آموزش AVR Assembler 1
آموزش AVR Assembler 1

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

من Arch linux را اجرا می کنم و در حال کار بر روی atmega328p-pu هستم که روی یک تخته نان نصب شده است. شما می توانید مانند من این کار را انجام دهید یا می توانید آردوینو را به کامپیوتر خود وصل کنید و به این ترتیب روی میکروکنترلر کار کنید.

ما برنامه هایی را برای 328p مانند برنامه ای که در اکثر آردوینوها وجود دارد می نویسیم ، اما باید توجه داشته باشید که این برنامه ها و تکنیک ها برای هر یک از میکروکنترلرهای Atmel نیز کار می کند و بعداً (در صورت تمایل) ما با برخی از آنها کار خواهیم کرد. بقیه هم همینطور جزئیات میکروکنترلر را می توانید در برگه های اطلاعات Atmel و دفترچه راهنمای دستورالعمل ها مشاهده کنید. من آنها را به این دستورالعمل پیوست می کنم.

در اینجا چیزی است که شما نیاز دارید:

1. یک تخته نان

2. یک آردوینو یا فقط میکروکنترلر

3. رایانه ای که از لینوکس استفاده می کند

4. مونتاژ avra با استفاده از git: git clone https://github.com/Ro5bert/avra.git یا اگر از ubuntu یا سیستم مبتنی بر debian استفاده می کنید فقط "sudo apt install avra" را تایپ کنید و هر دو اسمبلر avr را دریافت خواهید کرد و avrdude با این حال ، اگر آخرین نسخه را با استفاده از github دریافت کنید ، کلیه فایلهای مورد نیاز شامل فایل های دیگر را نیز دریافت خواهید کرد ، به عبارت دیگر ، فایل های m328Pdef.inc و tn85def.inc را در حال حاضر دارد.

5. avrdude

مجموعه کامل آموزشهای AVR assembler من را می توانید در اینجا پیدا کنید:

مرحله 1: ایجاد یک هیئت آزمایش

ایجاد یک هیئت آزمون
ایجاد یک هیئت آزمون

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

برای کسانی که با شما موافق هستند ، می توانید میکروکنترلر را از آردوینو خود بیرون کشیده و سپس با پیروی از دستورالعمل های زیر با ساخت "Breadboard Arduino" شروع کنید:

در تصویر ، من تنظیمات خود را نشان می دهم که شامل دو نوع Atmega328p مستقل روی یک نان برد بزرگ است. من منبع تغذیه را طوری تنظیم کرده ام که ریل بالای آن 9 ولت است و بقیه موارد 5 ولت از تنظیم کننده ولتاژ است. من همچنین از یک برد شکست FT232R برای برنامه ریزی تراشه ها استفاده می کنم. من آنها را خریدم و بوت لودرها را روی آنها قرار دادم ، اما اگر یکی را از آردوینو بیرون کشیدید ، خوب است.

توجه داشته باشید که اگر این کار را با ATtiny85 انجام می دهید ، می توانید برنامه نویس Sparkfun Tiny را در اینجا دریافت کنید: https://www.sparkfun.com/products/11801# و سپس آن را به سادگی به پورت USB کامپیوتر خود وصل کنید. ابتدا باید یک بوت لودر روی Attiny85 نصب کنید و ساده ترین راه این است که فقط از Arduino IDE استفاده کنید. با این حال ، باید روی فایل و تنظیمات برگزیده کلیک کنید و سپس این آدرس New Boards را اضافه کنید: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json که شما را قادر می سازد که بوت لودر را نصب کنید (اگر ATtiny85 شما قبلاً همراه آن نبوده است.)

مرحله 2: Assembler و Avrdude را نصب کنید

هم اکنون می توانید assembler و avrdude را از پیوندهای داده شده در مرحله اول این آموزش بارگیری و نصب کنید. به احتمال زیاد اگر قبلاً با Arduino کار کرده اید ، avrdude را قبلاً نصب کرده اید.

پس از نصب avra ، متوجه خواهید شد که یک زیرشاخه با آن "منابع" وجود دارد و در داخل آن فهرست مجموعه ای از فایل های شامل وجود دارد. اینها همه میکروکنترلرهایی هستند که می توانید با avra برنامه ریزی کنید. بلافاصله متوجه خواهید شد که فایلی برای 328p که ما در اینجا از آن استفاده می کنیم وجود ندارد. یکی رو ضمیمه کردم فایل باید m328Pdef.inc نامیده شود و باید داخل فهرست شامل یا هر جای دیگری که دوست دارید قرار دهید. ما آن را در برنامه های زبان اسمبلی خود قرار خواهیم داد. همه اینها این است که هر یک از رجیسترهای موجود در نام های میکروکنترلرها را از برگه داده ها ارائه دهیم تا مجبور نباشیم از نام هگزیدسیمال آنها استفاده کنیم. فایل فوق شامل "دستورالعمل های پراگما" است زیرا برای برنامه نویسی C و C ++ طراحی شده است. اگر از دیدن شکایت های مونتاژر "نادیده گرفتن دستورالعمل پراگما" خسته شده اید ، کافی است وارد پرونده شوید و همه خطوطی که با #pragma شروع می شوند را حذف یا نظر دهید.

خوب ، اکنون که میکروکنترلر خود را آماده کرده اید ، مونتاژ کننده شما آماده است و برنامه نویس شما آماده است ، می توانیم اولین برنامه خود را بنویسیم.

توجه: اگر از ATtiny85 به جای ATmega328P استفاده می کنید ، به فایل شامل فایل دیگری به نام tn85def.inc احتیاج دارید. من آن را نیز ضمیمه می کنم (توجه داشته باشید که باید آن را tn85def.inc.txt می نامیدم تا دستورالعمل ها بتوانند آن را بارگذاری کنم.) با این حال ، اگر شما avra assembler را از github تهیه کرده اید ، هر دوی این فایل ها را قبلاً در اختیار دارید. بنابراین توصیه می کنم آن را تهیه کرده و خودتان آن را کامپایل کنید: git clone

مرحله 3: سلام جهان

هدف از این اولین آموزش ، ایجاد اولین برنامه استانداردی است که هنگام یادگیری هر زبان جدید یا کاوش در هر پلت فرم الکترونیکی جدید می نویسید. "سلام دنیا!." در مورد ما ما فقط می خواهیم یک برنامه زبان اسمبلی بنویسیم ، آن را مونتاژ کنیم و آن را در میکروکنترلر خود بارگذاری کنیم. این برنامه باعث روشن شدن LED می شود. ایجاد "چشمک زدن" LED مانند برنامه عادی Arduino hello world در واقع یک برنامه بسیار پیچیده تر در زبان اسمبلی است و بنابراین ما هنوز آن را انجام نمی دهیم. ما قصد داریم ساده ترین کد "استخوانهای برهنه" را با حداقل کرک غیر ضروری بنویسیم.

ابتدا یک LED از PB5 (نمودار pinout را ببینید) که در خروجی آردوینو Digital Out 13 نیز نامیده می شود ، به یک مقاومت 220 اهم و سپس به GND وصل کنید. یعنی

PB5 - LED - R (220 اهم) - GND

حالا برنامه را بنویسید. ویرایشگر متن مورد علاقه خود را باز کرده و فایلی با نام "hello.asm" ایجاد کنید

؛ سلام.اسم

؛ یک LED را که به PB5 متصل است روشن می کند (خروجی دیجیتال 13). شامل "./m328Pdef.inc" ldi r16 ، 0b00100000 out DDRB ، r16 out PortB ، r16 شروع: شروع rjmp

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

پس از ایجاد فایل ، سپس در ترمینال آن را به صورت زیر مونتاژ می کنید:

avra hello.asm

این کد شما را مونتاژ کرده و فایلی به نام hello.hex ایجاد می کند که می توانیم آن را به صورت زیر بارگذاری کنیم:

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U flash: w: hello.hex

اگر از آردوینوی ورق استفاده می کنید ، باید دکمه تنظیم مجدد را در آردوینو باند فشار دهید ، درست قبل از اجرای دستور بالا. توجه داشته باشید که ممکن است مجبور شوید sudo را در جلو اضافه کنید یا آن را به عنوان root اجرا کنید. همچنین توجه داشته باشید که در برخی از arduino ها (مانند Arduino UNO) احتمالاً باید بیت ریت را به -b 115200 و پورت -P /dev /ttyACM0 را تغییر دهید (اگر در مورد امضای دستگاه نامعتبر خطایی از avrdude دریافت کردید ، فقط یک -اضافه کنید) F به فرمان)

اگر همه چیز آنطور که باید کار کرده است ، اکنون یک LED روشن می کنید ….. "سلام جهان!"

اگر از ATtiny85 استفاده می کنید ، دستور avrdude به صورت زیر خواهد بود:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

مرحله 4: Hello.asm خط به خط

برای اتمام این آموزش مقدماتی ، برنامه hello.asm را خط به خط مرور می کنیم تا ببینیم چگونه کار می کند.

؛ سلام.اسم

؛ چراغ LED متصل به PB5 را روشن می کند (خروجی دیجیتال 13)

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

. شامل "./m328Pdef.inc"

این خط به مونتاژ کننده می گوید که فایل m328Pdef.inc را که بارگیری کرده اید ، شامل شود. ممکن است بخواهید این مورد را در فهرست فایلهای مشابه شامل قرار دهید و سپس خط بالا را تغییر دهید تا به آنجا اشاره شود.

ldi r16 ، 0b00100000

ldi مخفف "بارگذاری فوری" است و به مونتاژ کننده می گوید که یک رجیستر کار ، r16 در این مورد ، بردارید و یک عدد دودویی در آن بارگذاری کنید ، 0b00100000 در این مورد. 0b در جلو می گوید که شماره ما به صورت دودویی است. اگر می خواستیم می توانستیم پایه دیگری مانند هگزیدسیمال انتخاب کنیم. در آن صورت ، عدد ما 0x20 خواهد بود که هگزیدسیمال برای 0b00100000 است. یا می توانستیم از عدد 32 مبنای 10 برای همان عدد استفاده کنیم.

تمرین 1: سعی کنید عدد خط بالا را در کد خود به هگزیدسیمال و سپس به اعشار تغییر دهید و بررسی کنید که همچنان در هر مورد کار می کند.

استفاده از باینری به دلیل نحوه عملکرد Ports و Registers ساده ترین است. ما در مورد آموزش پورت ها و ثبات های atmega328p در آموزش های بعدی بیشتر صحبت خواهیم کرد ، اما در حال حاضر فقط بیان می کنم که ما از r16 به عنوان "ثبت کار" خود استفاده می کنیم ، بدین معنی که ما فقط از آن به عنوان متغیری که ذخیره می کنیم استفاده می کنیم. اعداد داخل "ثبت نام" مجموعه ای از 8 بیت است. به معنی 8 نقطه است که می تواند 0 یا 1 باشد ("خاموش" یا "روشن"). هنگامی که شماره دودویی 0b00100000 را در رجیستر با استفاده از خط بالا بارگذاری می کنیم ، به سادگی آن عدد را در رجیستر r16 ذخیره می کنیم.

خارج از DDRB ، r16

این خط به کامپایلر می گوید محتویات رجیستر r16 را در رجیستر DDRB کپی کند. DDRB مخفف "Data Direction Register B" است و "پین" ها را در PortB تنظیم می کند. در نقشه pinout برای 328p می بینید که 8 پین با برچسب PB0 ، PB1 ،… ، PB7 وجود دارد. این پین ها نشان دهنده "بیت" های "PortB" هستند و وقتی شماره دودویی 00100000 را در ثبت DDRB بارگذاری می کنیم ، می گوییم که می خواهیم PB0 ، PB1 ، PB2 ، PB3 ، PB4 ، PB6 و PB7 به عنوان پین های INPUT تنظیم شوند. 0 در آنها وجود دارد ، و PB5 به عنوان یک پین OUTPUT تنظیم شده است زیرا ما 1 را در آن نقطه قرار می دهیم.

خارج از PortB، r16

اکنون که جهت پین ها را ثابت کرده ایم ، می توانیم ولتاژها را روی آنها تنظیم کنیم. خط بالا همان شماره دودویی را از ثبت ذخیره سازی r16 ما در PortB کپی می کند. این امر همه پین ها را روی 0 ولت تنظیم می کند به جز پایه PB5 روی HIGH که 5 ولت است.

تمرین 2: یک مولتی متر دیجیتالی بگیرید ، سرب سیاه را به زمین وصل کنید (GND) و سپس هر یک از پایه های PB0 تا PB7 را با سرب قرمز آزمایش کنید. آیا ولتاژهای هر یک از پین ها دقیقاً مربوط به قرار دادن 0b00100000 در PortB است؟ اگر مواردی وجود دارد که وجود ندارد ، چرا فکر می کنید چنین است؟ (نقشه پین را ببینید)

شروع:

rjmp شروع کنید

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

تمرین 3: دو خط بالا را از کد خود حذف کنید تا برنامه از صخره سقوط کند. چه اتفاقی می افتد؟ شما باید چیزی را ببینید که شبیه برنامه "پلک زدن" سنتی است که توسط آردوینو به عنوان "سلام جهان" استفاده می شود. به نظر شما چرا اینگونه عمل می کند؟ (به این فکر کنید که وقتی برنامه از صخره سقوط می کند چه اتفاقی می افتد …)

مرحله 5: نتیجه گیری

اگر تا اینجا پیش رفته اید تبریک می گویم! اکنون می توانید کد مونتاژ را بنویسید ، آن را مونتاژ کرده و روی میکروکنترلر خود بارگذاری کنید.

در این آموزش نحوه استفاده از دستورات زیر را آموخته اید:

ldi hregister ، شماره یک عدد (0-255) را در یک نیمکره بالا (16-31) بارگذاری می کند

خارج از ioregister ، ثبت نام تعدادی را از یک رجیستر کار به یک رجیستر ورودی/خروجی کپی کنید

برچسب rjmp به خط برنامه برچسب گذاری شده با "label" (که نمی تواند بیش از 204 دستورالعمل فاصله داشته باشد - یعنی پرش نسبی) می رود.

اکنون که این اصول اولیه از بین رفته است ، می توانیم بدون نیاز به بحث در مورد مکانیک کامپایل و بارگذاری ، به نوشتن کد جالب تر و مدارها و دستگاه های جالب تر ادامه دهیم.

امیدوارم از این آموزش مقدماتی لذت برده باشید. در آموزش بعدی ما یک جزء دیگر مدار (یک دکمه) اضافه می کنیم و کد خود را گسترش می دهیم تا پورت ها و تصمیمات ورودی را شامل شود.

توصیه شده: