title: Atmel AVR
text: 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.
  
  Externe links 
   AVR Homepage bij Microchip
   AVR Freaks community
   Arduino community
  
  Computerprocessor
  Microcontroller