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.

thumb|300px|Atmel AVR ATmega8 PDIP

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.. Gearchiveerd op 29 juni 2011. 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 thumb|STK500 Starter Kit