Sisukord:

AVR Assembleri õpetus 1: 5 sammu
AVR Assembleri õpetus 1: 5 sammu

Video: AVR Assembleri õpetus 1: 5 sammu

Video: AVR Assembleri õpetus 1: 5 sammu
Video: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Juuli
Anonim
AVR Assembleri õpetus 1
AVR Assembleri õpetus 1

Olen otsustanud kirjutada rea õpetusi, kuidas kirjutada koostamiskeele programme Atmega328p -le, mis on Arduinos kasutatav mikrokontroller. Kui inimesed jäävad huvitatud, jätkan nädal aega umbes nii kaua, kuni vaba aeg otsa saab või muidu inimesed ei loe neid.

Käitan Arch linuxit ja töötan leivalaual seadistatud atmega328p-pu kallal. Saate seda teha samamoodi nagu mina või lihtsalt ühendada arduino arvutiga ja töötada sel viisil mikrokontrolleri kallal.

Kirjutame programme 328p jaoks, nagu see on enamikus arduino programmides, kuid pidage meeles, et samad programmid ja tehnikad töötavad ka kõigi Atmeli mikrokontrollerite puhul ja hiljem (huvi korral) töötame mõne ka teised. Mikrokontrolleri üksikasjad leiate Atmeli andmelehtedelt ja kasutusjuhendist. Lisan need selle juhendi juurde.

Siin on vaja:

1. Leivalaud

2. Arduino või lihtsalt mikrokontroller

3. Linuxi kasutav arvuti

4. Avra assembler, kasutades git: git klooni https://github.com/Ro5bert/avra.git või kui kasutate ubuntut või debianil põhinevat süsteemi, sisestage lihtsalt "sudo apt install avra" ja saate nii avr assembleri ja avrdude. Siiski, kui saate uusima versiooni githubi abil, saate ka kõik vajalikud kaasamisfailid, teisisõnu, sellel on juba failid m328Pdef.inc ja tn85def.inc.

5. avrdude

Minu AVR-i komplekteerija õpetuste täieliku komplekti leiate siit:

Samm: koostage testimislaud

Ehitage testimislaud
Ehitage testimislaud

Soovi korral saate lihtsalt kasutada oma arduinot ja teha kõike, mis nendes õpetustes on. Kuna me räägime aga assamblee keeles kodeerimisest, on meie filosoofia olemuselt kõigi periferaalsete osade eemaldamine ja mikrokontrolleri endaga suhtlemine. Nii et kas sa ei arva, et seda oleks lõbusam teha?

Neile, kes nõustuvad, saate mikrokontrolleri arduinost välja tõmmata ja seejärel alustada "Arduino Breadboard" loomisega, järgides siin toodud juhiseid:

Pildil näitan oma seadistust, mis koosneb kahest eraldiseisvast Atmega328p -st suurel leivaplaadil (soovin, et saaksin eelmise õpetuse juhtmega ja ühe mikrokontrolleri peale laadituna hoida, kui töötan järgmisega). Mul on toiteallikas seadistatud nii, et kõige ülemine rööp on 9 V ja kõik ülejäänud on pingeregulaatorist 5 V. Kiipide programmeerimiseks kasutan ka FT232R breakout -plaati. Ostsin need ja panin neile alglaadurid peale, aga kui sa just ühe Arduinost välja tõmbasid, siis on see juba korras.

Pange tähele, et kui proovite seda ATtiny85 abil, saate Sparkfun Tiny Programmeri siit: https://www.sparkfun.com/products/11801# ja seejärel lihtsalt ühendage see oma arvuti USB -porti. Esmalt peate Attiny85 -sse installima alglaaduri ja lihtsaim viis on lihtsalt Arduino IDE kasutamine. Peate aga klõpsama failil ja eelistustel ning seejärel lisama selle uue tahvli URL-i: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json, mis võimaldab teil installida alglaaduri (kui teie ATtiny85 pole veel kaasas).

Samm: installige Assembler ja Avrdude

Nüüd saate kokkupanija ja avrdude alla laadida ja installida selle õpetuse esimesel etapil toodud linkidelt. On tõenäoline, et kui olete juba Arduino omaga koostööd teinud, siis on avrdude juba installitud.

Pärast avra installimist märkate, et sellega on kaasas alamkataloog nimega "allikad" ja selle kataloogi sees on hunnik kaasamisfaile. Need on kõik mikrokontrollerid, mida saate avra abil programmeerida. Märkate kohe, et siin kasutatava 328p jaoks pole ühtegi faili. Olen lisanud ühe. Faili nimi peaks olema m328Pdef.inc ja pange see kataloogi include või mujale, mis teile meeldib. Me kaasame selle oma koostamiskeele programmidesse. Kõik see annab andmelehelt kõik mikrokontrollerite nimedes olevad registrid, et me ei peaks kasutama nende kuueteistkümnendnimesid. Ülaltoodud fail sisaldab "pragma direktiive", kuna see oli mõeldud C ja C ++ programmeerimiseks. Kui olete väsinud nägema, kuidas kokkupanija sülitab välja pragma direktiivi ignoreerides, lähevad lihtsalt faili ja kustutavad või kommenteerivad kõik read, mis algavad #pragma

Olgu, nüüd, kui teil on mikrokontroller valmis, komplekteerija ja programmeerija valmis, saame kirjutada oma esimese programmi.

Märkus. Kui kasutate ATmega328P asemel ATtiny85, vajate te erinevat kaasamisfaili nimega tn85def.inc. Lisan ka selle (pange tähele, et pidin seda nimetama tn85def.inc.txt, et Instructables lubaks mul selle üles laadida.) Siiski, kui saite avra assembleri githubist, on teil mõlemad failid juba kaasas. Seega soovitan selle hankida ja ise koostada: git kloon

3. samm: Tere maailm

Selle esimese õpetuse eesmärk on luua standardne esimene programm, mis kirjutatakse uue keele õppimisel või uue elektroonikaplatvormi uurimisel. "Tere, Maailm!." Meie puhul tahame lihtsalt koostada koostamiskeele programmi, selle kokku panna ja oma mikrokontrollerile üles laadida. Programm süttib LED -i. LED -i "vilkuma" panemine nagu tavalise Arduino teremaailma programmi puhul on tegelikult koostamiskeeles palju keerulisem programm ja seega me seda veel ei tee. Kirjutame lihtsaima "paljaste luude" koodi minimaalse tarbetu kohevusega.

Esmalt ühendage PB5 -st LED (vt pinout -skeemi), mida nimetatakse ka digitaalseks väljundiks 13, arduino, 220 -oomise takistiga ja seejärel GND -ga. S.t.

PB5 - LED - R (220 oomi) - GND

Nüüd kirjutage programm. Avage oma lemmiktekstiredaktor ja looge fail nimega "hello.asm"

; tere. asm

; lülitab sisse LED -i, mis on ühendatud PB5 -ga (digitaalne väljund 13). kaasa arvatud.

Eespool on kood. Me läbime selle rida-realt minuti pärast, kuid kõigepealt veenduge, et saaksime selle teie seadmes tööle panna.

Pärast faili loomist monteerige see terminalis järgmiselt:

avra tere.asm

see paneb teie koodi kokku ja loob faili nimega hello.hex, mille saame üles laadida järgmiselt:

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U välklamp: w: tere.hex

kui kasutate leivaplaati arduino, peate vahetult enne ülaltoodud käsu täitmist vajutama leivalaua arduino lähtestamisnuppu. Pange tähele, et peate võib -olla lisama ka sudo ette või käivitama selle rootina. Pange tähele ka seda, et mõnel arduino seadmel (nt Arduino UNO) peate tõenäoliselt muutma bitikiiruse väärtuseks -b 115200 ja pordiks -P /dev /ttyACM0 (kui avrdude'ilt ilmneb viga seadme allkirja kohta, lisage lihtsalt - F käsule)

Kui kõik on toiminud nii nagu peab, süttib nüüd LED -tuli … "Tere maailm!"

Kui kasutate ATtiny85, on käsk avrdude järgmine:

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

Samm 4: Tere.asm Rida-realt

Selle sissejuhatava õpetuse lõpetamiseks vaatame rida-realt läbi programmi hello.asm, et näha, kuidas see toimib.

; tere. asm

; lülitab sisse LED, mis on ühendatud PB5 -ga (digitaalne väljund 13)

Monteerija ignoreerib kõike pärast semikoolonit ja seega on need kaks esimest rida lihtsalt "kommentaarid", mis selgitavad, mida programm teeb.

.include "./m328Pdef.inc"

See rida käsib monteerijal lisada allalaaditud fail m328Pdef.inc. Võib -olla soovite selle paigutada sarnaste kaasamisfailide kataloogi ja seejärel muuta ülaltoodud rida, et see sellele osutada.

ldi r16, 0b00100000

ldi tähistab "koheselt laadimist" ja käsib monteerijal võtta tööregister, antud juhul r16, ja laadida sinna kahendarv, 0b00100000. Ees olev 0b ütleb, et meie arv on binaarne. Kui oleksime tahtnud, oleksime võinud valida mõne muu aluse, näiteks heksadimaali. Sel juhul oleks meie arv olnud 0x20, mis on 0b00100000 puhul heksad. Või oleksime võinud sama numbri jaoks kasutada 32, mis on 10 kümnendkoha täpsusega.

Harjutus 1: proovige muuta ülaltoodud rea number kuueteistkümnendiks ja seejärel kümnendkohaks oma koodis ning veenduge, et see töötab igal juhul.

Binaaride kasutamine on aga portide ja registrite toimimisviisi tõttu kõige lihtsam. Me arutame tulevastes õpetustes üksikasjalikumalt atmega328p sadamaid ja registreid, kuid praegu ütlen lihtsalt, et kasutame r16 -d oma "tööregistrina", mis tähendab, et kasutame seda lihtsalt muutujana, mida me salvestame numbrid. "Register" on 8 -bitine komplekt. Tähendab 8 punkti, mis võivad olla kas 0 või 1 ("väljas" või "sees"). Kui laadime ülaltoodud rea abil registrisse kahendnumbri 0b00100000, oleme selle numbri lihtsalt registrisse r16 salvestanud.

välja DDRB, r16

See rida käsib kompilaatoril kopeerida registri r16 sisu DDRB registrisse. DDRB tähistab "Data Direction Register B" ja see seadistab "tihvtid" PortB -sse. 328p pinout -kaardil näete, et seal on 8 tihvti märgistusega PB0, PB1,…, PB7. Need nööpnõelad kujutavad endast porti "bitti" ja kui laadime kahendnumbri 00100000 DDRB registrisse, ütleme, et soovime, et PB0, PB1, PB2, PB3, PB4, PB6 ja PB7 oleks sisestatud tihvtidena, kuna need on Nendes on 0 -d ja PB5 on seatud VÄLJUNDI nööpnõelaks, kuna panime 1 sellesse kohta.

välja PortB, r16

Nüüd, kui oleme tihvtide suunad fikseerinud, saame nüüd neile pingeid määrata. Ülaltoodud rida kopeerib sama kahendnumbri meie salvestusregistrist r16 PortB -sse. See seab kõik tihvtid 0 -voldisele, välja arvatud tihvt PB5 väärtusele HIGH, mis on 5 volti.

Harjutus 2: Võtke digitaalne multimeeter, ühendage must juhe maasse (GND) ja seejärel katsetage punaste juhtmetega iga tihvti PB0 kuni PB7. Kas iga tihvti pinged vastavad täpselt 0B00100000 PortB -sse panemisele? Kui on neid, mida pole, siis miks see teie arvates on? (vt tihvtide kaarti)

Alusta:

rjmp Alusta

Lõpuks on ülaltoodud esimene rida "silt", mis märgistab koodi koha. Sel juhul märkige see koht "Start". Teine rida ütleb "suhteline hüpe sildile Start". Tulemuseks on see, et arvuti on paigutatud lõpmatusse ahelasse, mis hoiab jalgrattasõitu tagasi algusesse. Me vajame seda, sest me ei saa lasta programmil lihtsalt lõppeda või kaljult alla kukkuda, programm peab lihtsalt edasi töötama, et tuli jääks põlema.

Harjutus 3: eemaldage ülaltoodud kaks rida oma koodist, nii et programm kukuks kaljult alla. Mis juhtub? Te peaksite nägema midagi, mis näeb välja nagu traditsiooniline "vilkumisprogramm", mida Arduino kasutas oma "tere maailma!". Mis sa arvad, miks see nii toimib? (Mõelge, mis peab juhtuma, kui programm kukub kaljult alla …)

5. samm: järeldus

Kui olete nii kaugele jõudnud, siis palju õnne! Nüüd saate koostamiskoodi kirjutada, kokku panna ja oma mikrokontrollerile laadida.

Selles õpetuses olete õppinud kasutama järgmisi käske:

ldi hregister, number laadib arvu (0-255) ülemisse poolregistrisse (16-31)

ioregister, register kopeerib numbri tööregistrist I/O registrisse

rjmp silt hüppab programmi reale, mis on märgistatud sildiga (mis ei saa olla kaugemal kui 204 juhist - st suhteline hüpe)

Nüüd, kui need põhitõed on teelt väljas, saame jätkata huvitavama koodi ning huvitavamate vooluahelate ja seadmete kirjutamist, ilma et peaksime arutama koostamise ja üleslaadimise mehaanikat.

Loodan, et teile meeldis see sissejuhatav õpetus. Järgmises õpetuses lisame veel ühe vooluahela komponendi (nupu) ja laiendame oma koodi sisendportide ja otsuste lisamiseks.

Soovitan: