Obsah:

AVR Assembler Tutorial 1: 5 Steps
AVR Assembler Tutorial 1: 5 Steps

Video: AVR Assembler Tutorial 1: 5 Steps

Video: AVR Assembler Tutorial 1: 5 Steps
Video: AVR Assembly Tutorial: Part 1 (Basic Commands) 2024, November
Anonim
Výučba montéra AVR 1
Výučba montéra AVR 1

Rozhodol som sa napísať sériu návodov, ako napísať programy v montážnom jazyku pre Atmega328p, čo je mikrokontrolér používaný v Arduine. Ak budú mať ľudia naďalej záujem, budem pokračovať v vydávaní jedného týždenne alebo tak, kým mi nedôjde voľný čas, alebo ich ľudia prestanú čítať.

Používam Arch linux a pracujem na atmega328p-pu nastavenom na doske. Môžete to urobiť rovnako ako ja alebo jednoducho arduino zapojíte do počítača a budete tak pracovať na mikrokontroléri.

Budeme písať programy pre 328p, ako je ten, ktorý je vo väčšine arduinov, ale mali by ste si uvedomiť, že rovnaké programy a techniky budú fungovať aj pre ktorýkoľvek z mikrokontrolérov Atmel a neskôr (ak bude záujem) budeme pracovať s niektorými aj tí druhí. Podrobnosti o mikrokontroléri nájdete v údajových listoch spoločnosti Atmel a v návode na použitie. Pripájam ich k tomuto pokynu.

Čo budete potrebovať:

1. Doska na chlieb

2. Arduino alebo len mikrokontrolér

3. Počítač so systémom Linux

4. Asembler avra pomocou git: git clone https://github.com/Ro5bert/avra.git alebo ak používate systém založený na ubuntu alebo debian, stačí napísať „sudo apt install avra“a dostanete aj avr assembler a horlivosť. VŠAK, ak získate najnovšiu verziu pomocou programu github, získate tiež všetky potrebné súbory na zahrnutie, inými slovami, už obsahuje súbory m328Pdef.inc a tn85def.inc.

5. avrdude

Kompletnú sadu svojich návodov k assembleru AVR nájdete tu:

Krok 1: Zostavte testovaciu komisiu

Zostavte testovaciu komisiu
Zostavte testovaciu komisiu

Môžete jednoducho použiť svoje arduino a robiť všetko, čo je v týchto návodoch k dispozícii, ak sa vám páči. Pretože však hovoríme o kódovaní v montážnom jazyku, našou filozofiou je v zásade odstrániť všetky periférie a interagovať priamo so samotným mikrokontrolérom. Nemyslíte si teda, že by bolo zábavnejšie to takto robiť?

Tí z vás, ktorí súhlasia, môžu vytiahnuť mikrokontrolér zo svojho arduina a potom začať zostrojením „Breadboard Arduino“podľa týchto pokynov:

Na obrázku ukazujem svoje nastavenie, ktoré pozostáva z dvoch samostatných Atmega328p na veľkej doske (chcem, aby bol predchádzajúci tutoriál ponechaný zapojený a načítaný na jednom mikrokontroléri pri práci na ďalšom). Napájanie mám nastavené tak, že úplne horná lišta je 9V a všetky ostatné sú 5V od regulátora napätia. Na programovanie čipov používam aj oddeľovaciu dosku FT232R. Kúpil som ich a sám som na ne položil bootloadery, ale ak ste práve vytiahli jeden z Arduina, je to už v poriadku.

Všimnite si toho, že ak to skúšate s ATtiny85, môžete jednoducho získať programátor Sparkfun Tiny tu: https://www.sparkfun.com/products/11801# a potom ho jednoducho zapojiť do USB portu na vašom počítači. Na Attiny85 budete musieť najskôr nainštalovať bootloader a najľahšie je použiť Arduino IDE. Budete však musieť kliknúť na súbor a predvoľby a potom pridať túto adresu URL nových dosiek: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json, ktorá vám umožní nainštalovať bootloader (ak ho váš ATtiny85 ešte nedodal.)

Krok 2: Nainštalujte Assembler a Avrdude

Teraz si môžete stiahnuť a nainštalovať assembler a avrdude z odkazov uvedených v prvom kroku tohto tutoriálu. Je pravdepodobné, že ak ste už pracovali s Arduino, máte už avrdude nainštalovaný.

Po nainštalovaní programu avra si všimnete, že existuje podadresár s názvom „zdroje“a v tomto adresári sa nachádza množstvo súborov na zahrnutie. Toto sú všetky mikrokontroléry, ktoré môžete programovať pomocou programu avra. Hneď si všimnete, že pre 328p, ktorý tu používame, neexistuje žiadny súbor. Prikladám jeden. Súbor by sa mal volať m328Pdef.inc a mali by ste ho vložiť do adresára includes alebo kamkoľvek chcete. Zaradíme ho do našich jazykových jazykov montáže. Všetko, čo urobí, je dať každému z registrov v názvoch mikrokontrolérov z dátového listu, aby sme nemuseli používať ich hexadecimálne názvy. Vyššie uvedený súbor obsahuje „pragma direktívy“, pretože bol navrhnutý pre programovanie v C a C ++. Ak vás už unavuje vidieť, ako assembler chrlí sťažnosti na „ignorovanie smernice pragma“, choďte do súboru a vymažte alebo komentujte všetky riadky začínajúce na #pragma

Dobre, teraz, keď máte pripravený mikrokontrolér, zostavovač a programátor, môžeme napísať náš prvý program.

Poznámka: Ak používate ATtiny85 namiesto ATmega328P, potrebujete iný zahrňovací súbor s názvom tn85def.inc. Tiež ho priložím (všimol som si, že som ho musel nazvať tn85def.inc.txt, aby mi to Instructables umožnilo nahrať.) Ak ste však získali avra assembler z githubu, už s ním máte oba tieto súbory. Odporúčam teda zaobstarať si ho a zostaviť sám: git clone

Krok 3: Hello World

Cieľom tohto prvého tutoriálu je vytvoriť štandardný prvý program, ktorý píšete pri učení sa akéhokoľvek nového jazyka alebo pri skúmaní akejkoľvek novej platformy elektroniky. „Ahoj, svet!“V našom prípade jednoducho chceme napísať program v montážnom jazyku, zostaviť ho a nahrať do nášho mikrokontroléra. Program spôsobí rozsvietenie LED diódy. Spôsobiť „blikanie“diódy LED ako v prípade bežného svetového programu Arduino ahoj je v skutočnosti oveľa komplikovanejší program v montážnom jazyku, a tak to zatiaľ neurobíme. Chystáme sa napísať najjednoduchší kód „holých kostí“s minimálnym zbytočným nadýchaním.

Najprv pripojte LED diódu z PB5 (pozri diagram pinov), ktorá sa nazýva aj Digital Out 13 na arduine, k odporu 220 ohmov, potom k GND. Tj.

PB5 - LED - R (220 ohmov) - GND

Teraz napíšte program. Otvorte svoj obľúbený textový editor a vytvorte súbor s názvom „hello.asm“

; ahoj.asm

; zapne LED diódu, ktorá je pripojená k PB5 (digitálny výstup 13). zahrnúť "./m328Pdef.inc" ldi r16, 0b00100000 výstup DDRB, r16 výstup PortB, r16 Štart: rjmp Štart

Vyššie je kód. Prejdeme to riadkom po riadku za minútu, ale najskôr sa uistite, že to bude fungovať na vašom zariadení.

Po vytvorení súboru ho v termináli zostavíte takto:

avra ahoj.asm

toto zhromaždí váš kód a vytvorí súbor s názvom hello.hex, ktorý môžeme nahrať nasledovne:

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

Ak používate arduino na breadboarde, budete musieť stlačiť tlačidlo reset na arduino na breadboarde tesne pred vykonaním vyššie uvedeného príkazu. Všimnite si toho, že budete musieť tiež pridať sudo dopredu alebo ho spustiť ako root. Všimnite si tiež, že na niektorých arduinách (ako Arduino UNO) budete pravdepodobne musieť zmeniť bitovú rýchlosť na -b 115200 a port -P /dev /ttyACM0 (ak sa vám zobrazí chyba od avrdude o neplatnom podpise zariadenia, stačí pridať - F na príkaz)

Ak všetko funguje tak, ako má, teraz sa vám rozsvieti LED dióda ….. „Ahoj, svet!“

Ak používate ATtiny85, príkaz avrdude bude:

avrdude -p attiny85 -c usbtiny -U blesk: w: ahoj.hex

Krok 4: Hello.asm Riadok po riadku

Na záver tohto úvodného tutoriálu si prejdeme program hello.asm po riadkoch, aby sme zistili, ako funguje.

; ahoj.asm

; rozsvieti LED diódu, ktorá je pripojená k PB5 (digitálny výstup 13)

Zostavovateľ ignoruje všetko za bodkočiarkou, a preto sú tieto prvé dva riadky jednoducho „komentáre“vysvetľujúce, čo program robí.

.include "./m328Pdef.inc"

Tento riadok hovorí assembleru, aby zahrnul súbor m328Pdef.inc, ktorý ste stiahli. Možno to budete chcieť vložiť do adresára podobných súborov na zahrnutie a potom zmeniť vyššie uvedený riadok tak, aby naň ukázal.

ldi r16, 0b00100000

ldi znamená „okamžité načítanie“a hovorí montérovi, aby vzal pracovný register, v tomto prípade r16, a načítal doň binárne číslo, v tomto prípade 0b00100000. 0b vpredu hovorí, že naše číslo je v binárnom čísle. Ak by sme chceli, mohli by sme zvoliť inú bázu, ako je hexadecimálna. V takom prípade by naše číslo bolo 0x20, čo je hexadecimálne číslo pre 0b00100000. Alebo sme pre rovnaké číslo mohli použiť 32, čo je základ 10 desatinných miest.

Cvičenie 1: Skúste vo svojom kóde zmeniť číslo v hornom riadku na hexadecimálne a potom na desatinné miesto a overte, či v každom prípade stále funguje.

Použitie binárnych súborov je najjednoduchšie kvôli spôsobu, akým fungujú porty a registre. V ďalších tutoriáloch budeme podrobnejšie diskutovať o portoch a registroch atmega328p, ale zatiaľ len uvediem, že ako svoj „pracovný register“používame r16, čo znamená, že ho budeme používať iba ako premennú, ktorú ukladáme čísla v. „Register“je sada 8 bitov. To znamená 8 miest, ktoré môžu byť buď 0 alebo 1 („vypnuté“alebo „zapnuté“). Keď načítame binárne číslo 0b00100000 do registra pomocou vyššie uvedeného riadku, toto číslo sme jednoducho uložili do registra r16.

von DDRB, r16

Tento riadok hovorí kompilátoru, aby skopíroval obsah registra r16 do registra DDRB. DDRB je skratka pre „Data Direction Register B“a nastavuje „piny“na PortB. Na mape vývodov pre 328p vidíte, že existuje 8 pinov označených PB0, PB1, …, PB7. Tieto piny predstavujú „bity“„PortB“a keď načítame binárne číslo 00100000 do registra DDRB, hovoríme, že chceme, aby boli PB0, PB1, PB2, PB3, PB4, PB6 a PB7 nastavené ako VSTUPNÉ piny, pretože majú Majú 0 a PB5 je nastavený ako VÝSTUPNÝ pin, pretože na toto miesto dáme 1.

von PortB, r16

Teraz, keď sme určili smer kolíkov, teraz na nich môžeme nastaviť napätie. Vyššie uvedený riadok kopíruje rovnaké binárne číslo z nášho úložného registra r16 do PortB. Tým sa všetky piny nastavia na 0 voltov okrem pinu PB5 na HIGH, čo je 5 voltov.

Cvičenie 2: Vezmite digitálny multimeter, zapojte čierny vodič do zeme (GND) a potom otestujte každý z pinov PB0 až PB7 s červeným káblom. Zodpovedajú napätia na každom z kolíkov napätiu 0b00100000 v PortB? Ak existujú nejaké, ktoré nie sú, prečo si to myslíte? (pozri mapu špendlíkov)

Začiatok:

rjmp Štart

Nakoniec, prvý riadok vyššie je „štítok“, ktorý označuje miesto v kóde. V takom prípade označte toto miesto ako „Štart“. Druhý riadok hovorí „relatívny skok na štítok Štart“. Čistým výsledkom je, že počítač je umiestnený do nekonečnej slučky, ktorá sa neustále vracia na štart. Potrebujeme to, pretože nemôžeme nechať program len skončiť alebo spadnúť z útesu, program musí iba bežať, aby svetlo zostalo rozsvietené.

Cvičenie 3: Odstráňte vyššie uvedené dva riadky z kódu, aby program spadol z útesu. Čo sa stane? Mali by ste vidieť niečo, čo vyzerá ako tradičný program „blink“, ktorý používa Arduino ako „ahoj svet!“. Prečo si myslíte, že to takto funguje? (Zamyslite sa nad tým, čo sa musí stať, keď program spadne z útesu …)

Krok 5: Záver

Ak ste sa dostali až sem, gratulujeme! Teraz môžete písať kód zostavy, zostavovať ho a načítať do svojho mikrokontroléra.

V tomto návode ste sa naučili používať nasledujúce príkazy:

ldi hregister, číslo načíta číslo (0-255) do registra hornej polovice (16-31)

mimo registra, register skopíruje číslo z pracovného registra do registra I/O

štítok rjmp preskočí na riadok programu označeného „štítkom“(ktorý nemôže byť vzdialený viac ako 204 pokynov - t.j. relatívny skok)

Teraz, keď sú tieto základy nedostupné, môžeme pokračovať v písaní zaujímavejšieho kódu a zaujímavejších obvodov a zariadení bez toho, aby sme museli diskutovať o mechanike kompilácie a nahrávania.

Dúfam, že sa vám tento úvodný návod páčil. V nasledujúcom návode pridáme ďalší komponent obvodu (tlačidlo) a rozšírime náš kód o vstupné porty a rozhodnutia.

Odporúča: