Sada instrukcí Atmel AVR - Atmel AVR instruction set
Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto otázkách na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
The Sada instrukcí Atmel AVR je jazyk stroje pro Atmel AVR, a upravená harvardská architektura 8-bit RISC jeden čip mikrokontrolér který vyvinul Atmel v roce 1996. AVR byla jednou z prvních rodin mikrokontrolérů, které používaly on-chip flash paměť pro uložení programu.
Registry procesoru
Existuje 32 univerzálních 8bitových registrů R0 – R31. Všechny aritmetické a logické operace fungují na těchto registrech; pouze načítat a ukládat pokyny přístup RAM.
Omezený počet instrukcí pracuje na 16bitových párech registrů. Registr s nižším číslem dvojice obsahuje nejméně významné bity a musí být sudé. Poslední tři páry registrů se používají jako registry ukazatelů pro adresování paměti. Jsou známé jako X (R27: R26), Y (R29: R28) a Z (R31: R30). Režimy adresování po inkrementu a predekrementu jsou podporovány u všech tří. Y a Z také podporují šestibitový pozitivní posun.
Pokyny, které umožňují okamžitou hodnotu, jsou omezeny na registry R16 – R31 (8bitové operace) nebo na registraci párů R25: R24 – R31: R30 (16bitové operace ADIW a SBIW). Některé varianty operace MUL jsou omezeny na osm registrů, R16 až R23.
Registry zvláštního určení
Kromě těchto 32 univerzálních registrů má CPU několik speciálních registrů:
- PC: 16- nebo 22bitové počítadlo programů
- SP: 8- nebo 16-bitový ukazatel zásobníku
- SREG: 8bitový stavový registr
- RAMPX, RAMPY, RAMPZ, RAMPD a EIND: 8bitové segmentové registry, které jsou předřazeny na 16bitové adresy za účelem vytvoření 24bitových adres; k dispozici pouze v částech s velkými adresovými prostory.
Stavové bity
Bity stavového registru jsou:
- C Nést vlajku. Toto je příznak zapůjčení na odečtení. The
INC
aDEC
podle pokynů ne upravit příznak přenosu, takže je lze použít k smyčce přes vícebajtové aritmetické operace.[1] - Z Nulová vlajka. Nastavit na 1, když je aritmetický výsledek nulový.
- N Negativní vlajka. Nastaveno na kopii nejvýznamnějšího bitu aritmetického výsledku.
- PROTI Vlajka přetečení. Nastaveno v případě přetečení doplňku dvou.
- Vlajka S znamení. Unikátní pro AVR je to vždy N⊕V a ukazuje skutečné znamení srovnání.
- H Vlajka napůl. Jedná se o interní přenos z dodatků a slouží k podpoře BCD aritmetický.
- T bitová kopie. Tento bit používá speciální pokyny pro načítání bitů a ukládání bitů.
- Já Přerušit příznak. Nastavit, když jsou povolena přerušení.
Adresování
K dispozici jsou následující adresní prostory:
- Registry pro obecné účely jsou řešeny podle jejich čísel (0–31), ačkoli celé 5bitové číslo není uloženo v pokynech, které mohou pracovat pouze s podmnožinou těchto registrů.
- I / O registry mají vyhrazený 6bitový adresní prostor, jehož spodní polovina je bitově adresovatelná; některé části mají I / O registry mimo tento adresní prostor, které se nazývají "rozšířené I / O" a jsou přístupné pouze jako paměťově mapované I / O v prostoru datových adres.
- Datový adresní prostor mapuje 32 univerzálních registrů, všechny I / O registry (včetně těch, které jsou také přístupné prostřednictvím I / O adresního prostoru) a RAM; lze jej řešit buď přímo, nebo nepřímo prostřednictvím registrů ukazatele X, Y a Z, případně doplněných o RAMPX, RAMPY a RAMPZ.
- Programová paměť (blikat ) má samostatný adresní prostor adresovaný jako 16bitová slova pro účely načítání pokynů
- Pro účely načítání konstantních dat je programová paměť adresována bytewise přes registr ukazatele Z, případně doplněný RAMPZ.
- The EEPROM je v některých zařízeních mapována paměť; v jiných není přímo adresovatelný a je k němu přistupováno prostřednictvím adres, dat a řídících I / O registrů.
- Registry pro všeobecné účely, stavový registr a některé I / O registry jsou bitově adresovatelné, přičemž bit 0 je nejméně významný a bit 7 nejvýznamnější.
Prvních 64 I / O registrů je přístupných přes I / O i datový adresní prostor. Mají proto dvě různé adresy. Obvykle se zapisují jako „0x00 (0x20)“ až „0x3F (0x5F)“, kde první položka je I / O adresa a druhá v závorkách datová adresa.
Ke speciálním registrům CPU, s výjimkou PC, lze přistupovat jako k I / O registrům. Některé registry (RAMPX, RAMPY) nemusí být k dispozici na strojích s méně než 64 KiB adresovatelné paměti.
Registrovat | I / O adresa | Datová adresa |
---|---|---|
SREG | 0x3F | 0x5F |
SP | 0x3E: 0x3D | 0x5E: 0x5D |
EIND | 0x3C | 0x5C |
RAMPZ | 0x3B | 0x5B |
RAMPY | 0x3A | 0x5A |
RAMPX | 0x39 | 0x59 |
RAMPD | 0x38 | 0x58 |
Typická mapa paměti ATmega může vypadat takto:
Datová adresa | I / O adresa | Obsah |
---|---|---|
0x0000 - 0x001F | Registruje R0 - R31 | |
0x0020 - 0x003F | 0x00 - 0x1F | I / O registry (bit-addressable) |
0x0040 - 0x005F | 0x20 - 0x3F | I / O registry (not bit-addressable) |
0x0060 - 0x00FF | Rozšířené I / O registry (pouze I / O mapované v paměti) | |
0x0100 - RAMEND | Interní SRAM |
kde RAMEND je poslední adresa RAM. V částech bez rozšířeného I / O by RAM začínala na 0x0060.
Načasování pokynů
Aritmetické operace fungují na registrech R0 – R31, ale ne přímo na RAM a trvají jeden hodinový cyklus, s výjimkou násobení a sčítání celého slova (ADIW a SBIW), které trvají dva cykly.
RAM a I / O prostor je přístupný pouze kopírováním do nebo z registrů. Nepřímý přístup (včetně volitelného dodatečného přírůstku, předkrmu nebo konstantního posunutí) je možný prostřednictvím registrů X, Y a Z. Veškerý přístup do paměti RAM trvá dva hodinové cykly. Pohyb mezi registry a I / O je jeden cyklus. Přesunutí osmi nebo šestnácti bitových dat mezi registry nebo konstantou do registru je také jeden cyklus. Čtení programové paměti (LPM) trvá tři cykly.
Seznam pokynů
Pokyny jsou dlouhé jedno 16bitové slovo, s výjimkou těch, které obsahují 16bitovou nebo 22bitovou adresu, které obsahují dvě slova.
Existují dva typy podmíněných větví: skoky na adresu a přeskočení. Podmíněné větve (BRxx) mohou otestovat příznak ALU a přeskočit na zadanou adresu. Skips (SBxx) testuje libovolný bit v registru nebo I / O a přeskočí další instrukci, pokud byl test pravdivý.
V následujícím:
- Rd a Rr jsou registry v rozsahu R0 – R31
- Rdh a Rrh jsou registry v rozsahu R16 – R31 (vysoká polovina)
- Rdq a Rrq jsou registry v rozsahu R16 – R23 (jedna čtvrtina souboru registru)
- Rp je registrový pár R25: R24, R27: R26 (X), R29: R28 (Y) nebo R31: R30 (Z)
- XYZ je registr ukazatele, buď X nebo Y nebo Z
- YZ je registr ukazatele, buď Y nebo Z.
- s je číslo bitu ve stavovém registru (0 = C, 1 = Z atd., viz výše uvedený seznam)
- b je číslo bitu v univerzálním nebo I / O registru (0 = nejméně významné, 7 = nejvýznamnější)
- K6 je 6bitový okamžitý nepodepsaný konstantní (rozsah: 0–63)
- K8 je 8bitová okamžitá konstanta; protože se používá pouze v 8bitových operacích, jeho signatura je irelevantní
- IO5 je 5bitová I / O adresa pokrývající bitově adresovatelnou část I / O adresního prostoru, tj. Dolní polovinu (rozsah: 0–31)
- IO6 je 6bitová I / O adresa pokrývající celý I / O adresní prostor (rozsah: 0–63)
- D16 je 16bitová datová adresa pokrývající 64KiB; v částech s více než 64 KiB datovým prostorem je doplněn obsah registru segmentů RAMPD
- P22 je 22bitová programová adresa pokrývající 222 16bitová slova (tj. 8MiB )
- S7 a S12 jsou 7bitové (resp. 12bitové) podepsaný posunutí, v jednotkách slov, relativní k adrese programu uložené v počitadle programu
Aritmetický | Bit & další | Převod | Skok | Větev | Volání |
---|---|---|---|---|---|
PŘIDAT Rd, Rr ADC Rd, Rr ADIW Rp + 1: Rp, K6 SUB Rd, Rr SUBI Rdh, K8 SBC Rd, Rr SBCI Rdh, K8 SBIW Rp + 1: Rp, K6 INC Rd DEC Rd A Rd, Rr ANDI Rdh , K8 OR Rd, Rr ORI Rdh, K8 OR Rd, Rr COM Rd NEG Rd CP Rd, Rr CPC Rd, Rr CPI Rdh, K8 SWAP Rd LSR Rd ROR Rd ASR Rd MUL Rd, Rr MULS Rdh, Rrh MULSU Rdq, Rrq FMUL Rdq, Rrq FMULS Rdq, Rrq FMULSU Rdq, Rrq | BSET s BCLR s SBI IO5, b CBI IO5, b BST Rd, b BLD Rd, b NOP BREAK SLEEP WDR | MOV Rd, Rr MOVW Rd + 1: Rd, Rr + 1: Rr IN Rd, IO6 OUT IO6, Rr PUSH Rr POP Rr LDI Rdh, K8 LDS Rd, D16 LD Rd, X LDD Rd, YZ + K6 LD Rd, - XYZ LD Rd, XYZ + STS D16, Rr ST X, Rr STD YZ + K6, Rr ST -XYZ, Rr ST XYZ +, Rr LPM LPM Rd, Z LPM Rd, Z + ELPM ELPM Rd, Z ELPM Rd, Z + SPM | RJMP S12 IJMP EIJMP JMP P22 | CPSE Rd, Rr SBRC Rr, b SBRS Rr, b SBIC IO5, b SBIS IO5, b BRBC s, S7 BRBS s, S7 | RCALL S12ICALL EICALL CALL P22 RET RETI |
Dědičnost instrukční sady
Ne všechny pokyny jsou implementovány ve všech Atmel AVR řadiče. To je případ pokynů provádějících násobení, prodloužené zátěže / skoky / volání, dlouhé skoky a řízení výkonu.
Volitelné pokyny lze rozdělit do tří kategorií:
- funkce jádra CPU (výpočet) přidané na schopnější jádra CPU
- funkce adresování paměti, přidané u všech modelů s dostatečně velkou pamětí, která je vyžaduje
- volitelné funkce, několik periferií, které se u konkrétního modelu mohou nebo nemusí vyskytovat.
Zatímco vyšší procesory mají tendenci mít jak schopnější jádra, tak více paměti, přítomnost jednoho nezaručuje přítomnost druhého.
Pokyny pro základní procesor
Počínaje původním „klasickým“ jádrem jsou vylepšení organizována do následujících úrovní, z nichž každá zahrnuje všechny předchozí:
- "Klasické" jádro má pouze formu nulového operandu
LPM
instrukce, která je ekvivalentníLPM r0, Z
. - "Classic plus" přidává
MOVW
instrukce pro přesunutí párů registrů a obecnější forma instrukce LPM (LPM Rd, Z
aLPM Rd, Z +
), které umožňují libovolný cílový registr a automatické zvyšování ukazatele Z. - „Vylepšená“ jádra přidávají instrukce pro násobení.
- Jádra XMEGA nepřidávají nové pokyny per se, ale proveďte několik významných změn:
- Mapa paměti je reorganizována, eliminuje se mapování paměti souboru registru procesoru (takže I / O porty začínají na adrese RAM 0) a rozšiřuje se rozsah I / O portů. První 4K je nyní registr speciálních funkcí, druhý 4K je datový flash a normální RAM začíná na 8K.
- Před úpravou registrů ukazatele zásobníku (SPL a SPH) není nutné explicitně deaktivovat přerušení; jakýkoli zápis do SPL automaticky zakáže přerušení na 4 hodinové cykly, aby měl čas na aktualizaci SPH.
- Ostatní vícebajtové registry jsou pro povolení vybaveny stínovými registry atomový číst a psát. Když se načte bajt nejnižšího řádu, bajty vyššího řádu se zkopírují do stínových registrů, takže jejich pozdější čtení vytvoří momentka registru v době prvního čtení. Zápisy do bajtů nízkého řádu se ukládají do vyrovnávací paměti, dokud se nezapíše bajt nejvyššího řádu, na který se atomicky aktualizuje celý vícebajtový registr.
- Pozdější jádra XMEGA (konkrétně modely B, C a AU, jako je ATxmega16A4U, ale ne dřívější modely A, D a E, jako je ATxmega16D4), přidávají čtyři atomové read-modify-write pokyny: výměna (
XCH
), načíst a nastavit, načíst a vyčistit a načíst a přepnout. Pomáhají koordinovat s přímý přístup do paměti periferní zařízení, zejména a USB ovladač.
Méně schopné než „klasická“ jádra CPU jsou dvě podmnožiny: jádro „AVR1“ a „AVR drobné“. Matoucí je, že procesory značky „ATtiny“ mají řadu jader, včetně AVR1 (ATtiny11, ATtiny28), classic (ATtiny22, ATtiny26), classic + (ATtiny24) a AVRtiny (ATtiny20, ATtiny40).
Podmnožina AVR1 nebyla populární a od roku 2000 nebyly zavedeny žádné nové modely. Vynechává veškerou paměť RAM kromě 32 registrů mapovaných na adrese 0–31 a I / O portů na adresách 32–95. Zásobník je nahrazen tříúrovňovým hardwarovým zásobníkem a znakem TLAČIT
a POP
pokyny jsou smazány. Všechny 16bitové operace jsou stejně odstraněny IJMP
, ICALL
a všechny režimy adresování načtení a uložení kromě nepřímého přes Z.
Druhým, úspěšnějším pokusem o podmnožinu sady instrukcí AVR je jádro „AVR malý“.
Nejvýznamnější změnou je, že jádro AVRtiny vynechá registry R0 – R15. Registry také nejsou mapovány do paměti, přičemž I / O porty od 0 do 63 a RAM pro všeobecné účely začínají na adrese 64. 16bitové aritmetické operace (ADIW
, SBIW
) jsou vynechány, stejně jako zatížení / úložiště s režimy adresování posunutí (Y + d
, Z + d
), ale režimy adresování před a po zvýšení jsou zachovány. The LPM
instrukce je vynechána; místo toho je program ROM namapován na datový adresní prostor a lze k němu přistupovat pomocí pokynů pro normální načítání.
Nakonec jádro AVRtiny odstraní 2 slovo LDS
a STS
pokyny pro přímé adresování paměti RAM a místo toho použije prostor opcode, který byl dříve přidělen zátěži / úložišti, s pokyny pro posunutí pro nové 1 slovo LDS
a STS
instrukce, které mají přístup k prvním 128 umístěním univerzální RAM, adresy 0x40 až 0xBF. (The V
a VEN
pokyny poskytují přímý přístup do I / O prostoru od 0 do 0x3F.)
Pokyny k adresování paměti
Nejmenší jádra mají ≤256 bajtů datového adresního prostoru (což znamená ≤128 bajtů RAM po odstranění I / O portů a dalších vyhrazených adres) a ≤ 8192 bajtů (8 KiB) programové ROM. Ty mají pouze 8bitový ukazatel zásobníku (v SPL) a podporují pouze 12bitové pokyny pro relativní skok / volání RJMP
/RCALL
. (Protože počítadlo programu AVR počítá 16bitová slova, nikoli bajty, je pro adresu 2 dostatečný 12bitový offset13 bajtů ROM.)
Podle potřeby jsou k dispozici další možnosti adresování paměti pro přístup k dostupným prostředkům:
- Modely s> 256 bajty datového adresního prostoru (≥ 256 bajtů RAM) mají 16bitový ukazatel zásobníku, přičemž nejvyšší polovina je v registru SPH.
- Modely s> 8 KiB ROM přidávají 2slovné (22bitové)
SKOK
aVOLÁNÍ
instrukce. (Některé rané modely trpí tisková chyba pokud po instrukci přeskočení následuje 2slovná instrukce.) - Modely s> 64 KiB ROM přidávají
ELPM
instrukce a odpovídající registr RAMPZ.LPM
instrukce vynulovat adresu ROM v Z;ELPM
instrukce předloží RAMPZ registr pro vysoké bity. To není totéž jako obecnějšíLPM
návod; existují „klasické“ modely pouze s nulovým operandemELPM
(ATmega103 a at43usb320). Pokud je k dispozici automatický přírůstek (většina modelů), aktualizuje se celá 24bitová adresa včetně RAMPZ. - (Vzácné) modely s> 128 KiB ROM mají 3bajtové programové počítadlo. Volání a návraty podprogramů používají další bajt prostoru zásobníku, je zde nový registr EIND, který poskytuje další vysoké bity pro nepřímé skoky a volání, a jsou zde nové rozšířené pokyny
EIJMP
aEICALL
které používají EIND: Z jako cílovou adresu. (PředchozíIJMP
aICALL
instrukce používají nulové prodloužení Z.) - (Vzácné) modely s adresním prostorem RAM> 64 KiB rozšiřují 16bitové limity adresování RAM o registry RAMPX, RAMPY, RAMPZ a RAMPD. Poskytují další vysoké bity pro režimy adresování, které používají páry registrů X, Y nebo Z, nebo pokyny pro přímé adresování
LDS
/STS
. Na rozdíl od přístupu ROM neexistují žádné odlišné „rozšířené“ pokyny; místo toho se bezpodmínečně používají registry RAMP.
Pokyny k volitelným funkcím
Tři pokyny jsou k dispozici pouze u modelů, které mají odpovídající hardware
SPM
pro ukládání na flash ROM, je k dispozici pouze u procesorů s flash ROM (většina z nich)PŘESTÁVKA
pro vyvolání debuggeru na čipu je u některých malých modelů bez podpory debuggeru na čipu vynechánDES
za provedení Standard šifrování dat kol, je přítomen na modelech XMEGA s podporou akcelerátoru DES
Architektury jiné než AVR1 jsou pojmenovány podle konvencí avr-libc.[2]
Rodina | Členové | Aritmetický | Pobočky | Převody | Bitový |
---|---|---|---|---|---|
Minimální jádro AVR1 |
|
|
|
|
|
Klasické jádro až do 8K programového prostoru („AVR2“) |
| nové pokyny:
| nové pokyny:
| nové pokyny:
| (nic nového) |
AVR2, s pokyny MOVW a LPM („AVR2.5“) |
| (nic nového) | nové pokyny:
| (nic nového) | (nic nového) |
Klasické jádro s až 128 kB („AVR3“) |
| (nic nového) | nové pokyny:
| nové pokyny:
| (nic nového) |
Vylepšené jádro až s 8K („AVR4“) |
| nové pokyny:
| (nic nového) | nové pokyny:
| (nic nového) |
Vylepšené jádro až s 128 kB („AVR5“, „AVR5.1“) |
| (nic nového) | nová instrukce:
| (nic nového) | nové pokyny:
|
Vylepšené jádro až do 4M („AVR5“ a „AVR6“) |
| (nic nového) | nové pokyny:
| (nic nového) | (nic nového) |
XMEGA Core ("avrxmega" 2-6) | Série ATxmega | nové pokyny:
| (nic nového) | nové pokyny (od druhé revize křemíku - části AU, B, C)
| (nic nového) |
Snížené jádro AVRtiny ("avrtiny10") |
| (Stejné jako minimální jádro, s výjimkou snížené sady registrů CPU) | (Stejné jako klasické jádro s až 8 kB, s výjimkou snížené sady registrů CPU) | Stejné jako klasické jádro s až 8 kB, s následujícími výjimkami:
| (Stejné jako vylepšené jádro s až 128 kB, s výjimkou snížené sady registrů CPU) |
Kódování instrukcí
Bitové přiřazení:
- rrrrr = zdrojový registr
- rrrr = zdrojový registr (R16 – R31)
- rrr = zdrojový registr (R16 – R23)
- RRRR = dvojice zdrojových registrů (R1: R0 – R31: R30)
- ddddd = Cílový registr
- dddd = Cílový registr (R16 – R31)
- ddd = Cílový registr (R16 – R23)
- DDDD = pár cílových registrů (R1: R0 – R31: R30)
- pp = Zaregistrovat pár, W, X, Y nebo Z
- y = bit dvojice registrů Y / Z (0 = Z, 1 = Y)
- u = FMUL (S (U)) podepsáno s 0 = podepsáno nebo 1 = nepodepsáno
- s = bit pro ukládání / načítání (0 = načítání, 1 = ukládání)
- c = volání / skok (0 = skok, 1 = volání)
- cy = S nošením (0 = bez nošení, 1 = s nošením)
- e = Prodloužit adresu nepřímého skoku / volání o EIND (0 = 0: Z, 1 = EIND: Z)
- q = Rozšířit adresu programové paměti pomocí RAMPZ (0 = 0: Z, 1 = RAMPZ: Z)
- aaaaaa = adresa I / O prostoru
- aaaaa = adresa I / O prostoru (pouze prvních 32)
- bbb = počet bitů (0–7)
- B = bitová hodnota (0 nebo 1)
- kkkk = 4-bitová nepodepsaná konstanta (DES operační kód)
- kkkkkk = 6bitová konstanta bez znaménka
- KKKKKKKKK = 8bitová konstanta
Atmel AVR používá mnoho dělených polí, kde bity ve slově instrukce nesousedí. Zatížení / uložení s instrukcemi offsetu jsou nejextrémnějším příkladem, kdy je 6bitový offset rozdělen na tři části.
1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Návod |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D D D D | R R R R | MOVW Rd, Rr Přesunout dvojici registrů | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | d d d d | r r r r | MULS Rd, Rr | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | d d d | 0 | r r r | MULSU Rd, Rr | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | d d d | 1 | r r r | FMUL Rd, Rr | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | d d d | u | r r r | FMULS (U) Rd, Rr | ||||
0 | 0 | operační kód | r | d d d d d | r r r r | 2-operand pokyny | ||||||||||
0 | 0 | 0 | c̅y̅ | 0 | 1 | r | d d d d d | r r r r | CPC / CP Rd, Rr | |||||||
0 | 0 | 0 | c̅y̅ | 1 | 0 | r | d d d d d | r r r r | SBC / SUB Rd, Rr | |||||||
0 | 0 | 0 | cy | 1 | 1 | r | d d d d d | r r r r | ADD / ADC Rd, Rr (LSL / ROL Rd, když Rd = Rr) | |||||||
0 | 0 | 0 | 1 | 0 | 0 | r | d d d d d | r r r r | CPSE Rd, Rr | |||||||
0 | 0 | 1 | 0 | 0 | 0 | r | d d d d d | r r r r | A Rd, Rr | |||||||
0 | 0 | 1 | 0 | 0 | 1 | r | d d d d d | r r r r | EOR Rd, Rr | |||||||
0 | 0 | 1 | 0 | 1 | 0 | r | d d d d d | r r r r | NEBO Rd, Rr | |||||||
0 | 0 | 1 | 0 | 1 | 1 | r | d d d d d | r r r r | MOV Rd, Rr | |||||||
0 | 0 | 1 | 1 | K K K K | d d d d | K K K K | CPI Rd, K | |||||||||
0 | 1 | opc | K K K K | d d d d | K K K K | Registrujte okamžité operace | ||||||||||
0 | 1 | 0 | c̅y̅ | K K K K | d d d d | K K K K | SBCI / SUBI Rd, K | |||||||||
0 | 1 | 1 | 0 | K K K K | d d d d | K K K K | ORI Rd, K SBR Rd, K | |||||||||
0 | 1 | 1 | 1 | K K K K | d d d d | K K K K | ANDI Rd, K CBR Rd, K | |||||||||
1 | 0 | k | 0 | k k | s | d d d d d | y | k k k | LDD / STD Rd až Z + k nebo Y + k | |||||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | operační kód | Operace načítání / ukládání | |||||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | 0 | 0 | 0 | 0 | LDS rd, i / STS i, rd | ||||
16bitová okamžitá adresa SRAM i | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | y | 0 | 0 | 1 | LD / ST Rd až Z + / Y + | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | y | 0 | 1 | 0 | LD / ST Rd až −Z / −Y | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | d d d d d | 0 | 1 | q | 0 | LPM / ELPM Rd, Z | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | d d d d d | 0 | 1 | q | 1 | LPM / ELPM Rd, Z + | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | d d d d d | 0 | 1 | 0 | 0 | XCH Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | d d d d d | 0 | 1 | 0 | 1 | LAS Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | d d d d d | 0 | 1 | 1 | 0 | LAC Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | d d d d d | 0 | 1 | 1 | 1 | LAT Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | 1 | 1 | 0 | 0 | LD / ST Rd až X | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | 1 | 1 | 0 | 1 | LD / ST Rd až X + | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | 1 | 1 | 1 | 0 | LD / ST Rd až −X | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | 1 | 1 | 1 | 1 | POP / PUSH Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | operační kód | Pokyny jednoho operandu: | ||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 0 | 0 | 0 | COM Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 0 | 0 | 1 | NEG Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 0 | 1 | 0 | SWAP Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 0 | 1 | 1 | INC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 1 | 0 | 0 | (Rezervováno) | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 1 | 0 | 1 | ASR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 1 | 1 | 0 | LSR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | 1 | 1 | 1 | ROR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | B̅ | b b b | 1 | 0 | 0 | 0 | Clear / set bit SEx / CLx Status register | ||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | operační kód | 1 | 0 | 0 | 0 | Pokyny nulového operandu | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | RET |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | RETI |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | X | 1 | 0 | 0 | 0 | (Rezervováno) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | X | X | 1 | 0 | 0 | 0 | (Rezervováno) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | SPÁT |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | PŘESTÁVKA |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | WDR |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | (Rezervováno) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | q | 1 | 0 | 0 | 0 | LPM / ELPM |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | SPM |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | SPM Z + |
1 | 0 | 0 | 1 | 0 | 1 | 0 | C | 0 | 0 | 0 | E | 1 | 0 | 0 | 1 | Nepřímý skok / volání na Z nebo EIND: Z |
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 1 | 0 | 1 | 0 | DEC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | k k k k | 1 | 0 | 1 | 1 | DES kolo k | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | k k k k k | 1 | 1 | C | k | JMP / CALL abs22 | ||||
k k k k k k k k k k k k k k k k | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | k k | p str | k k k k | ADIW Rp, uimm6 | |||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | k k | p str | k k k k | SBIW Rp, uimm6 | |||||
1 | 0 | 0 | 1 | 1 | 0 | B | 0 | ááááá | b b b | CBI / SBI a, b (vymazat / nastavit I / O bit) | ||||||
1 | 0 | 0 | 1 | 1 | 0 | B | 1 | ááááá | b b b | SBIC / SBIS a, b (I / O bit test) | ||||||
1 | 0 | 0 | 1 | 1 | 1 | r | d d d d d | r r r r | MUL, bez znaménka: R1: R0 = Rr × Rd | |||||||
1 | 0 | 1 | 1 | s | a a | d d d d d | a a a a | IN / OUT do I / O prostoru | ||||||||
1 | 1 | 0 | C | 12bitový ofset se znaménkem | RJMP / RCALL do PC + simm12 | |||||||||||
1 | 1 | 1 | 0 | K K K K | d d d d | K K K K | LDI Rd, K | |||||||||
1 | 1 | 1 | 1 | 0 | B̅ | 7bitový offset se znaménkem | b b b | Podmíněná větev na bitu stavového registru | ||||||||
1 | 1 | 1 | 1 | 1 | 0 | s | d d d d d | 0 | b b b | Registrační bit BLD / BST do STATUS.T | ||||||
1 | 1 | 1 | 1 | 1 | 1 | B | d d d d d | 0 | b b b | SBRC / SBRS přeskočit, pokud se bit registru rovná B | ||||||
1 | 1 | 1 | 1 | 1 | X | X | d d d d d | 1 | b b b | (Rezervováno) |
Reference
- ^ „Návod k použití AVR“ (PDF). Atmel. Listopad 2016. Atmel-0856L.
- ^ „Používání nástrojů GNU“. Manuál AVR Libc. Citováno 6. května 2018.
- ^ Atmel. Poznámka k aplikaci "AVR201: Použití hardwarového multiplikátoru AVR". 2002. citát: „MegaAVR je řada nových zařízení v rodině mikrokontrolérů AVR RISC, která mimo jiné obsahuje hardwarový multiplikátor.“
externí odkazy
- GNU Development Environment:
- Programování mikrokontroléru AVR pomocí GCC Guido Socher
- Vývojové prostředí GNU pro mikrokontrolér AVR Rich Neswold
- Možnosti AVR v GCC-AVR
- Návod k použití AVR PDF
- Simulátor instrukční sady AVR (ATmega32u4 pro soubory Hex GCC Intel)
- Dědičnost sady AVR (Poznámka LLVM), na základě této stránky a kódu GCC & Binutils