Mundarija:

AVR Assembler qo'llanmasi 1: 5 qadam
AVR Assembler qo'llanmasi 1: 5 qadam

Video: AVR Assembler qo'llanmasi 1: 5 qadam

Video: AVR Assembler qo'llanmasi 1: 5 qadam
Video: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Noyabr
Anonim
AVR Assembler qo'llanmasi 1
AVR Assembler qo'llanmasi 1

Men Arduino -da ishlatiladigan mikrokontrolder bo'lgan Atmega328p uchun montaj tillari dasturlarini yozish bo'yicha bir qator darsliklar yozishga qaror qildim. Agar odamlar qiziqishni davom ettirsalar, men bo'sh vaqtim tugamaguncha yoki boshqa odamlar o'qishni to'xtatmaguncha, men haftasiga bir yoki undan ko'p vaqt o'tkazishni davom ettiraman.

Men Arch Linux bilan ishlayapman va men non panelida o'rnatilgan atmega328p-pu ustida ishlayapman. Siz buni men kabi qila olasiz yoki kompyuteringizga arduino -ni ulashingiz va mikrokontrollerda shu tarzda ishlashingiz mumkin.

Biz 328p uchun dasturlar yozamiz, aksariyat arduinolarda bo'lgani kabi, lekin shuni ta'kidlash kerakki, xuddi shu dasturlar va texnikalar Atmel mikrokontrolderlarining har birida ishlaydi va keyinchalik (agar qiziqish bo'lsa) biz ba'zi dasturlar bilan ishlaymiz. qolganlari ham. Mikrokontroller tafsilotlarini Atmel ma'lumot varaqalarida va yo'riqnomada topish mumkin. Men ularni bu ko'rsatmaga qo'shaman.

Bu erda sizga kerak bo'ladi:

1. Non paneli

2. Arduino, yoki shunchaki mikrokontroller

3. Linux bilan ishlaydigan kompyuter

4. Avra assembler git: git clone yordamida https://github.com/Ro5bert/avra.git yoki agar siz ubuntu yoki debianga asoslangan tizimdan foydalanayotgan bo'lsangiz "sudo apt install avra" yozing va siz ikkala avr assambleyasini olasiz. va avrdude. Ammo, agar siz github yordamida eng so'nggi versiyani olsangiz, siz kerakli fayllarni ham olasiz, boshqacha aytganda, u allaqachon m328Pdef.inc va tn85def.inc fayllariga ega.

5. avrdude

AVR assambleyasi bo'yicha qo'llanmalarimning to'liq to'plamini bu erda topishingiz mumkin:

1 -qadam: Test kartasini tuzing

Test kartasini tuzing
Test kartasini tuzing

Agar xohlasangiz, o'zingizning arduino -dan foydalanishingiz va bu darsliklardagi hamma narsani qilishingiz mumkin. Ammo, biz assotsiatsiya tilida kodlash haqida gapirayotganimiz uchun, bizning falsafamiz tabiatan barcha periferiyalarni olib tashlash va mikrokontrollerning o'zi bilan bevosita aloqada bo'lishdir. Xo'sh, buni shunday qilish qiziqroq bo'larmidi?

Siz rozi bo'lganlar uchun, siz mikrokontrollerni arduino -dan chiqarib olishingiz mumkin, so'ngra bu erdagi ko'rsatmalarga amal qilib, "Breadboard Arduino" qurishni boshlashingiz mumkin:

Rasmda men ikkita katta taxtada ikkita mustaqil Atmega328p -dan tashkil topgan qurilmamni ko'rsataman (keyingi darsda ishlayotganda oldingi darslikni simli va bitta mikrokontrolderga yuklashni xohlayman). Menda quvvat manbai o'rnatilgan, shuning uchun eng yuqori temir yo'l 9V, qolganlari esa voltaj regulyatoridan 5V. Men, shuningdek, chiplarni dasturlash uchun FT232R uzilish taxtasidan foydalanaman. Men ularni sotib oldim va yuklovchilarni o'zimga yukladim, lekin agar siz Arduino -dan bitta chiqarib qo'ysangiz, bu allaqachon yaxshi.

E'tibor bering, agar siz buni ATtiny85 bilan ishlatmoqchi bo'lsangiz, Sparkfun Tiny Programmer dasturini bu erdan olishingiz mumkin: https://www.sparkfun.com/products/11801# va keyin uni kompyuterning USB portiga ulang. Avval Attiny85 -ga yuklash vositasini o'rnatishingiz kerak bo'ladi va eng oson yo'li - Arduino IDE -dan foydalanish. Biroq, siz fayl va sozlamalarni bosishingiz kerak, so'ngra yangi taxtalar URL manzilini qo'shishingiz kerak: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json bootloader -ni o'rnatishga ruxsat bering (agar sizning ATtiny85 -da allaqachon mavjud bo'lmasa).

2 -qadam: Assembler va Avrdudeni o'rnating

Endi siz montajchini va avrdudeni ushbu darslikning birinchi bosqichida berilgan havolalardan yuklab olishingiz va o'rnatishingiz mumkin. Ehtimol, agar siz Arduino bilan ishlagan bo'lsangiz, unda siz allaqachon avrdude -ni o'rnatgansiz.

Avra -ni o'rnatganingizdan so'ng, u bilan birga "manbalar" deb nomlangan kichik katalog mavjudligini va bu katalogda bir nechta qo'shilgan fayllar borligini ko'rasiz. Bular avra bilan dasturlash mumkin bo'lgan barcha mikrokontrollerlar. Siz bu erda ishlatayotgan 328p uchun fayl yo'qligini darhol sezasiz. Men bittasini biriktirdim. Fayl m328Pdef.inc deb nomlanishi kerak va siz uni o'z ichiga olgan katalogga yoki xohlagan joyingizga qo'yishingiz kerak. Biz uni montaj tili dasturlariga kiritamiz. Bularning barchasi, har bir mikrokontrolder nomidagi registrlarni ma'lumotlar varag'idan beradi, shunda biz ularning o'n oltilik nomlarini ishlatmasligimiz kerak. Yuqoridagi fayl "pragma ko'rsatmalari" ni o'z ichiga oladi, chunki u C va C ++ dasturlash uchun mo'ljallangan. Agar montajchining "pragma ko'rsatmasiga e'tibor bermaslik" shikoyatlarini ko'rishdan charchagan bo'lsangiz, faylga kiring va #pragma bilan boshlangan barcha qatorlarni o'chirib tashlang yoki izohlang.

Xo'sh, endi sizda mikrokontroller, montajchi va dasturchi tayyor, biz birinchi dasturimizni yozishimiz mumkin.

Eslatma: Agar siz ATmega328P o'rniga ATtiny85 dan foydalanayotgan bo'lsangiz, sizga tn85def.inc deb nomlangan boshqa fayl kerak bo'ladi. Men uni biriktiraman (shuni esda tutingki, men uni tn85def.inc.txt deb atashim kerak edi, shuning uchun Instructables uni yuklashimga imkon beradi.) Ammo, agar siz github -dan avra assambleyasini olgan bo'lsangiz, unda sizda bu fayllarning ikkalasi ham bor. Shuning uchun men uni olishni va uni o'zingiz tuzishni maslahat beraman: git clone

3 -qadam: Salom dunyo

Birinchi darslikning maqsadi - har qanday yangi tilni o'rganishda yoki elektronika platformasini o'rganishda yozadigan birinchi standart dasturni yaratish. "Salom Dunyo!." Bizning holatlarimizda biz faqat montaj tili dasturini yozib, uni yig'ib, mikrokontrollerimizga yuklamoqchimiz. Dastur LEDni yoqishga olib keladi. Oddiy Arduino salom dasturida bo'lgani kabi, LEDning "miltillashi" ni keltirib chiqarishi, aslida montaj tilida ancha murakkab dastur, shuning uchun biz hozircha bunday qilmaymiz. Biz eng oddiy "yalang'och suyaklar" kodini keraksiz tuklarsiz yozamiz.

Birinchidan, arduino -da Digital Out 13 deb ham ataladigan PB5 LED -ni (pinout diagrammasini ko'ring) 220 ohmli rezistorga, so'ngra GND ga ulang. Ya'ni

PB5 - LED - R (220 ohm) - GND

Endi dasturni yozish. Sevimli matn muharririni oching va "hello.asm" nomli fayl yarating.

; salom.asm

; PB5 (raqamli chiqish 13) ga ulangan LEDni yoqadi. "./m328Pdef.inc" ldi r16, 0b00100000 DDRB, r16 - PortB, r16 - Start: rjmp Start

Yuqoridagi kod. Biz bir daqiqadan so'ng uni bosqichma-bosqich bosib o'tamiz, lekin avval uni qurilmangizda ishlashiga ishonch hosil qilaylik.

Faylni yaratganingizdan so'ng, uni terminalda quyidagicha yig'asiz:

avra salom.asm

bu sizning kodingizni yig'adi va hello.hex nomli faylni yaratadi, uni biz quyidagicha yuklashimiz mumkin:

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

Agar siz arduino dasturxonidan foydalansangiz, yuqoridagi buyruqni bajarishdan oldin, arduino panelidagi reset tugmasini bosishingiz kerak bo'ladi. E'tibor bering, siz oldingizga sudo qo'shishingiz yoki uni root sifatida bajarishingiz kerak bo'lishi mumkin. Shuni ham yodda tutingki, ba'zi arduino -larda (Arduino UNO kabi) siz bit tezligini -b 115200 ga o'zgartirishingiz kerak bo'ladi va -P /dev /ttyACM0 portini (agar siz avrdude -dan noto'g'ri qurilma imzosi haqida xatoga yo'l qo'ysangiz - F buyrug'iga)

Agar hamma narsa kerakli tarzda ishlagan bo'lsa, endi sizda LED yonadi … "Salom dunyo!"

Agar siz ATtiny85 dan foydalanayotgan bo'lsangiz, avrdude buyrug'i quyidagicha bo'ladi:

avrdude -p attiny85 -c usbtiny -U flesh: w: salom.hex

4-qadam: Hello.asm satr-satr

Kirish darsini tugatish uchun biz hello.asm dasturini bosqichma-bosqich ko'rib chiqamiz va uning qanday ishlashini bilib olamiz.

; salom.asm

; PB5 ga ulangan LEDni yoqadi (raqamli chiqish 13)

Nuqtali vergul qo'yilgandan keyin hamma narsa montajchi tomonidan e'tiborga olinmaydi va shuning uchun bu birinchi ikkita satr dasturning nima ekanligini tushuntirib beradigan "izohlar" dir.

"./m328Pdef.inc" ni qo'shing

Bu satr montajchiga siz yuklagan m328Pdef.inc faylini qo'shishni aytadi. Buni shunga o'xshash fayllar katalogiga qo'yishni xohlashingiz mumkin va keyin yuqoridagi satrni u erga ko'rsatish uchun o'zgartiring.

ldi r16, 0b00100000

ldi "zudlik bilan yuklash" degan ma'noni anglatadi va montajchiga bu holatda r16 ishchi registrini olishni va unga ikkilik raqamni yuklashni aytadi, bu holda 0b00100000. Oldidagi 0b raqamimiz ikkilik ekanligini aytadi. Agar xohlasak, biz boshqa bazani tanlagan bo'lardik, masalan, o'n oltilik. Bunday holda, bizning raqamimiz 0x20 bo'lar edi, bu 0b00100000 uchun o'n oltilik. Yoki biz bir xil son uchun 10 kasrli 32 dan foydalanishimiz mumkin edi.

1 -mashq: Yuqoridagi satrdagi raqamni o'n oltilik raqamga, so'ngra kodingizning o'nli kasriga o'zgartiring va u har bir holatda ham ishlashini tekshiring.

Portlar va registrlar ishi tufayli ikkilikni ishlatish eng oddiy. Biz kelgusi o'quv qo'llanmalarida atmega328p portlari va registrlarini batafsil muhokama qilamiz, lekin hozircha aytamanki, biz r16 -ni "ishchi registri" sifatida ishlatmoqdamiz, ya'ni biz uni saqlaydigan o'zgaruvchi sifatida ishlatmoqchimiz. "Ro'yxatdan o'tish" - bu 8 bitli to'plam. Bu 0 yoki 1 (o'chirilgan yoki yoqilgan) bo'lishi mumkin bo'lgan 8 nuqta. 0b00100000 ikkilik raqamini yuqoridagi satr yordamida registrga yuklaganimizda, biz bu raqamni r16 registrida saqladik.

