# Atmel AVR

De AVR is een 8 bit-RISC-microcontroller (µC) ontwikkeld door Atmel in 1996. De AVR was een van de eerste microcontroller-families die standaard gebruik maakte van on-chip-flashgeheugen voor programmaopslag in plaats van een noodzakelijke externe PROM, EPROM of EEPROM.

## Apparaatoverzicht

De AVR is een modified Harvard-architectuurapparaat waarbij het programma en de data worden benaderd via aparte fysieke geheugensystemen.

### Families

AVR's worden algemeen ingedeeld in vier groepen:
* tinyAVR — de ATtiny-serie
** 0,5–16 kB programmageheugen
** 6–32-pinbehuizing
** Gelimiteerde peripheral set
* megaAVR — de ATmega-serie
** 4–512 kB programmageheugen
** 28–100-pinbehuizing
** Uitgebreide instructieset (vermenigvuldiginstructies en instructies voor het gebruik van grotere programmageheugens)
** Uitgebreide peripheral set
* XMEGA — de ATxmega-serie
** 16–384 kB programmageheugen
** 44–64–100-pinbehuizing (A4, A3, A1)
** Uitgebreide prestatie-eigenschappen, zoals DMA, "Event System" en cryptografie-ondersteuning
** Zeer uitgebreide peripheral set met DAC's
* Applicatiespecifieke AVR
** megaAVR's met speciale mogelijkheden die niet voorkomen bij andere leden van de AVR-familie, zoals lcd-controllers, USB-controllers, geavanceerde PWM, CAN enz.
* 32-bit-AVR's

### Input en output

De elektrische, elektronische en functionele eigenschappen van de verbindingen van de Atmel AVR met de buitenwereld zijn multifunctioneel. Het grote probleem bij elektrische schakelingen is de fysieke ruimte die nodig is voor de pinnen, connectoren en bedrading. Door de verregaande verkleining van de schakelingen bij integratie op een chip, kan daar intern in het IC een functionaliteit worden aangebracht die ten dienste staat om de externe verbindingen optimaal in te stellen. Dit vereist voor de programmeur inzicht in de vele mogelijkheden waaruit een keuze moet worden gemaakt voor het doel waarvoor de processor wordt gebruikt. Bij het opstarten moeten eerst de juiste input en output registers geïnitialiseerd worden.
Zo kunnen de aansluitpennen qua elektrische eigenschappen ingesteld worden op bijvoorbeeld op hoge en lage impedantie (tri-state) of op open drain met "trekweerstand". Bij de oscillator kan vaak gekozen worden voor een interne oscillator of met een externe oscillator, met digitale ingang of met condensator of met kristal. De elektronische eigenschappen kunnen ingesteld worden op ingang of op uitgang. Bij de ingang kan gekozen worden voor digitale of analoge ingangen. In het geval van analoge ingangen een comparator of A-D-converter. Functioneel worden allerlei combinaties via interne multiplexing zowel analoog als digitaal mogelijk gemaakt: bijvoorbeeld UART of I2C of 1-wire of PWM enz.

### Architectuur
#### Data RAM

Flash, EEPROM, en SRAM zijn allemaal geïntegreerd in één chip, waardoor de noodzaak voor extern geheugen verdwijnt. Sommige apparaten hebben een externe bus voor extra datageheugen.

#### Programmageheugen (flash)

Programma-instructies worden opgeslagen in niet-vluchtig geheugen. Hoewel het 8 bits-MCU's zijn, gebruikt elke instructie een of twee 16-bitswoorden.
De grootte van het programmageheugen wordt meestal aangeduid in de naam van het apparaat (de ATmega64-lijn heeft bijvoorbeeld 64 kB flashgeheugen.
Er is geen mogelijkheid voor extern programmageheugen; alle code uitgevoerd door de AVR-kern moet in het on-chip flashgeheugen zitten.

#### Intern datageheugen

De data-adresruimte bestaat uit het registerbestand, I/O-registers en SRAM.

#### Interne registers

De AVR's hebben 32 single-byteregisters en zijn geclassificeerd als 8 bits-RISC-apparaten.
In de meeste varianten van de AVR-architectuur worden de werkregisters gemapt in de eerste 32 geheugenadressen (0x0000-0x001F) gevolgd door de 64 I/O-registers (0x0020-0x005F).
Het daadwerkelijke SRAM begint na deze registers (adres 0x0060). (De I/O-registerruimte kan groter zijn bij sommige uitgebreidere apparaten waarbij dus een deel van het SRAM-gedeelte wordt gebruikt.)
Hoewel het registerbestand en de I/O-registers apart kunnen worden aangesproken met speciale opcodes, kunnen ze ook worden aangesproken en gemanipuleerd alsof ze in het SRAM zitten).

#### EEPROM

Bijna alle AVR-microcontrollers hebben intern "Electrically Erasable Programmable Read Only Memory" (EEPROM) voor semi-permanente dataopslag. Net als het flashgeheugen behoudt het EEPROM zijn data als de spanning wegvalt.
In de meeste varianten van de AVR-architectuur wordt het interne EEPROM-geheugen niet gemapt in de adresseerbare geheugenruimte van de MCU. Het kan alleen worden aangesproken met speciale pointerregisters en lees-/schrijfinstructies. Hierdoor is het EEPROM-geheugen een stuk langzamer dan het interne SRAM.
Doordat het aantal schrijfbewerkingen van EEPROM-geheugen beperkt is – Atmel specificeert 100 000 schrijfbewerkingen in zijn datasheets – zou een goed ontworpen EEPROM-schrijfroutine moeten controleren of de data afwijkt van de gewenste data alvorens deze wordt geschreven.

### Programma-uitvoering

Atmels AVR's hebben een tweestaps, enkel niveau pijplijn-ontwerp. Dit houdt in dat de volgende machine-instructie wordt opgehaald als de huidige wordt uitgevoerd. De meeste instructies duren slechts één of twee cycli, wat de AVR's relatief snel maakt onder de 8 bits-microcontrollers.
De AVR-familie van processors werd ontworpen met de efficiënte uitvoering van gecompileerde C-code in gedachte en heeft diverse ingebouwde pointers voor de taak.

### Instructieset

De AVR-instructieset is meer orthogonaal dan de meeste 8 bits-microcontrollers, met name de PIC-microcontrollers waarmee AVR concurreert. Hij is echter niet compleet regulier:
* Pointerregisters X, Y, en Z hebben adresseringsmogelijkheden die van elkaar afwijken.
* Registerlocaties R0 tot R15 hebben andere addresseringsmogelijkheden dan registerlocaties R16 tot R31.
* I/O-poorten 0 tot 31 hebben andere adresseringsmogelijkheden dan I/O-poorten 32 tot 63.
* CLR beïnvloedt flags, waar SER dat niet doet, hoewel het de exact omgekeerde instructies zijn. CLR zet alle bits op nul terwijl SER alle bits op één zet.
Verder beïnvloeden sommige chipspecifieke verschillen de codegeneratie. Codepointers bestaan uit twee bytes op chips met 128 kB of minder flashgeheugen, maar drie bytes op de grotere chips; niet alle chips hebben hardwarevermenigvuldigers; chips met meer dan 8 kB flashgeheugen hebben branch- en call-instructies met langere ranges etc.
De grotendeels reguliere instructieset maakt het programmeren met C- (of zelf Ada-)compilers vrij eenvoudig. GCC heeft al enige tijd AVR-ondersteuning die veel gebruikt wordt. Atmel vroeg zelfs om input van grote compilerontwikkelaars voor kleine microcontrollers, om te bepalen welke instructieset het nuttigste is voor een compiler.

### Snelheid

De AVR-lijn ondersteunt snelheden van 0-20 MHz, waarbij sommige apparaten tot 32 MHz reiken. Werking op lager vermogen vereist meestal een gereduceerde kloksnelheid. Alle recente (Tiny en Mega, niet de 90S) AVR's hebben een on-chip oscillator, waardoor er geen externe klok of resonantiecircuit meer nodig is. Sommige AVR's hebben ook een systeemklokdeler, die de klok kan delen met tot 256. Deze prescaler kan worden geherconfigureerd tijdens run-time, wat een geoptimaliseerde kloksnelheid toestaat.
Aangezien alle operaties op registers R0-R31 een enkele cyclus gebruiken, kan de AVR tot 1 MIPS (miljoen instructies per seconde) per MHz halen. Laden en opslaan van en naar het geheugen duurt 2 cycli, branching duurt 3 cycli. Branching in de laatste "3 byte-pc"-onderdelen zoals de ATmega2560 zijn 1 cyclus langzamer.

### Ontwikkeling

AVR's worden veel gebruikt doordat er gratis en goedkope ontwikkelhulpmiddelen beschikbaar zijn, inclusief redelijk geprijsde ontwikkelborden en gratis ontwikkelsoftware. De AVR's worden verkocht onder verschillende namen die dezelfde basiskern, maar verschillende peripherals en geheugencombinaties hebben. Compatibiliteit tussen chips van elke familie is vrij goed, hoewel I/O-controllermogelijkheden variëren.

### Mogelijkheden

AVR's bieden een grote reeks mogelijkheden:
* Multifunctie, bidirectionele algemeen bruikbare I/O-poorten met configureerbare pull-upweerstanden.
* Meerdere interne oscillatoren, inclusief RC-oscillator zonder externe onderdelen
* Intern, zelf programmeerbaar instructiegeheugen tot 256 KB.
* In-systeem programmeerbaar met seriële/parallelle laagspanningsinterfaces of JTAG
** Optionele Boot Code Sectie met onafhankelijke Lock Bits voor beveiliging
* Ondersteuning voor on-chip debugging (OCD) met JTAG of debugWIRE op de meeste apparaten
** De JTAG-signalen (TMS, TDI, TDO en TCK) zijn gemultiplext op GPIO's. Deze pinnen kunnen worden geconfigureerd voor JTAG of GPIO, afhankelijk van de instelling van de fusebit, die met ISP of HVSP kan worden geprogrammeerd. Standaard staat JTAG aan.
** debugWIRE gebruikt de /RESET-pin als bi-directioneel communicatiekanaal om het on-chip debugcircuit aan te spreken. Het is aanwezig op apparaten met een laag aantal pinnen, aangezien het maar één pin gebruikt.
* Interne Data EEPROM tot 4 kB
* Interne SRAM tot 8 kB (32 kB bij XMega)
* Externe 64 kB little endian dataruimte op bepaalde modellen, zoals de Mega8515 en Mega162
** De externe dataruimte is over de interne dataruimte gelegd, zodat de volledige 64kB-adresruimte niet voorkomt op de externe bus. Een adres hoger dan 0x0100 zal intern RAM aanspreken, niet de externe bus.
** In bepaalde leden van de XMEGA-serie is de externe dataruimte verbeterd voor ondersteuning van zowel SRAM als SDRAM. Tevens zijn de data-adresseringsmodes uitgebreid om directe aanspreking tot 16MB aan datageheugen toe te staan.
** AVR's hebben doorgaans geen ondersteuning voor uitvoering van code vanaf extern geheugen. Sommige ASSP's (Applicatie Specifieke Standaard Product) ondersteunen dit wel.
* 8-bits en 16-bits timers
** PWMoutput
** Input capture
* Analoge comparator
* 10 of 12 bits-A/D-convertors, met multiplex tot 16 kanalen
* 12 bit-D/A-convertors
* Verschillende seriële interfaces, zoals
** I²C
** Synchrone/Asynchrone Seriële Peripherals (UART/USART) (gebruikt met RS-232, RS-485 en meer)
** Serial Peripheral Interface Bus (SPI)
** Universal Serial Interface (USI)
* Brownoutdetectie
* Watchdogtimer (WDT)
* Meerdere slaapstanden voor energiebesparing
* Licht- en motorbediening (PWM)
* CAN-controllerondersteuning
* USB-controllerondersteuning
** Volledige Full-speed (12 Mbit/s) hardware & Hub controller met embedded AVR
** gratis beschikbare Low-speed (1,5 Mbit/s) (HID)
* Ethernetcontrollerondersteuning
* Lcd-controllerondersteuning
* Laag-voltageapparaten werken vanaf 1,8 V
* picoPower-apparaten
* DMA-controllers en "Event System" peripheral communicatie
* Snelle cryptografie ondersteuning voor AES en DES

## Ontwikkelhulpmiddelen en evaluatiekits

De officiële Atmel AVR-ontwikkelhulpmiddelen en -evaluatiekits bestaan uit een aantal starterskits en debughulpmiddelen met ondersteuning voor de meeste AVR-apparaten:

### STK600 Starter Kit

De STK600-starterskit en -ontwikkelsysteem is een update van de STK500. De STK600 gebruikt een basisbord, een signaalroutingbord en een targetbord.
Het basisbord is hetzelfde als de STK500 en heeft een spanningsbron, een clock, in-systeem programmeren, RS-232-poorten en -connectoren voor de GPIO-signalen van het doelapparaat.
Het targetbord heeft ZIF-sockets voor DIP-, QFN- of QFP-behuizingen, afhankelijk van het bord.
Het signaalroutingbord zit tussen het basisbord en het targetbord, en verbindt de signalen aan de juiste pinnen op het targetbord. Er zijn veel verschillende routingborden die gebruikt kunnen worden met een enkel targetbord, afhankelijk van het apparaat in de ZIF-socket.
De STK600 wordt verbonden met de pc via een USB-aansluiting, waardoor beide RS-232-poorten beschikbaar zijn voor de microcontroller.

### STK500 Starter Kit

De STK500-starterskit en -ontwikkelsysteem heeft een ISP en een HVP (High Voltage Programming) voor alle AVR-apparaten, ofwel direct of via een uitbreidingsbord. Het bord bevat DIP-sockets voor alle beschikbare AVR's in DIP-behuizingen.
Er zijn verschillende uitbreidingsmodules beschikbaar voor de STK500:
* STK501 - Voegt ondersteuning toe voor microcontrollers in 64 pins-TQFP-behuizingen
* STK502 - Voegt ondersteuning toe voor lcd-AVR's in 64 pins-TQFP-behuizingen
* STK503 - Voegt ondersteuning toe voor microcontrollers in 100 pins-TQFP-behuizingen
* STK504 - Voegt ondersteuning toe voor lcd-AVR's in 100 pins-TQFP-behuizingen
* STK505 - Voegt ondersteuning toe voor 14 en 20 pins-AVR's
* STK520 - Voegt ondersteuning toe voor 14 en 20 pins-microcontrollers van de AT90PWM-familie
* STK524 - Voegt ondersteuning toe voor de ATmega32M1/C1-32 pins-CAN/LIN/Motor Control-familie
* STK525 - Voegt ondersteuning toe voor de AT90USB-microcontrollers in 64 pin-TQFP-behuizingen
* STLK526 - Voegt ondersteuning toe voor de AT90USB-microcontrollers in 32 pins-TQFP-behuizingen

### AVR ISP en AVR ISP mkII

De AVR ISP en AVR ISP mkII zijn goedkope hulpmiddelen om AVR's te programmeren via ICSP
De AVR ISP wordt verbonden met de pc via een seriële poort en haalt zijn spanning uit het doelsysteem. De AVR ISP staat gebruik van beide "standaard" ICSP-pinouts toe, de 10 pins- of de 6 pins-connector. De AVR ISP wordt niet meer geproduceerd en is vervangen door de AVR ISP mkII.
De AVR ISP mkII wordt verbonden met de pc via een USB-aansluiting en haalt zijn spanning van de USB-poort. Leds die zichtbaar zijn door de doorzichtige behuizing geven de status van spanning van het doelsysteem aan.

### AVR Dragon

De Dragon is een goedkoop hulpmiddel dan wordt verbonden met de pc via een USB-aansluiting. De Dragon kan alle AVR's programmeren via JTAG, HVP of ICSP. De Dragon biedt ook ondersteuning voor het debuggen van AVR's met minder dan 32 kB aan programmageheugen, via JTAG of debugWIRE. De Dragon heeft een klein prototypegebied waar een 8, 28 of 40 pins-AVR kan worden aangesloten.

### JTAGICE mkI en mkII

Het Joint Test Action Group, In Circuit Emulator (JTAGICE) debug hulpmiddel biedt ondersteuning voor on-chip debugging (OCD) van AVR's met een JTAG-interface. De originele JTAGICE mkI gebruikt een RS-232-interface als verbinding met de pc. De JTAGICE mkI wordt niet meer geproduceerd en is vervangen door de JTAGICE mkII.
Het JTAGICE mkII debug hulpmiddel ondersteunt on-chip debugging (OCD) van AVR's met de JTAG, PDI of debugWIRE-interface. De debugWIRE-interface gebruikt slecht één pin (de Resetpin), waardoor debuggen mogelijk is voor applicaties met een microcontroller met weinig pinnen.
De JTAGICE mkII wordt verbonden met de pc via een USB-aansluiting, maar er is een alternatieve aansluiting via een seriële poort, die een losse voeding nodig heeft. Naast JTAG ondersteunt de mkII programmeren via ISP (via de 6 of 10 pins-adapters). Zowel de USB- als de seriële variant gebruikt een versie van het STK500-protocol.

### Butterfly Demo Bord

Het zeer populaire AVR Butterfly-demonstratiebord is een zelfvoorzienende computer met batterijvoeding die draait op de Atmel AVR ATmega169V-microcontroller. Het was gebouwd om te pronken met de AVR-familie, in het bijzonder de nieuwe ingebouwde lcd-interface. Het bord bevat een lcd-scherm, een joystick, een speaker, een seriële poort, realtime clock (RTC), flash-geheugenchip en zowel temperatuur- als spanningssensoren. Eerdere versie van de AVR Butterfly bevatten ook een CdS-fotoweerstand; deze is niet meer aanwezig op borden geproduceerd na juni 2006 om aan de RoHS-norm te voldoen. Het kleine bord heeft een shirt-pin aan de achterkant zodat het als naamplaatje kan worden gedragen.
De AVR Butterfly komt met vooraf geladen software om de mogelijkheden van de microcontroller te demonstreren. De fabrieksfirmware kan je naam laten scrollen, de sensorwaarden weergeven en de tijd weergeven.
De AVR Butterfly demonstreert lcd-aansturing door een 14 segments-, 6 alpha-numeriek karakterdisplay aan te sturen. De lcd-interface gebruikt echter wel veel van de I/O-pinnen.
De ATmega169 CPU van de Buttferly kan snelheden tot 8 MHz aan, maar is door de fabrieksfirmware ingesteld op 2 MHz om de batterijduur te verlengen. Een vooraf geïnstalleerd bootloaderprogramma geeft de mogelijkheid het bord te herprogrammeren via een standaard seriële RS-232-aansluiting met nieuwe programma's die gebruikers kunnen schrijven met het gratis Atmel IDE-hulpmiddel.

### AT90USBKey

Dit kleine bord, ongeveer de helft van een creditcard, is iets duurder dan de AVR Butterfly. Het bevat een AT90USB1287-microcontroller met USB-On-The-Go (OTG), 16 MB DataFlash, leds, een kleine joystick en een temperatuursensor. Via de bijgeleverde software kan het bord zich gedragen als een USB-opslagapparaat, een USB-joystick en meer. Om als USB-host te werken is een batterij nodig, maar als USB-randapparaat gebruikt het alleen de spanning van de USB-poort.
Alleen de JTAG-aansluiting gebruikt de normale 2,54mm-pinafstand. Alle andere AVR I/O-poorten gebruiken compactere 1,27mm-headers.
Doordat de AT90USBKey 128 kB aan flashgeheugen heeft kan een AVR Dragon hem alleen programmeren en niet debuggen. Een JTAGICE kan hem zowel programmeren als debuggen. De processor kan ook worden geprogrammeerd via USB vanaf een Windows- of Linux-host, met USB "Device Firmware Update"-protocollen.
LUFA is een gratis USB-protocolstack voor de USBKey gemaakt door derden (MIT license).

### Raven Wireless Kit

De RAVEN-kit ondersteunt draadloze ontwikkeling met Atmels IEEE 802.15.4-chipsets voor ZigBee en andere draadloze stacks. Het stelt één paar draadloze Buttefly-kaarten voor plus een draadloze USBKey en kost ongeveer hetzelfde als deze samen (onder $100). Alle borden ondersteunen ontwikkeling via JTAG.
De kit bevat twee AVR Ravenborden, beide met een 2,4GHz-transceiver met ondersteuning voor IEEE 802.15.4 (en een ZigBee-stack met gratis licentie). De radio's worden aangestuurd met ATmega1284p-processoren, die ondersteund worden door een aangepast gesegmenteerd lcd-display aangestuurd door een ATmega3290p-processor. Raven-peripherals lijken op de Butterfly; piëzospeaker, DataFlash (groter), externe EEPROM, sensoren, 32kHz-kristal voor RTC etc. Deze zijn bedoeld voor het ontwerpen van op afstand aanstuurbare sensormodules, het aansturen van relais of wat maar nodig is.
De USB-stick gebruikt een AT90USB1287 voor verbindingen met een USB-host en de draadloze 2,4GHz-verbindingen. Ze zijn bedoeld voor het uitlezen en aansturen van draadloze modules, gebruikmakend van spanning van de host in plaats van batterijen.

### Programmers door derden

Er zijn een groot aantal programmeer- en debughulpmiddelen beschikbaar van derden. Deze apparaten gebruiken verschillende interfaces, waaronder RS-232, parallelle poort en USB. AVR Freaks heeft een uitgebreide lijst.

## Gebruik

AVR's worden gebruikt in verschillende automotive toepassingen zoals beveiliging, veiligheid en entertainment systemen. Atmel heeft een publicatie gelanceerd genaamd "Atmel Automotive Compilation", om nieuwe ontwikkelaars te helpen met automotive toepassingen.
Het Arduino computerplatform is gebaseerd op een ATmega328-microcontroller (ATmega168 of ATmega8 in oudere versies). De ATmega1280, met meer pinnen en geheugen beschikbaar, is ook gebruikt om het Arduino Megaplatform te ontwikkelen. Arduino borden kunnen worden gebruikt met zijn eigen taal en IDE, of met meer conventionele programmeeromgevingen (C/ASM/etc.) zoals de standaard AVR-platformen. Arduino borden kunnen op vele manieren geprogrammeerd worden. Dit gebeurt via een speciaal software programma.
USB-gebaseerde AVR's zijn gebruikt in de Microsoft Xbox hand-controllers. De link tussen de controllers en de Xbox is USB.
Verschillende bedrijven produceren AVR-gebaseerde microcontroller borden, bedoeld voor gebruik door hobbyisten, robotbouwers, experimenteurs en kleine systeemontwikkelaars.
System Semiconductor, Inc. produceert de M3000 Motor en Motion Control, waarin een Atmel AVR-kern en een Advanced Motion Controller zijn opgenomen.

## Nieuwe 32 bits-AVR's

In 2006 bracht Atmel-microcontrollers uit gebaseerd op een nieuwe, 32-bits AVR32-architectuur. Deze bevatten SIMD- en DSP-instructies, samen met andere audio- en videoverwerkingsmogelijkheden. Deze 32 bitsfamilie van apparaten is bedoeld om te concurreren met de op ARM gebaseerde processoren. De instructieset lijkt op andere RISC-kernen, maar is niet compatibel met de originele AVR of een van de ARM-kernen.
Lego heeft firmwarebroncodebestanden uitgebracht voor de 32 bits-AVR's om te helpen in de ontwikkeling van de opensourcealternatieven van zijn populaire robotica-NXT-besturingssysteem.