Tutoriali i AVR Assembler 1: 5 Hapa
Tutoriali i AVR Assembler 1: 5 Hapa

Video: Tutoriali i AVR Assembler 1: 5 Hapa

Video: Tutoriali i AVR Assembler 1: 5 Hapa
Video: Лекция 4. Архитектура AVR. Ассемблер 2025, Janar
Anonim
Udhëzues AVR Assembler 1
Udhëzues AVR Assembler 1

Kam vendosur të shkruaj një seri mësimesh se si të shkruaj programe të gjuhës së asamblesë për Atmega328p i cili është mikrokontrolluesi i përdorur në Arduino. Nëse njerëzit mbeten të interesuar, unë do të vazhdoj të nxjerr një në javë ose më shumë derisa të më mbarojë koha e lirë ose përndryshe njerëzit të mos i lexojnë më.

Unë jam duke drejtuar Arch linux dhe jam duke punuar në një atmega328p-pu të ngritur në një dërrasë buke. Ju mund ta bëni atë në të njëjtën mënyrë si unë ose thjesht mund të lidhni një arduino në kompjuterin tuaj dhe të punoni në mikrokontrollues në atë mënyrë.

Ne do të shkruajmë programe për 328p si ai që është në shumicën e arduino -ve, por duhet të keni parasysh që të njëjtat programe dhe teknika do të funksionojnë edhe për cilindo nga mikrokontrolluesit Atmel dhe më vonë (nëse ka interes) do të punojmë me disa nga edhe te tjeret gjithashtu. Detajet e mikrokontrolluesit mund të gjenden në fletët e të dhënave Atmel dhe Manuali i Set Instruction. Unë po i bashkoj ato me këtë udhëzues.

Këtu është ajo që do t'ju duhet:

1. Një dërrasë buke

2. Një Arduino, ose thjesht mikrokontrolluesi

3. Një kompjuter që funksionon me Linux

4. Asembler avra duke përdorur git: git klon https://github.com/Ro5bert/avra.git ose nëse jeni duke përdorur ubuntu ose një sistem të bazuar në debian thjesht shkruani "sudo apt install avra" dhe do të merrni të dy montuesit avr dhe avrdude. Mirëpo, nëse merrni versionin e fundit duke përdorur github atëherë do të merrni të gjithë skedarët e nevojshëm të përfshirë, me fjalë të tjera ai tashmë ka skedarët m328Pdef.inc dhe tn85def.inc.

5. avrdude

Kompleti i mësimeve të mia për montuesin AVR mund të gjendet këtu:

Hapi 1: Ndërtoni një bord testimi

Ndërtoni një bord testimi
Ndërtoni një bord testimi

Ju thjesht mund të përdorni arduino -n tuaj dhe të bëni gjithçka në këto udhëzime nëse dëshironi. Sidoqoftë, meqenëse ne po flasim për kodimin në gjuhën e asamblesë filozofia jonë është në thelb të heqim të gjitha periferikët dhe të ndërveprojmë drejtpërdrejt me vetë mikrokontrolluesin. Pra, nuk mendoni se do të ishte më argëtuese ta bëni atë në këtë mënyrë?

Për ata prej jush që jeni dakord, mund të nxirrni mikrokontrolluesin nga arduino juaj dhe më pas të filloni duke ndërtuar një "Arduino Breadboard" duke ndjekur udhëzimet këtu:

Në foto unë tregoj pajisjen time e cila përbëhet nga dy Atmega328p të pavarur në një pjatë të madhe (dua të jem në gjendje të mbaj mësimin e mëparshëm të lidhur dhe të ngarkuar në një mikrokontrollues ndërsa punoj në tjetrin). Unë kam furnizimin me energji elektrike të vendosur në mënyrë që hekurudha e sipërme të jetë 9V dhe të gjitha të tjerat janë 5V nga rregullatori i tensionit. Unë gjithashtu përdor një tabelë shpërthimi FT232R për të programuar patate të skuqura. I bleva dhe vendosa ngarkuesin mbi to vetë, por nëse sapo keni nxjerrë një nga Arduino atëherë është mirë tashmë.

Vini re se nëse po e provoni këtë me një ATtiny85 atëherë thjesht mund të merrni Programuesin Sparkfun Tiny këtu: https://www.sparkfun.com/products/11801# dhe pastaj thjesht ta lidhni atë në portën USB në kompjuterin tuaj. Së pari do t'ju duhet të instaloni një bootloader në Attiny85 dhe mënyra më e lehtë është thjesht të përdorni Arduino IDE. Sidoqoftë, do t'ju duhet të klikoni mbi skedarin dhe preferencat, dhe pastaj të shtoni këtë URL të New Boards: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json e cila do ju mundëson të instaloni bootloader (nëse ATtiny85 juaj nuk kishte ardhur tashmë me një të tillë.)

Hapi 2: Instaloni Assembler dhe Avrdude

Tani mund të shkarkoni dhe instaloni assembler dhe avrdude nga lidhjet e dhëna në hapin e parë të këtij tutoriali. Ka të ngjarë që nëse tashmë keni punuar me Arduino, atëherë tashmë e keni instaluar avrdude.

Pasi ta keni instaluar avra -n, do të vini re se ekziston një nëndrejtori që vjen me të e quajtur "burime" dhe brenda asaj drejtorie ka një mori skedarësh përfshirës. Këta janë të gjithë mikrokontrolluesit që mund të programoni me avra. Do të vini re menjëherë se nuk ka skedar për 328p që ne po përdorim këtu. Unë kam bashkangjitur një. Skedari duhet të quhet m328Pdef.inc dhe duhet të vendosni brenda drejtorisë së përfshirjes ose kudo tjetër që ju pëlqen. Ne do ta përfshijmë atë në programet tona të gjuhës së asamblesë. E gjithë kjo bën është që secilit prej regjistrave në emrat e mikrokontrolluesve t'i japim nga fleta e të dhënave në mënyrë që të mos na duhet të përdorim emrat e tyre heksidekimalë. Skedari i përfshirë më sipër përmban "direktiva pragma" pasi është krijuar për programim C dhe C ++. Nëse jeni lodhur duke parë montuesin duke pështyrë ankesat e "injorimit të direktivës pragma" thjesht shkoni në skedar dhe fshini ose komentoni të gjitha rreshtat që fillojnë me #pragma

Mirë, tani që keni gati mikrokontrolluesin tuaj, montuesin tuaj gati dhe programuesin tuaj gati, ne mund të shkruajmë programin tonë të parë.

Shënim: Nëse jeni duke përdorur ATtiny85 në vend të ATmega328P atëherë keni nevojë për një skedar të ndryshëm përfshirës të quajtur tn85def.inc. Unë gjithashtu do ta bashkoj atë (vini re se duhej ta quaja tn85def.inc.txt në mënyrë që Instructables të më lejonin ta ngarkoja.) Sidoqoftë, nëse e keni marrë montuesin avra nga github atëherë i keni tashmë të dyja këto skedarë me të. Prandaj ju rekomandoj ta merrni dhe ta përpiloni vetë: git clone

Hapi 3: Përshëndetje Botë

Qëllimi i këtij mësimi të parë është të ndërtojë programin standard të parë që shkruan kur mëson ndonjë gjuhë të re ose eksploron ndonjë platformë të re elektronike. "Përshendetje Botë!." Në rastin tonë, ne thjesht duam të shkruajmë një program të gjuhës së asamblesë, ta montojmë dhe ta ngarkojmë në mikrokontrolluesin tonë. Programi do të bëjë që një LED të ndizet. Të shkaktosh që një LED të "pulsojë" ashtu siç bëjnë për programin normal Arduino hello world është në fakt një program shumë më i komplikuar në gjuhën e asamblesë dhe kështu që ne nuk do ta bëjmë atë akoma. Ne do të shkruajmë kodin më të thjeshtë "kockat e zhveshura" me push të vogël të panevojshëm.

Së pari lidhni një LED nga PB5 (shiko diagramin pinout) e cila quhet edhe Digital Out 13 në një arduino, me një rezistencë 220 ohm, pastaj me GND. Dmth

PB5 - LED - R (220 ohm) - GND

Tani për të shkruar programin. Hapni redaktorin tuaj të preferuar të tekstit dhe krijoni një skedar të quajtur "hello.asm"

pershendetje.asm

; ndez një LED e cila është e lidhur me PB5 (dalja dixhitale 13). përfshini "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Fillimi: rjmp Fillimi

Më sipër është kodi. Ne do ta kalojmë atë rresht pas linje në një minutë, por së pari të sigurohemi që mund ta bëjmë atë të funksionojë në pajisjen tuaj.

Pasi të keni krijuar skedarin, atëherë në një terminal e mblidhni atë si më poshtë:

avra hello.asm

kjo do të mbledhë kodin tuaj dhe do të krijojë një skedar të quajtur hello.hex të cilin mund ta ngarkojmë si më poshtë:

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

nëse jeni duke përdorur një arduino të bordit të bukës do t'ju duhet të shtypni butonin e rivendosjes në arduino të bukës pak para se të ekzekutoni komandën e mësipërme. Vini re se mund t'ju duhet të shtoni një sudo përpara ose ta ekzekutoni atë si rrënjë. Gjithashtu vini re se në disa arduino (si Arduino UNO) ju ndoshta do të duhet të ndryshoni bitrate në -b 115200 dhe portën -P /dev /ttyACM0 (nëse merrni një gabim nga avrdude për një nënshkrim të pavlefshëm të pajisjes, thjesht shtoni një - F në komandë)

Nëse gjithçka ka funksionuar siç duhet tani do të keni një LED të ndezur ….. "Përshëndetje Botë!"

Nëse jeni duke përdorur ATtiny85 atëherë komanda avrdude do të jetë:

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

Hapi 4: Përshëndetje.asm Line-by-line

Për të përfunduar këtë tutorial hyrës ne do të kalojmë programin hello.asm rresht për rresht për të parë se si funksionon.

pershendetje.asm

; ndez një LED e cila është e lidhur me PB5 (dalja dixhitale 13)

Çdo gjë pas një pikëpresje injorohet nga montuesi dhe prandaj këto dy rreshta të parë janë thjesht "komente" që shpjegojnë atë që bën programi.

.përfshi "./m328Pdef.inc"

Kjo linjë i thotë montuesit të përfshijë skedarin m328Pdef.inc të cilin e keni shkarkuar. Ju mund të dëshironi ta vendosni këtë në një drejtori të skedarëve të ngjashëm të përfshirë dhe pastaj të ndryshoni rreshtin e mësipërm për ta treguar atë atje.

ldi r16, 0b00100000

ldi qëndron për "ngarkim i menjëhershëm" dhe i thotë montuesit të marrë një regjistër pune, r16 në këtë rast, dhe të ngarkojë një numër binar në të, 0b00100000 në këtë rast. 0b përpara thotë se numri ynë është në binar. Nëse do të donim, mund të kishim zgjedhur një bazë tjetër, siç është heksidecimal. Në atë rast numri ynë do të ishte 0x20 që është heksidekimal për 0b00100000. Ose mund të kishim përdorur 32 e cila është baza 10 dhjetore për të njëjtin numër.

Ushtrimi 1: Provoni të ndryshoni numrin në rreshtin më lart në heksidekimal dhe më pas në dhjetor në kodin tuaj dhe verifikoni që ai ende funksionon në secilin rast.

Përdorimi i binarit është më i thjeshtë edhe pse për shkak të mënyrës se si funksionojnë Portet dhe Regjistrat. Ne do të diskutojmë portet dhe regjistrat e atmega328p në më shumë detaje në mësimet e ardhshme, por tani për tani unë vetëm do të deklaroj se ne po përdorim r16 si "regjistrin tonë të punës" që do të thotë se ne thjesht do ta përdorim atë si një ndryshore që ruajmë numrat in. Një "regjistër" është një grup prej 8 bitësh. Do të thotë 8 pika që mund të jenë 0 ose 1 ("off" ose "on"). Kur ngarkojmë numrin binar 0b00100000 në regjistër duke përdorur rreshtin e mësipërm, thjesht e kemi ruajtur atë numër në regjistrin r16.

jashtë DDRB, r16

Kjo linjë i thotë përpiluesit të kopjojë përmbajtjen e regjistrit r16 në regjistrin DDRB. DDRB qëndron për "Regjistri i Drejtimit të të Dhënave B" dhe krijon "kunjat" në PortB. Në hartën pinout për 328p mund të shihni se ka 8 kunja të etiketuar PB0, PB1,…, PB7. Këto kunja përfaqësojnë "bitët" e "PortB" dhe kur ngarkojmë numrin binar 00100000 në regjistrin DDRB ne po themi se ne duam PB0, PB1, PB2, PB3, PB4, PB6, dhe PB7 të vendosur si kunja INPUT pasi ato kanë 0 në to, dhe PB5 është vendosur si një pin OUTPUT pasi kemi vënë një 1 në atë vend.

jashtë PortB, r16

Tani që kemi fiksuar drejtimet e kunjave tani mund të vendosim tensionet mbi to. Linja e mësipërme kopjon të njëjtin numër binar nga regjistri ynë i ruajtjes r16 në PortB. Kjo i vendos të gjitha kunjat në 0 volt përveç pinit PB5 në HIGH që është 5 volt.

Ushtrimi 2: Merrni një multimetër dixhital, lidhni plumbin e zi në tokë (GND) dhe më pas provoni secilën nga kunjat PB0 deri PB7 me plumbin e kuq. A janë tensionet në secilën prej kunjave saktësisht ato që korrespondojnë me vendosjen e 0b00100000 në PortB? Nëse ka ndonjë që nuk është, pse mendoni se është? (shiko hartën pin)

Fillo:

rjmp Fillimi

Së fundi, rreshti i parë më sipër është një "etiketë" e cila etiketon një vend në kod. Në këtë rast etiketimi i atij vendi si "Fillimi". Rreshti i dytë thotë "kërcim relativ në etiketën Start". Rezultati neto është që kompjuteri të vendoset në një lak të pafund që vetëm mban çiklizmin përsëri në Start. Ne kemi nevojë për këtë sepse nuk mund të kemi që programi sapo të përfundojë ose të bjerë nga një shkëmb, programi duhet të vazhdojë të funksionojë në mënyrë që drita të mbetet e ndezur.

Ushtrimi 3: Hiqni dy rreshtat e mësipërm nga kodi juaj në mënyrë që programi të bjerë nga një shkëmb. Cfare ndodh? Ju duhet të shihni diçka që duket si programi tradicional "blink" i përdorur nga Arduino si "përshëndetja e botës!". Pse mendoni se vepron në këtë mënyrë? (Mendoni se çfarë duhet të ndodhë kur programi bie nga një shkëmb …)

Hapi 5: Përfundimi

Nëse keni arritur deri këtu, urime! Tani mund të shkruani kodin e montimit, ta montoni dhe ta ngarkoni në mikrokontrolluesin tuaj.

Në këtë tutorial ju keni mësuar se si të përdorni komandat e mëposhtme:

ldi hregister, numri ngarkon një numër (0-255) në një regjistër të gjysmës së sipërme (16-31)

jashtë ioregister, regjistri kopjon një numër nga një regjistër pune në një regjistër I/O

Etiketa rjmp hidhet në linjën e programit të etiketuar me "etiketë" (e cila nuk mund të jetë më larg se 204 udhëzime larg - dmth kërcim relativ)

Tani që këto baza janë jashtë rrugës, ne mund të vazhdojmë të shkruajmë kod më interesant dhe qarqe dhe pajisje më interesante pa pasur nevojë të diskutojmë mekanikën e përpilimit dhe ngarkimit.

Shpresoj se ju ka pëlqyer ky mësim hyrës. Në tutorialin e ardhshëm ne do të shtojmë një komponent tjetër qarku (një buton) dhe do të zgjerojmë kodin tonë për të përfshirë portet hyrëse dhe vendimet.