DDRB, r16

Bu satr kompilyatorga r16 registrining mazmunini DDRB reestriga nusxalashini aytadi. DDRB "Ma'lumotlarni yo'naltirish registri B" degan ma'noni anglatadi va PortB -da "pinlar" ni o'rnatadi. 328p uchun xaritada siz PB0, PB1,…, PB7 etiketli 8 ta pin borligini ko'rishingiz mumkin. Bu pinlar "PortB" ning "bitlarini" ifodalaydi va 00100000 ikkilik raqamini DDRB reestriga yuklaganimizda, biz PB0, PB1, PB2, PB3, PB4, PB6 va PB7 ni INPUT pinlari sifatida o'rnatishni xohlayotganimizni aytamiz. Ularda 0 va PB5 OUTPUT pin sifatida o'rnatiladi, chunki biz bu joyga 1 qo'yamiz.

PortB, r16

Endi biz pimlarning yo'nalishini aniqladik, endi ulardagi kuchlanishni o'rnatishimiz mumkin. Yuqoridagi satr xuddi shu ikkilik raqamni r16 saqlash registrimizdan PortBga ko'chiradi. Bu PB5 pinidan tashqari barcha pimlarni 0 voltga o'rnatadi, ya'ni 5 volt.

2 -mashq: Raqamli multimetrni oling, qora simni erga ulang (GND) va keyin PB0 dan PB7 gacha bo'lgan har bir pinni qizil sim bilan tekshiring. Har bir pimdagi kuchlanish PortB -ga 0b00100000 qo'yishga to'g'ri keladimi? Agar yo'q bo'lsa, nima uchun shunday deb o'ylaysiz? (pin xaritasini ko'ring)

Boshlash:

rjmp Boshlash

Nihoyat, yuqoridagi birinchi qator - bu koddagi joyni belgilaydigan "yorliq". Bunday holda, bu joyni "Boshlash" deb belgilang. Ikkinchi satrda "Boshlash yorlig'iga nisbiy o'tish" yozilgan. Aniq natija shundaki, kompyuter cheksiz tsiklga joylashtirilgan bo'lib, u velosipedni "Start" ga qaytaradi. Bizga bu kerak, chunki bizda dastur tugashi yoki jarlikdan qulab tushishi mumkin emas, yorug'lik yonib turishi uchun dastur ishlashni davom ettirishi kerak.

3 -mashq: Dastur jarlikdan tushib ketishi uchun kodingizdan yuqoridagi ikki qatorni olib tashlang. Nima bo'ladi? Siz Arduino tomonidan "salom dunyo!" An'anaviy "miltillash" dasturiga o'xshash narsani ko'rishingiz kerak. Sizningcha, nima uchun bunday harakat qiladi? (Dastur jarlikdan qulaganda nima bo'lishi kerakligini o'ylab ko'ring …)

5 -qadam: Xulosa

Agar siz shu darajaga etgan bo'lsangiz, tabriklaymiz! Endi siz montaj kodini yozishingiz, yig'ishingiz va mikrokontrolleringizga yuklashingiz mumkin.

Ushbu qo'llanmada siz quyidagi buyruqlardan foydalanishni o'rgandingiz:

ldi hregister, raqam yuqori yarim reestrga (0-355) raqamni yuklaydi (16-31)

ioregister -dan chiqib, ro'yxatdan o'tish raqamini ishchi registrdan kirish -chiqish registriga nusxalash

rjmp yorlig'i "yorliq" bilan belgilangan dastur satriga o'tadi (204 yo'riqnomadan uzoq bo'lishi mumkin emas, ya'ni nisbiy o'tish)

Endi bu asoslar yo'q, biz kompilyatsiya qilish va yuklash mexanikasini muhokama qilmasdan, yanada qiziqarli kod va yanada qiziqarli sxemalar va qurilmalarni yozishni davom ettira olamiz.

Umid qilamanki, sizga bu kirish darsi yoqdi. Keyingi darsda biz boshqa elektron komponentni (tugma) qo'shamiz va kirish portlari va qarorlarni o'z ichiga olgan holda kodimizni kengaytiramiz.

Tavsiya: