Atmel AVR

**AVR** on modified Harvard architecture 8-bitine RISC-mikrokontroller, mille töötas välja Atmel 1996. aastal. AVR oli üks esimesi selliste mikrokontrollerite tooteperesid, mis kasutasid välkmälu tavalise PROMi (inglise keeles *Programmable Read-Only Memory*), EPROMi (*Electrically Programmable Read-Only Memory*) ja EEPROMi (*Electrically Ereasable Programmable Read-Only Memory*) asemel, mida kasutasid teised tollased mikrokontrollerid.

## Lühiajalugu
AVR-arhitektuurile panid aluse kaks Norra Tehnoloogiaülikooli üliõpilast: Alf-Efil Bogen ja Vegard Wollan.

Algne AVR-mikrokontroller töötati välja kohalikus mikrokiipide arenduskohas Trondheimis, kus kaks Atmel Norway loojat õpilastena töötasid. Kui Atmel arhitektuuri ostis, tegelesid Alf ja Vegard selle arendusega edasi Atmel Norway juures. Nad tegid tihedat koostööd kompilaatoreid loova firma IAR Systemsiga, et parandada käsustiku efektiivsust kõrgema taseme keelte kasutamisel ja kompileerimisel. 
Atmeli sõnul pole AVR millegi akronüüm ega tähista midagi konkreetset. Samuti ei anna arhitektuuri loojad ühest vastust küsimusele, mida AVR tähendab.

Esimeste AVR-i pere liikmete hulgas oli AT90S8515, mis oma 40 väljaviiguga DIP pakendis oli sama jalgade funktsionaalsusega mis Intel 8051, kaasaarvatud välised multipleksitud aadressi- ja andmesiinid. Ainus erinevus oli RESET polaarsus, mis 8051 puhul on vaikimisi kõrge, kuid AVR-il madal.

### Põhiliigitus
AVR-id jaotatakse üldjuhul viide gruppi:

* **tinyAVR** – ATtiny seeria
** 0,5–8 kB programmimälu
** 6–32 väljaviiguga pakend
** Piiratud perifeeriaseadmed
* **megaAVR** – ATmega seeria
** 4–256 kB programmimälu
** 28–100 väljaviiguga pakend
** Laiendatud käsustik (näiteks käsud suuremate mäluhulkade käsitlemiseks)
** Lai perifeeriaseadmete valik
* **XMEGA** – ATxmega seeria
** 16–384 kB programmimälu
** 44–64–100 väljaviiguga pakend
** Lisafunktsionaalsus (välise mälu kontroller, krüptograafia tugi jne)
** Lai perifeeriaseadmete valik koos D/A-muunduriga
* **Rakendusekohane AVR**
** megaAVR-id, millel on lisafunktsioone, näiteks LCD-kontroller, USB-kontroller jne.
* **FPSLIC™ (AVR koos [[FPGA]]ga)** 
** FPGA 5K kuni 40K loogilise väravaga
** SRAM AVR-i programmikoodi jaoks
** AVR-i tuum on võimeline töötama kuni 50&nbsp;MHz taktsagedusega 

### Arhitektuur
Välkmälu, EEPROM ja SRAM on integreeritud ühele kiibile, mis kõrvaldab üldjuhul vajaduse välise mälu jaoks. Mõnedel kiipidel on paralleelühenduse võimalus, mille läbi on võimalik külge ühendada lisamälu. Peaaegu kõigil (välja arvatud kõige väiksematel TinyAVR seeria mikrokontrolleritel) on jadaühenduse võimalus, mille abil saab ühendada suurema EEPROMi või välkmälu.

#### Programmimälu
Programmi käsustik paikneb muutumatus välkmälus. Kuigi tegemist on 8-bitiste mikrokontrolleritega, on iga käsk üks või kaks 16-bitist andmesõna.

Programmimälu maht on üldjuhul ära märgitud ka nimetuses (näiteks ATmega64x seerial on 64 kB välkmälu, ATmega32x seerial 32 kB).

AVR-i kiipidel pole tuge, mis toetaks programmi paiknemist välisel mälul, ehk kogu töötav kood peab paiknema sisemisel välkmälul. Ainsaks erandiks on AT94 FPSLIC AVR/FPGA kiibid.

#### Sisemine andmemälu
Aadressiruum koosneb protsessori registritest, sisend-väljund registritest ja SRAM-ist.

#### Sisemised registrid
AVR-idel on 32 ühebaidist protsessori registrit ja neid klassifitseeritakse 8-bitisteks RISC seadmeteks.

Enamasti on protsessori kasutuses olevad registrid esimesel 32 mäluaadressil (000016-001F16), millele järgnevad 64 sisend-väljund registrit (002016-005F16).

SRAM algab pärast ülalmainitud registreid (aadress 006016). Sisend-väljund registrid võivad mõnel juhul olla suuremad, sel juhul võtavad nad osa SRAM-i aadressiruumist.

Kuigi on olemas eraldi aadresserimissüsteemid protsessori ja sisend-väljund registritele ligipääsuks, saab kõiki käsitleda sarnaselt SRAM-iga.

XMEGA seeria kiipidel ei ole protsessori registrid adresseeritud ja seega pole neid võimalik kasutada kui SRAM-i. Selle asemel on sisend-väljund registrid paigutatud kohe mäluaadresside algusse. Lisaks on suurendatud neile mõeldud mälu 4096 baidini (000016-0FFF16). Sarnaselt eelmiste generatsioonidega võimaldatakse kiiret ligipääsu endiselt 64-le sisend-väljund registri asukohale. Pärast neid on XMEGAdes 4096-baidine aadressiala, kuhu saab vajadusel adresseerida EEPROMi. SRAM algab pärast eelnevaid piirkondi kohal 200016.

#### EEPROM
Peaaegu kõigil AVR-mikrokontrolleritel on sisemine EEPROM andmete püsivamaks salvestamiseks. Sarnaselt välkmäluga suudab EEPROM andmed säilitada ka siis, kui vool välja lülitada.

Enamikus AVR-arhitektuuri versioonides pole EEPROM otseselt adresseeritav ja seega pääseb sellele ligi sarnaselt väliste seadmetega. Kuna kasutada tuleb spetsiaalseid registreid ning lugemis- ja kirjutamiskäske, on suhtlus EEPROM-iga tunduvalt aeglasem kui näiteks SRAM-iga.

Samas võimaldab SecureAVR-i (AT90SC) pere  kasutada erilist EEPROM-i adresseerimist nii andmemälu kui programmimälu jaoks. Nagu mainitud, toetavad XMEGA kontrollerid vajadusel EEPROMI otsest adresseerimist.

Kuna kirjutamisoperatsioonide arv EEPROM-il on piiratud (Atmeli andmelehtede järgi umbes 100 000 kirjutamiskorda), peab hästi disainitud EEPROM-i kirjutamisprotseduur võrdlema konkreetsel hetkel EEPROM-is olevaid andmeid sinna kirjutatavaga ja ainult erinevuste korral sinna päriselt andmeid kirjutama, vähendades seeläbi kirjutamiste arvu.

#### Taimerid
Enamikul AVR-mikrokontrolleritel on sisemine taimer, millega on võimalik lugeda kas välist või sisemist taktsignaali. Seda sagedust saab sageduse jagajaga väiksemaks muuta, kui on vaja lugeda pikki intervalle. Mõned taimerid on võimelised töötama siis, kui mikrokontroller ise magab (suurem osa seadmeid on välja lülitatud, et energiat säästa). Taimereid on nii 8-, 16- kui ka 32-bitiseid. Taimeritega kaasnevad funktsioonid:

* Aja lugemine
* Pulsi pikkuse moduleerimine
* Väliste sündmust vaheliste aegade mõõtmine
* Analoog-digitaalmuunduri käivitamine
* Koodi õigeaegne käivitamine läbi katkestuste

### Programmi täitmine
AVR-idel on kaheetapiline, ühetasemeline *[[pipeline]]* disain. See tähendab, et iga järgmine käsk võetakse ette samal ajal, kui praegust täidetakse. Enamiku käskude jaoks kulub ainult üks või kaks kellatsüklit, mis teeb AVR-id võrdlemisi kiireteks 8-bitiste mikrokontrollerite hulgas.

AVR-pere protsessorid on disainitud eesmärgiga täita kompileeritud C-koodi võimalikult efektiivselt.

### Käsustik
Suuremas osas muudab tavaline käsustik AVR-ide programmeerimise C keeles suhteliselt lihtsaks. GNU on AVR-i toetust sisaldanud juba mõnda aega ja leidnud ka laia kasutust. Atmel ise on käsustiku arendamisse kaasanud suuremaid mikrokontrollerite kompilaatorite arendajaid, et panna paika, mis omadused kõrgema taseme keelte kasutamisel kasuks tulevad.

### Mikrokontrolleri kiirus
AVR-id toetavad üldjuhul taktsagedusi kuni 20&nbsp;MHz, kuid mõned suudavad töötada ka kuni 32&nbsp;MHz. Üldjuhul on madalamal pingel töötavad kontrollerid ka madalama taktsagedusega. Kõigil hiljutistel (ATtiny, ATmega, ATXmega, aga mitte 90S) AVR-idel on olemas sisseehitatud ostsillaator, mistõttu pole vaja välist kella. Mõnedel AVR-idel on sisseehitatud sageduse jagaja, mis võimaldab töö käigus vastavalt vajadusele taktsagedust reguleerida, mis omakorda võimaldab suuremat optimeeritust.

Kuna kõik operatsioonid registritel R0-R31 on ühetaktilised, suudab AVR saavutada kiirusi kuni 1 MIPS/MHz. Näiteks 8&nbsp;MHz peal töötav mikrokontroller suudab saavutada kuni 8 MIPS. Mälust laadimine ja kirjutamine võtavad 2 takti, hargnevused (inglise *branching*) võtavad 3 takti.

### Arendus
AVR-id on väga levinud tänu tasuta või odavatele arendusvahenditele, mille hulgas on odavad arendusplaadid ja tasuta arendustarkvara. AVR-id sisaldavad üldjuhul sama tuuma, kuid varieeruvad erinevate suhtlusvahendite ja mälu konfiguratsioonide poolest. Ühilduvus kiipide vahel on hea, kuigi sisend-väljund omadused võivad erineda.

### Funktsioonid
Praegused AVR-id pakuvad järgmisi funktsioone:
*Multifunktsionaalsed, mitmesuunalised sisend-väljund väljaviigud koos sisseehitatud *pull-up* takistitega 
*Mitu sisemist ostsillaatorit
*Sisemine, iseprogrammeeritav välkmälu kuni 256 kB (XMegadel kuni 384 kB)
**Süsteemisisene programmeerimine läbi paralleel- või jadaühenduse või läbi JTAGi
**Valikuline alglaadur koos kaitsevõimalustega
*Sisseehitatud koodisilumine (OCD) läbi JTAGI või Atmeli debugWIRE´i
*Sisemine EEPROM kuni 4 kB
*Sisemine SRAM kuni 16 kB (XMegal kuni 32 kB)
*8- ja 16-bitised taimerid
**PWM signaali genereerimine
**Sisendi mõõtmine
*Analoog komparaator
*10 või 12-bitised A/D konverterid, multipleksitud kuni 16 kanalile
*12-bitine D/A konverter
*Erinevad jadaühendused
**I²C ühilduv TWIga
**Sünkroonsed/asünkroonsed jadaühendused (UART/USART)
**Serial Peripheral Interface (SPI)
**Universal Serial Interface (USI)
*Madala pinge määramine (Brownout detection)
*Watchdog timer (WDT)
*Mitu energiasäästu- ja unerežiimi
*Controller Area Network tugi
*USB tugi
**Riistvaraline täiskiirus ja jaoturi kontroller
**Võimalik ka tarkvaraliselt emuleerida
*Etherneti tugi
*LCD-kontroller
*Madala pingega töötavad kiibid (kuni 1,8 V ja mõned isegi kuni 0,7 V, kuid koos sisseehitatud pingetõstjaga)
*Madala voolutarbega picoPower kiibid
*DMA- (Direct memory access) kontroller ja sündmustepõhine suhtlus perifeerseadmetega
*Krüptograafia tugi Advanced Encryption Standard (AES) and Data Encryption Standard (DES) jaoks

## 32-bitine AVR32
2006. aastal andis Atmel välja esimesed 32-bitised AVR32 arhitektuuril põhinevad mikrokontrollerid. AVR32 käsustik sisaldab uusi käske SIMD ja digitaalse signaalitöötluse jaoks, lisaks uutele audio-video töötlemisvahenditele. Üldiselt sarnaneb AVR32 käsustik teiste RISC-põhiste tuumade omaga, kuid pole üheselt tagasiühilduv algse AVR-i ega ka konkureeriva ARM-i põhiste kontrolleritega. See 32-bitine pere on põhiliselt suunatud konkureerima just ARM arhitektuuril põhinevate protsessoritega.

## Arendusvahendid
Atmeli pakutud arendusvahendite hulka kuuluvad erinevad programmaatorid, silurid ja ka baaskomplektid.

### STK600 baaskomplekt
STK600 baaskomplekt ja arendusplatvorm on STK500 järeltulija. STK600 puhul tuleb mikrokontroller kinnitada eraldi plaadiga põhiplaadile, mis annab talle voolu, kella, võimaldab programmeerimist ja suhtlust. Samuti saab põhiplaadi külge ühendada muid komponente, et skeemi testida. See arendusplatvorm toetab kõiki Atmel AVR-mikrokontrollereid, kuid erinevate väljaviikude arvu ja paigutusega kontrollerite kasutamiseks tuleb vahetada plaate, millele mikrokontroller kinnitub. Arvuti külge ühendub STK600 USB abil, jättes sellega arendustööks muud suhtlusvahendid vabaks.

### AVR ISP ja AVR ISP mkII
AVR ISP ja AVR ISP mkII on odavad tööriistad AVR-mikrokontrollerite programmeerimiseks läbi SPI liidese, mis ei eelda nende skeemist eemaldamist.

AVR ISP ühendub arvutiga üle jadaliidese ja võtab voolu programmeeritavast skeemist, samal ajal kui AVR ISP mkII ühendatakse USB-ga ja saab kogu vajaliku toite sealt. AVR ISP mkII on AVR ISP järeltulija, mille tõttu on ka viimase tootmine lõpetatud.

### Butterfly näidisplaat

Ülipopulaarne AVR Butterfly näidisplaat on Atmel AVR ATmega169V mikrokontrolleril põhinev patareitoitega arvuti. Selle eesmärk on demonstreerida AVR-peret üleüldiselt, kuid eraldi veel sisseehitatud LCD-kontrollerit. Plaadil on veel lisaks juhtkang, piesokõlar, kell, välkmälu, temperatuuri- ja pingeandurid. Enne 2006. aastat toodetud Buttreflydel oli ka veel fototakisti, mis sealt hiljem eemaldati RoHS nõuetega vastavuses olemiseks.. Lisaks on teisel poolel haaknõel, mis võimaldab Butterflyd kanda kui nimesilti.

AVR Butterflyl on vaikimisi laaditud tarkvara, mille abil saab ekraanil teksti kerida, kuvada sensorite lugemeid ja näidata aega. Samuti saab kõlari kaudu muusikat esitada. Butterfly peal olev ekraan on 14-segmendiline tekstiekraan, mille juhtimiseks läheb vaja suuremat osa mikrokontrolleri väljaviikudest.

Kuigi ATmega169 protsessori maksimaalseks kiiruseks on 16&nbsp;MHz, on tehaseseadetega kiiruseks määratud vaid 2&nbsp;MHz, et säästa kaasasoleva patarei eluiga. Lisaks võimaldab installeeritud alglaadur Butterflyd vastavalt soovile üle standardse RS-232 jadaühenduse ümber programmeerida, kasutades selleks tasuta Atmeli arendusvahendeid.

## Atmel AVR-i kasutusalad
AVRe kasutatakse laialdaselt autonduses: turvalisuses, ohutuses, meelelahutuses jne. Atmel avaldas hiljuti "Atmel Automotive Compilation", et aidata arendajatel luua paremaid lahendusi. Mõned praegustest kasutajatest on BMW, Daimler-Chrysler ja TRW. Lisaks on olemas eraldiseisev tootepere toitehalduse jaoks. Samuti sisaldavad 32-bitised AVR-mikrokontrollerid puutetundliku ekraani kontrollereid. USB tuge omavaid AVRe kasutatakse Microsoft Xboxi pultides.

Näiteks System Semiconductor, Inc. toodab mootorite juhtimiseks mõeldud kontrollerit M3000, mis sisaldab AVR-tuuma ja muud, tehes sellest kiibist mitmekülgsete rakendusvõimalustega mikrokontrolleri.

### Arduino
Arduino on hobielektroonikute seas laialt levinud AVR-il põhinev arendusplatvorm. See põhineb ATmega328 mikrokontrolleril (ATmega168 või ATmega8 vanematel versioonidel kui Diecimila). Samuti kasutatakse ATmega1280 Arduino Mega platvormil. Arduinot saab kasutada nii tema enda keelega ja oma graafilises keskkonnas kui ka tavalisemate arendusvahendite ja keeltega (C, assembler jne).

Mitmed firmad on loonud AVR-i baasil mikrokontrollerite plaate, mis on mõeldud harrastajatele, robootikutele ja lihtsamate süsteemide arenduseks. Mõned neist firmadest on Cubloc, BasicX, Oak Micros, ZX Microcontrollers ja myAVR. Lisaks on Arduinol palju kloone, mis on samuti laialt levinud.

## Avatud lähtekoodiga kloonid
FPGA kiire leviku tõttu harrastajate hulgas on hakatud arendama avatud lähtekoodiga, AVR-iga ühilduva ja AVR-i käsustikuga sobivaid protsessorituumasid. OpenCores nimetab suurimateks AVR-i kloonimisprojektideks:
* pAVR, kirjutatud VHDLis, eesmärgiks on seatud kiireima võimaliku AVR-protsessori loomine, kasutades selleks tehnikaid, mida päris AVR-id ei kasuta.
* avr_core on samuti VHDLis kirjutatud AVR-i kloon, mille eesmärgiks on võimalikult sarnaneda ATmega103-ga.
* Navré kirjutatud Verilogis, võimaldab kasutada tervet AVR-i käsustikku. Eesmärgiks on suur kiirus ja väike ressursikasutus, kuid see ei toeta katkestusi.

## Vaata ka
* dfu-programmer

## Viited