Sadržaj:

AVR asemblerski vodič 1: 5 koraka
AVR asemblerski vodič 1: 5 koraka

Video: AVR asemblerski vodič 1: 5 koraka

Video: AVR asemblerski vodič 1: 5 koraka
Video: Автомобильный генератор для генератора с самовозбуждением с использованием ДИОДА 2024, Juli
Anonim
Vodič za AVR asembler 1
Vodič za AVR asembler 1

Odlučio sam napisati niz vodiča o tome kako napisati programe na asemblerskom jeziku za Atmega328p koji je mikrokontroler koji se koristi u Arduinu. Ako ljudi budu i dalje zainteresirani, nastavit ću ih izdavati tjedno ili otprilike sve dok mi ne ponestane slobodnog vremena ili ih ljudi prestanu čitati.

Pokrećem Arch linux i radim na atmega328p-pu postavljenom na matičnoj ploči. To možete učiniti na isti način kao ja ili jednostavno možete priključiti arduino na svoje računalo i na taj način raditi na mikrokontroleru.

Pisaćemo programe za 328p poput onog koji je u većini arduino -a, ali imajte na umu da će ti isti programi i tehnike raditi i za bilo koji od mikrokontrolera Atmel, a kasnije ćemo (ako postoji interes) raditi s nekim od i ostale takođe. Pojedinosti o mikrokontroleru mogu se pronaći u Atmel tehničkim listovima i priručniku s uputama. Prilažem ih ovom uputstvu.

Evo šta će vam trebati:

1. Matična ploča

2. Arduino ili samo mikrokontroler

3. Računar sa Linuxom

4. Avra asembler koji koristi git: git clone https://github.com/Ro5bert/avra.git ili ako koristite ubuntu ili sistem zasnovan na debianu samo upišite "sudo apt install avra" i dobit ćete oba avr asemblera i avrdude. U svakom slučaju, ako dobijete najnoviju verziju koristeći github, dobit ćete i sve potrebne datoteke za uključivanje, drugim riječima već sadrži datoteke m328Pdef.inc i tn85def.inc.

5. avrdude

Kompletan set mojih AVR asemblerskih vodiča možete pronaći ovdje:

Korak 1: Izgradite ispitnu ploču

Napravite ispitnu ploču
Napravite ispitnu ploču

Možete jednostavno koristiti svoj arduino i učiniti sve u ovim vodičima ako želite. Međutim, budući da govorimo o kodiranju na asemblerskom jeziku, naša filozofija je inherentno uklanjanje svih perifernih uređaja i direktna interakcija sa samim mikrokontrolerom. Pa zar ne mislite da bi bilo zabavnije to učiniti na taj način?

Za one od vas koji se slažu, možete izvući mikrokontroler iz svog arduina, a zatim započeti s konstruiranjem "Breadboard Arduina" slijedeći upute ovdje:

Na slici pokazujem svoje postavljanje koje se sastoji od dva samostalna Atmega328p -a na velikoj ploči (želim da mogu držati prethodno uputstvo ožičeno i učitano na jedan mikrokontroler dok radim na sljedećem). Napajanje sam postavio tako da je gornja šina 9V, a sve ostale 5V od regulatora napona. Za programiranje čipova koristim i probojnu ploču FT232R. Kupio sam ih i sam im stavio bootloader, ali ako ste upravo izvukli jedan iz Arduina, već je u redu.

Imajte na umu da ako ovo pokušavate s ATtiny85, tada možete jednostavno nabaviti Sparkfun Tiny Programmer ovdje: https://www.sparkfun.com/products/11801#, a zatim ga jednostavno priključiti u USB priključak na računaru. Morat ćete prvo instalirati pokretački program na Attiny85, a najjednostavniji način je samo koristiti Arduino IDE. Međutim, morat ćete kliknuti na datoteku i postavke, a zatim dodati ovaj URL novih ploča: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json koji će omogućuju vam da instalirate pokretački program (ako vaš ATtiny85 već nije isporučen s njim.)

Korak 2: Instalirajte Assembler i Avrdude

Sada možete preuzeti i instalirati asembler i avrdude s veza navedenih u prvom koraku ovog vodiča. Ako ste već radili s Arduinom, vjerojatno je da ste već instalirali avrdude.

Nakon što instalirate avra primijetit ćete da postoji poddirektorij koji dolazi s njim nazvan "izvori", a unutar tog direktorija nalazi se hrpa datoteka za uključivanje. Ovo su svi mikrokontroleri koje možete programirati s avrom. Odmah ćete primijetiti da ne postoji datoteka za 328p koju ovdje koristimo. Priložio sam jednu. Datoteka bi se trebala zvati m328Pdef.inc i trebali biste je umetnuti u direktorij include ili bilo gdje drugo što želite. Uključićemo ga u naše programe za skupštinski jezik. Sve ovo daje svakom registru u mikrokontroleru imena iz podatkovne tablice kako ne bismo morali koristiti njihova heksidecimalna imena. Gornja datoteka za uključivanje sadrži "pragma direktive" budući da je dizajnirana za programiranje na C i C ++. Ako vam je dosadilo gledati asemblera kako izbacuje žalbe "ignorirajući direktivu pragme", samo idite u datoteku i izbrišite ili komentirajte sve retke koji počinju s #pragma

U redu, sad kad imate spreman mikrokontroler, spreman asembler i programer, možemo napisati naš prvi program.

Napomena: Ako koristite ATtiny85 umjesto ATmega328P, tada vam je potrebna druga datoteka uključivanja pod nazivom tn85def.inc. Priložit ću ga i (imajte na umu da sam ga morao nazvati tn85def.inc.txt kako bi mi Instructables omogućio da ga učitam.) U svakom slučaju, ako ste dobili asembler avra od github -a, onda već imate obje ove datoteke s njim. Zato preporučujem da ga nabavite i sami sastavite: git clone

Korak 3: Pozdrav svijetu

Cilj ovog prvog vodiča je izgradnja standardnog prvog programa koji se piše pri učenju bilo kojeg novog jezika ili istraživanju bilo koje nove elektroničke platforme. "Zdravo svijete!." U našem slučaju jednostavno želimo napisati program za montažni jezik, sastaviti ga i učitati na naš mikrokontroler. Program će izazvati uključivanje LED diode. Izazivanje LED -a da "treperi" kao što to rade za normalni Arduino hello world program zapravo je mnogo složeniji program na asemblerskom jeziku, pa to još nećemo učiniti. Napisat ćemo najjednostavniji kod "golih kostiju" s minimalnim nepotrebnim dlačicama.

Prvo spojite LED sa PB5 (pogledajte dijagram pinout -a) koji se na arduinu naziva i Digital Out 13, na otpornik od 220 ohma, a zatim na GND. Tj.

PB5 - LED - R (220 ohma) - GND

Sada da napišem program. Otvorite svoj omiljeni uređivač teksta i stvorite datoteku pod nazivom "hello.asm"

; hello.asm

; uključuje LED diodu koja je spojena na PB5 (digitalni izlaz 13). Uključuje "./m328Pdef.inc" ldi r16, 0b00100000 izlaz DDRB, r16 izlaz PortB, r16 Start: rjmp Start

Gore je kôd. Proći ćemo kroz to liniju po liniju za minutu, ali prvo se uvjerimo da to možemo pokrenuti na vašem uređaju.

Nakon što ste stvorili datoteku, tada je u terminalu sastavljate na sljedeći način:

avra hello.asm

ovo će sastaviti vaš kôd i stvoriti datoteku pod nazivom hello.hex koju možemo prenijeti na sljedeći način:

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

ako koristite arduino za matičnu ploču, morat ćete pritisnuti gumb za poništavanje na arduinu za matičnu ploču neposredno prije nego što izvršite gornju naredbu. Imajte na umu da ćete možda morati dodati sudo ispred ili ga izvršiti kao root. Također imajte na umu da ćete na nekim arduinima (poput Arduino UNO -a) vjerojatno morati promijeniti brzinu prijenosa u -b 115200 i port -P /dev /ttyACM0 (ako dobijete grešku od avrdude u vezi s nevažećim potpisom uređaja, samo dodajte - F do naredbe)

Ako je sve radilo kako treba, sada će vam upaliti LED dioda ….. "Hello World!"

Ako koristite ATtiny85, naredba avrdude će biti:

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

Korak 4: Hello.asm Line-by-line

Da bismo završili ovaj uvodni vodič, proći ćemo kroz program hello.asm liniju po liniju da vidimo kako to funkcionira.

; hello.asm

; uključuje LED diodu koja je spojena na PB5 (digitalni izlaz 13)

Asembler zanemaruje sve iza točke sa zarezom, pa su stoga ove prve dvije linije jednostavno "komentari" koji objašnjavaju šta program radi.

.include "./m328Pdef.inc"

Ova linija govori asembleru da uključi datoteku m328Pdef.inc koju ste preuzeli. Možda ćete ovo htjeti staviti u direktorij sa sličnim datotekama za uključivanje, a zatim promijeniti gornji red tako da na njega ukazuje.

ldi r16, 0b00100000

ldi označava "trenutno učitavanje" i govori asembleru da uzme radni registar, r16 u ovom slučaju, i u njega učita binarni broj, 0b00100000 u ovom slučaju. 0b ispred kaže da je naš broj u binarnom obliku. Da smo htjeli mogli smo odabrati drugu bazu, poput heksidecimalne. U tom slučaju naš broj bi bio 0x20 što je heksidecimalno za 0b00100000. Ili smo mogli koristiti 32 što je osnovica 10 decimalnih mjesta za isti broj.

Vježba 1: Pokušajte promijeniti broj u gornjoj liniji u heksidecimalni, a zatim u decimalni u svom kodu i provjerite radi li i dalje u svakom slučaju.

Korištenje binarnih datoteka ipak je najjednostavnije zbog načina na koji portovi i registri rade. O portovima i registrima atmega328p razgovarat ćemo detaljnije u budućim vodičima, ali za sada ću samo navesti da koristimo r16 kao naš "radni registar", što znači da ćemo ga koristiti samo kao varijablu koju pohranjujemo brojevi u. "Registar" je skup od 8 bita. Znači 8 tačaka koje mogu biti 0 ili 1 (`isključeno 'ili' uključeno '). Kada učitavamo binarni broj 0b00100000 u registar koristeći gornju liniju, jednostavno smo taj broj pohranili u registar r16.

izlaz DDRB, r16

Ova linija govori kompajleru da kopira sadržaj registra r16 u DDRB registar. DDRB označava "Registar smjera podataka B" i postavlja "pinove" na PortB. Na mapi iscrtavanja za 328p možete vidjeti da postoji 8 pinova označenih sa PB0, PB1,…, PB7. Ovi pinovi predstavljaju "bitove" "PortB" i kada učitamo binarni broj 00100000 u DDRB registar govorimo da želimo da PB0, PB1, PB2, PB3, PB4, PB6 i PB7 budu postavljeni kao INPUT pinovi budući da imaju 0 je u njima, a PB5 je postavljen kao OUTPUT pin jer smo stavili 1 na to mjesto.

izlaz PortB, r16

Sada kada smo fiksirali smjerove pinova sada možemo postaviti napone na njima. Gornji red kopira isti binarni broj iz našeg skladišnog registra r16 u PortB. Ovo postavlja sve pinove na 0 volti osim pina PB5 na HIGH koji iznosi 5 volti.

Vježba 2: Uzmite digitalni multimetar, priključite crni kabel u uzemljenje (GND), a zatim testirajte svaki od pinova PB0 do PB7 s crvenim kabelom. Jesu li naponi na svakom pinu točno oni koji odgovaraju stavljanju 0b00100000 u PortB? Ako postoje neki koji nisu, zašto mislite da je to tako? (pogledajte pin kartu)

Početak:

rjmp Start

Konačno, prvi gornji red je "label" koji označava mjesto u kodu. U ovom slučaju označite to mjesto kao "Start". Druga linija kaže "relativni skok do oznake Start." Neto rezultat je da je računar smješten u beskonačnu petlju koja samo nastavlja da se vraća na početak. To nam je potrebno jer ne možemo program jednostavno završiti ili pasti s litice, program mora samo nastaviti raditi kako bi svjetlo ostalo upaljeno.

Vježba 3: Uklonite gornja dva retka iz koda tako da program padne s litice. Šta se dešava? Trebali biste vidjeti nešto što izgleda kao tradicionalni "blink" program koji Arduino koristi kao svoj "hello world!". Šta mislite zašto se ponaša na ovaj način? (Razmislite o tome šta se mora dogoditi kada program padne s litice …)

Korak 5: Zaključak

Ako ste dovde stigli, čestitam! Sada možete pisati sklopni kod, sastaviti ga i učitati na svoj mikrokontroler.

U ovom vodiču naučili ste kako koristiti sljedeće naredbe:

ldi hregister, broj učitava broj (0-255) u gornju polovinu registra (16-31)

iz ioregistra, register kopira broj iz radnog registra u I/O registar

etiketa rjmp prelazi na liniju programa označenu "label" (koja ne može biti udaljena više od 204 upute - tj. relativni skok)

Sada kada su ove osnove smetnje, možemo nastaviti pisati zanimljiviji kod i zanimljivija kola i uređaje bez potrebe za raspravljanjem o mehanici sastavljanja i učitavanja.

Nadam se da ste uživali u ovom uvodnom vodiču. U sljedećem vodiču ćemo dodati još jednu komponentu kola (dugme) i proširiti naš kôd tako da uključi ulazne portove i odluke.

Preporučuje se: