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, Listopad
Anonim
AVR Assembler Tutorial 1
AVR Assembler Tutorial 1

Rozhodl jsem se napsat sérii návodů, jak psát programy sestavovacího jazyka pro Atmega328p, což je mikrokontrolér používaný v Arduinu. Pokud lidé zůstanou zájem, budu pokračovat v vydávání jednoho týdně nebo tak nějak, dokud mi nedojde volný čas, jinak je lidé přestanou číst.

Používám Arch linux a pracuji na atmega328p-pu nastaveném na prkénku. Můžete to udělat stejným způsobem jako já nebo můžete jednoduše připojit arduino k počítači a pracovat tak na mikrokontroléru.

Budeme psát programy pro 328p, jako je ten, který je ve většině arduino, ale měli byste si uvědomit, že stejné programy a techniky budou fungovat také pro jakýkoli mikrokontrolér Atmel a později (pokud bude zájem) budeme pracovat s některými i ostatní. Podrobnosti o mikrokontroléru najdete v listech Atmel a v návodu k použití. Přikládám je k tomuto pokynu.

Zde budete potřebovat:

1. Prkénko

2. Arduino, nebo jen mikrokontrolér

3. Počítač se systémem Linux

4. Avra assembler pomocí git: git clone https://github.com/Ro5bert/avra.git nebo pokud používáte ubuntu nebo systém založený na debianu, stačí napsat „sudo apt install avra“a dostanete jak avr assembler a avrdude. Pokud však získáte nejnovější verzi pomocí github, získáte také všechny potřebné soubory pro zahrnutí, jinými slovy již obsahuje soubory m328Pdef.inc a tn85def.inc.

5. avrdude

Kompletní sadu mých návodů k assembleru AVR najdete zde:

Krok 1: Sestavte testovací tabuli

Postavte testovací tabuli
Postavte testovací tabuli

Můžete jednoduše použít své arduino a dělat vše v těchto tutoriálech, pokud chcete. Jelikož však mluvíme o kódování v jazyce sestavení, naší filozofií je ve své podstatě odstranit všechny periferály a komunikovat přímo se samotným mikrokontrolérem. Nemyslíte si tedy, že by bylo zábavnější to takhle dělat?

Pro ty z vás, kteří souhlasí, můžete vytáhnout mikrokontrolér ze svého arduina a poté začít sestavením „Breadboard Arduino“podle pokynů zde:

Na obrázku ukazuji své nastavení, které se skládá ze dvou samostatných Atmega328p na velkém prkénku (chci mít možnost udržet předchozí tutoriál zapojený a načtený na jednom mikrokontroléru při práci na dalším). Napájení mám nastaveno tak, že úplně horní lišta je 9V a všechny ostatní jsou 5V od regulátoru napětí. K programování čipů používám také rozpojovací desku FT232R. Koupil jsem je a sám na ně nasadil bootloadery, ale pokud jste právě vytáhli jeden z Arduina, je to již v pořádku.

Všimněte si toho, že pokud to zkoušíte s ATtiny85, pak můžete jednoduše získat Sparkfun Tiny Programmer zde: https://www.sparkfun.com/products/11801# a pak jej jednoduše zapojit do USB portu na vašem počítači. Na Attiny85 budete muset nejprve nainstalovat bootloader a nejjednodušší způsob je použít Arduino IDE. Budete však muset kliknout na soubor a předvolby a poté přidat tuto adresu URL nových desek: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json, která vám umožní nainstalovat bootloader (pokud váš ATtiny85 ještě nebyl dodán s ním.)

Krok 2: Nainstalujte Assembler a Avrdude

Nyní si můžete stáhnout a nainstalovat assembler a avrdude z odkazů uvedených v prvním kroku tohoto tutoriálu. Je pravděpodobné, že pokud jste již pracovali s Arduino, máte již nainstalovanou avrdude.

Jakmile máte nainstalovanou avru, všimnete si, že existuje podadresář s názvem „zdroje“a v tomto adresáři je spousta souborů pro zahrnutí. To jsou všechny mikrokontroléry, které můžete programovat pomocí avra. Hned si všimnete, že pro 328p, který zde používáme, neexistuje žádný soubor. Jednu jsem připojil. Soubor by se měl jmenovat m328Pdef.inc a měli byste jej umístit do adresáře includes nebo kamkoli chcete. Zahrneme to do našich jazykových sestavovacích programů. Vše, co dělá, je dát každému z registrů v názvech mikrokontrolérů z datového listu, abychom nemuseli používat jejich hexadecimální jména. Výše uvedený soubor obsahuje „direktivy pragma“, protože byl navržen pro programování v C a C ++. Pokud vás unavuje vidět, jak assembler chrlí stížnosti „ignorování směrnice pragma“, jednoduše přejděte do souboru a smažte nebo okomentujte všechny řádky začínající #pragma

Dobře, teď, když máte připravený mikrokontrolér, váš assembler a programátor, můžeme napsat náš první program.

Poznámka: Pokud používáte ATtiny85 místo ATmega328P, potřebujete jiný zahrnout soubor s názvem tn85def.inc. Připojím to také (všimněte si, že jsem tomu musel říkat tn85def.inc.txt, aby mi to Instructables umožnilo nahrát.) Nicméně, pokud jste získali avra assembler z github, pak již máte oba tyto soubory s ním. Doporučuji tedy pořídit si jej a sestavit sami: git clone

Krok 3: Hello World

Cílem tohoto prvního tutoriálu je vybudovat standardní první program, který člověk napíše, když se učí nový jazyk nebo zkoumá novou elektronickou platformu. "Ahoj světe!." V našem případě prostě chceme napsat program v jazyce sestavení, sestavit jej a nahrát do našeho mikrokontroléru. Program způsobí rozsvícení LED. Způsobit „blikání“LED jako u běžného světového programu Arduino ahoj je ve skutečnosti mnohem složitější program v jazyce sestavení, a tak to zatím nebudeme dělat. Chystáme se napsat nejjednodušší kód „holých kostí“s minimálním zbytečným chmýřím.

Nejprve připojte LED z PB5 (viz diagram pinoutu), která se také nazývá Digital Out 13 na arduinu, k odporu 220 ohmů, poté k GND. Tj.

PB5 - LED - R (220 ohmů) - GND

Nyní k napsání programu. Otevřete svůj oblíbený textový editor a vytvořte soubor s názvem „hello.asm“

; ahoj.asm

; rozsvítí LED, která je připojena k PB5 (digitální výstup 13). zahrnout "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Start: rjmp Start

Výše je kód. Za minutu to projdeme řádek po řádku, ale nejprve se ujistěte, že to dokážeme na vašem zařízení fungovat.

Poté, co jste soubor vytvořili, jej v terminálu sestavíte následovně:

avra ahoj.asm

toto sestaví váš kód a vytvoří soubor s názvem hello.hex, který můžeme nahrát následovně:

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

pokud používáte arduino na breadboardu, budete muset stisknout tlačítko reset na arduino breadboard těsně před spuštěním výše uvedeného příkazu. Všimněte si, že budete muset také přidat sudo vpředu nebo jej spustit jako root. Všimněte si také, že u některých arduino (jako Arduino UNO) budete pravděpodobně muset změnit bitrate na -b 115200 a port -P /dev /ttyACM0 (pokud se vám zobrazí chyba od avrdude o neplatném podpisu zařízení, stačí přidat - F na příkaz)

Pokud vše fungovalo, jak mělo, nyní se vám rozsvítí LED dioda ….. „Hello World!“

Pokud používáte ATtiny85, pak příkaz avrdude bude:

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

Krok 4: Hello.asm Řádek po řádku

K dokončení tohoto úvodního kurzu projdeme program hello.asm řádek po řádku, abychom zjistili, jak to funguje.

; ahoj

; rozsvítí LED, která je připojena k PB5 (digitální výstup 13)

Vše za středníkem ignoruje assembler, a proto tyto první dva řádky jsou jednoduše „komentáře“vysvětlující, co program dělá.

.include "./m328Pdef.inc"

Tento řádek říká assembleru, aby zahrnoval soubor m328Pdef.inc, který jste stáhli. Možná to budete chtít umístit do adresáře podobných zahrnutých souborů a poté změnit výše uvedený řádek tak, aby na něj odkazoval.

ldi r16, 0b00100000

ldi znamená „okamžité načtení“a říká assembleru, aby vzal pracovní registr, v tomto případě r16, a do něj nahrál binární číslo, v tomto případě 0b00100000. 0b vpředu říká, že naše číslo je binární. Pokud bychom chtěli, mohli jsme si vybrat jinou bázi, jako je hexadecimální. V takovém případě by naše číslo bylo 0x20, což je pro 0b00100000 hexadecimální. Nebo jsme pro stejné číslo mohli použít 32, což je základ 10 desetinných míst.

Cvičení 1: Zkuste v kódu změnit číslo na řádku výše na hexadecimální a poté na desítkové a ověřte, zda v každém případě stále funguje.

Použití binárních souborů je nejjednodušší, protože funguje porty a registry. V dalších tutoriálech budeme podrobněji diskutovat o portech a registrech atmega328p, ale prozatím jen uvedu, že používáme r16 jako náš „pracovní registr“, což znamená, že jej budeme používat pouze jako proměnnou, kterou ukládáme čísla v. „Register“je sada 8 bitů. To znamená 8 míst, která mohou být buď 0 nebo 1 (`` vypnuto '' nebo `` zapnuto ''). Když načteme binární číslo 0b00100000 do registru pomocí výše uvedeného řádku, jednoduše jsme toto číslo uložili do registru r16.

z DDRB, r16

Tento řádek říká kompilátoru, aby zkopíroval obsah registru r16 do registru DDRB. DDRB znamená „Data Direction Register B“a nastavuje „piny“na PortB. Na mapě pinoutů pro 328p můžete vidět, že existuje 8 pinů označených PB0, PB1,…, PB7. Tyto piny představují „bity“„PortB“a když načteme binární číslo 00100000 do registru DDRB, říkáme, že chceme, aby PB0, PB1, PB2, PB3, PB4, PB6 a PB7 byly nastaveny jako piny INPUT, protože mají Je v nich 0 a PB5 je nastaven jako VÝSTUPNÍ pin, protože jsme na toto místo dali 1.

z PortB, r16

Nyní, když jsme stanovili směry kolíků, můžeme na nich nyní nastavit napětí. Výše uvedený řádek kopíruje stejné binární číslo z našeho úložného registru r16 do PortB. Tím se nastaví všechny piny na 0 voltů kromě pinu PB5 na HIGH, což je 5 voltů.

Cvičení 2: Vezměte digitální multimetr, zapojte černý vodič do země (GND) a poté otestujte každý z pinů PB0 až PB7 s červeným vodičem. Odpovídají napětí na každém z pinů vložení 0b00100000 do PortB? Pokud existují nějaké, které nejsou, proč si to myslíte? (viz mapa pinů)

Start:

rjmp Start

Konečně první řádek nahoře je „štítek“, který označuje místo v kódu. V tomto případě označte toto místo jako „Start“. Druhý řádek říká „relativní skok na štítek Start“. Výsledkem je, že počítač je umístěn do nekonečné smyčky, která se stále vrací zpět na Start. Potřebujeme to, protože nemůžeme nechat program jen skončit nebo spadnout z útesu, program musí jen běžet, aby světlo zůstalo rozsvícené.

Cvičení 3: Odstraňte z kódu výše uvedené dva řádky, aby program spadl z útesu. Co se stalo? Měli byste vidět něco, co vypadá jako tradiční program „blink“, který používá Arduino jako „ahoj svět!“. Proč si myslíte, že to tak funguje? (Zamyslete se nad tím, co se musí stát, když program spadne z útesu …)

Krok 5: Závěr

Pokud jste se dostali až sem, gratulujeme! Nyní můžete zapisovat kód sestavy, sestavit jej a načíst do mikrokontroléru.

V tomto kurzu jste se naučili používat následující příkazy:

ldi hregister, number načte číslo (0-255) do horní poloviny registru (16-31)

out ioregister, register zkopíruje číslo z funkčního registru do I/O registru

rjmp label přeskočí na řádek programu označeného „label“(což nemůže být dále než 204 instrukcí - tj. relativní skok)

Nyní, když jsou tyto základy mimo provoz, můžeme pokračovat v psaní zajímavějšího kódu a zajímavějších obvodů a zařízení, aniž bychom museli diskutovat o mechanice kompilace a nahrávání.

Doufám, že se vám tento úvodní návod líbil. V dalším kurzu přidáme další součást obvodu (tlačítko) a rozšíříme náš kód tak, aby zahrnoval vstupní porty a rozhodnutí.

Doporučuje: