Close or Esc Key

Arduino Projects   |   Raspberry Pi   |   Electronic Circuits   |   AVR   |   PIC   |   8051   |   Electronic Projects

AVR Microcontroller

Written By: 

Akshay Daga

 

Microcontroller: Microcontroller can be termed as a single on chip computer which includes number of peripherals like RAM, EEPROM, Timers etc., required to perform some predefined task.
 
Architecture of AVR Microcontroller
Fig. 1: Block Diagram Showing Architecture of AVR Microcontroller
 
Does this mean that the microcontroller is another name for a computer…? The answer is NO!
The computer on one hand is designed to perform all the general purpose tasks on a single machine like you can use a computer to run a software to perform calculations or you can use a computer to store some multimedia file or to access internet through the browser, whereas the microcontrollers are meant to perform only the specific tasks, for e.g., switching the AC off automatically when room temperature drops to a certain defined limit and again turning it ON when temperature rises above the defined limit.
 
There are number of popular families of microcontrollers which are used in different applications as per their capability and feasibility to perform the desired task, most common of these are 8051, AVR and PIC microcontrollers. In this article we will introduce you with AVR family of microcontrollers.
History of AVR
AVR was developed in the year 1996 by Atmel Corporation. The architecture of AVR was developed by Alf-Egil Bogen and Vegard Wollan. AVR derives its name from its developers and stands for Alf-Egil Bogen Vegard Wollan RISC microcontroller, also known as Advanced Virtual RISC. The AT90S8515 was the first microcontroller which was based on AVR architecture however the first microcontroller to hit the commercial market was AT90S1200 in the year 1997.
 
AVR microcontrollers are available in three categories:
1.      TinyAVR – Less memory, small size, suitable only for simpler applications
2.      MegaAVR – These are the most popular ones having good amount of memory (upto 256 KB), higher number of inbuilt peripherals and suitable for moderate to complex applications.
3.      XmegaAVR – Used commercially for complex applications, which require large program memory and high speed.
The following table compares the above mentioned AVR series of microcontrollers:
 
Series Name
Pins
Flash Memory
Special Feature
TinyAVR
6-32
0.5-8 KB
Small in size
MegaAVR
28-100
4-256KB
Extended peripherals
XmegaAVR
44-100
16-384KB
DMA , Event System included
 
 

Importance of AVR

What’s special about AVR?
They are fast: AVR microcontroller executes most of the instructions in single execution cycle. AVRs are about 4 times faster than PICs, they consume less power and can be operated in different power saving modes. Let’s do the comparison between the three most commonly used families of microcontrollers.
 
 
8051
PIC
AVR
SPEED
Slow
Moderate
Fast
MEMORY
Small
Large
Large
ARCHITECTURE
CISC
RISC
RISC
ADC
Not Present
Inbuilt
Inbuilt
Timers
Inbuilt
Inbuilt
Inbuilt
PWM Channels
Not Present
Inbuilt
Inbuilt
 
AVR is an 8-bit microcontroller belonging to the family of Reduced Instruction Set Computer (RISC). In RISC architecture the instruction set of the computer are not only fewer in number but also simpler and faster in operation. The other type of categorization is CISC (Complex Instruction Set Computers). Click to find out differences between RISC and CISC. We will explore more on this when we will learn about the architecture of AVR microcontrollers in following section.
 
Let’s see what all this means. What is 8-bit? This means that the microcontroller is capable of transmitting and receiving 8-bit data. The input/output registers available are of 8-bits. The AVR family controllers have register based architecture which means that both the operands for an operation are stored in a register and the result of the operation is also stored in a register. Following figure shows a simple example performing OR operation between two input registers and storing the value in Output Register.
 
Working of AVR Microcontroller
Fig. 2: Block Diagram Showing Simple Example Carrying Out OR Operation Between Two Input Registers And Value Storage In Output Register

The CPU takes values from two input registers INPUT-1 and INPUT-2, performs the logical operation and stores the value into the OUTPUT register. All this happens in 1 execution cycle.

In our journey with the AVR we will be working on Atmega16 microcontroller, which is a 40-pin IC and belongs to the megaAVR category of AVR family. Some of the features of Atmega16 are:

·      16KB of Flash memory
·         1KB of SRAM
·         512 Bytes of EEPROM
·         Available in 40-Pin DIP
·         8-Channel 10-bit ADC
·         Two 8-bit Timers/Counters
·         One 16-bit Timer/Counter
·         4 PWM Channels
·         In System Programmer (ISP)
·         Serial USART
·         SPI Interface
·         Digital to Analog Comparator.
 
 

 Architecture of AVR

The AVR microcontrollers are based on the advanced RISC architecture and consist of 32 x 8-bit general purpose working registers. Within one single clock cycle, AVR can take inputs from two general purpose registers and put them to ALU for carrying out the requested operation, and transfer back the result to an arbitrary register. The ALU can perform arithmetic as well as logical operations
over the inputs from the register or between the register and a constant. Single register operations like taking a complement can also be executed in ALU. We can see that AVR does not have any register like accumulator as in 8051 family of microcontrollers; the operations can be performed between any of the registers and can be stored in either of them.
 
AVR follows Harvard Architecture format in which the processor is equipped with separate memories and buses for Program and the Data information. Here while an instruction is being executed, the next instruction is pre-fetched from the program memory.
 
AVR Family Architecture
 
Fig. 3: Block Diagram Of memory architecture In AVR 
 
Since AVR can perform single cycle execution, it means that AVR can execute 1 million instructions per second if cycle frequency is 1MHz. The higher is the operating frequency of the controller, the higher will be its processing speed. We need to optimize the power consumption with processing speed and hence need to select the operating frequency accordingly.
 
There are two flavors for Atmega16 microcontroller:
1.      Atmega16:- Operating frequency range is 0 – 16 MHz.
2.      Atmega16L:- Operating frequency range is 0 – 8 MHz.
If we are using a crystal of 8 MHz = 8 x 106 Hertz = 8 Million cycles, then AVR can execute 8 million instructions.
 
Naming Convention.!
The AT refers to Atmel the manufacturer, Mega means that the microcontroller belong to MegaAVR category, 16 signifies the memory of the controller, which is 16KB.
Naming Convention of ATmega16 - AVR Family
 
Fig. 4: Naming Convention Of AVR Microcontroller
 

 

Architecture Diagram: Atmega16

Following points explain the building blocks of Atmega16 architecture:
·           I/O Ports: Atmega16 has four (PORTA, PORTB, PORTC and PORTD) 8-bit input-output ports.
 
·           Internal Calibrated Oscillator: Atmega16 is equipped with an internal oscillator for driving its clock. By default Atmega16 is set to operate at internal calibrated oscillator of 1 MHz. The maximum frequency of internal oscillator is 8Mhz. Alternatively, ATmega16 can be operated using an external crystal oscillator with a maximum frequency of 16MHz. In this case you need to modify the fuse bits. (Fuse Bits will be explained in a separate tutorial).
 
Architecture of ATmega16 - AVR Microcontrollers | Building Blocks
·         Fig. 5: Block Diagram Explaining AVR Architecture 

 
  ADC Interface: Atmega16 is equipped with an 8 channel ADC (Analog to Digital Converter) with a resolution of 10-bits. ADC reads the analog input for e.g., a sensor input and converts it into digital information which is understandable by the microcontroller.
 
·           Timers/Counters: Atmega16 consists of two 8-bit and one 16-bit timer/counter. Timers are useful for generating precision actions for e.g., creating time delays between two operations.
 
·           Watchdog Timer: Watchdog timer is present with internal oscillator. Watchdog timer continuously monitors and resets the controller if the code gets stuck at any execution action for more than a defined time interval.
 
·           Interrupts: Atmega16 consists of 21 interrupt sources out of which four are external. The remaining are internal interrupts which support the peripherals like USART, ADC, Timers etc.
 
·           USART: Universal Synchronous and Asynchronous Receiver and Transmitter interface is available for interfacing with external device capable of communicating serially (data transmission bit by bit).
 
·         

Architecture Continued

        General Purpose Registers: Atmega16 is equipped with 32 general purpose registers which are coupled directly with the Arithmetic Logical Unit (ALU) of CPU.
 
·           Memory: Atmega16 consist of three different memory sections:
 
1.         Flash EEPROM: Flash EEPROM or simple flash memory is used to store the program dumped or burnt by the user on to the microcontroller. It can be easily erased electrically as a single unit. Flash memory is non-volatile i.e., it retains the program even if the power is cut-off. Atmega16 is available with 16KB of in system programmable Flash EEPROM.
 
2.        Byte Addressable EEPROM: This is also a nonvolatile memory used to store data like values of certain variables. Atmega16 has 512 bytes of EEPROM, this memory can be useful for storing the lock code if we are designing an application like electronic door lock.
 
3.        SRAM: Static Random Access Memory, this is the volatile memory of microcontroller i.e., data is lost as soon as power is turned off. Atmega16 is equipped with 1KB of internal SRAM. A small portion of SRAM is set aside for general purpose registers used by CPU and some for the peripheral subsystems of the microcontroller.
 
·           ISP: AVR family of controllers have In System Programmable Flash Memory which can be programmed without removing the IC from the circuit, ISP allows to reprogram the controller while it is in the application circuit.
 
·          SPI: Serial Peripheral Interface, SPI port is used for serial communication between two devices on a common clock source. The data transmission rate of SPI is more than that of USART.
 
·           TWI: Two Wire Interface (TWI) can be used to set up a network of devices, many devices can be connected over TWI interface forming a network, the devices can simultaneously transmit and receive and have their own unique address.
 
·           DAC: Atmega16 is also equipped with a Digital to Analog Converter (DAC) interface which can be used for reverse action performed by ADC. DAC can be used when there is a need of converting a digital signal to analog signal.
 
 

MegaAVR Family

Various microcontroller of MegaAVR series:
ATmega8 and Atmega32 are other members of MegaAVR series controllers. They are quite similar to ATmega16 in architecture. Low power version MegaAVR controllers are also available in markets. The following table shows the comparison between different members of MegaAVR family:
 
Part Name
ROM
RAM
EEPROM
I/0 Pins
Timer
Interrupts
Operation Voltage
Operating frequency
Packaging
ATmega8
8KB
1KB
512B
23
3
19
4.5-5.5 V
0-16 MHz
28
ATmega8L
8KB
1KB
512B
23
3
19
2.7-5.5 V
0-8 MHz
28
ATmega16
16KB
1KB
512B
32
3
21
4.5-5.5 V
0-16 MHz
40
ATmega16L
16KB
1KB
512B
32
3
21
2.7-5.5 V
0-8 MHz
40
ATmega32
32KB
2KB
1KB
32
3
21
4.5-5.5 V
0-16 MHz
40
ATmega32L
32KB
2KB
1KB
32
3
21
2.7-5.5 V
0-8 MHz
40

 

 

 

 

Comments

 I m reading  ATMega 16 but there is quite difficutly I  felt while reding the intrrupts

plz give me easy tutorial for this.

elobrate yourself.. where exactly you got struct

 

check the link it is a very nice example for reading intrrupt(serial intrrupt):

http://www.engineersgarage.com/embedded/avr-microcontroller-projects/int...

 it will be better if we provided the programming of AVR in assembley, as it will help us to learn both programming and instruction set of AVR ( step by step working of AVR)

I want compiler for AVR ATMEGA32 kindly sent .

                  Thank u

 

you can use AVR studio4... plz ask queries on forums

Or u can use CAVR, some site give it for free

Tutorial was nice can put some stuff regarding programing in assembly and C

 

Hi,

 

 i request u to provide tutorial of AVR ATMEGA32  in the quite easy language and the easy view.

 plz.

 

Hello,

 

i request u to provide tutorial of PIC MICROCONTROLLER  in the quite easy language and the easy view.

 plz.

 

send me avr interview questions and answers

i want tutoriyal about avr,pic,vlsi.plz send to my mail id

IT IS VERY NICE..

i want RTC interface programming for AVR(ATMEGA16) can u plz send me

its some example, i used DS1307 and 74595 as serial to parallel data, i compiled it with CAVR

if you little bit not understand, you can contact me at facebook with ID denianwar@yahoo.com

 

#include <mega16.h>
#asm
   .equ __i2c_port=0x12 ;PORTD
   .equ __sda_bit=3
   .equ __scl_bit=2
#endasm
#include <i2c.h>
#include <delay.h>
#define SDI PORTC.0   //serial data input
#define LCLK PORTC.1  //latch clock
#define SCLK PORTC.2  //serial clock

// DS1307 Real Time Clock functions
#include <ds1307.h>

// Declare your global variables here
char hh,mm,ss,jam,menit,a,b;
void geser(char data, char n)
{ unsigned char hasil,coun;  
    for (coun =0 ;coun <=n; coun++)
    {
        SCLK=0;
        hasil= (data << coun) & 0x80;
        if(hasil==0x80)
        {SDI=1;}
        else
        {SDI=0;};
        SCLK=1;
        delay_us(1);
        SCLK=0;  
        delay_us(1);
    };       
 }   

char segment(char angka)
{  unsigned char a;     
                 switch (angka)
        {
                case 0: {a=0b00111111; break;}
                case 1: {a=0b00000110;break;}
                case 2: {a=0b01011011;break;}
                case 3: {a=0b01001111;break;}    
                case 4: {a=0b01100110;break;}
                case 5: {a=0b01101101;break;}   
                case 6: {a=0b01111101;break;}
                case 7: {a=0b00000111;break;}
                case 8: {a=0b01111111;break;}    
                case 9: {a=0b01101111;break;}
                //case 'A': {a=0b00000001;break;}
                //case 'B': {a=0b00000010;break;}
                //case 'C': {a=0b00000100;break;}
                //case 'D': {a=0b00001000;break;}
                //case '*': {a=0b00001001;break;}
                //case '#': {a=0b00100010;break;}
                case 'e': {a=~0b01000000;break;}
                case '0': {a=0b00000000;break;}
                //else:  {a=0b00000000;break;}
                }    
                return a;
}

void blank()
{char a;
LCLK=0;
 for(a=0;a<2;a++)
 {
 geser (segment('0'),7);
 }
LCLK=1;
}

void tampil(char a,char b,char c)
{


       PORTA=0b11111110;
       LCLK=0;
       geser(segment(a/10),7);
       geser(segment(a/10),7);
       LCLK=1;
       delay_ms(1);
       blank();
       
       PORTA=0b11111101;
       LCLK=0;
       geser(segment(a%10),7);
       geser(segment(a%10),7);
       LCLK=1;
       delay_ms(1);
       blank();
        
       PORTA=0b11111011;
       LCLK=0;
       geser(segment(b/10),7);
       geser(segment(b/10),7);
       LCLK=1;
       delay_ms(1);
       blank();
       
       PORTA=0b11110111;
       LCLK=0;
       geser(segment(b%10),7);
       geser(segment(b%10),7);
       LCLK=1;
       delay_ms(1);
       blank();
       
       PORTA=0b11101111;
       LCLK=0;
       geser(segment(c/10),7);
       geser(segment(c/10),7);
       LCLK=1;
       delay_ms(1);
       blank();
       
       PORTA=0b11011111;
       LCLK=0;
       geser(segment(c%10),7);
       geser(segment(c%10),7);
       LCLK=1;
       delay_ms(1);
       blank();
       
       PORTA=0b10111111;
       LCLK=0;
       geser(segment(0),7);
       geser(segment(0),7);
       LCLK=1;
       delay_ms(1);
       blank();
       
       
}

void padam(char a,char b,char c)
{

       PORTA=0b11111110;   
       LCLK=0;
       geser(segment(a),7);
       LCLK=1;
       delay_ms(1);
       
       PORTA=0b11111101;
       LCLK=0;
       geser(segment(a),7);
       LCLK=1;
       delay_ms(1);
        
       
       PORTA=0b11111011;
       LCLK=0;
       geser(segment(b),7);
       LCLK=1;
       delay_ms(1);
        
       
       PORTA=0b11110111;
       LCLK=0;
       geser(segment(b),7);
       LCLK=1;
       delay_ms(1);
        
       
       PORTA=0b11101111;
       LCLK=0;
       geser(segment(c),7);
       LCLK=1;
       delay_ms(1);
        
       
       PORTA=0b11011111;
       LCLK=0;
       geser(segment(c),7);
       LCLK=1;
       delay_ms(1);
       
       
       
}
void main(void)
{
PORTA=0xFF;//switching
DDRA=0xFF;

PORTB=0xff;//push button
DDRB=0b00001111;
 
PORTC=0xFF;//data serial
DDRC=0xFF;

PORTD=0x00; //DS1307
DDRD=0xFF;


// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(3,0,1);
//rtc_set_time(00,00,00);
awal:
PORTB.0=0;
PORTB.1=0;
while (1)
      {
      // Place your code here
      rtc_get_time(&hh,&mm,&ss);
       tampil(hh,mm,ss);
       if(PINB.5==0){goto setjam;}
       
       if ((mm==40)&&(ss==00)){goto buzz;}
      }
 
buzz:
for(b=0;b<=10;b++)
{
PORTB.0=0;
PORTB.1=0;
for(a=0;a<=50;a++)
{
 rtc_get_time(&hh,&mm,&ss);
 tampil(hh,mm,ss);
}
PORTB.0=1;
PORTB.1=0;
for(a=0;a<=50;a++)
{
 rtc_get_time(&hh,&mm,&ss);
 tampil(hh,mm,ss);
}

}
PORTB.0=0;
PORTB.1=0;
goto awal;
     
setjam:
jam=hh;
menit=mm;
while(1)
{
    for(a=0;a<=20;a++)
 {
  tampil(jam,menit,ss);
 }
 
 for(a=0;a<=20;a++)
 {
  padam('0','0','0');
 }
 
 
  if(PINB.6==0)
 {tampil(jam,menit,ss);
  jam=jam+1;if(jam==24){jam=0;}
  hh=jam;
 }
 
 if(PINB.7==0)
 {
  menit=menit+1;if(menit==60){menit=0;}
  mm=menit;
 
 }
 
 
 
 if(PINB.5==0)
 {tampil(jam,menit,ss);
  rtc_set_time(jam,menit,00);
  rtc_get_time(&hh,&mm,&ss);
  for(a=0;a<=20;a++)
 {
  tampil(hh,mm,ss);
 }
  goto awal;
 }
 }
      

}

only xmega devices have DAC. 

hello i need help me to adxl 345

hi sir,
sen me avr interview questions

If you want to get read, this is how you should write.

What are difference between AVR Programmable and USART?
in a project, is it need use both? Thanks. :)

can we write more than 16KB of code in ATmega 16 because the hex file generated by my code is of 32 KB and it still works on my MCU. plz help

how to convert 8051 programs to atmega8 microcontroller ?i have codes for digital lock and visitor counter written in assembly c for 8051 ,now

i hav to convert it to atmega8 since i cant use 8051 for my project, pls help me

can you upload any example or fully listing program? i wish i can help you, denianwar@yahoo.com

i wish 2 make a digital visitor counter on atmega8...can u plz give code in embedded C language..at moment i m making a single direction entrance in which i just need 2 count n show number of persons entering (no complication of bidirection or controlling any other peripherals..!!)

but i m using 2 IR transmitter n reciever which will show that the person has entered after he has crossed both I R sensors..how do i code it..?

 

 start--> person crossing both I R sensor--> YES increment the counter n display on 7 segment display.

                                                              

                                                              -->NO show previous counted value itself on 7 segment dislay.

 

 

plz help me...!!!

great article, its help me to teach microcontrol in my class, thanks www.engineersgarage.com

can any one please tell me how to use internal eeprom for storing files of smaller size ..i m using atmega16 ...my project includes buttons , 16x 2 lcd , atmega16 .....i hav to do three things.....

1.display hello message

2.to retrieve files from eeprom

3. send them via blue tooth

i m now in  storing files in eeprom

 

pls help me this is my final year project..........

thnx in advance

hello

my project includes atmega16 ,lcd,buttons for navigation

my project is store files in eeprom , then retrieve them and send via bluetooth..,,,i need help in this  3 things

help this is my final yr project ..

thnx in advance

can ne one provide some example for navigation button (up,down.ok.back )..................

Respected sir,

i wish 2 implement digital visitor counter using Atmega8. can u plz suggest me the module to b used in infra red transmitter n reciever? i was thinking of using opamp as comparator and giving its output 2 atmega8. but i m unable 2 form its circuit diagram. can u plz help me with it immediately.

 

 

ur help wil b invaluable. plz. help..its urgent...!!!

can somebody send me tutorials for interfacing a 16*2 lcd with atmega8??

help is highly appreciated

thanks in advance

i want to more about AVR microcontrollers

can any one help me to interface DC1307 real time clock display on LCD and controllerd by key pad ?

can u please send me the code of RTC interfacing with AVR atmega16 working code with circuit diagram fast as i am in urgent....!!!

 

can u please send me the code of RTC interfacing with AVR atmega16 working code with circuit diagram fast as i am in urgent....!!!

 

I want to read atmega 16 timers coading  concept in a detail and ni  very simple way.....plz suggest me...i am very confused with this topic.....

I am using ATmega16 microcontroller,will any one please help me to write a program code for switching the Boost(Dc-Dc) converter

Hi.. I am new in microcontroller, and i have a confusion about Timers and Timer Interrupts. Please help me to understand it, means whats the difference between using Timer to give delay and as interrupt..

what compiler can I use for Atmega 16

I cant load ATmega16 please help me suhagiyam@gmail.comenlightened

Chip enable program error

 

ATmega16 does not have a DAC peripheral as such.

Thanks!! Is very nice *-*

 

i want avr tutorial

i need A GUIDENCE IN RTC DS1307 PROGRAMMING WTH ATMEGA 8 PLZ HELP ME...MY MAIL ID IS sammerkapare@gamil.com

You dont wont help you want someone to do it for you, stop being lazy and do it yourself

Hello can any one send me code for interfacing micro sd card for opening file for read and write i'm using codevision for programming