Kazalo:

AVR Assembler Tutorial 1: 5 Koraki
AVR Assembler Tutorial 1: 5 Koraki

Video: AVR Assembler Tutorial 1: 5 Koraki

Video: AVR Assembler Tutorial 1: 5 Koraki
Video: AVR Ассемблер. Урок 1. Вводный. AVR Assembler. Lesson 1. Promo. 2024, Julij
Anonim
Vadnica za sestavljalec AVR 1
Vadnica za sestavljalec AVR 1

Odločil sem se, da bom napisal vrsto vaj o tem, kako napisati programe za montažni jezik za Atmega328p, ki je mikrokrmilnik, ki se uporablja v Arduinu. Če bodo ljudje še naprej zainteresirani, bom še naprej delal eno tedensko, dokler mi ne zmanjka prostega časa, sicer jih ljudje ne bodo več brali.

Uporabljam Arch linux in delam na atmega328p-pu, ki je nastavljen na plošči. To lahko storite na enak način kot jaz ali pa preprosto priključite arduino v računalnik in tako delate na mikrokrmilniku.

Pisali bomo programe za 328p, kot je tisti v večini arduinov, vendar upoštevajte, da bodo ti isti programi in tehnike delovali tudi za kateri koli od mikrokrmilnikov Atmel, kasneje pa bomo (če obstaja interes) sodelovali z nekaterimi tudi ostale. Podrobnosti o mikrokrmilniku najdete v podatkovnih listih podjetja Atmel in v priročniku z navodili. Prilagam jih temu navodilu.

Tukaj boste potrebovali:

1. Okvir

2. Arduino ali samo mikrokrmilnik

3. Računalnik z operacijskim sistemom Linux

4. Sestavljalec avra z uporabo git: git clone https://github.com/Ro5bert/avra.git ali če uporabljate ubuntu ali sistem, ki temelji na debianu, samo vnesite "sudo apt install avra" in dobili boste asembler avr in avrdude. KADAR pa najnovejšo različico dobite z githubom, boste dobili tudi vse potrebne datoteke za vključitev, z drugimi besedami, že ima datoteke m328Pdef.inc in tn85def.inc.

5. avrdude

Celoten sklop mojih vadnic za sestavljalec AVR najdete tukaj:

1. korak: Zgradite preskusno ploščo

Zgradite preskusno tablo
Zgradite preskusno tablo

Lahko preprosto uporabite svoj arduino in po želji naredite vse v teh vadnicah. Ker pa govorimo o kodiranju v montažnem jeziku, je naša filozofija sama po sebi odstraniti vse periferne elemente in neposredno komunicirati s samim mikrokrmilnikom. Torej se vam ne zdi, da bi bilo tako bolj zabavno?

Za tiste, ki se strinjate, lahko mikrokrmilnik izvlečete iz svojega arduina in nato začnete z izdelavo "Breadboard Arduino", tako da sledite navodilom tukaj:

Na sliki prikazujem svojo nastavitev, ki je sestavljena iz dveh samostojnih Atmega328p na veliki plošči (želim, da bi bila prejšnja vadnica povezana in naložena na en mikrokrmilnik, medtem ko delam na naslednji). Napajalnik imam nastavljen tako, da je zgornja tirnica 9V, vse ostale pa 5V od regulatorja napetosti. Za programiranje čipov uporabljam tudi odklopno ploščo FT232R. Kupil sem jih in jim naložil zagonske nalagalnike, če pa ste enega izvlekli iz Arduina, je že v redu.

Upoštevajte, da če to poskušate z ATtiny85, lahko preprosto dobite Sparkfun Tiny Programmer tukaj: https://www.sparkfun.com/products/11801# in ga preprosto priključite v vrata USB na vašem računalniku. Najprej boste morali namestiti zagonski nalagalnik na Attiny85, najlažji način pa je samo uporaba Arduino IDE. Vendar boste morali klikniti datoteko in nastavitve ter nato dodati ta URL novih plošč: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json, ki bo omogoča namestitev zagonskega nalagalnika (če vaš ATtiny85 še ni bil priložen.)

2. korak: Namestite Assembler in Avrdude

Zdaj lahko prenesete in namestite asembler in avrdude s povezav, navedenih na prvem koraku te vadnice. Če ste že delali z Arduinom, imate verjetno nameščen avrdude.

Ko namestite avro, boste opazili, da je z njim podimenik, imenovan "viri", in znotraj tega imenika je kup vključujočih datotek. To so vsi mikrokrmilniki, ki jih lahko programirate z avro. Takoj boste opazili, da tukaj ni datoteke za 328p, ki jo uporabljamo. Priložil sem eno. Datoteko bi morali imenovati m328Pdef.inc in jo vstaviti v imenik include ali kamor koli drugam. To bomo vključili v naše programe za montažni jezik. Vse to naredi, da vsakemu registru v mikrokrmilniku da imena iz podatkovnega lista, tako da nam ni treba uporabljati njihovih heksadecimalnih imen. Zgornja datoteka vključuje "pragma direktive", saj je bila zasnovana za programiranje C in C ++. Če se naveličate videti, da sestavljalec izpljune pritožbe glede "ignoriranja direktive pragme", pojdite v datoteko in izbrišite ali komentirajte vse vrstice, ki se začnejo z #pragma

V redu, zdaj, ko imate pripravljen mikrokrmilnik, pripravljen asembler in programer, lahko napišemo prvi program.

Opomba: Če namesto ATmega328P uporabljate ATtiny85, potem potrebujete drugo datoteko za vključitev, imenovano tn85def.inc. Priložil ga bom tudi (upoštevajte, da sem ga moral poklicati tn85def.inc.txt, da bi mi Instructables omogočil, da ga naložim.) KADARkoli, če ste dobili asembler avra iz github -a, imate obe datoteki z njim. Zato priporočam, da ga dobite in sestavite sami: git clone

3. korak: Pozdravljeni svet

Cilj te prve vadnice je izdelati standardni prvi program, ki ga napišete pri učenju katerega koli novega jezika ali raziskovanju katere koli nove elektronske platforme. "Pozdravljen, svet!." V našem primeru preprosto želimo napisati program za montažni jezik, ga sestaviti in naložiti na svoj mikrokrmilnik. Program bo prižgal LED. Povzročiti, da LED utripa, kot to počnejo pri običajnem programu Arduino hello world, je pravzaprav veliko bolj zapleten program v zbirnem jeziku, zato tega še ne bomo storili. Napisali bomo najpreprostejšo kodo "golih kosti" z minimalnimi nepotrebnimi dlačicami.

Najprej priključite LED iz PB5 (glejte diagram izklopa), ki se na arduinu imenuje tudi Digital Out 13, na 220 ohmski upor, nato na GND. Tj.

PB5 - LED - R (220 ohm) - GND

Zdaj za pisanje programa. Odprite svoj najljubši urejevalnik besedil in ustvarite datoteko z imenom "hello.asm"

; zdravo.asm

; prižge LED, ki je priključen na PB5 (digitalni izhod 13).vključite "./m328Pdef.inc" ldi r16, 0b00100000 izhod DDRB, r16 izhod PortB, r16 Začetek: rjmp Start

Zgoraj je koda. Čez minuto ga bomo pregledali po vrsti, vendar najprej poskrbimo, da lahko deluje na vaši napravi.

Ko ustvarite datoteko, jo v terminalu sestavite na naslednji način:

avra zdravo.asm

to bo zbralo vašo kodo in ustvarilo datoteko, imenovano hello.hex, ki jo lahko naložimo na naslednji način:

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

če uporabljate arduino s ploščico, boste morali pritisniti gumb za ponastavitev na plošči arduino tik pred izvedbo zgornjega ukaza. Upoštevajte, da boste morda morali dodati sudo spredaj ali ga izvesti kot root. Upoštevajte tudi, da boste pri nekaterih arduinih (kot je Arduino UNO) verjetno morali spremeniti bitno hitrost na -b 115200 in vrata -P /dev /ttyACM0 (če od avrdude dobite napako glede neveljavnega podpisa naprave, samo dodajte - F do ukaza)

Če je vse delovalo, kot bi moralo, bo zdaj prižgana LED dioda ….. "Pozdravljeni svet!"

Če uporabljate ATtiny85, bo ukaz avrdude naslednji:

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

4. korak: Hello.asm Line-by-line

Za zaključek te uvodne vadnice bomo po vrstici pogledali program hello.asm, da vidimo, kako deluje.

; zdravo.asm

; prižge LED, ki je priključen na PB5 (digitalni izhod 13)

Asembler ignorira vse po podpičju, zato sta ti prvi dve vrstici preprosto "komentarji", ki pojasnjujejo, kaj program počne.

.include "./m328Pdef.inc"

Ta vrstica pove asemblerju, naj vključi datoteko m328Pdef.inc, ki ste jo prenesli. Morda boste želeli to postaviti v imenik s podobnimi datotekami za vključitev in nato spremeniti zgornjo vrstico tako, da kaže nanjo.

ldi r16, 0b00100000

ldi pomeni "nalaganje takoj" in pove asemblerju, naj vzame delovni register, v tem primeru r16 in vanj naloži binarno število, v tem primeru 0b00100000. 0b spredaj pravi, da je naša številka v binarnem sistemu. Če bi želeli, bi lahko izbrali drugo osnovo, na primer heksidecimalno. V tem primeru bi bilo naše število 0x20, kar je heksidecimalno za 0b00100000. Ali pa bi lahko uporabili 32, ki je osnova 10 decimalk za isto število.

Vaja 1: Poskusite spremeniti številko v zgornji vrstici v heksidecimalno in nato v decimalno kodo ter preverite, ali še vedno deluje v vsakem primeru.

Uporaba binarnih datotek je zaradi načina delovanja vrat in registrov najpreprostejša. O vratih in registrih atmega328p bomo podrobneje razpravljali v prihodnjih vadnicah, za zdaj pa bom samo navedel, da r16 uporabljamo kot "delovni register", kar pomeni, da ga bomo uporabljali samo kot spremenljivko, ki jo shranimo številke. "Register" je niz 8 bitov. Pomeni 8 mest, ki so lahko 0 ali 1 ("izključeno" ali "vklopljeno"). Ko v zgornjo vrstico naložimo binarno številko 0b00100000 v register, smo to številko preprosto shranili v register r16.

izhod DDRB, r16

Ta vrstica pove prevajalniku, naj kopira vsebino registra r16 v register DDRB. DDRB pomeni "Register smeri podatkov B" in nastavi "zatiče" na PortB. Na zemljevidu izpisov za 328p lahko vidite, da je 8 zatičev z oznako PB0, PB1,…, PB7. Ti zatiči predstavljajo "bite" "PortB" in ko naložimo binarno številko 00100000 v register DDRB, pravimo, da želimo, da so PB0, PB1, PB2, PB3, PB4, PB6 in PB7 nastavljeni kot vhodi INPUT, saj imajo 0 je v njih, PB5 pa je nastavljen kot izhodni pin, saj smo na to mesto postavili 1.

izhod PortB, r16

Zdaj, ko smo določili smeri zatičev, lahko na njih nastavimo napetosti. Zgornja vrstica kopira isto binarno številko iz našega pomnilniškega registra r16 v PortB. S tem nastavite vse nožice na 0 voltov, razen čena PB5 na VISOKO, kar je 5 voltov.

Vaja 2: Vzemite digitalni multimeter, priključite črni kabel v ozemljitev (GND) in nato vsak od zatičev PB0 do PB7 preizkusite z rdečim kablom. Ali so napetosti na vsakem zatiču natančno tiste, ki ustrezajo postavitvi 0b00100000 v PortB? Če obstajajo takšni, ki niso, zakaj mislite, da je tako? (glej zemljevid pin)

Začetek:

rjmp Start

Končno je prva vrstica zgoraj "oznaka", ki označuje mesto v kodi. V tem primeru označite to mesto kot "Start". Druga vrstica pravi "relativni skok na oznako Start". Neto rezultat je, da je računalnik postavljen v neskončno zanko, ki se kar vrti nazaj na Start. To potrebujemo, ker ne moremo imeti programa, ki bi se lahko končal ali pa padel s pečine, program pa mora še naprej teči, da luč ostane prižgana.

Vaja 3: Odstranite zgornji dve vrstici iz kode, tako da program pade s pečine. Kar se zgodi? Videti bi morali nekaj, kar je videti kot tradicionalni "utripajoči" program, ki ga Arduino uporablja kot "svet zdravo!". Zakaj mislite, da deluje tako? (Pomislite, kaj se mora zgoditi, ko program pade s pečine …)

5. korak: Zaključek

Če ste prišli tako daleč, potem čestitam! Zdaj lahko napišete montažno kodo, jo sestavite in naložite na svoj mikrokrmilnik.

V tej vadnici ste se naučili uporabljati naslednje ukaze:

ldi hregister, številka naloži številko (0-255) v zgornjo polovico registra (16-31)

iz ioregistra, register kopira številko iz delovnega registra v I/O register

Oznaka rjmp skoči v vrstico programa z oznako "label" (ki ne sme biti oddaljena več kot 204 navodil - to je relativni skok)

Zdaj, ko teh osnov ni več, lahko nadaljujemo s pisanjem zanimivejše kode ter bolj zanimivih vezij in naprav, ne da bi morali razpravljati o mehaniki sestavljanja in nalaganja.

Upam, da ste uživali v tej uvodni vadnici. V naslednji vadnici bomo dodali še eno komponento vezja (gumb) in razširili našo kodo na vhodna vrata in odločitve.

Priporočena: