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, Srpanj
Anonim
Vodič za sastavljač AVR -a 1
Vodič za sastavljač AVR -a 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 ostanu zainteresirani, nastavit ću ih izdavati tjedno ili otprilike dok mi ne ponestane slobodnog vremena ili ih ljudi prestanu čitati.

Radim na Arch linux-u i radim na atmega328p-pu postavljenom na ploču. Možete to učiniti na isti način kao ja ili jednostavno priključiti arduino u svoje računalo i na taj način raditi na mikrokontroleru.

Mi ćemo pisati programe za 328p poput onog koji je u većini arduina, ali trebali biste imati 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. Pojedinosti o mikrokontroleru mogu se pronaći u podatkovnim listovima Atmel i priručniku s uputama. Prilažem ih ovom uputstvu.

Evo što će vam trebati:

1. Matična ploča

2. Arduino, ili samo mikrokontroler

3. Računalo s Linuxom

4. Asembler avra koji koristi git: git clone https://github.com/Ro5bert/avra.git ili ako koristite ubuntu ili sustav temeljen 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

Cijeli skup mojih AVR asemblerskih vodiča možete pronaći ovdje:

Korak 1: Izgradite ispitnu ploču

Izgradite ispitnu ploču
Izgradite 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 ukloniti sve periferne uređaje i izravno stupiti u interakciju sa samim mikrokontrolerom. Pa zar ne mislite da bi bilo zabavnije to učiniti na taj način?

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

Na slici prikazujem svoj set koji se sastoji od dva samostalna Atmega328p -a na velikoj ploči (želim da mogu držati prethodni vodič ožičenim i učitanim na jedan mikrokontroler dok radim na sljedećem). Napajanje sam postavio tako da je gornja tračnica 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čunalu. Morat ćete prvo instalirati bootloader 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ćiti vam instaliranje pokretačkog programa (ako vaš ATtiny85 već nije isporučen s njim.)

Korak 2: Instalirajte asembler i Avrdude

Sada možete preuzeti i instalirati asembler i avrdude s veza navedenih u prvom koraku ovog vodiča. Vjerojatno je da ako ste već radili s Arduinom, već imate instaliran 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 nema datoteke 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čit ćemo ga u naše programe za montažni jezik. Sve što to čini je dati svakom registru u mikrokontroleru imena iz podatkovnog lista kako ne bismo morali koristiti njihove heksadecimalne nazive. Gornja datoteka za uključivanje sadrži "pragma direktive" budući da je dizajnirana za programiranje na C i C ++. Ako vam je dosadilo vidjeti kako asembler ispituje ž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, 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 dopustio da ga učitam.) MEĐUTIM, 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. "Pozdrav svijete!." U našem slučaju jednostavno želimo napisati program za montažni jezik, sastaviti ga i prenijeti na naš mikrokontroler. Program će izazvati uključivanje LED diode. Izazivanje LED -a da "treperi" kao što to čini 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.

Najprije spojite LED s PB5 (pogledajte dijagram pinout -a) koji se također naziva Digital Out 13 na arduinu, 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"

; zdravo.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, zatim je u terminalu sastavite na sljedeći način:

avra zdravo.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 bljeskalica: 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 bitrate na -b 115200 i port -P /dev /ttyACM0 (ako dobijete pogrešku od avrdudea o neispravnom potpisu uređaja, samo dodajte - F do naredbe)

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

Ako koristite ATtiny85, naredba avrdude bit će:

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

Korak 4: Hello.asm Line-by-line

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

; zdravo.asm

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

Asembler zanemaruje sve iza točke sa zarezom, pa su stoga ova prva dva retka jednostavno "komentari" koji objašnjavaju što program radi.

.uključuje "./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 redak 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, u ovom slučaju 0b00100000. 0b ispred kaže da je naš broj u binarnom obliku. Da smo htjeli mogli smo odabrati drugu bazu, poput heksidecimalne. U tom bi slučaju naš broj bio 0x20 što je heksidecimalno za 0b00100000. Ili smo mogli upotrijebiti 32 što je osnovica 10 decimalnih mjesta za isti broj.

Vježba 1: Pokušajte promijeniti broj u gornjem retku 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 bitova. Znači 8 točaka koje mogu biti 0 ili 1 ("isključeno" ili "uključeno"). Kada učitamo binarni broj 0b00100000 u registar koristeći gornji redak, jednostavno smo taj broj pohranili u registar r16.

izlaz DDRB, r16

Ovaj redak govori prevoditelju da kopira sadržaj registra r16 u DDRB registar. DDRB označava "Registar smjera podataka B" i postavlja "pinove" na PortB. Na karti iscrtavanja za 328p možete vidjeti da postoji 8 pinova s oznakom 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 ULAZNI 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 redak kopira isti binarni broj iz našeg registra za pohranu r16 u PortB. Time se svi pinovi postavljaju 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 provjerite 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 redak je "oznaka" koja označava mjesto u kodu. U ovom slučaju označite to mjesto kao "Start". Drugi redak kaže "relativni skok do oznake Start". Neto rezultat je da je računalo smješteno u beskonačnu petlju koja se samo 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. Što se događa? Trebali biste vidjeti nešto što izgleda kao tradicionalni "blink" program koji Arduino koristi kao svoj "hello world!". Što mislite zašto se ponaša na ovaj način? (Razmislite o tome što se mora dogoditi kada program padne s litice …)

Korak 5: Zaključak

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

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

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

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

oznaka rjmp preskače u redak programa označen s "label" (koji ne može biti udaljen više od 204 upute - tj. relativni skok)

Sada kada su te 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 dodat ćemo drugu komponentu kruga (gumb) i proširiti naš kôd tako da uključi ulazne portove i odluke.

Preporučeni: