电子工程世界电子工程世界电子工程世界

型号

产品描述

搜索
 

ATMEGA324A-CUR

器件型号:ATMEGA324A-CUR
器件类别:半导体    嵌入式处理器和控制器   
厂商名称:Atmel (Microchip)
下载文档 在线购买

ATMEGA324A-CUR在线购买

供应商 器件名称 价格 最低购买 库存  
ATMEGA324A-CUR ¥30.07 1 点击查看 点击购买

器件描述

8-BIT, FLASH, 20 MHz, RISC MICROCONTROLLER, PQFP44

8位, FLASH, 20 MHz, 精简指令集微控制器, PQFP44

参数

ATMEGA324A-CUR功能数量 1
ATMEGA324A-CUR端子数量 44
ATMEGA324A-CUR最大工作温度 85 Cel
ATMEGA324A-CUR最小工作温度 -40 Cel
ATMEGA324A-CUR最大供电/工作电压 5.5 V
ATMEGA324A-CUR最小供电/工作电压 4.5 V
ATMEGA324A-CUR额定供电电压 5 V
ATMEGA324A-CUR外部数据总线宽度 0.0
ATMEGA324A-CUR输入输出总线数量 32
ATMEGA324A-CUR线速度 20 MHz
ATMEGA324A-CUR加工封装描述 10 × 10 MM, 1 MM HEIGHT, 0.80 MM PITCH, 绿色, 塑料, MS-026ACB, TQFP-44
ATMEGA324A-CUR状态 ACTIVE
ATMEGA324A-CUR工艺 CMOS
ATMEGA324A-CUR包装形状 SQUARE
ATMEGA324A-CUR包装尺寸 FLATPACK, THIN PROFILE
ATMEGA324A-CUR表面贴装 Yes
ATMEGA324A-CUR端子形式 GULL WING
ATMEGA324A-CUR端子间距 0.8000 mm
ATMEGA324A-CUR端子涂层 NOT SPECIFIED
ATMEGA324A-CUR端子位置
ATMEGA324A-CUR包装材料 塑料/环氧树脂
ATMEGA324A-CUR温度等级 INDUSTRIAL
ATMEGA324A-CURADC通道 Yes
ATMEGA324A-CUR地址总线宽度 0.0
ATMEGA324A-CUR位数 8
ATMEGA324A-CUR最大FCLK时钟频率 20 MHz
ATMEGA324A-CUR微处理器类型 精简指令集微控制器
ATMEGA324A-CURPWM通道 Yes
ATMEGA324A-CURROM编程 FLASH

ATMEGA324A-CUR器件文档内容

Features                                                                                  8-bit
                                                                                          Microcontroller
High-performance, Low-power AVR 8-bit Microcontroller                                  with
Advanced RISC Architecture                                                              16/32/64/128K
                                                                                          Bytes In-System
       131 Powerful Instructions Most Single-clock Cycle Execution                     Programmable
       32 x 8 General Purpose Working Registers                                          Flash
       Fully Static Operation
       Up to 20 MIPS Throughput at 20 MHz                                                ATmega164PA
       On-chip 2-cycle Multiplier                                                        ATmega324PA
                                                                                          ATmega644PA
High Endurance Non-volatile Memory segments                                             ATmega1284P

       16/32/64/128K Bytes of In-System Self-programmable Flash program memory
       512B/1K/2K/4K Bytes EEPROM

       1/2/4/16K Bytes Internal SRAM

       Write/Erase Cycles: 10,000 Flash/ 100,000 EEPROM
       Data retention: 20 years at 85C/ 100 years at 25C(1)

       Optional Boot Code Section with Independent Lock Bits
            In-System Programming by On-chip Boot Program
            True Read-While-Write Operation

       Programming Lock for Software Security

JTAG (IEEE std. 1149.1 Compliant) Interface

       Boundary-scan Capabilities According to the JTAG Standard
       Extensive On-chip Debug Support
       Programming of Flash, EEPROM, Fuses, and Lock Bits through the JTAG Interface

Peripheral Features

       Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes
       One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
       Real Time Counter with Separate Oscillator
       Six PWM Channels
       8-channel, 10-bit ADC

            Differential mode with selectable gain at 1x, 10x or 200x
       Byte-oriented Two-wire Serial Interface
       Two Programmable Serial USART
       Master/Slave SPI Serial Interface
       Programmable Watchdog Timer with Separate On-chip Oscillator
       On-chip Analog Comparator
       Interrupt and Wake-up on Pin Change

Special Microcontroller Features

       Power-on Reset and Programmable Brown-out Detection
       Internal Calibrated RC Oscillator
       External and Internal Interrupt Sources
       Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby and

         Extended Standby

I/O and Packages

       32 Programmable I/O Lines
       40-pin PDIP, 44-lead TQFP, 44-pad VQFN/QFN/MLF
       44-pad DRQFN

       49-ball VFBGA

Operating Voltages

       1.8 - 5.5V

Speed Grades for ATmega164PA/324PA/644PA/1284P

       0 - 20MHz @ 1.8 - 5.5V

Power Consumption at 1 MHz, 1.8V, 25C

       Active: 0.4 mA
       Power-down Mode: 0.1A
       Power-save Mode: 0.6A (Including 32 kHz RTC)

Note: 1. See "Data Retention" on page 9 for details.

                                                                                          8152GAVR11/09
                       ATmega164PA/324PA/644PA/1284P

1. Pin Configurations

1.1 Pinout - PDIP/TQFP/VQFN/QFN/MLF for ATmega164PA/324PA/644PA/1284P

                 Figure 1-1. Pinout

                                                                                                         PDIP

                             (PCINT8/XCK0/T0) PB0                                                              PA0 (ADC0/PCINT0)
                             (PCINT9/CLKO/T1) PB1                                                              PA1 (ADC1/PCINT1)
                          (PCINT10/INT2/AIN0) PB2                                                              PA2 (ADC2/PCINT2)
                        (PCINT11/OC0A/AIN1) PB3                                                                PA3 (ADC3/PCINT3)
                           (PCINT12/OC0B/SS) PB4                                                               PA4 (ADC4/PCINT4)
                                                                                                               PA5 (ADC5/PCINT5)
                                (PCINT13/MOSI) PB5                                                             PA6 (ADC6/PCINT6)
                                (PCINT14/MISO) PB6                                                             PA7 (ADC7/PCINT7)
                                                                                                               AREF
                                  (PCINT15/SCK) PB7                                                            GND
                                                     RESET                                                     AVCC
                                                        VCC                                                    PC7 (TOSC2/PCINT23)
                                                        GND                                                    PC6 (TOSC1/PCINT22)
                                                      XTAL2                                                    PC5 (TDI/PCINT21)
                                                      XTAL1                                                    PC4 (TDO/PCINT20)
                                                                                                               PC3 (TMS/PCINT19)
                                (PCINT24/RXD0) PD0                                                             PC2 (TCK/PCINT18)
                                (PCINT25/TXD0) PD1                                                             PC1 (SDA/PCINT17)
                        (PCINT26/RXD1/INT0) PD2                                                                PC0 (SCL/PCINT16)
                        (PCINT27/TXD1/INT1) PD3                                                                PD7 (OC2A/PCINT31)
                       (PCINT28/XCK1/OC1B) PD4
                               (PCINT29/OC1A) PD5
                         (PCINT30/OC2B/ICP) PD6

                                                            TQFP/VQFN/QFN/MLF

                                                            PB4 (SS/OC0B/PCINT12)
                                                               PB3 (AIN1/OC0A/PCINT11)
                                                                   PB2 (AIN0/INT2/PCINT10)
                                                                       PB1 (T1/CLKO/PCINT9)
                                                                           PB0 (XCK0/T0/PCINT8)
                                                                               GND
                                                                                   VCC
                                                                                       PA0 (ADC0/PCINT0)
                                                                                           PA1 (ADC1/PCINT1)
                                                                                               PA2 (ADC2/PCINT2)
                                                                                                  PA3 (ADC3/PCINT3)

                              (PCINT13/MOSI) PB5                                                                     PA4 (ADC4/PCINT4)
                              (PCINT14/MISO) PB6                                                                     PA5 (ADC5/PCINT5)
                                                                                                                     PA6 (ADC6/PCINT6)
                                (PCINT15/SCK) PB7                                                                    PA7 (ADC7/PCINT7)
                                                   RESET                                                             AREF
                                                       VCC                                                           GND
                                                      GND                                                            AVCC
                                                    XTAL2                                                            PC7 (TOSC2/PCINT23)
                                                    XTAL1                                                            PC6 (TOSC1/PCINT22)
                                                                                                                     PC5 (TDI/PCINT21)
                              (PCINT24/RXD0) PD0                                                                     PC4 (TDO/PCINT20)
                              (PCINT25/TXD0) PD1
                       (PCINT26/RXD1/INT0) PD2

                                                            (PCINT27/TXD1/INT1) PD3
                                                               (PCINT28/XCK1/OC1B) PD4

                                                                   (PCINT29/OC1A) PD5
                                                                       (PCINT30/OC2B/ICP) PD6

                                                                           (PCINT31/OC2A) PD7
                                                                               VCC
                                                                                   GND

                                                                                       (PCINT16/SCL) PC0
                                                                                           (PCINT17/SDA) PC1
                                                                                               (PCINT18/TCK) PC2
                                                                                                  (PCINT19/TMS) PC3

                 Note: The large center pad underneath the VQFN/QFN/MLF package should be soldered to ground on
                             the board to ensure good mechanical stability.

                                                                                                                                                2

8152GAVR11/09
                   ATmega164PA/324PA/644PA/1284P

1.2 Pinout - DRQFN for ATmega164PA/324PA/644PA                          Bottom view

                                   Figure 1-2. DRQFN - Pinout

                                      Top view

                                                                                                                                                            A24
                                                                                                                                                        B20

                                                                                                                                                   A23
                                                                                                                                               B19

                                                                                                                                          A22
                                                                                                                                     B18

                                                                                                                                 A21
                                                                                                                            B17

                                                                                                                        A20
                                                                                                                   B16

                                                                                                               A19

                                                         A19
                                                    B16

                                                A20
                                           B17

                                       A21
                                  B18

                              A22
                         B19

                     A23
                B20

            A24

A1                              A18                            A18                                                                                                   A1
    B1                      B15                                    B15                                                                                           B1

A2                              A17                            A17                                                                                                   A2
    B2                      B14                                    B14                                                                                           B2

A3                              A16                            A16                                                                                                   A3
    B3                      B13                                    B13                                                                                           B3

A4                              A15                            A15                                                                                                   A4
    B4                      B12                                    B12                                                                                           B4

A5                              A14                            A14                                                                                                   A5
    B5                      B11                                    B11                                                                                           B5

A6                              A13                            A13                                                                                                   A6

            A7
                B6

                     A8
                         B7

                              A9
                                  B8

                                       A10
                                           B9

                                                A11
                                                    B10

                                                         A12
                                                                                                               A12

                                                                                                                   B10
                                                                                                                        A11

                                                                                                                            B9
                                                                                                                                 A10

                                                                                                                                     B8
                                                                                                                                          A9

                                                                                                                                               B7
                                                                                                                                                   A8

                                                                                                                                                        B6
                                                                                                                                                            A7

Table 1-1.  DRQFN - Pinout
  A1
  B1        PB5    A7       PD3                                A13      PC4   A19                                                                                PA3
  A2                                                                                                                                                             PA2
  B2        PB6    B6       PD4                                B11      PC5   B16                                                                                PA1
  A3                                                                                                                                                             PA0
  B3        PB7    A8       PD5                                A14      PC6   A20                                                                                VCC
  A4                                                                                                                                                             GND
  B4        RESET B7        PD6                                B12      PC7   B17                                                                                PB0
  A5                                                                                                                                                             PB1
  B5        VCC    A9       PD7                                A15      AVCC  A21                                                                                PB2
  A6                                                                                                                                                             PB3
            GND    B8       VCC                                B13      GND   B18                                                                                PB4

            XTAL2  A10      GND                                A16      AREF  A22

            XTAL1  B9       PC0                                B14      PA7   B19

            PD0    A11      PC1                                A17      PA6   A23

            PD1    B10      PC2                                B15      PA5   B20

            PD2    A12      PC3                                A18      PA4   A24

                                                                                                                                                                  3

8152GAVR11/09
                   ATmega164PA/324PA/644PA/1284P

1.3 Pinout - VFBGA for ATmega164PA/324PA/644PA

                                   Figure 1-3. VFBGA - Pinout

             Top view                                               Bottom view

       1234567                                                 7654321

A                                                                                                      A
B                                                                                                      B
C                                                                                                      C
D                                                                                                      D
E                                                                                                      E
F                                                                                                      F
G                                                                                                      G

Table 1-2.  BGA - Pinout

       A    1             2      3                               4    5  6    7
       B                       PB2                             GND  VCC
       C    GND           PB4  PB3                             PB0  PA0  PA2  GND
       D                       PB7                             PB1  PA1
       E    PB6           PB5  PD0                             GND  PA4  PA3  PA5
       F                       PD5                             PD7  PC5
       G    VCC    RESET       PD6                             PC0  PC2  PA6  AREF
                               VCC                             GND  PC1
            GND    XTAL2                                                 PA7  GND

            XTAL1         PD1                                            PC7  AVCC

            PD2           PD3                                            PC4  PC6

            GND           PD4                                            PC3  GND

                                                                                                                                                                  4

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

2. Overview

                                   The ATmega164PA/324PA/644PA/1284P is a low-power CMOS 8-bit microcontroller based on
                                   the AVR enhanced RISC architecture. By executing powerful instructions in a single clock cycle,
                                   the ATmega164PA/324PA/644PA/1284P achieves throughputs approaching 1 MIPS per MHz
                                   allowing the system designer to optimize power consumption versus processing speed.

2.1 Block Diagram

Figure 2-1. Block Diagram

         VCC          Power               PA7..0                                                          PB7..0
RESET             Supervision         PORT A (8)                                                       PORT B (8)
                 POR / BOD &
         GND                                 A/D           Internal                                      Analog      USART 0
                     RESET               Converter  Bandgap reference                                  Comparator    USART 1
   XTAL1
    XTAL2          Watchdog           EEPROM                                                                    SPI
                      Timer

                   Watchdog
                    Oscillator

                    Oscillator
                    Circuits /

                      Clock
                  Generation

                                                                                            CPU        8bit T/C 0
                                      JTAG/OCD                                                         16bit T/C 1
                                                                                                       8bit T/C 2
                                      TWI           FLASH                                        SRAM

                                      PORT C (8)                                                       PORT D (8)

                 TOSC2/PC7 TOSC1/PC6  PC5..0                                                           PD7..0

                 The AVR core combines a rich instruction set with 32 general purpose working registers. All the
                 32 registers are directly connected to the Arithmetic Logic Unit (ALU), allowing two independent
                 registers to be accessed in one single instruction executed in one clock cycle. The resulting
                 architecture is more code efficient while achieving throughputs up to ten times faster than con-
                 ventional CISC microcontrollers.

                                                                                                                              5

8152GAVR11/09
             ATmega164PA/324PA/644PA/1284P

The ATmega164PA/324PA/644PA/1284P provides the following features: 16/32/64/128K bytes
of In-System Programmable Flash with Read-While-Write capabilities, 512B/1K/2K/4K bytes
EEPROM, 1/2/4/16K/ bytes SRAM, 32 general purpose I/O lines, 32 general purpose working
registers, Real Time Counter (RTC), three flexible Timer/Counters with compare modes and
PWM, 2 USARTs, a byte oriented 2-wire Serial Interface, a 8-channel, 10-bit ADC with optional
differential input stage with programmable gain, programmable Watchdog Timer with Internal
Oscillator, an SPI serial port, IEEE std. 1149.1 compliant JTAG test interface, also used for
accessing the On-chip Debug system and programming and six software selectable power sav-
ing modes. The Idle mode stops the CPU while allowing the SRAM, Timer/Counters, SPI port,
and interrupt system to continue functioning. The Power-down mode saves the register contents
but freezes the Oscillator, disabling all other chip functions until the next interrupt or Hardware
Reset. In Power-save mode, the asynchronous timer continues to run, allowing the user to main-
tain a timer base while the rest of the device is sleeping. The ADC Noise Reduction mode stops
the CPU and all I/O modules except Asynchronous Timer and ADC, to minimize switching noise
during ADC conversions. In Standby mode, the Crystal/Resonator Oscillator is running while the
rest of the device is sleeping. This allows very fast start-up combined with low power consump-
tion. In Extended Standby mode, both the main Oscillator and the Asynchronous Timer continue
to run.

The device is manufactured using Atmel's high-density nonvolatile memory technology. The On-
chip ISP Flash allows the program memory to be reprogrammed in-system through an SPI serial
interface, by a conventional nonvolatile memory programmer, or by an On-chip Boot program
running on the AVR core. The boot program can use any interface to download the application
program in the application Flash memory. Software in the Boot Flash section will continue to run
while the Application Flash section is updated, providing true Read-While-Write operation. By
combining an 8-bit RISC CPU with In-System Self-Programmable Flash on a monolithic chip,
the Atmel ATmega164PA/324PA/644PA/1284P is a powerful microcontroller that provides a
highly flexible and cost effective solution to many embedded control applications.

The ATmega164PA/324PA/644PA/1284P AVR is supported with a full suite of program and sys-
tem development tools including: C compilers, macro assemblers, program
debugger/simulators, in-circuit emulators, and evaluation kits.

2.2 Comparison Between ATmega164PA, ATmega324PA, ATmega644PA and ATmega1284P

Table 2-1.  Differences between ATmega164PA, ATmega324PA and ATmega644PA and
            ATmega1284P

Device       Flash      EEPROM     RAM

ATmega164PA  16 Kbyte   512 Bytes  1 Kbyte

ATmega324PA  32 Kbyte   1 Kbyte    2 Kbyte

ATmega644PA  64 Kbyte   2 Kbyte    4 Kbyte

ATmega1284P  128 Kbyte  4 Kbyte    16 Kbyte

                                                                                                                                                                  6

8152GAVR11/09
                                     ATmega164PA/324PA/644PA/1284P

2.3 Pin Descriptions

2.3.1 VCC

           Digital supply voltage.

2.3.2 GND

2.3.3                       Ground.
       Port A (PA7:PA0)

2.3.4                       Port A serves as analog inputs to the Analog-to-digital Converter.

                            Port A also serves as an 8-bit bi-directional I/O port with internal pull-up resistors (selected for
                            each bit). The Port A output buffers have symmetrical drive characteristics with both high sink
                            and source capability. As inputs, Port A pins that are externally pulled low will source current if
                            the pull-up resistors are activated. The Port A pins are tri-stated when a reset condition becomes
                            active, even if the clock is not running.

                            Port A also serves the functions of various special features of the
                            ATmega164PA/324PA/644PA/1284P as listed on page 82.

       Port B (PB7:PB0)

2.3.5                       Port B is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The
                            Port B output buffers have symmetrical drive characteristics with both high sink and source
                            capability. As inputs, Port B pins that are externally pulled low will source current if the pull-up
                            resistors are activated. The Port B pins are tri-stated when a reset condition becomes active,
                            even if the clock is not running.

                            Port B also serves the functions of various special features of the
                            ATmega164PA/324PA/644PA/1284P as listed on page 84.

       Port C (PC7:PC0)

2.3.6                       Port C is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The
                            Port C output buffers have symmetrical drive characteristics with both high sink and source
                            capability. As inputs, Port C pins that are externally pulled low will source current if the pull-up
                            resistors are activated. The Port C pins are tri-stated when a reset condition becomes active,
                            even if the clock is not running.

                            Port C also serves the functions of the JTAG interface, along with special features of the
                            ATmega164PA/324PA/644PA/1284P as listed on page 87.

       Port D (PD7:PD0)

           Port D is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The
           Port D output buffers have symmetrical drive characteristics with both high sink and source
           capability. As inputs, Port D pins that are externally pulled low will source current if the pull-up
           resistors are activated. The Port D pins are tri-stated when a reset condition becomes active,
           even if the clock is not running.

           Port D also serves the functions of various special features of the
           ATmega164PA/324PA/644PA/1284P as listed on page 89.

                                                                                                                                                                  7

8152GAVR11/09
2.3.7 RESET                      ATmega164PA/324PA/644PA/1284P

2.3.8 XTAL1  Reset input. A low level on this pin for longer than the minimum pulse length will generate a
2.3.9 XTAL2  reset, even if the clock is not running. The minimum pulse length is given in "System and Reset
2.3.10 AVCC  Characteristics" on page 334. Shorter pulses are not guaranteed to generate a reset.

2.3.11 AREF  Input to the inverting Oscillator amplifier and input to the internal clock operating circuit.

             Output from the inverting Oscillator amplifier.

             AVCC is the supply voltage pin for Port A and the Analog-to-digital Converter. It should be exter-
             nally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected
             to VCC through a low-pass filter.

             This is the analog reference pin for the Analog-to-digital Converter.

                                                                                                                                                                  8

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

3. Resources

                                   A comprehensive set of development tools, application notes and datasheetsare available for
                                   download on http://www.atmel.com/avr.

4. About Code Examples

                                   This documentation contains simple code examples that briefly show how to use various parts of
                                   the device. Be aware that not all C compiler vendors include bit definitions in the header files
                                   and interrupt handling in C is compiler dependent. Please confirm with the C compiler documen-
                                   tation for more details.
                                   The code examples assume that the part specific header file is included before compilation. For
                                   I/O registers located in extended I/O map, "IN", "OUT", "SBIS", "SBIC", "CBI", and "SBI" instruc-
                                   tions must be replaced with instructions that allow access to extended I/O. Typically "LDS" and
                                   "STS" combined with "SBRS", "SBRC", "SBR", and "CBR".
                                       Note: 1.

5. Data Retention

                                   Reliability Qualification results show that the projected data retention failure rate is much less
                                   than 1 PPM over 20 years at 85C or 100 years at 25C.

                                                                                                                                                                  9

8152GAVR11/09
               ATmega164PA/324PA/644PA/1284P

6. AVR CPU Core

6.1 Overview

                                   This section discusses the AVR core architecture in general. The main function of the CPU core
                                   is to ensure correct program execution. The CPU must therefore be able to access memories,
                                   perform calculations, control peripherals, and handle interrupts.

                                   Figure 6-1. Block Diagram of the AVR Architecture

    Flash      Program                              Data Bus 8-bit
  Program      Counter
  Memory                                            Status
               Direct Addressing                 and Control          Interrupt
Instruction                Indirect Addressing                          Unit
   Register                                         32 x 8
                                                   General               SPI
Instruction                                       Purpose               Unit
   Decoder                                       Registrers
                                                                     Watchdog
Control Lines                                        ALU              Timer

                                                                       Analog
                                                                    Comparator

                                                    Data            I/O Module1
                                                   SRAM             I/O Module 2
                                                                    I/O Module n
                                                 EEPROM

                                                 I/O Lines

In order to maximize performance and parallelism, the AVR uses a Harvard architecture with
separate memories and buses for program and data. Instructions in the program memory are
executed with a single level pipelining. While one instruction is being executed, the next instruc-
tion is pre-fetched from the program memory. This concept enables instructions to be executed
in every clock cycle. The program memory is In-System Reprogrammable Flash memory.

The fast-access Register File contains 32 x 8-bit general purpose working registers with a single
clock cycle access time. This allows single-cycle Arithmetic Logic Unit (ALU) operation. In a typ-

                                                                                                                                                                10

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   ical ALU operation, two operands are output from the Register File, the operation is executed,
                                   and the result is stored back in the Register File in one clock cycle.

                                   Six of the 32 registers can be used as three 16-bit indirect address register pointers for Data
                                   Space addressing enabling efficient address calculations. One of the these address pointers
                                   can also be used as an address pointer for look up tables in Flash program memory. These
                                   added function registers are the 16-bit X-, Y-, and Z-register, described later in this section.

                                   The ALU supports arithmetic and logic operations between registers or between a constant and
                                   a register. Single register operations can also be executed in the ALU. After an arithmetic opera-
                                   tion, the Status Register is updated to reflect information about the result of the operation.

                                   Program flow is provided by conditional and unconditional jump and call instructions, able to
                                   directly address the whole address space. Most AVR instructions have a single 16-bit word for-
                                   mat. Every program memory address contains a 16- or 32-bit instruction.

                                   Program Flash memory space is divided in two sections, the Boot Program section and the
                                   Application Program section. Both sections have dedicated Lock bits for write and read/write
                                   protection. The SPM instruction that writes into the Application Flash memory section must
                                   reside in the Boot Program section.

                                   During interrupts and subroutine calls, the return address Program Counter (PC) is stored on the
                                   Stack. The Stack is effectively allocated in the general data SRAM, and consequently the Stack
                                   size is only limited by the total SRAM size and the usage of the SRAM. All user programs must
                                   initialize the SP in the Reset routine (before subroutines or interrupts are executed). The Stack
                                   Pointer (SP) is read/write accessible in the I/O space. The data SRAM can easily be accessed
                                   through the five different addressing modes supported in the AVR architecture.

                                   The memory spaces in the AVR architecture are all linear and regular memory maps.

                                   A flexible interrupt module has its control registers in the I/O space with an additional Global
                                   Interrupt Enable bit in the Status Register. All interrupts have a separate Interrupt Vector in the
                                   Interrupt Vector table. The interrupts have priority in accordance with their Interrupt Vector posi-
                                   tion. The lower the Interrupt Vector address, the higher the priority.

                                   The I/O memory space contains 64 addresses for CPU peripheral functions as Control Regis-
                                   ters, SPI, and other I/O functions. The I/O Memory can be accessed directly, or as the Data
                                   Space locations following those of the Register File, 0x20 - 0x5F. In addition, the
                                   ATmega164PA/324PA/644PA/1284P has Extended I/O space from 0x60 - 0xFF in SRAM where
                                   only the ST/STS/STD and LD/LDS/LDD instructions can be used.

6.2 ALU Arithmetic Logic Unit

                                   The high-performance AVR ALU operates in direct connection with all the 32 general purpose
                                   working registers. Within a single clock cycle, arithmetic operations between general purpose
                                   registers or between a register and an immediate are executed. The ALU operations are divided
                                   into three main categories arithmetic, logical, and bit-functions. Some implementations of the
                                   architecture also provide a powerful multiplier supporting both signed/unsigned multiplication
                                   and fractional format. See the "Instruction Set" section for a detailed description.

6.3 Status Register

                                   The Status Register contains information about the result of the most recently executed arithme-
                                   tic instruction. This information can be used for altering program flow in order to perform
                                   conditional operations. Note that the Status Register is updated after all ALU operations, as

                                                                                                                                                                11

8152GAVR11/09
                           ATmega164PA/324PA/644PA/1284P

6.3.1                       specified in the Instruction Set Reference. This will in many cases remove the need for using the
                            dedicated compare instructions, resulting in faster and more compact code.

                            The Status Register is not automatically stored when entering an interrupt routine and restored
                            when returning from an interrupt. This must be handled by software.

       SREG Status Register

       The AVR Status Register SREG is defined as:

       Bit            7    6    5    4                  3    2    1    0
       0x3F (0x5F)
       Read/Write     I    T    H    S                  V    N    Z    C    SREG
       Initial Value
                      R/W  R/W  R/W  R/W                R/W  R/W  R/W  R/W

                      0    0    0    0                  0    0    0    0

       Bit 7 I: Global Interrupt Enable
       The Global Interrupt Enable bit must be set for the interrupts to be enabled. The individual inter-
       rupt enable control is then performed in separate control registers. If the Global Interrupt Enable
       Register is cleared, none of the interrupts are enabled independent of the individual interrupt
       enable settings. The I-bit is cleared by hardware after an interrupt has occurred, and is set by
       the RETI instruction to enable subsequent interrupts. The I-bit can also be set and cleared by
       the application with the SEI and CLI instructions, as described in the instruction set reference.

       Bit 6 T: Bit Copy Storage
       The Bit Copy instructions BLD (Bit LoaD) and BST (Bit STore) use the T-bit as source or desti-
       nation for the operated bit. A bit from a register in the Register File can be copied into T by the
       BST instruction, and a bit in T can be copied into a bit in a register in the Register File by the
       BLD instruction.

       Bit 5 H: Half Carry Flag
       The Half Carry Flag H indicates a Half Carry in some arithmetic operations. Half Carry Is useful
       in BCD arithmetic. See the "Instruction Set Description" for detailed information.

       Bit 4 S: Sign Bit, S = N  V

       The S-bit is always an exclusive or between the Negative Flag N and the Two's Complement
       Overflow Flag V. See the "Instruction Set Description" for detailed information.

       Bit 3 V: Two's Complement Overflow Flag
       The Two's Complement Overflow Flag V supports two's complement arithmetics. See the
       "Instruction Set Description" for detailed information.

       Bit 2 N: Negative Flag
       The Negative Flag N indicates a negative result in an arithmetic or logic operation. See the
       "Instruction Set Description" for detailed information.

       Bit 1 Z: Zero Flag
       The Zero Flag Z indicates a zero result in an arithmetic or logic operation. See the "Instruction
       Set Description" for detailed information.

       Bit 0 C: Carry Flag
       The Carry Flag C indicates a carry in an arithmetic or logic operation. See the "Instruction Set
       Description" for detailed information.

                                                                                                                                                                12

8152GAVR11/09
           ATmega164PA/324PA/644PA/1284P

6.4 General Purpose Register File

                                   The Register File is optimized for the AVR Enhanced RISC instruction set. In order to achieve
                                   the required performance and flexibility, the following input/output schemes are supported by the
                                   Register File:

                                    One 8-bit output operand and one 8-bit result input
                                    Two 8-bit output operands and one 8-bit result input
                                    Two 8-bit output operands and one 16-bit result input
                                    One 16-bit output operand and one 16-bit result input
                                   Figure 6-2 shows the structure of the 32 general purpose working registers in the CPU.

Figure 6-2. AVR CPU General Purpose Working Registers

           7        0  Addr.
                       0x00
General      R0       0x01
Purpose       R1       0x02
Working       R2
Registers      ...     0x0D
              R13      0x0E
              R14      0x0F                            X-register Low Byte
              R15      0x10                            X-register High Byte
              R16      0x11                            Y-register Low Byte
              R17                                      Y-register High Byte
               ...     0x1A                            Z-register Low Byte
              R26      0x1B                            Z-register High Byte
              R27      0x1C
              R28      0x1D
              R29      0x1E
              R30      0x1F
              R31

Most of the instructions operating on the Register File have direct access to all registers, and
most of them are single cycle instructions.

As shown in Figure 6-2, each register is also assigned a data memory address, mapping them
directly into the first 32 locations of the user Data Space. Although not being physically imple-
mented as SRAM locations, this memory organization provides great flexibility in access of the
registers, as the X-, Y- and Z-pointer registers can be set to index any register in the file.

                                                                                                                                                                13

8152GAVR11/09
                                   ATmega164PA/324PA/644PA/1284P

6.4.1  The X-register, Y-register, and Z-register

                            The registers R26..R31 have some added functions to their general purpose usage. These reg-
                            isters are 16-bit address pointers for indirect addressing of the data space. The three indirect
                            address registers X, Y, and Z are defined as described in Figure 6-3.

                   Figure 6-3. The X-, Y-, and Z-registers

                               15             XH                               XL                                  0

                   X-register  7                            07                                                     0

                               R27 (0x1B)                   R26 (0x1A)

                               15             YH                               YL                                  0

                   Y-register  7                            07                                                     0

                               R29 (0x1D)                   R28 (0x1C)

                               15             ZH                               ZL                                  0

                   Z-register  7              0             7                      0

                               R31 (0x1F)                   R30 (0x1E)

                   In the different addressing modes these address registers have functions as fixed displacement,

                   automatic increment, and automatic decrement (see the instruction set reference for details).

6.5 Stack Pointer

                   The Stack is mainly used for storing temporary data, for storing local variables and for storing
                   return addresses after interrupts and subroutine calls. Note that the Stack is implemented as
                   growing from higher to lower memory locations. The Stack Pointer Register always points to the
                   top of the Stack. The Stack Pointer points to the data SRAM Stack area where the Subroutine
                   and Interrupt Stacks are located. A Stack PUSH command will decrease the Stack Pointer.

                   The Stack in the data SRAM must be defined by the program before any subroutine calls are
                   executed or interrupts are enabled. Initial Stack Pointer value equals the last address of the
                   internal SRAM and the Stack Pointer must be set to point above start of the SRAM, see Figure
                   7-2 on page 21.

                   See Table 6-1 for Stack Pointer details.

                   Table 6-1. Stack Pointer instructions

                   Instruction Stack pointer  Description

                   PUSH        Decremented by 1 Data is pushed onto the stack

                   CALL        Decremented by 2 Return address is pushed onto the stack with a subroutine call or
                   ICALL                                   interrupt
                   RCALL

                   POP         Incremented by 1 Data is popped from the stack

                   RET         Incremented by 2 Return address is popped from the stack with return from
                   RETI                                    subroutine or return from interrupt

                   The AVR Stack Pointer is implemented as two 8-bit registers in the I/O space. The number of
                   bits actually used is implementation dependent, see Table 6-2 on page 15. Note that the data
                   space in some implementations of the AVR architecture is so small that only SPL is needed. In
                   this case, the SPH Register will not be present.

                                                                                                                                                                14

8152GAVR11/09
                               ATmega164PA/324PA/644PA/1284P

6.5.1 SPH and SPL Stack Pointer High and Stack pointer Low

Bit            15              14   13   12                   11      10          9       8
0x3E (0x5E)
0x3D (0x5D)                           SP12                 SP11    SP10        SP9     SP8      SPH

Read/Write     SP7             SP6  SP5  SP4                  SP3     SP2         SP1     SP0      SPL

Initial Value  7               6    5    4                    3       2           1       0

               R               R    R    R/W                  R/W     R/W         R/W     R/W

               R/W  R/W             R/W  R/W                  R/W     R/W         R/W     R/W
                 0    0               0  0/0(1)               0/1(1)  1/0(1)        0       0

               1               1    1    1                    1       1           1       1

Note: 1. Initial values respectively for the ATmega164PA/324PA/644PA/1284P

Table 6-2.     Stack Pointer size
                       Device
                                                                      Stack Pointer size
                  ATmega164PA                                                SP[10:0]
                  ATmega324PA                                                SP[11:0]
                  ATmega644PA                                                SP[12:0]
                  ATmega644PA                                                SP[13:0]

6.6 Instruction Execution Timing

                                   This section describes the general access timing concepts for instruction execution. The AVR
                                   CPU is driven by the CPU clock clkCPU, directly generated from the selected clock source for the
                                   chip. No internal clock division is used.

                                   Figure 6-4 on page 15 shows the parallel instruction fetches and instruction executions enabled
                                   by the Harvard architecture and the fast-access Register File concept. This is the basic pipelin-
                                   ing concept to obtain up to 1 MIPS per MHz with the corresponding unique results for functions
                                   per cost, functions per clocks, and functions per power-unit.

Figure 6-4. The Parallel Instruction Fetches and Instruction Executions

                                    T1                        T2              T3               T4

                       clkCPU

    1st Instruction Fetch

1st Instruction Execute
   2nd Instruction Fetch

2nd Instruction Execute
    3rd Instruction Fetch

3rd Instruction Execute
    4th Instruction Fetch

Figure 6-5 shows the internal timing concept for the Register File. In a single clock cycle an ALU
operation using two register operands is executed, and the result is stored back to the destina-
tion register.

                                                                                                                                                                15

8152GAVR11/09
                                 ATmega164PA/324PA/644PA/1284P

Figure 6-5. Single Cycle ALU Operation

                                 T1     T2  T3  T4

                         clkCPU
     Total Execution Time
Register Operands Fetch
  ALU Operation Execute

         Result Write Back

6.7 Reset and Interrupt Handling

                                   The AVR provides several different interrupt sources. These interrupts and the separate Reset
                                   Vector each have a separate program vector in the program memory space. All interrupts are
                                   assigned individual enable bits which must be written logic one together with the Global Interrupt
                                   Enable bit in the Status Register in order to enable the interrupt. Depending on the Program
                                   Counter value, interrupts may be automatically disabled when Boot Lock bits BLB02 or BLB12
                                   are programmed. This feature improves software security. See the section "Memory Program-
                                   ming" on page 296 for details.

                                   The lowest addresses in the program memory space are by default defined as the Reset and
                                   Interrupt Vectors. The complete list of vectors is shown in "Interrupts" on page 62. The list also
                                   determines the priority levels of the different interrupts. The lower the address the higher is the
                                   priority level. RESET has the highest priority, and next is INT0 the External Interrupt Request
                                   0. The Interrupt Vectors can be moved to the start of the Boot Flash section by setting the IVSEL
                                   bit in the MCU Control Register (MCUCR). Refer to "Interrupts" on page 62 for more information.
                                   The Reset Vector can also be moved to the start of the Boot Flash section by programming the
                                   BOOTRST Fuse, see "Memory Programming" on page 296.

                                   When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are dis-
                                   abled. The user software can write logic one to the I-bit to enable nested interrupts. All enabled
                                   interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a
                                   Return from Interrupt instruction RETI is executed.

                                   There are basically two types of interrupts. The first type is triggered by an event that sets the
                                   Interrupt Flag. For these interrupts, the Program Counter is vectored to the actual Interrupt Vec-
                                   tor in order to execute the interrupt handling routine, and hardware clears the corresponding
                                   Interrupt Flag. Interrupt Flags can also be cleared by writing a logic one to the flag bit position(s)
                                   to be cleared. If an interrupt condition occurs while the corresponding interrupt enable bit is
                                   cleared, the Interrupt Flag will be set and remembered until the interrupt is enabled, or the flag is
                                   cleared by software. Similarly, if one or more interrupt conditions occur while the Global Interrupt
                                   Enable bit is cleared, the corresponding Interrupt Flag(s) will be set and remembered until the
                                   Global Interrupt Enable bit is set, and will then be executed by order of priority.

                                   The second type of interrupts will trigger as long as the interrupt condition is present. These
                                   interrupts do not necessarily have Interrupt Flags. If the interrupt condition disappears before the
                                   interrupt is enabled, the interrupt will not be triggered.

                                                                                                                                                                16

8152GAVR11/09
                           ATmega164PA/324PA/644PA/1284P

       When the AVR exits from an interrupt, it will always return to the main program and execute one
       more instruction before any pending interrupt is served.
       Note that the Status Register is not automatically stored when entering an interrupt routine, nor
       restored when returning from an interrupt routine. This must be handled by software.
       When using the CLI instruction to disable interrupts, the interrupts will be immediately disabled.
       No interrupt will be executed after the CLI instruction, even if it occurs simultaneously with the
       CLI instruction. The following example shows how this can be used to avoid interrupts during the
       timed EEPROM write sequence..

        Assembly Code Example
               in r16, SREG ; store SREG value
               cli ; disable interrupts during timed sequence
               sbi EECR, EEMPE ; start EEPROM write
               sbi EECR, EEPE
               out SREG, r16 ; restore SREG value (I-bit)

        C Code Example
               char cSREG;
               cSREG = SREG; /* store SREG value */
               /* disable interrupts during timed sequence */
               __disable_interrupt();
               EECR |= (1<                EECR |= (1<                SREG = cSREG; /* restore SREG value (I-bit) */

       When using the SEI instruction to enable interrupts, the instruction following SEI will be exe-
       cuted before any pending interrupts, as shown in this example.

       Assembly Code Example
             sei ; set Global Interrupt Enable
             sleep; enter sleep, waiting for interrupt
             ; note: will enter sleep before any pending
             ; interrupt(s)

       C Code Example
             __enable_interrupt(); /* set Global Interrupt Enable */
             __sleep(); /* enter sleep, waiting for interrupt */
             /* note: will enter sleep before any pending interrupt(s) */

6.7.1  Interrupt Response Time

                            The interrupt execution response for all the enabled AVR interrupts is five clock cycles minimum.
                            After five clock cycles the program vector address for the actual interrupt handling routine is exe-
                            cuted. During these five clock cycle period, the Program Counter is pushed onto the Stack. The
                            vector is normally a jump to the interrupt routine, and this jump takes three clock cycles. If an

                                                                                                                                                                17

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   interrupt occurs during execution of a multi-cycle instruction, this instruction is completed before
                                   the interrupt is served. If an interrupt occurs when the MCU is in sleep mode, the interrupt exe-
                                   cution response time is increased by five clock cycles. This increase comes in addition to the
                                   start-up time from the selected sleep mode.
                                   A return from an interrupt handling routine takes five clock cycles. During these five clock cycles,
                                   the Program Counter (three bytes) is popped back from the Stack, the Stack Pointer is incre-
                                   mented by three, and the I-bit in SREG is set.

                                                                                                                                                                18

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

7. AVR Memories

7.1 Overview

                                   This section describes the different memories in the ATmega164PA/324PA/644PA/1284P. The
                                   AVR architecture has two main memory spaces, the Data Memory and the Program Memory
                                   space. In addition, the ATmega164PA/324PA/644PA/1284P features an EEPROM Memory for
                                   data storage. All three memory spaces are linear and regular.

7.2 In-System Reprogrammable Flash Program Memory

                                   The ATmega164PA/324PA/644PA/1284P contains 16/32/64/128K bytes On-chip In-System
                                   Reprogrammable Flash memory for program storage. Since all AVR instructions are 16 or 32
                                   bits wide, the Flash is organized as 32/64 x 16. For software security, the Flash Program mem-
                                   ory space is divided into two sections, Boot Program section and Application Program section.
                                   The Flash memory has an endurance of at least 10,000 write/erase cycles. The
                                   ATmega164PA/324PA/644PA/1284P Program Counter (PC) is 15/16 bits wide, thus addressing
                                   the 32/64K program memory locations. The operation of Boot Program section and associated
                                   Boot Lock bits for software protection are described in detail in "Memory Programming" on page
                                   296. "Memory Programming" on page 296 contains a detailed description on Flash data serial
                                   downloading using the SPI pins or the JTAG interface.
                                   Constant tables can be allocated within the entire program memory address space (see the LPM
                                    Load Program Memory instruction description.
                                   Timing diagrams for instruction fetch and execution are presented in "Instruction Execution Tim-
                                   ing" on page 15.

                                                                                                                                                                19

8152GAVR11/09
                      ATmega164PA/324PA/644PA/1284P

Figure 7-1. Program Memory Map
                             Program Memory

                                                 0x0000

                      Application Flash Section

                      Boot Flash Section

                                                 0x1FFF/0x3FFF/0x7FFF/0xFFFF

7.3 SRAM Data Memory

Figure 7-2 shows how the ATmega164PA/324PA/644PA/1284P SRAM Memory is organized.

The ATmega164PA/324PA/644PA/1284P is a complex microcontroller with more peripheral
units than can be supported within the 64 location reserved in the Opcode for the IN and OUT
instructions. For the Extended I/O space from $060 - $FF in SRAM, only the ST/STS/STD and
LD/LDS/LDD instructions can be used.

The first 4,352 Data Memory locations address both the Register File, the I/O Memory,
Extended I/O Memory, and the internal data SRAM. The first 32 locations address the Register
file, the next 64 location the standard I/O Memory, then 160 locations of Extended I/O memory
and the next 4,096 locations address the internal data SRAM.

The five different addressing modes for the data memory cover: Direct, Indirect with Displace-
ment, Indirect, Indirect with Pre-decrement, and Indirect with Post-increment. In the Register file,
registers R26 to R31 feature the indirect addressing pointer registers.

The direct addressing reaches the entire data space.

The Indirect with Displacement mode reaches 63 address locations from the base address given
by the Y- or Z-register.

When using register indirect addressing modes with automatic pre-decrement and post-incre-
ment, the address registers X, Y, and Z are decremented or incremented.

                                                                                                                                                                20

8152GAVR11/09
                                 ATmega164PA/324PA/644PA/1284P

       The 32 general purpose working registers, 64 I/O registers, 160 Extended I/O Registers and the
       1024/2048/4096 bytes of internal data SRAM in the ATmega164PA/324PA/644PA/1284P are all
       accessible through all these addressing modes. The Register File is described in "General Pur-
       pose Register File" on page 13.

       Figure 7-2. Data Memory Map for ATmega164PA/324PA/644PA/1284P

                                 Data Memory

                                   32 Registers             0x0000 - 0x001F
                                 64 I/O Registers           0x0020 - 0x005F
                                 160 Ext I/O Reg.           0x0060 - 0x00FF
                                                            0x0100

                                         Internal SRAM
                                 (1024/2048/4096/16384x 8)

                                                            0x04FF/0x08FF/0x10FF /0x40FF

7.3.1  Data Memory Access Times

       This section describes the general access timing concepts for internal memory access. The
       internal data SRAM access is performed in two clkCPU cycles as described in Figure 7-3.

       Figure 7-3. On-chip Data SRAM Access Cycles

                                 T1                         T2               T3

         clk                     Compute Address            Address valid

                CPU                                                                            Write

       Address                                                                                 Read
           Data
             WR
           Data
             RD

                                 Memory Access Instruction                   Next Instruction

                                                                                                                                                                21

8152GAVR11/09
                        ATmega164PA/324PA/644PA/1284P

7.4 EEPROM Data Memory

7.4.1                       The ATmega164PA/324PA/644PA/1284P contains 512B/1K/2K/4K bytes of data EEPROM
                            memory. It is organized as a separate data space, in which single bytes can be read and written.
                            The EEPROM has an endurance of at least 100,000 write/erase cycles. The access between
                            the EEPROM and the CPU is described in the following, specifying the EEPROM Address Reg-
                            isters, the EEPROM Data Register, and the EEPROM Control Register.

                            For a detailed description of SPI, JTAG and Parallel data downloading to the EEPROM, see
                            page 311, page 315, and page 300 respectively.

       EEPROM Read/Write Access

7.4.2                       The EEPROM Access Registers are accessible in the I/O space. See "Register Description" on
                            page 24 for details.

                            The write access time for the EEPROM is given in Table 7-2 on page 26. A self-timing function,
                            however, lets the user software detect when the next byte can be written. If the user code con-
                            tains instructions that write the EEPROM, some precautions must be taken. In heavily filtered
                            power supplies, VCC is likely to rise or fall slowly on power-up/down. This causes the device for
                            some period of time to run at a voltage lower than specified as minimum for the clock frequency
                            used. See Section "7.4.2" on page 22. for details on how to avoid problems in these situations.

                            In order to prevent unintentional EEPROM writes, a specific write procedure must be followed.
                            Refer to the description of the EEPROM Control Register for details on this.

                            When the EEPROM is read, the CPU is halted for four clock cycles before the next instruction is
                            executed. When the EEPROM is written, the CPU is halted for two clock cycles before the next
                            instruction is executed.

       Preventing EEPROM Corruption

       During periods of low VCC, the EEPROM data can be corrupted because the supply voltage is
       too low for the CPU and the EEPROM to operate properly. These issues are the same as for
       board level systems using EEPROM, and the same design solutions should be applied.

       An EEPROM data corruption can be caused by two situations when the voltage is too low. First,
       a regular write sequence to the EEPROM requires a minimum voltage to operate correctly. Sec-
       ondly, the CPU itself can execute instructions incorrectly, if the supply voltage is too low.

       EEPROM data corruption can easily be avoided by following this design recommendation:

       Keep the AVR RESET active (low) during periods of insufficient power supply voltage. This can
       be done by enabling the internal Brown-out Detector (BOD). If the detection level of the internal
       BOD does not match the needed detection level, an external low VCC reset Protection circuit can
       be used. If a reset occurs while a write operation is in progress, the write operation will be com-
       pleted provided that the power supply voltage is sufficient.

                                                                                                                                                                22

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

7.5 I/O Memory

                                   The I/O space definition of the ATmega164PA/324PA/644PA/1284P is shown in "Register Sum-
                                   mary" on page 442.
                                   All ATmega164PA/324PA/644PA/1284P I/Os and peripherals are placed in the I/O space. All
                                   I/O locations may be accessed by the LD/LDS/LDD and ST/STS/STD instructions, transferring
                                   data between the 32 general purpose working registers and the I/O space. I/O Registers within
                                   the address range 0x00 - 0x1F are directly bit-accessible using the SBI and CBI instructions. In
                                   these registers, the value of single bits can be checked by using the SBIS and SBIC instructions.
                                   Refer to the instruction set section for more details. When using the I/O specific commands IN
                                   and OUT, the I/O addresses 0x00 - 0x3F must be used. When addressing I/O Registers as data
                                   space using LD and ST instructions, 0x20 must be added to these addresses. The
                                   ATmega164PA/324PA/644PA/1284P is a complex microcontroller with more peripheral units
                                   than can be supported within the 64 location reserved in Opcode for the IN and OUT instruc-
                                   tions. For the Extended I/O space from 0x60 - 0xFF in SRAM, only the ST/STS/STD and
                                   LD/LDS/LDD instructions can be used.
                                   For compatibility with future devices, reserved bits should be written to zero if accessed.
                                   Reserved I/O memory addresses should never be written.
                                   Some of the Status Flags are cleared by writing a logical one to them. Note that, unlike most
                                   other AVRs, the CBI and SBI instructions will only operate on the specified bit, and can therefore
                                   be used on registers containing such Status Flags. The CBI and SBI instructions work with reg-
                                   isters 0x00 to 0x1F only.
                                   The I/O and peripherals control registers are explained in later sections.
                                   The ATmega164PA/324PA/644PA/1284P contains three General Purpose I/O Registers, see
                                   "Register Description" on page 24. These registers can be used for storing any information, and
                                   they are particularly useful for storing global variables and Status Flags. General Purpose I/O
                                   Registers within the address range 0x00 - 0x1F are directly bit-accessible using the SBI, CBI,
                                   SBIS, and SBIC instructions.

                                                                                                                                                                23

8152GAVR11/09
                                              ATmega164PA/324PA/644PA/1284P

7.6 Register Description

7.6.1 EEARH and EEARL The EEPROM Address Register

       Bit               15     14               13     12      11      10      9      8  EEARH
       0x22 (0x42)                                      EEAR11  EEAR10  EEAR9  EEAR8  EEARL
       0x21 (0x41)    EEAR7  EEAR6            EEAR5  EEAR4  EEAR3   EEAR2   EEAR1  EEAR0
                          7      6                5      4
       Read/Write         R     R                 R      R       3       2      1      0
                        R/W    R/W              R/W    R/W    R/W      R/W    R/W    R/W
       Initial Value      0      0                0      0    R/W     R/W     R/W    R/W
                          X      X                X      X
                                                                X       X       X      X
                                                                X       X       X      X

       Bits 15:12 Res: Reserved Bits
       These bits are reserved bits in the ATmega164PA/324PA/644PA/1284P and will always read as
       zero.

7.6.2                        Bits 11:0 EEAR8:0: EEPROM Address
                            The EEPROM Address Registers EEARH and EEARL specify the EEPROM address in the
                            512/1K/2K/4K bytes EEPROM space. The EEPROM data bytes are addressed linearly between
                            0 and 511/1023/2047/4096. The initial value of EEAR is undefined. A proper value must be writ-
                            ten before the EEPROM may be accessed.

       EEDR The EEPROM Data Register

       Bit            7                    6  5      4      3       2       1      0
       0x20 (0x40)
       Read/Write     MSB                                                          LSB    EEDR
       Initial Value
                      R/W    R/W              R/W    R/W    R/W     R/W     R/W    R/W

                      0                    0  0      0      0       0       0      0

       Bits 7:0 EEDR7:0: EEPROM Data
       For the EEPROM write operation, the EEDR Register contains the data to be written to the
       EEPROM in the address given by the EEAR Register. For the EEPROM read operation, the
       EEDR contains the data read out from the EEPROM at the address given by EEAR.

7.6.3  EECR The EEPROM Control Register

       Bit            7                    6  5      4      3       2       1      0

       0x1F (0x3F)                          EEPM1 EEPM0 EERIE     EEMPE   EEPE   EERE   EECR

       Read/Write     R                    R  R/W    R/W    R/W     R/W     R/W    R/W

       Initial Value  0                    0  X      X      0       0       X      0

       Bits 7:6 Res: Reserved Bits
       These bits are reserved bits in the ATmega164PA/324PA/644PA/1284P and will always read as
       zero.

       Bits 5:4 EEPM1 and EEPM0: EEPROM Programming Mode Bits
       The EEPROM Programming mode bit setting defines which programming action that will be trig-
       gered when writing EEPE. It is possible to program data in one atomic operation (erase the old
       value and program the new value) or to split the Erase and Write operations in two different

                                                                                                                                                                24

8152GAVR11/09
                              ATmega164PA/324PA/644PA/1284P

                 operations. The Programming times for the different modes are shown in Table 7-1 on page 25.
                 While EEPE is set, any write to EEPMn will be ignored. During reset, the EEPMn bits will be
                 reset to 0b00 unless the EEPROM is busy programming.

                 Table 7-1. EEPROM Mode Bits

                 EEPM1 EEPM0  Programming     Operation
                                    Time      Erase and Write in one operation (Atomic Operation)
                                              Erase Only
                 0  0         3.4 ms          Write Only
                                              Reserved for future use
                 0  1         1.8 ms

                 1  0         1.8 ms

                 1  1         

                  Bit 3 EERIE: EEPROM Ready Interrupt Enable
                 Writing EERIE to one enables the EEPROM Ready Interrupt if the I bit in SREG is set. Writing
                 EERIE to zero disables the interrupt. The EEPROM Ready interrupt generates a constant inter-
                 rupt when EEPE is cleared.

                  Bit 2 EEMPE: EEPROM Master Programming Enable
                 The EEMPE bit determines whether setting EEPE to one causes the EEPROM to be written.
                 When EEMPE is set, setting EEPE within four clock cycles will write data to the EEPROM at the
                 selected address If EEMPE is zero, setting EEPE will have no effect. When EEMPE has been
                 written to one by software, hardware clears the bit to zero after four clock cycles. See the
                 description of the EEPE bit for an EEPROM write procedure.

                  Bit 1 EEPE: EEPROM Programming Enable
                 The EEPROM Write Enable Signal EEPE is the write strobe to the EEPROM. When address
                 and data are correctly set up, the EEPE bit must be written to one to write the value into the
                 EEPROM. The EEMPE bit must be written to one before a logical one is written to EEPE, other-
                 wise no EEPROM write takes place. The following procedure should be followed when writing
                 the EEPROM (the order of steps 3 and 4 is not essential):

                 1. Wait until EEPE becomes zero.
                 2. Wait until SPMEN in SPMCSR becomes zero.
                 3. Write new EEPROM address to EEAR (optional).
                 4. Write new EEPROM data to EEDR (optional).
                 5. Write a logical one to the EEMPE bit while writing a zero to EEPE in EECR.
                 6. Within four clock cycles after setting EEMPE, write a logical one to EEPE.
                 The EEPROM can not be programmed during a CPU write to the Flash memory. The software
                 must check that the Flash programming is completed before initiating a new EEPROM write.
                 Step 2 is only relevant if the software contains a Boot Loader allowing the CPU to program the
                 Flash. If the Flash is never being updated by the CPU, step 2 can be omitted. See "Memory Pro-
                 gramming" on page 296 for details about Boot programming.

                 Caution: An interrupt between step 5 and step 6 will make the write cycle fail, since the
                 EEPROM Master Write Enable will time-out. If an interrupt routine accessing the EEPROM is
                 interrupting another EEPROM access, the EEAR or EEDR Register will be modified, causing the
                 interrupted EEPROM access to fail. It is recommended to have the Global Interrupt Flag cleared
                 during all the steps to avoid these problems.

                                                                                                   25

8152GAVR11/09
              ATmega164PA/324PA/644PA/1284P

When the write access time has elapsed, the EEPE bit is cleared by hardware. The user soft-
ware can poll this bit and wait for a zero before writing the next byte. When EEPE has been set,
the CPU is halted for two cycles before the next instruction is executed.

Bit 0 EERE: EEPROM Read Enable
The EEPROM Read Enable Signal EERE is the read strobe to the EEPROM. When the correct
address is set up in the EEAR Register, the EERE bit must be written to a logic one to trigger the
EEPROM read. The EEPROM read access takes one instruction, and the requested data is
available immediately. When the EEPROM is read, the CPU is halted for four cycles before the
next instruction is executed.

The user should poll the EEPE bit before starting the read operation. If a write operation is in
progress, it is neither possible to read the EEPROM, nor to change the EEAR Register.

The calibrated Oscillator is used to time the EEPROM accesses. Table 7-2 on page 26 lists the
typical programming time for EEPROM access from the CPU.

Table 7-2. EEPROM Programming Time

Symbol        Number of Calibrated RC Oscillator Cycles  Typ Programming Time
                                                                     3.3 ms
EEPROM write  26,368
(from CPU)

                                                                                                                                                                26

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   The following code examples show one assembly and one C function for writing to the
                                   EEPROM. The examples assume that interrupts are controlled (e.g. by disabling interrupts glob-
                                   ally) so that no interrupts will occur during execution of these functions. The examples also
                                   assume that no Flash Boot Loader is present in the software. If such code is present, the
                                   EEPROM write function must also wait for any ongoing SPM command to finish.

                                     Assembly Code Example()
                                               EEPROM_write:
                                                  ; Wait for completion of previous write
                                                  sbic EECR,EEPE
                                                  rjmp EEPROM_write
                                                  ; Set up address (r18:r17) in address register
                                                  out EEARH, r18
                                                  out EEARL, r17
                                                  ; Write data (r16) to Data Register
                                                  out EEDR,r16
                                                  ; Write logical one to EEMPE
                                                  sbi EECR,EEMPE
                                                  ; Start eeprom write by setting EEPE
                                                  sbi EECR,EEPE
                                                  ret

                                     C Code Example(1)
                                               void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
                                               {
                                                  /* Wait for completion of previous write */
                                                  while(EECR & (1<                                                      ;
                                                  /* Set up address and Data Registers */
                                                  EEAR = uiAddress;
                                                  EEDR = ucData;
                                                  /* Write logical one to EEMPE */
                                                  EECR |= (1<                                                   /* Start eeprom write by setting EEPE */
                                                  EECR |= (1<                                                }

                                       Note: 1. See "About Code Examples" on page 9.

                                                                                                                                                                27

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   The next code examples show assembly and C functions for reading the EEPROM. The exam-
                                   ples assume that interrupts are controlled so that no interrupts will occur during execution of
                                   these functions.

                                     Assembly Code Example(1)
                                               EEPROM_read:
                                                  ; Wait for completion of previous write
                                                  sbic EECR,EEPE
                                                  rjmp EEPROM_read
                                                  ; Set up address (r18:r17) in address register
                                                  out EEARH, r18
                                                  out EEARL, r17
                                                  ; Start eeprom read by writing EERE
                                                  sbi EECR,EERE
                                                  ; Read data from Data Register
                                                  in r16,EEDR
                                                  ret

                                     C Code Example(1)
                                               unsigned char EEPROM_read(unsigned int uiAddress)
                                               {
                                                  /* Wait for completion of previous write */
                                                  while(EECR & (1<                                                      ;
                                                  /* Set up address register */
                                                  EEAR = uiAddress;
                                                  /* Start eeprom read by writing EERE */
                                                  EECR |= (1<                                                   /* Return data from Data Register */
                                                  return EEDR;
                                               }

                                       Note: 1. See "About Code Examples" on page 9.

                                                                                                                                                                28

8152GAVR11/09
                              ATmega164PA/324PA/644PA/1284P

7.6.4  GPIOR2 General Purpose I/O Register 2
7.6.5
7.6.6  Bit            7    6                    5    4    3    2    1    0
       0x2B (0x4B)
       Read/Write     MSB                                                LSB  GPIOR2
       Initial Value
                      R/W  R/W                  R/W  R/W  R/W  R/W  R/W  R/W

                      0    0                    0    0    0    0    0    0

       GPIOR1 General Purpose I/O Register 1

       Bit            7    6                    5    4    3    2    1    0
       0x2A (0x4A)
       Read/Write     MSB                                                LSB  GPIOR1
       Initial Value
                      R/W  R/W                  R/W  R/W  R/W  R/W  R/W  R/W

                      0    0                    0    0    0    0    0    0

       GPIOR0 General Purpose I/O Register 0

       Bit            7    6                    5    4    3    2    1    0
       0x1E (0x3E)
       Read/Write     MSB                                                LSB  GPIOR0
       Initial Value
                      R/W  R/W                  R/W  R/W  R/W  R/W  R/W  R/W

                      0    0                    0    0    0    0    0    0

       Note:  1. SRWn1 = SRW11 (upper sector) or SRW01 (lower sector), SRWn0 = SRW10 (upper sector) or
                  SRW00 (lower sector). The ALE pulse in period T4 is only present if the next instruction
                  accesses the RAM (internal or external).

                                                                                                                                                                29

8152GAVR11/09
                                          ATmega164PA/324PA/644PA/1284P

8. System Clock and Clock Options

8.1 Clock Systems and their Distribution

       Figure 8-1 presents the principal clock systems in the AVR and their distribution. All of the clocks
       need not be active at a given time. In order to reduce power consumption, the clocks to modules
       not being used can be halted by using different sleep modes, as described in "Power Manage-
       ment and Sleep Modes" on page 43. The clock systems are detailed below.

       Figure 8-1. Clock Distribution

                           Asynchronous   General I/O     ADC                      CPU Core     RAM                      Flash and
                           Timer/Counter    Modules                                                                      EEPROM

                                           clkI/O                   clkADC         clkCPU
                                          clkASY                                   clkFLASH
                                                          AVR Clock
                                                          Control Unit

                                                                                   Reset Logic  Watchdog Timer

                                                                     Source clock            Watchdog clock
                                                          System Clock
                                                                                                             Watchdog
                                                            Prescaler                                        Oscillator

                                                               Clock
                                                           Multiplexer

                           Timer/Counter  External Clock        Crystal                       Low-frequency              Calibrated RC
                              Oscillator                       Oscillator                    Crystal Oscillator             Oscillator

8.1.1  CPU Clock clkCPU
8.1.2
       The CPU clock is routed to parts of the system concerned with operation of the AVR core.
       Examples of such modules are the General Purpose Register File, the Status Register and the
       data memory holding the Stack Pointer. Halting the CPU clock inhibits the core from performing
       general operations and calculations.

       I/O Clock clkI/O

       The I/O clock is used by the majority of the I/O modules, like Timer/Counters, SPI, and USART.
       The I/O clock is also used by the External Interrupt module, but note that some external inter-
       rupts are detected by asynchronous logic, allowing such interrupts to be detected even if the I/O
       clock is halted. Also note that start condition detection in the USI module is carried out asynchro-
       nously when clkI/O is halted, TWI address recognition in all sleep modes.

                                                                                                                                                                30

8152GAVR11/09
       ATmega164PA/324PA/644PA/1284P

8.1.3     Flash Clock clkFLASH
8.1.4
8.1.5                          The Flash clock controls operation of the Flash interface. The Flash clock is usually active simul-
                               taneously with the CPU clock.
8.2
          Asynchronous Timer Clock clkASY

                               The Asynchronous Timer clock allows the Asynchronous Timer/Counter to be clocked directly
                               from an external clock or an external 32 kHz clock crystal. The dedicated clock domain allows
                               using this Timer/Counter as a real-time counter even when the device is in sleep mode.

          ADC Clock clkADC

                               The ADC is provided with a dedicated clock domain. This allows halting the CPU and I/O clocks
                               in order to reduce noise generated by digital circuitry. This gives more accurate ADC conversion
                               results.

       Clock Sources

       The device has the following clock source options, selectable by Flash Fuse bits as shown
       below. The clock from the selected source is input to the AVR clock generator, and routed to the
       appropriate modules.

       Table 8-1. Device Clocking Options Select(1)                                                      CKSEL3..0
         Device Clocking Option                                                                          1111 - 1000
         Low Power Crystal Oscillator                                                                    0111 - 0110
         Full Swing Crystal Oscillator                                                                   0101 - 0100
         Low Frequency Crystal Oscillator
         Internal 128 kHz RC Oscillator                                                                      0011
         Calibrated Internal RC Oscillator                                                                   0010
         External Clock                                                                                      0000
         Reserved                                                                                            0001

8.2.1                         Note: 1. For all fuses "1" means unprogrammed while "0" means programmed.
       Default Clock Source

8.2.2                       The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 pro-
                            grammed, resulting in 1.0MHz system clock. The startup time is set to maximum and time-out
                            period enabled. (CKSEL = "0010", SUT = "10", CKDIV8 = "0"). The default setting ensures that
                            all users can make their desired clock source setting using any available programming interface.

       Clock Startup Sequence

       Any clock source needs a sufficient VCC to start oscillating and a minimum number of oscillating
       cycles before it can be considered stable.

       To ensure sufficient VCC, the device issues an internal reset with a time-out delay (tTOUT) after
       the device reset is released by all other reset sources. "On-chip Debug System" on page 47
       describes the start conditions for the internal reset. The delay (tTOUT) is timed from the Watchdog
       Oscillator and the number of cycles in the delay is set by the SUTx and CKSELx fuse bits. The

                                                                                                                                                                31

8152GAVR11/09
               ATmega164PA/324PA/644PA/1284P

       selectable delays are shown in Table 8-2. The frequency of the Watchdog Oscillator is voltage
       dependent as shown in "Typical Characteristics" on page 341.

       Table 8-2. Number of Watchdog Oscillator Cycles

       Typ Time-out (VCC = 5.0V)  Typ Time-out (VCC = 3.0V)                Number of Cycles
                     0 ms                       0 ms                                   0

       4.1 ms                                               4.3 ms                   512
                                                                                8K (8,192)
       65 ms                                                69 ms

8.2.3                       Main purpose of the delay is to keep the AVR in reset until it is supplied with minimum Vcc. The
                            delay will not monitor the actual voltage and it will be required to select a delay longer than the
                            Vcc rise time. If this is not possible, an internal or external Brown-Out Detection circuit should be
                            used. A BOD circuit will ensure sufficient Vcc before it releases the reset, and the time-out delay
                            can be disabled. Disabling the time-out delay without utilizing a Brown-Out Detection circuit is
                            not recommended.

                            The oscillator is required to oscillate for a minimum number of cycles before the clock is consid-
                            ered stable. An internal ripple counter monitors the oscillator output clock, and keeps the internal
                            reset active for a given number of clock cycles. The reset is then released and the device will
                            start to execute. The recommended oscillator start-up time is dependent on the clock type, and
                            varies from 6 cycles for an externally applied clock to 32K cycles for a low frequency crystal.

                            The start-up sequence for the clock includes both the time-out delay and the start-up time when
                            the device starts up from reset. When starting up from Power-save or Power-down mode, Vcc is
                            assumed to be at a sufficient level and only the start-up time is included.

       Clock Source Connections

       The pins XTAL1 and XTAL2 are input and output, respectively, of an inverting amplifier which
       can be configured for use as an On-chip Oscillator, as shown in Figure 8-2 on page 32. Either a
       quartz crystal or a ceramic resonator may be used.

       C1 and C2 should always be equal for both crystals and resonators. The optimal value of the
       capacitors depends on the crystal or resonator in use, the amount of stray capacitance, and the
       electromagnetic noise of the environment. For ceramic resonators, the capacitor values given by
       the manufacturer should be used.

       Figure 8-2. Crystal Oscillator Connections                   XTAL2
                                                        C2

                                  C1                                XTAL1

                                                                    GND

                                                                                                                                                                32

8152GAVR11/09
                           ATmega164PA/324PA/644PA/1284P

8.3 Low Power Crystal Oscillator

                                   This Crystal Oscillator is a low power oscillator, with reduced voltage swing on the XTAL2 out-
                                   put. It gives the lowest power consumption, but is not capable of driving other clock inputs, and
                                   may be more susceptible to noise in noisy environments. In these cases, refer to the "Full Swing
                                   Crystal Oscillator" on page 34.

                                   Some initial guidelines for choosing capacitors for use with crystals are given in Table 8-3. The
                                   crystal should be connected as described in "Clock Source Connections" on page 32.

                                   The Low Power Oscillator can operate in three different modes, each optimized for a specific fre-
                                   quency range. The operating mode is selected by the fuses CKSEL3..1 as shown in Table 8-3.

Table 8-3. Low Power Crystal Oscillator Operating Modes(1)

        Frequency Range (MHz)  CKSEL3..1(2)    Recommended Range for Capacitors C1
                   0.4 - 0.9        100(3)                         and C2 (pF)

                                                                           

        0.9 - 3.0                      101                       12 - 22

        3.0 - 8.0                      110                       12 - 22

        8.0 - 16.0                     111                       12 - 22

Notes:  1. If 8 MHz frequency exceeds the specification of the device (depends on VCC), the CKDIV8
            Fuse can be programmed in order to divide the internal frequency by 8. It must be ensured
            that the resulting divided clock meets the frequency specification of the device.

        2. This is the recommended CKSEL settings for the different frequency ranges.
        3. This option should not be used with crystals, only with ceramic resonators.

The CKSEL0 Fuse together with the SUT1..0 Fuses select the start-up times as shown in Table
8-4.

Table 8-4. Start-up Times for the Low Power Crystal Oscillator Clock Selection

Oscillator Source /        Start-up Time from  Additional Delay  CKSEL0         SUT1..0
Power Conditions            Power-down and        from Reset          0            00
                                Power-save        (VCC = 5.0V)                     01
Ceramic resonator, fast                                                            10
rising power                       258 CK      14CK + 4.1 ms(1)                    11
                                                                                   00
Ceramic resonator, slowly      258 CK          14CK + 65 ms(1)            0
rising power

Ceramic resonator, BOD         1K CK           14CK(2)                    0
enabled

Ceramic resonator, fast        1K CK           14CK + 4.1 ms(2)           0
rising power

Ceramic resonator, slowly      1K CK           14CK + 65 ms(2)            1
rising power

                                                                                                                                                                33

8152GAVR11/09
                                   ATmega164PA/324PA/644PA/1284P

Table 8-4. Start-up Times for the Low Power Crystal Oscillator Clock Selection (Continued)

Oscillator Source /                Start-up Time from  Additional Delay  CKSEL0 SUT1..0
Power Conditions                    Power-down and        from Reset
                                        Power-save        (VCC = 5.0V)            1  01
Crystal Oscillator, BOD
enabled                                    16K CK              14CK

Crystal Oscillator, fast           16K CK              14CK + 4.1 ms              1  10
rising power

Crystal Oscillator, slowly         16K CK              14CK + 65 ms               1  11
rising power

Notes:  1. These options should only be used when not operating close to the maximum frequency of the
            device, and only if frequency stability at start-up is not important for the application. These
            options are not suitable for crystals.

        2. These options are intended for use with ceramic resonators and will ensure frequency stability
            at start-up. They can also be used with crystals when not operating close to the maximum fre-
            quency of the device, and if frequency stability at start-up is not important for the application.

8.4 Full Swing Crystal Oscillator

This Crystal Oscillator is a full swing oscillator, with rail-to-rail swing on the XTAL2 output. This is
useful for driving other clock inputs and in noisy environments. The current consumption is
higher than the "Low Power Crystal Oscillator" on page 33. Note that the Full Swing Crystal
Oscillator will only operate for Vcc = 2.7 - 5.5 volts.

Some initial guidelines for choosing capacitors for use with crystals are given in Table 8-6. The
crystal should be connected as described in "Clock Source Connections" on page 32.

The operating mode is selected by the fuses CKSEL3..1 as shown in Table 8-5.

Table 8-5. Full Swing Crystal Oscillator Operating Modes

Frequency Range(1) (MHz)           CKSEL3..1           Recommended Range for Capacitors C1
                                                                           and C2 (pF)

        0.4 - 20                           011                           12 - 22

Notes: 1. If 8 MHz frequency exceeds the specification of the device (depends on VCC), the CKDIV8
                Fuse can be programmed in order to divide the internal frequency by 8. It must be ensured

                that the resulting divided clock meets the frequency specification of the device.

Table 8-6. Start-up Times for the Full Swing Crystal Oscillator Clock Selection

Oscillator Source /                Start-up Time from  Additional Delay  CKSEL0      SUT1..0
Power Conditions                    Power-down and        from Reset          0         00
                                        Power-save        (VCC = 5.0V)                  01
Ceramic resonator, fast                                                                 10
rising power                               258 CK      14CK + 4.1 ms(1)

Ceramic resonator, slowly          258 CK              14CK + 65 ms(1)            0
rising power

Ceramic resonator, BOD             1K CK               14CK(2)                    0
enabled

                                                                                                                                                                34

8152GAVR11/09
                                      ATmega164PA/324PA/644PA/1284P

Table 8-6. Start-up Times for the Full Swing Crystal Oscillator Clock Selection

Oscillator Source /                   Start-up Time from  Additional Delay      CKSEL0 SUT1..0
Power Conditions                       Power-down and        from Reset
                                           Power-save        (VCC = 5.0V)       0  11
Ceramic resonator, fast
rising power                                   1K CK      14CK + 4.1 ms(2)

Ceramic resonator, slowly             1K CK               14CK + 65 ms(2)       1  00
rising power

Crystal Oscillator, BOD               16K CK                14CK                1  01
enabled

Crystal Oscillator, fast              16K CK              14CK + 4.1 ms         1  10
rising power

Crystal Oscillator, slowly            16K CK              14CK + 65 ms          1  11
rising power

Notes:  1. These options should only be used when not operating close to the maximum frequency of the
            device, and only if frequency stability at start-up is not important for the application. These
            options are not suitable for crystals.

        2. These options are intended for use with ceramic resonators and will ensure frequency stability
            at start-up. They can also be used with crystals when not operating close to the maximum fre-
            quency of the device, and if frequency stability at start-up is not important for the application.

8.5 Low Frequency Crystal Oscillator

The Low-frequency Crystal Oscillator is optimized for use with a 32.768 kHz watch crystal.
When selecting crystals, load capasitance and crystal's Equivalent Series Resistance, ESR
must be taken into consideration. Both values are specified by the crystal vendor.
ATmega164PA/324PA/644PA/1284P oscillator is optimized for very low power consumption,
and thus when selecting crystals, see Table 8-7 on page 35 for maximum ESR recommenda-
tions on 9 pF and 12.5 pF crystals.

Table 8-7.  Maximum ESR Recommendation for 32.768 kHz Watch Crystal

            Crystal CL (pF)                                       Max ESR [k](1)

                          9.0                                               65

                          12.5                                              30

Note: 1. Maximum ESR is typical value based on characterization
The Low-frequency Crystal Oscillator provides an internal load capacitance, see Table on page
35 at each TOSC pin.

Table 8-8. Capacitance for Low-frequency Oscillator

            Device                    32kHz Osc. Type Cap (Xtal1/Tosc1)         Cap (Xtal2/Tosc2)
                                                                                         8 pF
ATmega164PA/324PA/644PA/1284P         System Osc.           18 pF                        6 pF

                                      Timer Osc.            6 pF

The capacitance (Ce + Ci) needed at each TOSC pin can be calculated by using:

                                      Ce + Ci = 2  CL Cs

where:

                                                                                                                                                                35

8152GAVR11/09
                    ATmega164PA/324PA/644PA/1284P

Ce - is optional external capacitors as described in Figure 8-2 on page 32
Ci - is is the pin capacitance in Table 8-8 on page 35
CL - is the load capacitance for a 32.768 kHz crystal specified by the crystal vendor.
CS - is the total stray capacitance for one TOSC pin.
Crystals specifying load capacitance (CL) higher than the ones given in the Table 8-8 on page
35, require external capacitors applied as described in Figure 8-2 on page 32.

Figure 8-3. Crystal Oscillator Connections

Crystals specifying load capacitance (CL) higher than listed in Table 8-8 on page 35, require
external capacitors applied as described in Figure 8-2 on page 32.

To find suitable load capacitance for a 32.768 kHz crysal, please consult the crystal datasheet.

When this oscillator is selected, start-up times are determined by the SUT Fuses and CKSEL0
as shown in Table 8-9.

Table 8-9. Start-up Times for the Low Frequency Crystal Oscillator Clock Selection

Power Conditions     Start-up Time from  Additional Delay  CKSEL0  SUT1..0
BOD enabled           Power-down and        from Reset          0     00
Fast rising power         Power-save        (VCC = 5.0V)        0     01
Slowly rising power                            14CK(1)          0     10
                              1K CK
                                         14CK + 4.1 ms(1)
                              1K CK
                                         14CK + 65 ms(1)
                              1K CK

                     Reserved                              0                        11

BOD enabled          32K CK              14CK              1                        00

Fast rising power    32K CK              14CK + 4.1 ms     1                        01

Slowly rising power  32K CK              14CK + 65 ms      1                        10

                     Reserved                              1                        11

Note: 1. These options should only be used if frequency stability at start-up is not important for the
                application.

                                                                                                                                                                36

8152GAVR11/09
                                       ATmega164PA/324PA/644PA/1284P

8.6 Calibrated Internal RC Oscillator

By default, the Internal RC Oscillator provides an approximate 8 MHz clock. Though voltage and
temperature dependent, this clock can be very accurately calibrated by the the user. See Table
27-6 on page 333 and "Internal Oscillator Speed" on page 359 and page 384 for more details.
The device is shipped with the CKDIV8 Fuse programmed. See "System Clock Prescaler" on
page 39 for more details.

This clock may be selected as the system clock by programming the CKSEL Fuses as shown in
Table 8-10. If selected, it will operate with no external components. During reset, hardware loads
the pre-programmed calibration value into the OSCCAL Register and thereby automatically cal-
ibrates the RC Oscillator. The accuracy of this calibration is shown as Factory calibration in
Table 27-6 on page 333.

By changing the OSCCAL register from SW, see "OSCCAL Oscillator Calibration Register" on
page 41, it is possible to get a higher calibration accuracy than by using the factory calibration.
The accuracy of this calibration is shown as User calibration in Table 27-6 on page 333.

When this Oscillator is used as the chip clock, the Watchdog Oscillator will still be used for the
Watchdog Timer and for the Reset Time-out. For more information on the pre-programmed cali-
bration value, see the section "Calibration Byte" on page 299.

Table 8-10.  Internal Calibrated RC Oscillator Operating Modes
                Frequency Range(2) (MHz)
                             7.3 - 8.1                            CKSEL3..0
                                                                    0010(1)

Notes: 1. The device is shipped with this option selected.
            2. If 8 MHz frequency exceeds the specification of the device (depends on VCC), the CKDIV8
                Fuse can be programmed in order to divide the internal frequency by 8.

When this Oscillator is selected, start-up times are determined by the SUT Fuses as shown in

Table 8-11 on page 37.

Table 8-11. Start-up times for the Internal Calibrated RC Oscillator clock selection

Power Conditions                       Start-up Time from Power-  Additional Delay from  SUT1..0
BOD enabled                               down and Power-save       Reset (VCC = 5.0V)      00

                                                      6 CK                   14CK

Fast rising power                      6 CK                       14CK + 4.1 ms           01
Slowly rising power                    6 CK                       14CK + 65 ms           10(1)

                                       Reserved                                          11

Note: 1. The device is shipped with this option selected.

                                                                                                                                                                37

8152GAVR11/09
                                      ATmega164PA/324PA/644PA/1284P

8.7 128 kHz Internal Oscillator

                 The 128 kHz internal Oscillator is a low power Oscillator providing a clock of 128 kHz. The fre-
                 quency is nominal at 3V and 25C. This clock may be select as the system clock by
                 programming the CKSEL Fuses to "0011" as shown in Table 8-12.

                 Table 8-12.  128 kHz Internal Oscillator Operating Modes(2)
                                      Nominal Frequency
                                              128 kHz                            CKSEL3..0
                                                                                    0011

                 Note: 1. Note that the 128kHz oscillator is a very low power clock source, and is not designed for high
                                 accuracy.

                 When this clock source is selected, start-up times are determined by the SUT Fuses as shown in
                 Table 8-13.

                 Table 8-13. Start-up Times for the 128 kHz Internal Oscillator

                 Power Conditions     Start-up Time from Power-          Additional Delay from  SUT1..0
                                         down and Power-save                        Reset          00
                                                                                                   01
                 BOD enabled                         6 CK                        14CK              10
                                                                                                   11
                 Fast rising power                   6 CK                        14CK + 4 ms

                 Slowly rising power                 6 CK                        14CK + 64 ms

                                                     Reserved

8.8 External Clock

                                   To drive the device from an external clock source, XTAL1 should be driven as shown in Figure
                                   8-4. To run the device on an external clock, the CKSEL Fuses must be programmed to "0000".

                                   Figure 8-4. External Clock Drive Configuration

                                                 NC               XTAL2
                                                                  XTAL1
                                      EXTERNAL                    GND
                                           CLOCK
                                          SIGNAL

                 When this clock source is selected, start-up times are determined by the SUT Fuses as shown in
                 Table 8-15.

                 Table 8-14.  Crystal Oscillator Clock Frequency
                                      Nominal Frequency
                                             0 - 20 MHz                          CKSEL3..0
                                                                                    0000

                                                                                                38

8152GAVR11/09
                              ATmega164PA/324PA/644PA/1284P

Table 8-15. Start-up Times for the External Clock Selection

    Power Conditions          Start-up Time from Power-  Additional Delay from  SUT1..0
BOD enabled                      down and Power-save       Reset (VCC = 5.0V)      00

                                             6 CK                   14CK

Fast rising power             6 CK                           14CK + 4.1 ms      01

Slowly rising power           6 CK                           14CK + 65 ms       10

                              Reserved                                          11

When applying an external clock, it is required to avoid sudden changes in the applied clock fre-
quency to ensure stable operation of the MCU. A variation in frequency of more than 2% from
one clock cycle to the next can lead to unpredictable behavior. If changes of more than 2% is
required, ensure that the MCU is kept in Reset during the changes.

Note that the System Clock Prescaler can be used to implement run-time changes of the internal
clock frequency while still ensuring stable operation. Refer to "System Clock Prescaler" on page
39 for details.

8.9 Timer/Counter Oscillator

                                   ATmega164PA/324PA/644PA/1284P uses the same type of crystal oscillator for Low-frequency
                                   Crystal Oscillator and Timer/Counter Oscillator. See "Low Frequency Crystal Oscillator" on page
                                   35 for details on the oscillator and crystal requirements.

                                   The device can operate its Timer/Counter2 from an external 32.768 kHz watch crystal or a exter-
                                   nal clock source. See "Clock Source Connections" on page 32 for details.

                                   Applying an external clock source to TOSC1 can be done if EXTCLK in the ASSR Register is
                                   written to logic one. See "The Output Compare Register B contains an 8-bit value that is contin-
                                   uously compared with the counter value (TCNT2). A match can be used to generate an Output
                                   Compare interrupt, or to generate a waveform output on the OC2B pin." on page 159 for further
                                   description on selecting external clock as input instead of a 32.768 kHz watch crystal.

8.10 Clock Output Buffer

                                   The device can output the system clock on the CLKO pin. To enable the output, the CKOUT
                                   Fuse has to be programmed. This mode is suitable when the chip clock is used to drive other cir-
                                   cuits on the system. The clock also will be output during reset, and the normal operation of I/O
                                   pin will be overridden when the fuse is programmed. Any clock source, including the internal RC
                                   Oscillator, can be selected when the clock is output on CLKO. If the System Clock Prescaler is
                                   used, it is the divided system clock that is output.

8.11 System Clock Prescaler

The ATmega164PA/324PA/644PA/1284P has a system clock prescaler, and the system clock
can be divided by setting the "CLKPR Clock Prescale Register" on page 41. This feature can
be used to decrease the system clock frequency and the power consumption when the require-
ment for processing power is low. This can be used with all clock source options, and it will affect
the clock frequency of the CPU and all synchronous peripherals. clkI/O, clkADC, clkCPU, and clk-
FLASH are divided by a factor as shown in Table 8-16 on page 42.

When switching between prescaler settings, the System Clock Prescaler ensures that no
glitches occurs in the clock system. It also ensures that no intermediate frequency is higher than

                                                                                                                                                                39

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   neither the clock frequency corresponding to the previous setting, nor the clock frequency corre-
                                   sponding to the new setting.
                                   The ripple counter that implements the prescaler runs at the frequency of the undivided clock,
                                   which may be faster than the CPU's clock frequency. Hence, it is not possible to determine the
                                   state of the prescaler - even if it were readable, and the exact time it takes to switch from one
                                   clock division to the other cannot be exactly predicted. From the time the CLKPS values are writ-
                                   ten, it takes between T1 + T2 and T1 + 2 * T2 before the new clock frequency is active. In this
                                   interval, 2 active clock edges are produced. Here, T1 is the previous clock period, and T2 is the
                                   period corresponding to the new prescaler setting.
                                   To avoid unintentional changes of clock frequency, a special write procedure must be followed
                                   to change the CLKPS bits:
                                   1. Write the Clock Prescaler Change Enable (CLKPCE) bit to one and all other bits in

                                         CLKPR to zero.
                                   2. Within four cycles, write the desired value to CLKPS while writing a zero to CLKPCE.
                                   Interrupts must be disabled when changing prescaler setting to make sure the write procedure is
                                   not interrupted.

                                                                                                                                                                40

8152GAVR11/09
                               ATmega164PA/324PA/644PA/1284P

8.12 Register Description

8.12.1 OSCCAL Oscillator Calibration Register

        Bit               7       6              5     4     3                           2       1     0
        (0x66)         CAL7    CAL6                                                           CAL1  CAL0
        Read/Write     R/W     R/W               CAL5  CAL4  CAL3  CAL2                        R/W   R/W  OSCCAL
        Initial Value
                                                 R/W   R/W   R/W                         R/W

                                                      Device Specific Calibration Value

8.12.2                        Bits 7:0 CAL7:0: Oscillator Calibration Value
                             The Oscillator Calibration Register is used to trim the Calibrated Internal RC Oscillator to
                             remove process variations from the oscillator frequency. A pre-programmed calibration value is
                             automatically written to this register during chip reset, giving the Factory calibrated frequency as
                             specified in Table 27-6 on page 333. The application software can write this register to change
                             the oscillator frequency. The oscillator can be calibrated to frequencies as specified in Table 27-
                             6 on page 333. Calibration outside that range is not guaranteed.

                             Note that this oscillator is used to time EEPROM and Flash write accesses, and these write
                             times will be affected accordingly. If the EEPROM or Flash are written, do not calibrate to more
                             than 8.8 MHz. Otherwise, the EEPROM or Flash write may fail.

                             The CAL7 bit determines the range of operation for the oscillator. Setting this bit to 0 gives the
                             lowest frequency range, setting this bit to 1 gives the highest frequency range. The two fre-
                             quency ranges are overlapping, in other words a setting of OSCCAL = 0x7F gives a higher
                             frequency than OSCCAL = 0x80.

                             The CAL6..0 bits are used to tune the frequency within the selected range. A setting of 0x00
                             gives the lowest frequency in that range, and a setting of 0x7F gives the highest frequency in the
                             range.

        CLKPR Clock Prescale Register

        Bit            7       6                 5     4     3                           2    1     0

        (0x61)         CLKPCE                             CLKPS3 CLKPS2 CLKPS1 CLKPS0                  CLKPR

        Read/Write     R/W     R                 R     R     R/W                         R/W  R/W   R/W

        Initial Value  0       0                 0     0           See Bit Description

         Bit 7 CLKPCE: Clock Prescaler Change Enable
        The CLKPCE bit must be written to logic one to enable change of the CLKPS bits. The CLKPCE
        bit is only updated when the other bits in CLKPR are simultaneously written to zero. CLKPCE is
        cleared by hardware four cycles after it is written or when CLKPS bits are written. Rewriting the
        CLKPCE bit within this time-out period does neither extend the time-out period, nor clear the
        CLKPCE bit.

         Bits 3:0 CLKPS3:0: Clock Prescaler Select Bits 3 - 0
        These bits define the division factor between the selected clock source and the internal system
        clock. These bits can be written run-time to vary the clock frequency to suit the application
        requirements. As the divider divides the master clock input to the MCU, the speed of all synchro-
        nous peripherals is reduced when a division factor is used. The division factors are given in
        Table 8-16 on page 42.

                                                                                                                                                                41

8152GAVR11/09
                     ATmega164PA/324PA/644PA/1284P

The CKDIV8 Fuse determines the initial value of the CLKPS bits. If CKDIV8 is unprogrammed,
the CLKPS bits will be reset to "0000". If CKDIV8 is programmed, CLKPS bits are reset to
"0011", giving a division factor of 8 at start up. This feature should be used if the selected clock
source has a higher frequency than the maximum frequency of the device at the present operat-
ing conditions. Note that any value can be written to the CLKPS bits regardless of the CKDIV8
Fuse setting. The Application software must ensure that a sufficient division factor is chosen if
the selected clock source has a higher frequency than the maximum frequency of the device at
the present operating conditions. The device is shipped with the CKDIV8 Fuse programmed.

Table 8-16.  Clock Prescaler Select
     CLKPS3
          0  CLKPS2  CLKPS1             CLKPS0  Clock Division Factor
          0                                  0                1
          0  0                       0       1                2
          0                                  0                4
          0  0                       0       1                8
          0                                  0               16
          0  0                       1       1               32
          0                                  0               64
          1  0                       1       1
          1                                  0              128
          1  1                       0       1              256
          1                                  0          Reserved
          1  1                       0       1          Reserved
          1                                  0          Reserved
          1  1                       1       1          Reserved
          1                                  0          Reserved
             1                       1       1          Reserved
                                                        Reserved
             0                       0

             0                       0

             0                       1

             0                       1

             1                       0

             1                       0

             1                       1

             1                       1

                                                                                                                                                                42

8152GAVR11/09
                             ATmega164PA/324PA/644PA/1284P

9. Power Management and Sleep Modes

9.1 Overview

                                   Sleep modes enable the application to shut down unused modules in the MCU, thereby saving-
                                   power. The AVR provides various sleep modes allowing the user to tailor the power
                                   consumption to the application's requirements.

                                   When enabled, the Brown-out Detector (BOD) actively monitors the power supply voltage during
                                   the sleep periods. To further save power, it is possible to disable the BOD in some sleep modes.
                                   See "BOD Disable" on page 44 for more details.

9.2 Sleep Modes

                 Figure 8-1 on page 30 presents the different clock systems in the
                 ATmega164PA/324PA/644PA/1284P, and their distribution. The figure is helpful in selecting an
                 appropriate sleep mode. Table 9-1 shows the different sleep modes, their wake up sources and
                 BOD disable ability.

                 Table 9-1.  Active Clock Domains and Wake-up Sources in the Different Sleep Modes.

                             Active Clock Domains Oscillators          Wake-up Sources

                 Sleep Mode  clkCPU
                 Idle                clkFLASH
                 ADCNRM                      clkIO
                 Power-down                          clkADC
                 Power-save                                  clkASY
                 Standby(1)                                        Main Clock
                 Extended                                              Source
                 Standby                                                   Enabled
                                                                                  Timer Osc
                                                                                      Enabled
                                                                                            INT2:0 and
                                                                                                Pin Change
                                                                                                     TWI Address
                                                                                                         Match
                                                                                                                Timer2
                                                                                                                      SPM/
                                                                                                                         EEPROM Ready
                                                                                                                                ADC
                                                                                                                                         WDT Interrupt
                                                                                                                                                 Other I/O
                                                                                                                                                        Software
                                                                                                                                                            BOD Disdable

                             XXX X                     X(2) X X X X X X X
                                    XX X
                                                       X(2) X(3) X X(2) X X X
                                           X
                                                    X          X(3) X                   X                 X

                                          X(2) X       X(2) X(3) X X                    X                 X

                                                               X(3) X                   X                 X

                                                       X(2) X(3) X X                    X                 X

                 Notes: 1. Only recommended with external crystal or resonator selected as clock source.
                             2. If Timer/Counter2 is running in asynchronous mode.
                             3. For INT0, only level interrupt.

                 To enter any of the sleep modes, the SE bit in SMCR must be written to logic one and a SLEEP
                 instruction must be executed. The SM2, SM1, and SM0 bits in the SMCR Register select which
                 sleep mode will be activated by the SLEEP instruction. See Table 9-2 on page 48 for a
                 summary.

                 If an enabled interrupt occurs while the MCU is in a sleep mode, the MCU wakes up. The MCU
                 is then halted for four cycles in addition to the start-up time, executes the interrupt routine, and
                 resumes execution from the instruction following SLEEP. The contents of the Register File and
                 SRAM are unaltered when the device wakes up from sleep. If a reset occurs during sleep mode,
                 the MCU wakes up and executes from the Reset Vector.

                                                                                                          43

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

9.3 BOD Disable

                 When the Brown-out Detector (BOD) is enabled by BODLEVEL fuses, Table 26-3 on page 297,
                 the BOD is actively monitoring the power supply voltage during a sleep period. To save power, it
                 is possible to disable the BOD by software for some of the sleep modes, see Table 9-1 on page
                 43. The sleep mode power consumption will then be at the same level as when BOD is globally
                 disabled by fuses. If BOD is disabled in software, the BOD function is turned off immediately
                 after entering the sleep mode. Upon wake-up from sleep, BOD is automatically enabled again.
                 This ensures safe operation in case the VCC level has dropped during the sleep period.

                 When the BOD has been disabled, the wake-up time from sleep mode will be approximately 60
                 s to ensure that the BOD is working correctly before the MCU continues executing code.

                 BOD disable is controlled by bit 6, BODS (BOD Sleep) in the control register MCUCR, see
                 "MCUCR MCU Control Register" on page 49. Writing this bit to one turns off the BOD in rele-
                 vant sleep modes, while a zero in this bit keeps BOD active. Default setting keeps BOD active,
                 i.e. BODS set to zero.

                 Writing to the BODS bit is controlled by a timed sequence and an enable bit, see "MCUCR
                 MCU Control Register" on page 49.

9.4 Idle Mode

                                   When the SM2..0 bits are written to 000, the SLEEP instruction makes the MCU enter Idle
                                   mode, stopping the CPU but allowing the SPI, USART, Analog Comparator, ADC, 2-wire Serial
                                   Interface, Timer/Counters, Watchdog, and the interrupt system to continue operating. This sleep
                                   mode basically halts clkCPU and clkFLASH, while allowing the other clocks to run.

                                   Idle mode enables the MCU to wake up from external triggered interrupts as well as internal
                                   ones like the Timer Overflow and USART Transmit Complete interrupts. If wake-up from the
                                   Analog Comparator interrupt is not required, the Analog Comparator can be powered down by
                                   setting the ACD bit in the Analog Comparator Control and Status Register ACSR. This will
                                   reduce power consumption in Idle mode. If the ADC is enabled, a conversion starts automati-
                                   cally when this mode is entered.

9.5 ADC Noise Reduction Mode

                 When the SM2..0 bits are written to 001, the SLEEP instruction makes the MCU enter ADC
                 Noise Reduction mode, stopping the CPU but allowing the ADC, the external interrupts, 2-wire
                 Serial Interface address match, Timer/Counter2 and the Watchdog to continue operating (if
                 enabled). This sleep mode basically halts clkI/O, clkCPU, and clkFLASH, while allowing the
                 other clocks to run.

                 This improves the noise environment for the ADC, enabling higher resolution measurements. If
                 the ADC is enabled, a conversion starts automatically when this mode is entered. Apart form the
                 ADC Conversion Complete interrupt, only an External Reset, a Watchdog System Reset, a
                 Watchdog interrupt, a Brown-out Reset, a 2-wire serial interface interrupt, a Timer/Counter2
                 interrupt, an SPM/EEPROM ready interrupt, an external level interrupt on INT7:4 or a pin
                 change interrupt can wakeup the MCU from ADC Noise Reduction mode.

                                                                                                                                                                44

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

9.6 Power-down Mode

                                   When the SM2..0 bits are written to 010, the SLEEP instruction makes the MCU enter Power-
                                   down mode. In this mode, the external Oscillator is stopped, while the external interrupts, the 2-
                                   wire Serial Interface, and the Watchdog continue operating (if enabled). Only an External Reset,
                                   a Watchdog Reset, a Brown-out Reset, 2-wire Serial Interface address match, an external level
                                   interrupt on PCINT7:4, an external interrupt on INT2:0, or a pin change interrupt can wake up
                                   the MCU. This sleep mode basically halts all generated clocks, allowing operation of asynchro-
                                   nous modules only.
                                   Note that if a level triggered interrupt is used for wake-up from Power-down mode, the changed
                                   level must be held for some time to wake up the MCU. Refer to "External Interrupts" on page 68
                                   for details.
                                   When waking up from Power-down mode, there is a delay from the wake-up condition occurs
                                   until the wake-up becomes effective. This allows the clock to restart and become stable after
                                   having been stopped. The wake-up period is defined by the same CKSEL Fuses that define the
                                   Reset Time-out period, as described in "Clock Sources" on page 31.

9.7 Power-save Mode

                                   When the SM2:0 bits are written to 011, the SLEEP instruction makes the MCU enter Power-
                                   save mode. This mode is identical to Power-down, with one exception:
                                   If Timer/Counter2 is enabled, it will keep running during sleep. The device can wake up from
                                   either Timer Overflow or Output Compare event from Timer/Counter2 if the corresponding
                                   Timer/Counter2 interrupt enable bits are set in TIMSK2, and the Global Interrupt Enable bit in
                                   SREG is set.
                                   If Timer/Counter2 is not running, Power-down mode is recommended instead of Power-save
                                   mode.
                                   The Timer/Counter2 can be clocked both synchronously and asynchronously in Power-save
                                   mode. If the Timer/Counter2 is not using the asynchronous clock, the Timer/Counter Oscillator is
                                   stopped during sleep. If the Timer/Counter2 is not using the synchronous clock, the clock source
                                   is stopped during sleep. Note that even if the synchronous clock is running in Power-save, this
                                   clock is only available for the Timer/Counter2.

9.8 Standby Mode

                                   When the SM2..0 bits are 110 and an external crystal/resonator clock option is selected, the
                                   SLEEP instruction makes the MCU enter Standby mode. This mode is identical to Power-down
                                   with the exception that the Oscillator is kept running. From Standby mode, the device wakes up
                                   in six clock cycles.

9.9 Extended Standby Mode

                                   When the SM2..0 bits are 111 and an external crystal/resonator clock option is selected, the
                                   SLEEP instruction makes the MCU enter Extended Standby mode. This mode is identical to
                                   Power-save mode with the exception that the Oscillator is kept running. From Extended Standby
                                   mode, the device wakes up in six clock cycles.

                                                                                                                                                                45

8152GAVR11/09
                               ATmega164PA/324PA/644PA/1284P

9.10 Power Reduction Register

                                   The Power Reduction Register(PRR), see "PRR Power Reduction Register" on page 49, pro-
                                   vides a method to stop the clock to individual peripherals to reduce power consumption. The
                                   current state of the peripheral is frozen and the I/O registers can not be read or written.
                                   Resources used by the peripheral when stopping the clock will remain occupied, hence the
                                   peripheral should in most cases be disabled before stopping the clock. Waking up a peripheral,
                                   which is done by clearing the bit in PRR, puts the peripheral in the same state as before
                                   shutdown.

                                   Peripheral shutdown can be used in Idle mode and Active mode to significantly reduce the over-
                                   all power consumption. In all other sleep modes, the clock is already stopped.

9.11 Minimizing Power Consumption

9.11.1                       There are several issues to consider when trying to minimize the power consumption in an AVR
                             controlled system. In general, sleep modes should be used as much as possible, and the sleep
                             mode should be selected so that as few as possible of the device's functions are operating. All
                             functions not needed should be disabled. In particular, the following modules may need special
                             consideration when trying to achieve the lowest possible power consumption.

        Analog to Digital Converter

9.11.2                       If enabled, the ADC will be enabled in all sleep modes. To save power, the ADC should be dis-
                             abled before entering any sleep mode. When the ADC is turned off and on again, the next
                             conversion will be an extended conversion. Refer to "ADC - Analog-to-digital Converter" on page
                             242 for details on ADC operation.

        Analog Comparator

9.11.3                       When entering Idle mode, the Analog Comparator should be disabled if not used. When entering
                             ADC Noise Reduction mode, the Analog Comparator should be disabled. In other sleep modes,
                             the Analog Comparator is automatically disabled. However, if the Analog Comparator is set up
                             to use the Internal Voltage Reference as input, the Analog Comparator should be disabled in all
                             sleep modes. Otherwise, the Internal Voltage Reference will be enabled, independent of sleep
                             mode. Refer to "AC - Analog Comparator" on page 239 for details on how to configure the Ana-
                             log Comparator.

        Brown-out Detector

9.11.4                       If the Brown-out Detector is not needed by the application, this module should be turned off. If
                             the Brown-out Detector is enabled by the BODLEVEL Fuses, it will be enabled in all sleep
                             modes, and hence, always consume power. In the deeper sleep modes, this will contribute sig-
                             nificantly to the total current consumption. Refer to "Brown-out Detection" on page 54 for details
                             on how to configure the Brown-out Detector.

        Internal Voltage Reference

        The Internal Voltage Reference will be enabled when needed by the Brown-out Detection, the
        Analog Comparator or the ADC. If these modules are disabled as described in the sections
        above, the internal voltage reference will be disabled and it will not be consuming power. When
        turned on again, the user must allow the reference to start up before the output is used. If the
        reference is kept on in sleep mode, the output can be used immediately. Refer to "Internal Volt-
        age Reference" on page 55 for details on the start-up time.

                                                                                                                                                                46

8152GAVR11/09
                        ATmega164PA/324PA/644PA/1284P

9.11.5  Watchdog Timer
9.11.6
                   If the Watchdog Timer is not needed in the application, the module should be turned off. If the
9.11.7             Watchdog Timer is enabled, it will be enabled in all sleep modes, and hence, always consume
                   power. In the deeper sleep modes, this will contribute significantly to the total current consump-
                   tion. Refer to "Interrupts" on page 62 for details on how to configure the Watchdog Timer.

        Port Pins

                             When entering a sleep mode, all port pins should be configured to use minimum power. The
                             most important is then to ensure that no pins drive resistive loads. In sleep modes where both
                             the I/O clock (clkI/O) and the ADC clock (clkADC) are stopped, the input buffers of the device will
                             be disabled. This ensures that no power is consumed by the input logic when not needed. In
                             some cases, the input logic is needed for detecting wake-up conditions, and it will then be
                             enabled. Refer to the section "Digital Input Enable and Sleep Modes" on page 78 for details on
                             which pins are enabled. If the input buffer is enabled and the input signal is left floating or have
                             an analog signal level close to VCC/2, the input buffer will use excessive power.

                             For analog input pins, the digital input buffer should be disabled at all times. An analog signal
                             level close to VCC/2 on an input pin can cause significant current even in active mode. Digital
                             input buffers can be disabled by writing to the Digital Input Disable Registers (DIDR1 and
                             DIDR0). Refer to "DIDR1 Digital Input Disable Register 1" on page 241 and "DIDR0 Digital
                             Input Disable Register 0" on page 261 for details.

        On-chip Debug System

                   If the On-chip debug system is enabled by the OCDEN Fuse and the chip enters sleep mode,
                   the main clock source is enabled, and hence, always consumes power. In the deeper sleep
                   modes, this will contribute significantly to the total current consumption.

                   There are three alternative ways to disable the OCD system:

                   Disable the OCDEN Fuse.
                   Disable the JTAGEN Fuse.
                   Write one to the JTD bit in MCUCR.

                                                                                                                                                                47

8152GAVR11/09
                                              ATmega164PA/324PA/644PA/1284P

9.12 Register Description

9.12.1 SMCR Sleep Mode Control Register

The Sleep Mode Control Register contains control bits for power management.

Bit                        7               6  5     4  3    2               1    0

0x33 (0x53)                                        SM2  SM1             SM0  SE        SMCR

Read/Write                 R               R  R     R  R/W  R/W             R/W  R/W

Initial Value              0               0  0     0  0    0               0    0

Bits 3, 2, 1 SM2:0: Sleep Mode Select Bits 2, 1, and 0
These bits select between the five available sleep modes as shown in Table 9-2.

Table 9-2.                 Sleep Mode Select
        SM2
          0                   SM1             SM0      Sleep Mode
          0                                            Idle
          0                   0                  0     ADC Noise Reduction
          0                                            Power-down
          1                   0                  1     Power-save
          1                                            Reserved
          1                   1                  0     Reserved
          1                                            Standby(1)
                              1                  1     Extended Standby(1)

                              0                  0

                              0                  1

                              1                  0

                              1                  1

Note: 1. Standby modes are only recommended for use with external crystals or resonators.

Bit 0 SE: Sleep Enable
The SE bit must be written to logic one to make the MCU enter the sleep mode when the SLEEP
instruction is executed. To avoid the MCU entering the sleep mode unless it is the programmer's
purpose, it is recommended to write the Sleep Enable (SE) bit to one just before the execution of
the SLEEP instruction and to clear it immediately after waking up.

                                                                                                                                                                48

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

9.12.2 MCUCR MCU Control Register

        Bit            7             6       5       4         3       2      1         0

        0x35 (0x55)    JTD           BODS    BODSE   PUD                    IVSEL     IVCE   MCUCR

        Read/Write     R/W           R       R       R/W       R       R      R/W       R/W

        Initial Value  0             0       0       0         0       0      0         0

         Bit 6 BODS: BOD Sleep
        The BODS bit must be written to logic one in order to turn off BOD during sleep, see Table 9-1
        on page 43. Writing to the BODS bit is controlled by a timed sequence and an enable bit,
        BODSE in MCUCR. To disable BOD in relevant sleep modes, both BODS and BODSE must first
        be set to one. Then, to set the BODS bit, BODS must be set to one and BODSE must be set to
        zero within four clock cycles.

        The BODS bit is active three clock cycles after it is set. A sleep instruction must be executed
        while BODS is active in order to turn off the BOD for the actual sleep mode. The BODS bit is
        automatically cleared after three clock cycles.

9.12.3                        Bit 5 BODSE: BOD Sleep Enable
                             BODSE enables setting of BODS control bit, as explained in BODS bit description. BOD disable
                             is controlled by a timed sequence.

        PRR Power Reduction Register

        Bit                7             6       5          4      3      2          1      0  PRR
        (0x64)         PRTWI         PRTIM2  PRTIM0  PRUSART1  PRTIM1  PRSPI  PRUSART0  PRADC
        Read/Write
        Initial Value   R/W            R/W     R/W        R/W    R/W    R/W        R/W    R/W
                           0             0       0          0      0      0          0      0

         Bit 7 - PRTWI: Power Reduction TWI
        Writing a logic one to this bit shuts down the TWI by stopping the clock to the module. When
        waking up the TWI again, the TWI should be re initialized to ensure proper operation.

         Bit 6 - PRTIM2: Power Reduction Timer/Counter2
        Writing a logic one to this bit shuts down the Timer/Counter2 module in synchronous mode (AS2
        is 0). When the Timer/Counter2 is enabled, operation will continue like before the shutdown.

         Bit 5 - PRTIM0: Power Reduction Timer/Counter0
        Writing a logic one to this bit shuts down the Timer/Counter0 module. When the Timer/Counter0
        is enabled, operation will continue like before the shutdown.

         Bit 4 - PRUSART1: Power Reduction USART1
        Writing a logic one to this bit shuts down the USART1 by stopping the clock to the module.
        When waking up the USART1 again, the USART1 should be reinitialized to ensure proper
        operation.

         Bit 3 - PRTIM1: Power Reduction Timer/Counter1
        Writing a logic one to this bit shuts down the Timer/Counter1 module. When the Timer/Counter1
        is enabled, operation will continue like before the shutdown.

                                                                                                                                                                49

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                    Bit 2 - PRSPI: Power Reduction Serial Peripheral Interface
                                   Writing a logic one to this bit shuts down the Serial Peripheral Interface by stopping the clock to
                                   the module. When waking up the SPI again, the SPI should be re initialized to ensure proper
                                   operation.
                                    Bit 1 - PRUSART0: Power Reduction USART0
                                   Writing a logic one to this bit shuts down the USART0 by stopping the clock to the module.
                                   When waking up the USART0 again, the USART0 should be reinitialized to ensure proper
                                   operation.
                                    Bit 0 - PRADC: Power Reduction ADC
                                   Writing a logic one to this bit shuts down the ADC. The ADC must be disabled before shut down.
                                   The analog comparator cannot use the ADC input MUX when the ADC is shut down.

                                                                                                                                                                50

8152GAVR11/09
                              ATmega164PA/324PA/644PA/1284P

10. System Control and Reset

10.1 Resetting the AVR

10.1.1                       During reset, all I/O Registers are set to their initial values, and the program starts execution
                             from the Reset Vector. The instruction placed at the Reset Vector must be a JMP Absolute
                             Jump instruction to the reset handling routine. If the program never enables an interrupt
                             source, the Interrupt Vectors are not used, and regular program code can be placed at these
                             locations. This is also the case if the Reset Vector is in the Application section while the Interrupt
                             Vectors are in the Boot section or vice versa. The circuit diagram in Figure 10-1 on page 52
                             shows the reset logic. "System and Reset Characteristics" on page 334 defines the electrical
                             parameters of the reset circuitry.

                             The I/O ports of the AVR are immediately reset to their initial state when a reset source goes
                             active. This does not require any clock source to be running.

                             After all reset sources have gone inactive, a delay counter is invoked, stretching the internal
                             reset. This allows the power to reach a stable level before normal operation starts. The time-out
                             period of the delay counter is defined by the user through the SUT and CKSEL Fuses. The dif-
                             ferent selections for the delay period are presented in "Clock Sources" on page 31.

        Reset Sources

                             The ATmega164PA/324PA/644PA/1284P has five sources of reset:

                              Power-on Reset. The MCU is reset when the supply voltage is below the Power-on Reset
                               threshold (VPOT).

                              External Reset. The MCU is reset when a low level is present on the RESET pin for longer than
                               the minimum pulse length.

                              Watchdog Reset. The MCU is reset when the Watchdog Timer period expires and the
                               Watchdog is enabled.

                              Brown-out Reset. The MCU is reset when the supply voltage VCC is below the Brown-out Reset
                               threshold (VBOT) and the Brown-out Detector is enabled.

                              JTAG AVR Reset. The MCU is reset as long as there is a logic one in the Reset Register, one
                               of the scan chains of the JTAG system. Refer to the section "IEEE 1149.1 (JTAG) Boundary-
                               scan" on page 268 for details.

                                                                                                                                                                51

8152GAVR11/09
                                  ATmega164PA/324PA/644PA/1284P

        Figure 10-1. Reset Logic

                                                                         DATA BUS

                                                                                       MCU Status
                                                                                   Register (MCUSR)

                                                      Power-on Reset
                                                            Circuit
                                                                         PORF
                                                                            BORF
                                                                                EXTRF
                                                                                     WDRF
                                                                                         JTRF

        BODLEVEL [2..0]                                Brown-out
                                                      Reset Circuit
                                   Pull-up Resistor
                                               SPIKE
                                              FILTER

        JTAG Reset
          Register

                                                      Watchdog
                                                      Oscillator

                                                      Clock          CK  Delay Counters

                                                      Generator                                      TIMEOUT

                                                      CKSEL[3:0]
                                                         SUT[1:0]

10.1.2  Power-on Reset

                             A Power-on Reset (POR) pulse is generated by an On-chip detection circuit. The detection level
                             is defined in "System and Reset Characteristics" on page 334. The POR is activated whenever
                             VCC is below the detection level. The POR circuit can be used to trigger the start-up Reset, as
                             well as to detect a failure in supply voltage.

                             A Power-on Reset (POR) circuit ensures that the device is reset from Power-on. Reaching the
                             Power-on Reset threshold voltage invokes the delay counter, which determines how long the
                             device is kept in RESET after VCC rise. The RESET signal is activated again, without any delay,
                             when VCC decreases below the detection level.

                                                                                                                                                                52

8152GAVR11/09
                   ATmega164PA/324PA/644PA/1284P

        Figure 10-2. MCU Start-up, RESET Tied to VCC

        VCC        VPOT

        RESET      VRST

        TIME-OUT         tTOUT

        INTERNAL
            RESET

        Figure 10-3. MCU Start-up, RESET Extended Externally

        VCC        VPOT

        RESET                   VRST

        TIME-OUT                                      tTOUT

        INTERNAL
            RESET

10.1.3  External Reset

                             An External Reset is generated by a low level on the RESET pin. Reset pulses longer than the
                             minimum pulse width (see "System and Reset Characteristics" on page 334) will generate a
                             reset, even if the clock is not running. Shorter pulses are not guaranteed to generate a reset.
                             When the applied signal reaches the Reset Threshold Voltage VRST on its positive edge, the
                             delay counter starts the MCU after the Time-out period tTOUT has expired.

                             Figure 10-4. External Reset During Operation

                                                                    CC

                                                                                                                                                                53

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

10.1.4  Brown-out Detection

        ATmega164PA/324PA/644PA/1284P has an On-chip Brown-out Detection (BOD) circuit for
        monitoring the VCC level during operation by comparing it to a fixed trigger level. The trigger level
        for the BOD can be selected by the BODLEVEL Fuses. The trigger level has a hysteresis to
        ensure spike free Brown-out Detection. The hysteresis on the detection level should be inter-
        preted as VBOT+ = VBOT + VHYST/2 and VBOT- = VBOT - VHYST/2.

        When the BOD is enabled, and VCC decreases to a value below the trigger level (VBOT- in Figure
        10-5 on page 54), the Brown-out Reset is immediately activated. When VCC increases above the
        trigger level (VBOT+ in Figure 10-5 on page 54), the delay counter starts the MCU after the Time-
        out period tTOUT has expired.

        The BOD circuit will only detect a drop in VCC if the voltage stays below the trigger level for lon-
        ger than tBOD given in "System and Reset Characteristics" on page 334.

        Figure 10-5. Brown-out Reset During Operation

                             VCC        VBOT-          VBOT+

                             RESET

                             TIME-OUT                  tTOUT

                             INTERNAL
                                 RESET

10.1.5  Watchdog Reset

        When the Watchdog times out, it will generate a short reset pulse of one CK cycle duration. On

        the falling edge of this pulse, the delay timer starts counting the Time-out period tTOUT. Refer to
        page 62 for details on operation of the Watchdog Timer.

        Figure 10-6. Watchdog Reset During Operation

                                CC

                                        CK

                                                                                                                                                                54

8152GAVR11/09
                                 ATmega164PA/324PA/644PA/1284P

10.2 Internal Voltage Reference

10.2.1                       ATmega164PA/324PA/644PA/1284P features an internal bandgap reference. This reference is
                             used for Brown-out Detection, and it can be used as an input to the Analog Comparator or the
                             ADC.

        Voltage Reference Enable Signals and Start-up Time

        The voltage reference has a start-up time that may influence the way it should be used. The
        start-up time is given in "System and Reset Characteristics" on page 334. To save power, the
        reference is not always turned on. The reference is on during the following situations:

        1. When the BOD is enabled (by programming the BODLEVEL [2:0] Fuse).
        2. When the bandgap reference is connected to the Analog Comparator (by setting the

             ACBG bit in ACSR).
        3. When the ADC is enabled.
        Thus, when the BOD is not enabled, after setting the ACBG bit or enabling the ADC, the user
        must always allow the reference to start up before the output from the Analog Comparator or
        ADC is used. To reduce power consumption in Power-down mode, the user can avoid the three
        conditions above to ensure that the reference is turned off before entering Power-down mode.

                                                                                                                                                                55

8152GAVR11/09
                                    ATmega164PA/324PA/644PA/1284P

10.3 Watchdog Timer

10.3.1 Features

                  Clocked from separate On-chip Oscillator
                  3 Operating modes

                        Interrupt
                        System Reset
                        Interrupt and System Reset
                  Selectable Time-out period from 16ms to 8s
                  Possible Hardware fuse Watchdog always on (WDTON) for fail-safe mode

10.3.2 Overview

                 ATmega164PA/324PA/644PA/1284P has an Enhanced Watchdog Timer (WDT). The WDT is a
                 timer counting cycles of a separate on-chip 128 kHz oscillator. The WDT gives an interrupt or a
                 system reset when the counter reaches a given time-out value. In normal operation mode, it is
                 required that the system uses the WDR - Watchdog Timer Reset - instruction to restart the coun-
                 ter before the time-out value is reached. If the system doesn't restart the counter, an interrupt or
                 system reset will be issued.

                 Figure 10-7. Watchdog Timer

                         128kHz               OSC/2K
                     OSCILLATOR                  OSC/4K
                                                     OSC/8K
                                                         OSC/16K
                                                             OSC/32K
                                                                OSC/64K
                                                                    OSC/128K
                                                                        OSC/256K
                                                                            OSC/512K
                                                                               OSC/1024K

                     WATCHDOG                                                             WDP0
                     RESET                                                                WDP1
                                                                                          WDP2
                               WDE                                                        WDP3

                                                                                            MCU RESET

                     WDIF

                     WDIE                                                                 INTERRUPT

                 In Interrupt mode, the WDT gives an interrupt when the timer expires. This interrupt can be used
                 to wake the device from sleep-modes, and also as a general system timer. One example is to
                 limit the maximum time allowed for certain operations, giving an interrupt when the operation
                 has run longer than expected. In System Reset mode, the WDT gives a reset when the timer
                 expires. This is typically used to prevent system hang-up in case of runaway code. The third
                 mode, Interrupt and System Reset mode, combines the other two modes by first giving an inter-
                 rupt and then switch to System Reset mode. This mode will for instance allow a safe shutdown
                 by saving critical parameters before a system reset.

                 The Watchdog always on (WDTON) fuse, if programmed, will force the Watchdog Timer to Sys-
                 tem Reset mode. With the fuse programmed the System Reset mode bit (WDE) and Interrupt
                 mode bit (WDIE) are locked to 1 and 0 respectively. To further ensure program security, altera-
                 tions to the Watchdog set-up must follow timed sequences. The sequence for clearing WDE and
                 changing time-out configuration is as follows:

                                                                                                       56

8152GAVR11/09
                                     ATmega164PA/324PA/644PA/1284P

                 1. In the same operation, write a logic one to the Watchdog change enable bit (WDCE) and
                      WDE. A logic one must be written to WDE regardless of the previous value of the WDE
                      bit.

                 2. Within the next four clock cycles, write the WDE and Watchdog prescaler bits (WDP) as
                      desired, but with the WDCE bit cleared. This must be done in one operation.

                 The following code example shows one assembly and one C function for turning off the Watch-
                 dog Timer. The example assumes that interrupts are controlled (e.g. by disabling interrupts
                 globally) so that no interrupts will occur during the execution of these functions.

                  Assembly Code Example(1)
                         WDT_off:
                            ; Turn off global interrupt
                            cli
                            ; Reset Watchdog Timer
                            wdr
                            ; Clear WDRF in MCUSR
                            in r16, MCUSR
                            andi r16, ~(0<                             out MCUSR, r16
                            ; Write logical one to WDCE and WDE
                            ; Keep old prescaler setting to prevent unintentional time-out
                            in r16, WDTCSR
                            ori r16, (1<                             out WDTCSR, r16
                            ; Turn off WDT
                            ldi r16, (0<                             out WDTCSR, r16
                            ; Turn on global interrupt
                            sei
                            ret

                  C Code Example(1)
                         void WDT_off(void)
                         {
                            __disable_interrupt();
                            __watchdog_reset();
                            /* Clear WDRF in MCUSR */
                            MCUSR &= ~(1<                             /* Write logical one to WDCE and WDE */
                            /* Keep old prescaler setting to prevent unintentional time-out */
                            WDTCSR |= (1<                             /* Turn off WDT */
                            WDTCSR = 0x00;
                            __enable_interrupt();
                         }

                 Note: 1. The example code assumes that the part specific header file is included.

                                                                                                                                              57

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   Note: If the Watchdog is accidentally enabled, for example by a runaway pointer or brown-out
                                   condition, the device will be reset and the Watchdog Timer will stay enabled. If the code is not
                                   set up to handle the Watchdog, this might lead to an eternal loop of time-out resets. To avoid this
                                   situation, the application software should always clear the Watchdog System Reset Flag
                                   (WDRF) and the WDE control bit in the initialisation routine, even if the Watchdog is not in use.
                                   The following code example shows one assembly and one C function for changing the time-out
                                   value of the Watchdog Timer.

                                     Assembly Code Example(1)
                                               WDT_Prescaler_Change:
                                                  ; Turn off global interrupt
                                                  cli
                                                  ; Reset Watchdog Timer
                                                  wdr
                                                  ; Start timed sequence
                                                  in r16, WDTCSR
                                                  ori r16, (1<                                                   out WDTCSR, r16
                                                  ; -- Got four cycles to set the new values from here -
                                                  ; Set new prescaler(time-out) value = 64K cycles (~0.5 s)
                                                  ldi r16, (1<                                                   out WDTCSR, r16
                                                  ; -- Finished setting new values, used 2 cycles -
                                                  ; Turn on global interrupt
                                                  sei
                                                  ret

                                     C Code Example(1)
                                               void WDT_Prescaler_Change(void)
                                               {
                                                  __disable_interrupt();
                                                  __watchdog_reset();
                                                  /* Start timed equence */
                                                  WDTCSR |= (1<                                                   /* Set new prescaler(time-out) value = 64K cycles (~0.5 s) */
                                                  WDTCSR = (1<                                                   __enable_interrupt();
                                               }

                                       Note: 1. The example code assumes that the part specific header file is included.
                                   Note: The Watchdog Timer should be reset before any change of the WDP bits, since a change
                                   in the WDP bits can result in a time-out when switching to a shorter time-out period.

                                                                                                                                                                58

8152GAVR11/09
                                       ATmega164PA/324PA/644PA/1284P

10.4 Register Description

10.4.1 MCUSR MCU Status Register

The MCU Status Register provides information on which reset source caused an MCU reset.

Bit                                 7  6  5  4     3     2                   1    0

0x34 (0x54)                               JTRF  WDRF  BORF  EXTRF              PORF MCUSR

Read/Write                          R  R  R  R/W   R/W   R/W                 R/W  R/W

Initial Value                       0  0  0             See Bit Description

Bit 4 JTRF: JTAG Reset Flag
This bit is set if a reset is being caused by a logic one in the JTAG Reset Register selected by
the JTAG instruction AVR_RESET. This bit is reset by a Power-on Reset, or by writing a logic
zero to the flag.

Bit 3 WDRF: Watchdog Reset Flag
This bit is set if a Watchdog Reset occurs. The bit is reset by a Power-on Reset, or by writing a
logic zero to the flag.

Bit 2 BORF: Brown-out Reset Flag
This bit is set if a Brown-out Reset occurs. The bit is reset by a Power-on Reset, or by writing a
logic zero to the flag.

Bit 1 EXTRF: External Reset Flag
This bit is set if an External Reset occurs. The bit is reset by a Power-on Reset, or by writing a
logic zero to the flag.

Bit 0 PORF: Power-on Reset Flag
This bit is set if a Power-on Reset occurs. The bit is reset only by writing a logic zero to the flag.

To make use of the Reset Flags to identify a reset condition, the user should read and then
Reset the MCUSR as early as possible in the program. If the register is cleared before another
reset occurs, the source of the reset can be found by examining the Reset Flags.

                                                                                                                                                                59

8152GAVR11/09
                     ATmega164PA/324PA/644PA/1284P

10.4.2 WDTCSR Watchdog Timer Control Register

Bit               7     6                           5     4       3          2        1     0  WDTCSR
(0x60)         WDIF  WDIE                        WDP3  WDCE     WDE       WDP2     WDP1  WDP0
Read/Write     R/W   R/W                          R/W           R/W        R/W      R/W   R/W
Initial Value                                           R/W
                  0     0                           0     0       X          0        0     0

Bit 7 - WDIF: Watchdog Interrupt Flag
This bit is set when a time-out occurs in the Watchdog Timer and the Watchdog Timer is config-
ured for interrupt. WDIF is cleared by hardware when executing the corresponding interrupt
handling vector. Alternatively, WDIF is cleared by writing a logic one to the flag. When the I-bit in
SREG and WDIE are set, the Watchdog Time-out Interrupt is executed.

Bit 6 - WDIE: Watchdog Interrupt Enable
When this bit is written to one and the I-bit in the Status Register is set, the Watchdog Interrupt is
enabled. If WDE is cleared in combination with this setting, the Watchdog Timer is in Interrupt
Mode, and the corresponding interrupt is executed if time-out in the Watchdog Timer occurs.

If WDE is set, the Watchdog Timer is in Interrupt and System Reset Mode. The first time-out in
the Watchdog Timer will set WDIF. Executing the corresponding interrupt vector will clear WDIE
and WDIF automatically by hardware (the Watchdog goes to System Reset Mode). This is use-
ful for keeping the Watchdog Timer security while using the interrupt. To stay in Interrupt and
System Reset Mode, WDIE must be set after each interrupt. This should however not be done
within the interrupt service routine itself, as this might compromise the safety-function of the
Watchdog System Reset mode. If the interrupt is not executed before the next time-out, a Sys-
tem Reset will be applied.

Table 10-1.    Watchdog Timer Configuration
   WDTON
        1      WDE   WDIE Mode                                                     Action on Time-out
        1                                                                          None
        1      0           0                           Stopped                     Interrupt
                                                                                   Reset
        1      0           1                           Interrupt Mode              Interrupt, then go to System
                                                                                   Reset Mode
        0      1           0                           System Reset Mode           Reset

               1           1                           Interrupt and System Reset
                                                       Mode

               x           x                           System Reset Mode

Bit 4 - WDCE: Watchdog Change Enable
This bit is used in timed sequences for changing WDE and prescaler bits. To clear the WDE bit,
and/or change the prescaler bits, WDCE must be set.

Once written to one, hardware will clear WDCE after four clock cycles.

Bit 3 - WDE: Watchdog System Reset Enable
WDE is overridden by WDRF in MCUSR. This means that WDE is always set when WDRF is
set. To clear WDE, WDRF must be cleared first. This feature ensures multiple resets during con-
ditions causing failure, and a safe start-up after the failure.

                                                                                                                                                                60

8152GAVR11/09
                  ATmega164PA/324PA/644PA/1284P

Bit 5, 2:0 - WDP3:0: Watchdog Timer Prescaler 3, 2, 1 and 0
The WDP3:0 bits determine the Watchdog Timer prescaling when the Watchdog Timer is run-
ning. The different prescaling values and their corresponding time-out periods are shown in
Table 10-2 on page 61.

.

Table 10-2. Watchdog Timer Prescale Select

WDP3  WDP2  WDP1  WDP0  Number of WDT Oscillator      Typical Time-out at
   0     0     0     0               Cycles                 VCC = 5.0V

                               2K (2048) cycles                16 ms

0     0     0     1     4K (4096) cycles              32 ms

0     0     1     0     8K (8192) cycles              64 ms

0     0     1     1     16K (16384) cycles            0.125 s

0     1     0     0     32K (32768) cycles            0.25 s

0     1     0     1     64K (65536) cycles            0.5 s

0     1     1     0     128K (131072) cycles          1.0 s

0     1     1     1     256K (262144) cycles          2.0 s

1     0     0     0     512K (524288) cycles          4.0 s

1     0     0     1     1024K (1048576) cycles        8.0 s

1     0     1     0

1     0     1     1

1     1     0     0

                                            Reserved

1     1     0     1

1     1     1     0

1     1     1     1

                                                                                                                                                                61

8152GAVR11/09
                                ATmega164PA/324PA/644PA/1284P

11. Interrupts

11.1 Overview

                                   This section describes the specifics of the interrupt handling as performed in
                                   ATmega164PA/324PA/644PA/1284P. For a general explanation of the AVR interrupt handling,
                                   refer to "Reset and Interrupt Handling" on page 16.

11.2 Interrupt Vectors in ATmega164PA/324PA/644PA/1284P

                Table 11-1. Reset and Interrupt Vectors

                Vector Program

                No.  Address(2) Source                   Interrupt Definition
                                                         External Pin, Power-on Reset, Brown-out Reset,
                1    $0000(1)   RESET                    Watchdog Reset, and JTAG AVR Reset
                                                         External Interrupt Request 0
                2    $0002      INT0                     External Interrupt Request 1
                                INT1                     External Interrupt Request 2
                3    $0004      INT2                     Pin Change Interrupt Request 0
                                PCINT0                   Pin Change Interrupt Request 1
                4    $0006      PCINT1                   Pin Change Interrupt Request 2
                                PCINT2                   Pin Change Interrupt Request 3
                5    $0008      PCINT3                   Watchdog Time-out Interrupt
                                WDT                      Timer/Counter2 Compare Match A
                6    $000A      TIMER2_COMPA             Timer/Counter2 Compare Match B
                                TIMER2_COMPB             Timer/Counter2 Overflow
                7    $000C      TIMER2_OVF               Timer/Counter1 Capture Event
                                TIMER1_CAPT              Timer/Counter1 Compare Match A
                8    $000E      TIMER1_COMPA             Timer/Counter1 Compare Match B
                                TIMER1_COMPB             Timer/Counter1 Overflow
                9    $0010      TIMER1_OVF               Timer/Counter0 Compare Match A
                                TIMER0_COMPA             Timer/Counter0 Compare match B
                10 $0012        TIMER0_COMPB             Timer/Counter0 Overflow
                                TIMER0_OVF               SPI Serial Transfer Complete
                11 $0014        SPI_STC                  USART0 Rx Complete
                                USART0_RX                USART0 Data Register Empty
                12 $0016        USART0_UDRE              USART0 Tx Complete
                                USART0_TX                Analog Comparator
                13 $0018        ANALOG_COMP              ADC Conversion Complete
                                ADC                      EEPROM Ready
                14 $001A        EE_READY                 2-wire Serial Interface
                                TWI
                15 $001C

                16 $001E

                17 $0020

                18 $0022

                19 $0024

                20 $0026

                21 $0028

                22 $002A

                23 $002C

                24 $002E

                25 $0030

                26 $0032

                27 $0034

                                                                                                                                                                62

8152GAVR11/09
                                              ATmega164PA/324PA/644PA/1284P

                 Table 11-1. Reset and Interrupt Vectors (Continued)

                 Vector Program

                 No.        Address(2) Source         Interrupt Definition

                 28 $0036           SPM_READY         Store Program Memory Ready

                 29 $0038           USART1_RX         USART1 Rx Complete

                 30 $003A           USART1_UDRE       USART1 Data Register Empty

                 31 $003C           USART1_TX         USART1 Tx Complete

                 Notes:  1. When the BOOTRST Fuse is programmed, the device will jump to the Boot Loader address at
                             reset, see "Memory Programming" on page 296.

                         2. When the IVSEL bit in MCUCR is set, Interrupt Vectors will be moved to the start of the Boot
                             Flash Section. The address of each Interrupt Vector will then be the address in this table
                             added to the start address of the Boot Flash Section.

                 Table 11-2 shows reset and Interrupt Vectors placement for the various combinations of

                 BOOTRST and IVSEL settings. If the program never enables an interrupt source, the Interrupt

                 Vectors are not used, and regular program code can be placed at these locations. This is also

                 the case if the Reset Vector is in the Application section while the Interrupt Vectors are in the

                 Boot section or vice versa.

                 Table 11-2. Reset and Interrupt Vectors Placement(1)

                 BOOTRST    IVSEL Reset Address                       Interrupt Vectors Start Address

                         1       0            0x0000                  0x0002

                         1       1            0x0000                  Boot Reset Address + 0x0002

                         0       0            Boot Reset Address      0x0002

                         0       1            Boot Reset Address      Boot Reset Address + 0x0002

                 Note: 1. The Boot Reset Address is shown in Table 25-10 on page 291. For the BOOTRST Fuse "1"
                                 means unprogrammed while "0" means programmed.

                 The most typical and general program setup for the Reset and Interrupt Vector Addresses in
                 ATmega164PA/324PA/644PA/1284P is:

                 Address    Labels            Code                            Comments
                 0x0000                       jmp                             ; Reset
                 0x0002                       jmp     RESET                   ; IRQ0
                 0x0004                       jmp     INT0                    ; IRQ1
                 0x0006                       jmp     INT1                    ; IRQ2
                 0x0008                       jmp     INT2                    ; PCINT0
                 0x000A                       jmp     PCINT0                  ; PCINT1
                 0x000C                       jmp     PCINT1                  ; PCINT2
                 0x000E                       jmp     PCINT2                  ; PCINT3
                 0x0010                       jmp     PCINT3                  ; Watchdog Timeout
                 0x0012                       jmp     WDT                     ; Timer2 CompareA
                 0x0014                       jmp     TIM2_COMPA              ; Timer2 CompareB
                 0x0016                       jmp     TIM2_COMPB              ; Timer2 Overflow
                 0x0018                       jmp     TIM2_OVF                ; Timer1 Capture
                 0x001A                       jmp     TIM1_CAPT               ; Timer1 CompareA
                 0x001C                       jmp     TIM1_COMPA              ; Timer1 CompareB
                 0x001E                       jmp     TIM1_COMPB              ; Timer1 Overflow
                 0x0020                       jmp     TIM1_OVF                ; Timer0 CompareA
                                                      TIM0_COMPA

                                                                                                       63

8152GAVR11/09
                                      ATmega164PA/324PA/644PA/1284P

                 0x0022   RESET:      jmp       TIM0_COMPB    ; Timer0 CompareB
                 0x0024   ...         jmp       TIM0_OVF      ; Timer0 Overflow
                 0x0026               jmp       SPI_STC       ; SPI Transfer Complete
                 0x0028               jmp       USART0_RXC    ; USART0 RX Complete
                 0x002A               jmp       USART0_UDRE   ; USART0,UDR Empty
                 0x002C               jmp       USART0_TXC    ; USART0 TX Complete
                 0x002E               jmp       ANA_COMP      ; Analog Comparator
                 0x0030               jmp       ADC           ; ADC Conversion Complete
                 0x0032               jmp       EE_RDY        ; EEPROM Ready
                 0x0034               jmp       TWI           ; 2-wire Serial
                 0x0036               jmp       SPM_RDY       ; SPM Ready
                 0x0038               jmp       USART1_RXC    ; USART1 RX Complete
                 0x003A               jmp       USART1_UDRE   ; USART1,UDR Empty
                 0x003C               jmp       USART1_TXC    ; USART1 TX Complete
                 ;
                 0x003E               ldi       r16,          ; Main program start
                                                high(RAMEND)
                 0x003F               out       SPH,r16       ; Set Stack Pointer to
                                                              top of RAM
                 0x0040               ldi       r16,
                                                low(RAMEND)   ; Enable interrupts
                 0x0041               out       SPL,r16
                 0x0042               sei
                 0x0043                  xxx
                 ...                  ...       ...

                 When the BOOTRST Fuse is unprogrammed, the Boot section size set to 8K bytes and the
                 IVSEL bit in the MCUCR Register is set before any interrupts are enabled, the most typical and
                 general program setup for the Reset and Interrupt Vector Addresses is:

                 Address Labels Code                Comments

                 0x00000 RESET: ldi r16,high(RAMEND); Main program start

                 0x00001       out SPH,r16          ; Set Stack Pointer to top of RAM

                 0x00002       ldi r16,low(RAMEND)

                 0x00003       out SPL,r16          ; Enable interrupts
                 0x00004       sei

                 0x00005       xxx

                 ;

                 .org 0x1F002

                 0x1F002       jmp EXT_INT0         ; IRQ0 Handler

                 0x1F004       jmp EXT_INT1         ; IRQ1 Handler

                 ...           ... ...              ;

                 0x1FO36       jmp SPM_RDY          ; SPM Ready Handler

                 When the BOOTRST Fuse is programmed and the Boot section size set to 8K bytes, the most
                 typical and general program setup for the Reset and Interrupt Vector Addresses is:

                 Address Labels Code            Comments

                 .org 0x0002

                 0x00002       jmp    EXT_INT0      ; IRQ0 Handler

                                                                                       64

8152GAVR11/09
                             ATmega164PA/324PA/644PA/1284P

        0x00004       jmp EXT_INT1         ; IRQ1 Handler

        ...           ... ...              ;

        0x00036       jmp SPM_RDY          ; SPM Ready Handler

        ;

        .org 0x1F000         r16,high(RAMEND); Main program start
        0x1F000 RESET: ldi

        0x1F001       out SPH,r16          ; Set Stack Pointer to top of RAM

        0x1F002       ldi r16,low(RAMEND)

        0x1F003       out SPL,r16          ; Enable interrupts
        0x1F004       sei

        0x1F005       xxx

        When the BOOTRST Fuse is programmed, the Boot section size set to 8K bytes and the IVSEL
        bit in the MCUCR Register is set before any interrupts are enabled, the most typical and general
        program setup for the Reset and Interrupt Vector Addresses is:

        Address Labels Code                Comments

        ;

        .org 0x1F000

        0x1F000       jmp    RESET         ; Reset handler
                             EXT_INT0      ; IRQ0 Handler
        0x1F002       jmp

        0x1F004       jmp EXT_INT1         ; IRQ1 Handler

        ...           ... ...              ;

        0x1F036       jmp SPM_RDY          ; SPM Ready Handler

        ;

        0x1F03E RESET: ldi r16,high(RAMEND); Main program start

        0x1F03F       out SPH,r16          ; Set Stack Pointer to top of RAM

        0x1F040       ldi r16,low(RAMEND)

        0x1F041       out SPL,r16          ; Enable interrupts
        0x1F042       sei

        0x1FO43       xxx

11.2.1  Moving Interrupts Between Application and Boot Space
                             The General Interrupt Control Register controls the placement of the Interrupt Vector table.

                                                                                                                                                                65

8152GAVR11/09
                                     ATmega164PA/324PA/644PA/1284P

11.3 Register Description

11.3.1 MCUCR MCU Control Register

Bit            7                     6  5        4    3  2  1      0

0x35 (0x55)    JTD                   BODS BODSE  PUD      IVSEL  IVCE  MCUCR

Read/Write     R/W                   R  R        R/W  R  R  R/W    R/W

Initial Value  0                     0  0        0    0  0  0      0

Bit 1 IVSEL: Interrupt Vector Select
When the IVSEL bit is cleared (zero), the Interrupt Vectors are placed at the start of the Flash
memory. When this bit is set (one), the Interrupt Vectors are moved to the beginning of the Boot
Loader section of the Flash. The actual address of the start of the Boot Flash Section is deter-
mined by the BOOTSZ Fuses. Refer to the section "Memory Programming" on page 296 for
details. To avoid unintentional changes of Interrupt Vector tables, a special write procedure must
be followed to change the IVSEL bit:

     a. Write the Interrupt Vector Change Enable (IVCE) bit to one.

     b. Within four cycles, write the desired value to IVSEL while writing a zero to IVCE.

Interrupts will automatically be disabled while this sequence is executed. Interrupts are disabled
in the cycle IVCE is set, and they remain disabled until after the instruction following the write to
IVSEL. If IVSEL is not written, interrupts remain disabled for four cycles. The I-bit in the Status
Register is unaffected by the automatic disabling.

Note:  If Interrupt Vectors are placed in the Boot Loader section and Boot Lock bit BLB02 is programmed,
       interrupts are disabled while executing from the Application section. If Interrupt Vectors are placed
       in the Application section and Boot Lock bit BLB12 is programed, interrupts are disabled while
       executing from the Boot Loader section. Refer to the section "Memory Programming" on page 296
       for details on Boot Lock bits.

Bit 0 IVCE: Interrupt Vector Change Enable
The IVCE bit must be written to logic one to enable change of the IVSEL bit. IVCE is cleared by
hardware four cycles after it is written or when IVSEL is written. Setting the IVCE bit will disable
interrupts, as explained in the IVSEL description above. See the following Code Example.

                                                                                                                                                                66

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                     Assembly Code Example
                                               Move_interrupts:
                                                  ; Get MCUCR
                                                  in r16, MCUCR
                                                  mov r17, r16
                                                  ; Enable change of Interrupt Vectors
                                                  ori r16, (1<                                                   out MCUCR, r16
                                                  ; Move interrupts to Boot Flash section
                                                  ori r17, (1<                                                   out MCUCR, r17
                                                  ret

                                     C Code Example
                                               void Move_interrupts(void)
                                               {
                                               uchar temp;
                                                  /* GET MCUCR*/
                                                  temp = MCUCR;
                                                  /* Enable change of Interrupt Vectors */
                                                  MCUCR = temp|(1<                                                   /* Move interrupts to Boot Flash section */
                                                  MCUCR = temp|(1<                                                }

                                                                                                                                                                67

8152GAVR11/09
                                 ATmega164PA/324PA/644PA/1284P

12. External Interrupts

12.1 Overview

                                   The External Interrupts are triggered by the INT2:0 pin or any of the PCINT31:0 pins. Observe
                                   that, if enabled, the interrupts will trigger even if the INT2:0 or PCINT31:0 pins are configured as
                                   outputs. This feature provides a way of generating a software interrupt.

                                   The Pin change interrupt PCI3 will trigger if any enabled PCINT31:24 pin toggle, Pin change
                                   interrupt PCI2 will trigger if any enabled PCINT23:16 pin toggles, Pin change interrupt PCI1 if
                                   any enabled PCINT15:8 toggles and Pin change interrupts PCI0 will trigger if any enabled
                                   PCINT7:0 pin toggles. PCMSK3, PCMSK2, PCMSK1 and PCMSK0 Registers control which pins
                                   contribute to the pin change interrupts. Pin change interrupts on PCINT31:0 are detected asyn-
                                   chronously. This implies that these interrupts can be used for waking the part also from sleep
                                   modes other than Idle mode.

                                   The External Interrupts can be triggered by a falling or rising edge or a low level. This is set up
                                   as indicated in the specification for the External Interrupt Control Registers EICRA (INT2:0).
                                   When the external interrupt is enabled and is configured as level triggered, the interrupt will trig-
                                   ger as long as the pin is held low. Low level interrupts and the edge interrupt on INT2:0 are
                                   detected asynchronously. This implies that these interrupts can be used for waking the part also
                                   from sleep modes other than Idle mode. The I/O clock is halted in all sleep modes except Idle
                                   mode.

                                   Note that if a level triggered interrupt is used for wake-up from Power-down, the required level
                                   must be held long enough for the MCU to complete the wake-up to trigger the level interrupt. If
                                   the level disappears before the end of the Start-up Time, the MCU will still wake up, but no inter-
                                   rupt will be generated. The start-up time is defined by the SUT and CKSEL Fuses as described
                                   in "System Clock and Clock Options" on page 30.

12.2 Register Description

12.2.1 EICRA External Interrupt Control Register A

The External Interrupt Control Register A contains control bits for interrupt sense control.

Bit                        7  6                       5      4      3      2      1      0

(0x69)                                              ISC21  ISC20  ISC11  ISC10  ISC01  ISC00  EICRA

Read/Write                 R  R                       R/W    R/W    R/W    R/W    R/W    R/W

Initial Value              0  0                       0      0      0      0      0      0

Bits 7:6 Reserved
These bits are reserved in the ATmega164PA/324PA/644PA/1284P, and will always read as
zero.

Bits 5:0 ISC21, ISC20 ISC00, ISC00: External Interrupt 2 - 0 Sense Control Bits
The External Interrupts 2 - 0 are activated by the external pins INT2:0 if the SREG I-flag and the
corresponding interrupt mask in the EIMSK is set. The level and edges on the external pins that
activate the interrupts are defined in Table 12-1. Edges on INT2..INT0 are registered asynchro-
nously. Pulses on INT2:0 pins wider than the minimum pulse width given in "External Interrupts
Characteristics" on page 334 will generate an interrupt. Shorter pulses are not guaranteed to

                                                                                                                                                                68

8152GAVR11/09
                                  ATmega164PA/324PA/644PA/1284P

        generate an interrupt. If low level interrupt is selected, the low level must be held until the com-
        pletion of the currently executing instruction to generate an interrupt. If enabled, a level triggered
        interrupt will generate an interrupt request as long as the pin is held low. When changing the
        ISCn bit, an interrupt can occur. Therefore, it is recommended to first disable INTn by clearing its
        Interrupt Enable bit in the EIMSK Register. Then, the ISCn bit can be changed. Finally, the INTn
        interrupt flag should be cleared by writing a logical one to its Interrupt Flag bit (INTFn) in the
        EIFR Register before the interrupt is re-enabled.

        Table 12-1. Interrupt Sense Control(1)

        ISCn1 ISCn0 Description

             0         0       The low level of INTn generates an interrupt request.

             0         1       Any edge of INTn generates asynchronously an interrupt request.

             1         0       The falling edge of INTn generates asynchronously an interrupt request.

              1        1       The rising edge of INTn generates asynchronously an interrupt request.
        Note:
                 1. n = 2, 1 or 0.
                     When changing the ISCn1/ISCn0 bits, the interrupt must be disabled by clearing its Interrupt
                     Enable bit in the EIMSK Register. Otherwise an interrupt can occur when the bits are changed.

12.2.2 EIMSK External Interrupt Mask Register

        Bit               7    6                 5  4  3  2                           1         0

        0x1D (0x3D)                                  INT2                        INT1   IINT0      EIMSK

        Read/Write        R    R                 R  R  R  R/W                         R/W    R/W

        Initial Value     0    0                 0  0  0  0                           0         0

12.2.3                        Bits 2:0 INT2:0: External Interrupt Request 2 - 0 Enable
                             When an INT2:0 bit is written to one and the I-bit in the Status Register (SREG) is set (one), the
                             corresponding external pin interrupt is enabled. The Interrupt Sense Control bits in the External
                             Interrupt Control Register, EICRA, defines whether the external interrupt is activated on rising or
                             falling edge or level sensed. Activity on any of these pins will trigger an interrupt request even if
                             the pin is enabled as an output. This provides a way of generating a software interrupt.

        EIFR External Interrupt Flag Register

        Bit               7    6                 5  4  3  2                           1         0

        0x1C (0x3C)                                  INTF2                       INTF1  IINTF0     EIFR

        Read/Write        R/W  R                 R  R  R  R/W                         R/W    R/W

        Initial Value     0    0                 0  0  0  0                           0         0

         Bits 2:0 INTF2:0: External Interrupt Flags 2 - 0
        When an edge or logic change on the INT2:0 pin triggers an interrupt request, INTF2:0 becomes
        set (one). If the I-bit in SREG and the corresponding interrupt enable bit, INT2:0 in EIMSK, are
        set (one), the MCU will jump to the interrupt vector. The flag is cleared when the interrupt routine
        is executed. Alternatively, the flag can be cleared by writing a logical one to it. These flags are
        always cleared when INT2:0 are configured as level interrupt. Note that when entering sleep
        mode with the INT2:0 interrupts disabled, the input buffers on these pins will be disabled. This

                                                                                                                                                                69

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   may cause a logic change in internal signals which will set the INTF2:0 flags. See "Digital Input
                                   Enable and Sleep Modes" on page 78 for more information.

                                                                                                                                                                70

8152GAVR11/09
                          ATmega164PA/324PA/644PA/1284P

12.2.4 PCICR Pin Change Interrupt Control Register

        Bit            7  6                           5  4  3      2      1      0

        (0x68)                                          PCIE3  PCIE2  PCIE1  PCIE0  PCICR

        Read/Write     R  R                           R  R  R/W    R/W    R/W    R/W

        Initial Value  0  0                           0  0  0      0      0      0

         Bit 3 PCIE3: Pin Change Interrupt Enable 3
        When the PCIE3 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), pin
        change interrupt 3 is enabled. Any change on any enabled PCINT31..24 pin will cause an inter-
        rupt. The corresponding interrupt of Pin Change Interrupt Request is executed from the PCI3
        Interrupt Vector. PCINT31..24 pins are enabled individually by the PCMSK3 Register.

         Bit 2 PCIE2: Pin Change Interrupt Enable 2
        When the PCIE2 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), pin
        change interrupt 2 is enabled. Any change on any enabled PCINT23..16 pin will cause an inter-
        rupt. The corresponding interrupt of Pin Change Interrupt Request is executed from the PCI2
        Interrupt Vector. PCINT23..16 pins are enabled individually by the PCMSK2 Register.

         Bit 1 PCIE1: Pin Change Interrupt Enable 1
        When the PCIE1 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), pin
        change interrupt 1 is enabled. Any change on any enabled PCINT15..8 pin will cause an inter-
        rupt. The corresponding interrupt of Pin Change Interrupt Request is executed from the PCI1
        Interrupt Vector. PCINT15..8 pins are enabled individually by the PCMSK1 Register.

12.2.5                        Bit 0 PCIE0: Pin Change Interrupt Enable 0
                             When the PCIE0 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), pin
                             change interrupt 0 is enabled. Any change on any enabled PCINT7..0 pin will cause an interrupt.
                             The corresponding interrupt of Pin Change Interrupt Request is executed from the PCI0 Interrupt
                             Vector. PCINT7..0 pins are enabled individually by the PCMSK0 Register.

        PCIFR Pin Change Interrupt Flag Register

        Bit            7  6                           5  4  3      2      1      0

        0x1B (0x3B)                                       PCIF3  PCIF2  PCIF1  PCIF0  PCIFR

        Read/Write     R  R                           R  R  R/W    R/W    R/W    R/W

        Initial Value  0  0                           0  0  0      0      0      0

         Bit 3 PCIF3: Pin Change Interrupt Flag 3
        When a logic change on any PCINT31..24 pin triggers an interrupt request, PCIF3 becomes set
        (one). If the I-bit in SREG and the PCIE3 bit in EIMSK are set (one), the MCU will jump to the
        corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alter-
        natively, the flag can be cleared by writing a logical one to it.

         Bit 2 PCIF2: Pin Change Interrupt Flag 2
        When a logic change on any PCINT23..16 pin triggers an interrupt request, PCIF2 becomes set
        (one). If the I-bit in SREG and the PCIE2 bit in EIMSK are set (one), the MCU will jump to the
        corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alter-
        natively, the flag can be cleared by writing a logical one to it.

                                                                                                                                                                71

8152GAVR11/09
                                ATmega164PA/324PA/644PA/1284P

12.2.6                        Bit 1 PCIF1: Pin Change Interrupt Flag 1
                             When a logic change on any PCINT15..8 pin triggers an interrupt request, PCIF1 becomes set
                             (one). If the I-bit in SREG and the PCIE1 bit in EIMSK are set (one), the MCU will jump to the
                             corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alter-
                             natively, the flag can be cleared by writing a logical one to it.

                              Bit 0 PCIF0: Pin Change Interrupt Flag 0
                             When a logic change on any PCINT7..0 pin triggers an interrupt request, PCIF0 becomes set
                             (one). If the I-bit in SREG and the PCIE0 bit in EIMSK are set (one), the MCU will jump to the
                             corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alter-
                             natively, the flag can be cleared by writing a logical one to it.

        PCMSK3 Pin Change Mask Register 3

        Bit                7        6        5        4        3        2        1        0    PCMSK3
        (0x73)         PCINT31  PCINT30  PCINT29  PCINT28  PCINT27  PCINT26  PCINT25  PCINT24
        Read/Write
        Initial Value    R/W      R/W      R/W      R/W      R/W      R/W      R/W      R/W
                           0        0        0        0        0        0        0        0

12.2.7                        Bit 7:0 PCINT31:24: Pin Change Enable Mask 31:24
                             Each PCINT31:24-bit selects whether pin change interrupt is enabled on the corresponding I/O
                             pin. If PCINT31:24 is set and the PCIE2 bit in PCICR is set, pin change interrupt is enabled on
                             the corresponding I/O pin. If PCINT31..24 is cleared, pin change interrupt on the corresponding
                             I/O pin is disabled.

        PCMSK2 Pin Change Mask Register 2

        Bit                7        6        5        4        3        2        1        0    PCMSK2
        (0x6D)         PCINT23  PCINT22  PCINT21  PCINT20  PCINT19  PCINT18  PCINT17  PCINT16
        Read/Write
        Initial Value    R/W      R/W      R/W      R/W      R/W      R/W      R/W      R/W
                           0        0        0        0        0        0        0        0

12.2.8                        Bit 7:0 PCINT23:16: Pin Change Enable Mask 23..16
                             Each PCINT23:16-bit selects whether pin change interrupt is enabled on the corresponding I/O
                             pin. If PCINT23:16 is set and the PCIE2 bit in PCICR is set, pin change interrupt is enabled on
                             the corresponding I/O pin. If PCINT23..16 is cleared, pin change interrupt on the corresponding
                             I/O pin is disabled.

        PCMSK1 Pin Change Mask Register 1

        Bit                7        6        5        4        3        2        1        0    PCMSK1
        (0x6C)         PCINT15  PCINT14  PCINT13  PCINT12  PCINT11  PCINT10  PCINT9   PCINT8
        Read/Write
        Initial Value    R/W      R/W      R/W      R/W      R/W      R/W      R/W      R/W
                           0        0        0        0        0        0        0        0

         Bit 7:0 PCINT15:8: Pin Change Enable Mask 15..8
        Each PCINT15:8-bit selects whether pin change interrupt is enabled on the corresponding I/O
        pin. If PCINT15:8 is set and the PCIE1 bit in EIMSK is set, pin change interrupt is enabled on the
        corresponding I/O pin. If PCINT15:8 is cleared, pin change interrupt on the corresponding I/O
        pin is disabled.

                                                                                                                                                                72

8152GAVR11/09
                                            ATmega164PA/324PA/644PA/1284P

12.2.9 PCMSK0 Pin Change Mask Register 0

Bit            7       6                    5       4       3       2       1       0       PCMSK0
(0x6B)         PCINT7  PCINT6               PCINT5  PCINT4  PCINT3  PCINT2  PCINT1  PCINT0
Read/Write     R/W     R/W                  R/W     R/W     R/W     R/W     R/W     R/W
Initial Value  0       0                    0       0       0       0       0       0

Bit 7:0 PCINT7:0: Pin Change Enable Mask 7..0
Each PCINT7:0 bit selects whether pin change interrupt is enabled on the corresponding I/O pin.
If PCINT7:0 is set and the PCIE0 bit in PCICR is set, pin change interrupt is enabled on the cor-
responding I/O pin. If PCINT7..0 is cleared, pin change interrupt on the corresponding I/O pin is
disabled.

                                                                                                                                                                73

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

13. I/O-Ports

13.1 Overview

                 All AVR ports have true Read-Modify-Write functionality when used as general digital I/O ports.
                 This means that the direction of one port pin can be changed without unintentionally changing
                 the direction of any other pin with the SBI and CBI instructions. The same applies when chang-
                 ing drive value (if configured as output) or enabling/disabling of pull-up resistors (if configured as
                 input). Each output buffer has symmetrical drive characteristics with both high sink and source
                 capability. The pin driver is strong enough to drive LED displays directly. All port pins have indi-
                 vidually selectable pull-up resistors with a supply-voltage invariant resistance. All I/O pins have
                 protection diodes to both VCC and Ground as indicated in Figure 13-1. Refer to "Electrical Char-
                 acteristics" on page 328 for a complete list of parameters.

                 Figure 13-1. I/O Pin Equivalent Schematic

                 Pxn                               Rpu
                                                           Logic
                                      Cpin
                                                    See Figure
                                            "General Digital I/O" for

                                                       Details

                 All registers and bit references in this section are written in general form. A lower case "x" repre-
                 sents the numbering letter for the port, and a lower case "n" represents the bit number. However,
                 when using the register or bit defines in a program, the precise form must be used. For example,
                 PORTB3 for bit no. 3 in Port B, here documented generally as PORTxn. The physical I/O Regis-
                 ters and bit locations are listed in "Register Description" on page 93.

                 Three I/O memory address locations are allocated for each port, one each for the Data Register
                  PORTx, Data Direction Register DDRx, and the Port Input Pins PINx. The Port Input Pins
                 I/O location is read only, while the Data Register and the Data Direction Register are read/write.
                 However, writing a logic one to a bit in the PINx Register, will result in a toggle in the correspond-
                 ing bit in the Data Register. In addition, the Pull-up Disable PUD bit in MCUCR disables the
                 pull-up function for all pins in all ports when set.

                 Using the I/O port as General Digital I/O is described in "Ports as General Digital I/O" on page
                 75. Most port pins are multiplexed with alternate functions for the peripheral features on the
                 device. How each alternate function interferes with the port pin is described in "Alternate Port
                 Functions" on page 80. Refer to the individual module sections for a full description of the alter-
                 nate functions.

                                                                       74

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   Note that enabling the alternate function of some of the port pins does not affect the use of the
                                   other pins in the port as general digital I/O.

13.2 Ports as General Digital I/O

                                   The ports are bi-directional I/O ports with optional internal pull-ups. Figure 13-2 shows a func-
                                   tional description of one I/O-port pin, here generically called Pxn.
                                   Figure 13-2. General Digital I/O(1)

                                                                                QD              PUD
                                                                                  DDxn
                                                                                Q CLR           WDx
                                                                                                RDx
                                                                              RESET

                                      Pxn                                                                        1            DATA BUS
                                                                              QD

                                                                              PORTxn            0

                                                                              Q CLR

                                                                              RESET                                 WRx  WPx
                                                                                           RRx
                                                    SLEEP

                                                           SYNCHRONIZER                         RPx
                                                                                                clk I/O
                                                           DQ       DQ
                                                           LQ       PINxn

                                                                           Q

                                           PUD:     PULLUP DISABLE            WDx:      WRITE DDRx
                                           SLEEP:   SLEEP CONTROL             RDx:      READ DDRx
                                           clkI/O:  I/O CLOCK                 WRx:      WRITE PORTx
                                                                              RRx:      READ PORTx REGISTER
                                                                              RPx:      READ PORTx PIN
                                                                              WPx:      WRITE PINx REGISTER

                               Note:  1. WRx, WPx, WDx, RRx, RPx, and RDx are common to all pins within the same port. clkI/O,
        Configuring the Pin               SLEEP, and PUD are common to all ports.

13.2.1

        Each port pin consists of three register bits: DDxn, PORTxn, and PINxn. As shown in "Register
        Description" on page 93, the DDxn bits are accessed at the DDRx I/O address, the PORTxn bits
        at the PORTx I/O address, and the PINxn bits at the PINx I/O address.

        The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written logic one,
        Pxn is configured as an output pin. If DDxn is written logic zero, Pxn is configured as an input
        pin.

        If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is
        activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to
        be configured as an output pin. The port pins are tri-stated when reset condition becomes active,
        even if no clocks are running.

                                                                                                                                                                75

8152GAVR11/09
                                  ATmega164PA/324PA/644PA/1284P

13.2.2                       If PORTxn is written logic one when the pin is configured as an output pin, the port pin is driven
13.2.3                       high (one). If PORTxn is written logic zero when the pin is configured as an output pin, the port
                             pin is driven low (zero).
13.2.4
        Toggling the Pin

                             Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
                             Note that the SBI instruction can be used to toggle one single bit in a port.

        Switching Between Input and Output

        When switching between tri-state ({DDxn, PORTxn} = 0b00) and output high ({DDxn, PORTxn}
        = 0b11), an intermediate state with either pull-up enabled {DDxn, PORTxn} = 0b01) or output
        low ({DDxn, PORTxn} = 0b10) must occur. Normally, the pull-up enabled state is fully accept-
        able, as a high-impedant environment will not notice the difference between a strong high driver
        and a pull-up. If this is not the case, the PUD bit in the MCUCR Register can be set to disable all
        pull-ups in all ports.

        Switching between input with pull-up and output low generates the same problem. The user
        must use either the tri-state ({DDxn, PORTxn} = 0b00) or the output high state ({DDxn, PORTxn}
        = 0b11) as an intermediate step.

        Table 13-1 summarizes the control signals for the pin value.

        Table 13-1. Port Pin Configurations

                                  PUD

        DDxn PORTxn (in MCUCR)               I/O     Pull-up  Comment
                                                        No    Tri-state (Hi-Z)
        0                      0  X          Input     Yes    Pxn will source current if ext. pulled low.
                                                        No    Tri-state (Hi-Z)
        0                      1  0          Input      No    Output Low (Sink)
                                                        No    Output High (Source)
        0                      1  1          Input

        1                      0  X          Output

        1                      1  X          Output

        Reading the Pin Value

        Independent of the setting of Data Direction bit DDxn, the port pin can be read through the
        PINxn Register bit. As shown in Figure 13-2, the PINxn Register bit and the preceding latch con-
        stitute a synchronizer. This is needed to avoid metastability if the physical pin changes value
        near the edge of the internal clock, but it also introduces a delay. Figure 13-3 shows a timing dia-
        gram of the synchronization when reading an externally applied pin value. The maximum and
        minimum propagation delays are denoted tpd,max and tpd,min respectively.

                                                                                                                                                                76

8152GAVR11/09
                                     ATmega164PA/324PA/644PA/1284P

                 Figure 13-3. Synchronization when Reading an Externally Applied Pin value

                    SYSTEM CLK          XXX             XXX                         in r17, PINx
                 INSTRUCTIONS
                                                              0x00                                0xFF
                    SYNC LATCH                          t pd, max
                               PINxn
                                   r17                                   t pd, min

                 Consider the clock period starting shortly after the first falling edge of the system clock. The latch
                 is closed when the clock is low, and goes transparent when the clock is high, as indicated by the
                 shaded region of the "SYNC LATCH" signal. The signal value is latched when the system clock
                 goes low. It is clocked into the PINxn Register at the succeeding positive clock edge. As indi-
                 cated by the two arrows tpd,max and tpd,min, a single signal transition on the pin will be delayed
                 between and 1 system clock period depending upon the time of assertion.

                 When reading back a software assigned pin value, a nop instruction must be inserted as indi-
                 cated in Figure 13-4. The out instruction sets the "SYNC LATCH" signal at the positive edge of
                 the clock. In this case, the delay tpd through the synchronizer is 1 system clock period.

                 Figure 13-4. Synchronization when Reading a Software Assigned Pin Value

                 SYSTEM CLK

                 r16                                          0xFF

                 INSTRUCTIONS           out PORTx, r16  nop                         in r17, PINx

                 SYNC LATCH

                 PINxn

                 r17                                    0x00                                      0xFF

                                                        t pd

                 The following code example shows how to set port B pins 0 and 1 high, 2 and 3 low, and define
                 the port pins from 4 to 7 as input with pull-ups assigned to port pins 6 and 7. The resulting pin
                 values are read back again, but as previously discussed, a nop instruction is included to be able
                 to read back the value recently assigned to some of the pins.

                                                                                                                                              77

8152GAVR11/09
                                              ATmega164PA/324PA/644PA/1284P

        Assembly Code Example(1)

                 ...
                 ; Define pull-ups and set outputs high
                 ; Define directions for port pins
                 ldi r16,(1<                  ldi r17,(1<                  out PORTB,r16
                 out DDRB,r17
                 ; Insert nop for synchronization
                 nop
                 ; Read port pins
                 in r16,PINB
                 ...
        C Code Example

              unsigned char i;
                 ...
                 /* Define pull-ups and set outputs high */
                 /* Define directions for port pins */
                 PORTB = (1<                  DDRB = (1<                  /* Insert nop for synchronization*/
                 __no_operation();
                 /* Read port pins */
                 i = PINB;
                 ...

        Note:  1. For the assembly program, two temporary registers are used to minimize the time from pull-
                   ups are set on pins 0, 1, 6, and 7, until the direction bits are correctly set, defining bit 2 and 3
                   as low and redefining bits 0 and 1 as strong high drivers.

13.2.5  Digital Input Enable and Sleep Modes

        As shown in Figure 13-2, the digital input signal can be clamped to ground at the input of the
        schmitt-trigger. The signal denoted SLEEP in the figure, is set by the MCU Sleep Controller in
        Power-down mode, Power-save mode, and Standby mode to avoid high power consumption if
        some input signals are left floating, or have an analog signal level close to VCC/2.

        SLEEP is overridden for port pins enabled as external interrupt pins. If the external interrupt
        request is not enabled, SLEEP is active also for these pins. SLEEP is also overridden by various
        other alternate functions as described in "Alternate Port Functions" on page 80.

        If a logic high level ("one") is present on an asynchronous external interrupt pin configured as
        "Interrupt on Rising Edge, Falling Edge, or Any Logic Change on Pin" while the external interrupt
        is not enabled, the corresponding External Interrupt Flag will be set when resuming from the
        above mentioned Sleep mode, as the clamping in these sleep mode produces the requested
        logic change.

                                                                                                                                                                78

8152GAVR11/09
        ATmega164PA/324PA/644PA/1284P

13.2.6  Unconnected Pins

                             If some pins are unused, it is recommended to ensure that these pins have a defined level. Even
                             though most of the digital inputs are disabled in the deep sleep modes as described above, float-
                             ing inputs should be avoided to reduce current consumption in all other modes where the digital
                             inputs are enabled (Reset, Active mode and Idle mode).

                             The simplest method to ensure a defined level of an unused pin, is to enable the internal pull-up.
                             In this case, the pull-up will be disabled during reset. If low power consumption during reset is
                             important, it is recommended to use an external pull-up or pull-down. Connecting unused pins
                             directly to VCC or GND is not recommended, since this may cause excessive currents if the pin is
                             accidentally configured as an output.

                                                                                                                                                                79

8152GAVR11/09
                               ATmega164PA/324PA/644PA/1284P

13.3 Alternate Port Functions

Most port pins have alternate functions in addition to being general digital I/Os. Figure 13-5
shows how the port pin control signals from the simplified Figure 13-2 on page 75 can be over-
ridden by alternate functions. The overriding signals may not be present in all port pins, but the
figure serves as a generic description applicable to all port pins in the AVR microcontroller
family.

Figure 13-5. Alternate Port Functions(1)

                                                    PUOExn                                                                         PUD

                                                    PUOVxn

                               1
                               0

                                                    DDOExn                                                          QD             WDx
                                                    DDOVxn                                                          DDxn           RDx
                                                                                                                    Q CLR
                               1
                               0                                                                                  RESET

                                                    PVOExn
                                                    PVOVxn

                               1                                                                                           1                             DATA BUS

Pxn                                                                                                        QD              0
                                                                             0

                                                                                                     PORTxn                                 PTOExn

                                                                                DIEOExn                    Q CLR

                                                                                                                                                    WPx

                                                    DIEOVxn                                          RESET                         WRx

                               1

                                                                                SLEEP                                         RRx

                               0

                                                                                       SYNCHRONIZER                                RPx

                                                                                         D SET Q  DQ
                                                                                         L CLR Q  PINxn

                                                                                                    CLR Q

                                                                                                                                   clk I/O

                                                                                                                                   DIxn

                                                                                                                                   AIOxn

PUOExn:   Pxn PULL-UP OVERRIDE ENABLE                                                             PUD:            PULLUP DISABLE
PUOVxn:   Pxn PULL-UP OVERRIDE VALUE                                                              WDx:            WRITE DDRx
DDOExn:   Pxn DATA DIRECTION OVERRIDE ENABLE                                                      RDx:            READ DDRx
DDOVxn:   Pxn DATA DIRECTION OVERRIDE VALUE                                                       RRx:            READ PORTx REGISTER
PVOExn:   Pxn PORT VALUE OVERRIDE ENABLE                                                          WRx:            WRITE PORTx
PVOVxn:   Pxn PORT VALUE OVERRIDE VALUE                                                           RPx:            READ PORTx PIN
DIEOExn:  Pxn DIGITAL INPUT-ENABLE OVERRIDE ENABLE                                                WPx:            WRITE PINx
DIEOVxn:  Pxn DIGITAL INPUT-ENABLE OVERRIDE VALUE                                                 clkI/O:         I/O CLOCK
SLEEP:    SLEEP CONTROL                                                                           DIxn:           DIGITAL INPUT PIN n ON PORTx
                                                                                                  AIOxn:          ANALOG INPUT/OUTPUT PIN n ON PORTx
PTOExn:   Pxn, PORT TOGGLE OVERRIDE ENABLE

Note: 1. WRx, WPx, WDx, RRx, RPx, and RDx are common to all pins within the same port. clkI/O,
                SLEEP, and PUD are common to all ports. All other signals are unique for each pin.

                                                                                                                                                                80

8152GAVR11/09
       ATmega164PA/324PA/644PA/1284P

Table 13-2 summarizes the function of the overriding signals. The pin and port indexes from Fig-
ure 13-5 are not shown in the succeeding tables. The overriding signals are generated internally
in the modules having the alternate function.

Table 13-2. Generic Description of Overriding Signals for Alternate Functions

Signal Name Full Name    Description

PUOE   Pull-up Override  If this signal is set, the pull-up enable is controlled by the PUOV
       Enable            signal. If this signal is cleared, the pull-up is enabled when
                         {DDxn, PORTxn, PUD} = 0b010.

PUOV   Pull-up Override  If PUOE is set, the pull-up is enabled/disabled when PUOV is
       Value             set/cleared, regardless of the setting of the DDxn, PORTxn,
                         and PUD Register bits.

DDOE   Data Direction    If this signal is set, the Output Driver Enable is controlled by the
       Override Enable   DDOV signal. If this signal is cleared, the Output driver is
                         enabled by the DDxn Register bit.

DDOV   Data Direction    If DDOE is set, the Output Driver is enabled/disabled when
       Override Value    DDOV is set/cleared, regardless of the setting of the DDxn
                         Register bit.

PVOE   Port Value        If this signal is set and the Output Driver is enabled, the port
       Override Enable   value is controlled by the PVOV signal. If PVOE is cleared, and
                         the Output Driver is enabled, the port Value is controlled by the
                         PORTxn Register bit.

PVOV   Port Value        If PVOE is set, the port value is set to PVOV, regardless of the
       Override Value    setting of the PORTxn Register bit.

PTOE   Port Toggle       If PTOE is set, the PORTxn Register bit is inverted.
       Override Enable

DIEOE  Digital Input     If this bit is set, the Digital Input Enable is controlled by the
       Enable Override   DIEOV signal. If this signal is cleared, the Digital Input Enable
       Enable            is determined by MCU state (Normal mode, sleep mode).

DIEOV  Digital Input     If DIEOE is set, the Digital Input is enabled/disabled when
       Enable Override   DIEOV is set/cleared, regardless of the MCU state (Normal
       Value             mode, sleep mode).

                         This is the Digital Input to alternate functions. In the figure, the

                         signal is connected to the output of the schmitt trigger but

DI     Digital Input     before the synchronizer. Unless the Digital Input is used as a

                         clock source, the module with the alternate function will use its

                         own synchronizer.

AIO    Analog            This is the Analog Input/output to/from alternate functions. The
       Input/Output      signal is connected directly to the pad, and can be used bi-
                         directionally.

The following subsections shortly describe the alternate functions for each port, and relate the
overriding signals to the alternate function. Refer to the alternate function description for further
details.

                                                                                                                                                                81

8152GAVR11/09
                                       ATmega164PA/324PA/644PA/1284P

13.3.1  Alternate Functions of Port A

        The Port A pins with alternate functions are shown in Table 13-3.

        Table 13-3.    Port A Pins Alternate Functions
             Port Pin
                PA7     Alternate Function
                PA6
                PA5     ADC7 (ADC input channel 7)
                PA4     PCINT7 (Pin Change Interrupt 7)
                PA3
                PA2     ADC6 (ADC input channel 6)
                PA1     PCINT6 (Pin Change Interrupt 6)
                PA0
                        ADC5 (ADC input channel 5)
                        PCINT5 (Pin Change Interrupt 5)

                        ADC4 (ADC input channel 4)
                        PCINT4 (Pin Change Interrupt 4)

                        ADC3 (ADC input channel 3)
                        PCINT3 (Pin Change Interrupt 3)

                        ADC2 (ADC input channel 2)
                        PCINT2 (Pin Change Interrupt 2)

                        ADC1 (ADC input channel 1)
                        PCINT1 (Pin Change Interrupt 1)

                        ADC0 (ADC input channel 0)
                        PCINT0 (Pin Change Interrupt 0)

         ADC7:0/PCINT7:0 Port A, Bit 7:0
        ADC7:0, Analog to Digital Converter, Channels 7:0.

        PCINT7:0, Pin Change Interrupt source 7:0: The PA7:0 pins can serve as external interrupt
        sources.

                                                                                                                                                                82

8152GAVR11/09
                      ATmega164PA/324PA/644PA/1284P

Table 13-4 on page 83 and Table 13-5 on page 83 relates the alternate functions of Port A to the
overriding signals shown in Figure 13-5 on page 80.

Table 13-4. Overriding Signals for Alternate Functions in PA7:PA4

Signal PA7/ADC7/          PA6/ADC6/         PA5/ADC5/              PA4/ADC4/
Name PCINT7               PCINT6            PCINT5                 PCINT4
                                                                   0
PUOE 0                    0                 0                      0
                                                                   0
PUOV 0                    0                 0                      0
                                                                   0
DDOE 0                    0                 0                      0
                                                                   PCINT4 PCIE0 +
DDOV 0                    0                 0                      ADC4D
                                                                   PCINT4 PCIE0
PVOE 0                    0                 0                      PCINT4 INPUT
                                                                   ADC4 INPUT
PVOV 0                    0                 0

DIEOE   PCINT7 PCIE0 +  PCINT6 PCIE0 +  PCINT5 PCIE0 +
        ADC7D             ADC6D             ADC5D

DIEOV PCINT7 PCIE0      PCINT6 PCIE0    PCINT5 PCIE0

DI      PCINT7 INPUT      PCINT6 INPUT      PCINT5 INPUT

AIO     ADC7 INPUT        ADC6 INPUT        ADC5 INPUT

Table 13-5. Overriding Signals for Alternate Functions in PA3:PA0

Signal  PA3/ADC3/         PA2/ADC2/         PA1/ADC1/              PA0/ADC0/
Name    PCINT3            PCINT2            PCINT1                 PCINT0
                                                                   0
PUOE 0                    0                 0                      0
                                                                   0
PUOV 0                    0                 0                      0
                                                                   0
DDOE 0                    0                 0                      0
                                                                   PCINT0 PCIE0 +
DDOV 0                    0                 0                      ADC0D
                                                                   PCINT0 PCIE0
PVOE 0                    0                 0                      PCINT0 INPUT
                                                                   ADC0 INPUT
PVOV 0                    0                 0

DIEOE   PCINT3 PCIE0 +  PCINT2 PCIE0 +  PCINT1 PCIE0 +
        ADC3D             ADC2D             ADC1D

DIEOV PCINT3 PCIE0      PCINT2 PCIE0    PCINT1 PCIE0

DI      PCINT3 INPUT      PCINT2 INPUT      PCINT1 INPUT

AIO     ADC3 INPUT        ADC2 INPUT        ADC1 INPUT

                                                                                                                                                                83

8152GAVR11/09
                                       ATmega164PA/324PA/644PA/1284P

13.3.2  Alternate Functions of Port B

        The Port B pins with alternate functions are shown in Table 13-6.

        Table 13-6. Port B Pins Alternate Functions

        Port Pin Alternate Functions

        PB7  SCK (SPI Bus Master clock input)
             PCINT15 (Pin Change Interrupt 15)

        PB6  MISO (SPI Bus Master Input/Slave Output)
             PCINT14 (Pin Change Interrupt 14)

        PB5  MOSI (SPI Bus Master Output/Slave Input)
             PCINT13 (Pin Change Interrupt 13)

                     SS (SPI Slave Select input)
        PB4 OC0B (Timer/Conter 0 Output Compare Match B Output)

                     PCINT12 (Pin Change Interrupt 12)

                     AIN1 (Analog Comparator Negative Input)
        PB3 OC0A (Timer/Conter 0 Output Compare Match A Output)

                     PCINT11 (Pin Change Interrupt 11)

                     AIN0 (Analog Comparator Positive Input)
        PB2 INT2 (External Interrupt 2 Input)

                     PCINT10 (Pin Change Interrupt 10)

                     T1 (Timer/Counter 1 External Counter Input)
        PB1 CLKO (Divided System Clock Output)

                     PCINT9 (Pin Change Interrupt 9)

                     T0 (Timer/Counter 0 External Counter Input)
        PB0 XCK0 (USART0 External Clock Input/Output)

                     PCINT8 (Pin Change Interrupt 8)

        The alternate pin configuration is as follows:

         SCK/PCINT15 Port B, Bit 7
        SCK: Master Clock output, Slave Clock input pin for SPI channel. When the SPI is enabled as a
        slave, this pin is configured as an input regardless of the setting of DDB7. When the SPI0 is
        enabled as a master, the data direction of this pin is controlled by DDB7. When the pin is forced
        to be an input, the pull-up can still be controlled by the PORTB7 bit.

        PCINT15, Pin Change Interrupt source 15: The PB7 pin can serve as an external interrupt
        source.

         MISO/PCINT14 Port B, Bit 6
        MISO: Master Data input, Slave Data output pin for SPI channel. When the SPI is enabled as a
        master, this pin is configured as an input regardless of the setting of DDB6. When the SPI is
        enabled as a slave, the data direction of this pin is controlled by DDB6. When the pin is forced to
        be an input, the pull-up can still be controlled by the PORTB6 bit.

        PCINT14, Pin Change Interrupt source 14: The PB6 pin can serve as an external interrupt
        source.

                                                                                                                                                                84

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                    MOSI/PCINT13 Port B, Bit 5
                                   MOSI: SPI Master Data output, Slave Data input for SPI channel. When the SPI is enabled as a
                                   slave, this pin is configured as an input regardless of the setting of DDB5. When the SPI is
                                   enabled as a master, the data direction of this pin is controlled by DDB5. When the pin is forced
                                   to be an input, the pull-up can still be controlled by the PORTB5 bit.
                                   PCINT13, Pin Change Interrupt source 13: The PB5 pin can serve as an external interrupt
                                   source.

                                    SS/OC0B/PCINT12 Port B, Bit 4
                                   SS: Slave Port Select input. When the SPI is enabled as a slave, this pin is configured as an
                                   input regardless of the setting of DDB4. As a slave, the SPI is activated when this pin is driven
                                   low. When the SPI is enabled as a master, the data direction of this pin is controlled by DDB4.
                                   When the pin is forced to be an input, the pull-up can still be controlled by the PORTB4 bit.
                                   OC0B, Output Compare Match B output: The PB4 pin can serve as an external output for the
                                   Timer/Counter0 Output Compare. The pin has to be configured as an output (DDB4 set "one") to
                                   serve this function. The OC0B pin is also the output pin for the PWM mode timer function.
                                   PCINT12, Pin Change Interrupt source 12: The PB4 pin can serve as an external interrupt
                                   source.

                                    AIN1/OC0A/PCINT11, Bit 3
                                   AIN1, Analog Comparator Negative input. This pin is directly connected to the negative input of
                                   the Analog Comparator.
                                   OC0A, Output Compare Match A output: The PB3 pin can serve as an external output for the
                                   Timer/Counter0 Output Compare. The pin has to be configured as an output (DDB3 set "one") to
                                   serve this function. The OC0A pin is also the output pin for the PWM mode timer function.
                                   PCINT11, Pin Change Interrupt source 11: The PB3 pin can serve as an external interrupt
                                   source.

                                    AIN0/INT2/PCINT10, Bit 2
                                   AIN0, Analog Comparator Positive input. This pin is directly connected to the positive input of
                                   the Analog Comparator.
                                   INT2, External Interrupt source 2. The PB2 pin can serve as an External Interrupt source to the
                                   MCU.
                                   PCINT10, Pin Change Interrupt source 10: The PB2 pin can serve as an external interrupt
                                   source.

                                    T1/CLKO/PCINT9, Bit 1
                                   T1, Timer/Counter1 counter source.
                                   CLKO, Divided System Clock: The divided system clock can be output on the PB1 pin. The
                                   divided system clock will be output if the CKOUT Fuse is programmed, regardless of the
                                   PORTB1 and DDB1 settings. It will also be output during reset.
                                   PCINT9, Pin Change Interrupt source 9: The PB1 pin can serve as an external interrupt source.

                                                                                                                                                                85

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                  T0/XCK0/PCINT8, Bit 0
                 T0, Timer/Counter0 counter source.

                 XCK0, USART0 External clock. The Data Direction Register (DDB0) controls whether the clock
                 is output (DDD0 set "one") or input (DDD0 cleared). The XCK0 pin is active only when the
                 USART0 operates in Synchronous mode.

                 PCINT8, Pin Change Interrupt source 8: The PB0 pin can serve as an external interrupt source.

                 Table 13-7 and Table 13-8 relate the alternate functions of Port B to the overriding signals
                 shown in Figure 13-5 on page 80. SPI MSTR INPUT and SPI SLAVE OUTPUT constitute the
                 MISO signal, while MOSI is divided into SPI MSTR OUTPUT and SPI SLAVE INPUT. .

                 Table 13-7. Overriding Signals for Alternate Functions in PB7:PB4

                 Signal  PB7/SCK/        PB6/MISO/        PB5/MOSI/                 PB4/SS/OC0B/
                 Name    PCINT15         PCINT14          PCINT13                   PCINT12

                 PUOE SPE MSTR         SPE MSTR       SPE MSTR                SPE MSTR

                 PUOV PORTB7 PUD       PORTB14 PUD    PORTB13 PUD             PORTB12 PUD

                 DDOE SPE MSTR         SPE MSTR       SPE MSTR                SPE MSTR

                 DDOV 0                  0                0                         0

                 PVOE SPE MSTR         SPE MSTR       SPE MSTR                OC0A ENABLE

                 PVOV SCK OUTPUT         SPI SLAVE        SPI MSTR OUTPUT OC0A
                                         OUTPUT

                 DIEOE PCINT15 PCIE1 PCINT14 PCIE1 PCINT13 PCIE1 PCINT12 PCIE1

                 DIEOV 1                 1                1                         1

                 DI      SCK INPUT       SPI MSTR INPUT   SPI SLAVE INPUT           SPI SS
                         PCINT17 INPUT   PCINT14 INPUT    PCINT13 INPUT             PCINT12 INPUT

                 AIO                                                            

                 Table 13-8. Overriding Signals for Alternate Functions in PB3:PB0

                 Signal  PB3/AIN1/OC0B/  PB2/AIN0/INT2/   PB1/T1/CLKO/PCIN PB0/T0/XCK/
                 Name    PCINT11         PCINT10
                                                          T9                        PCINT8

                 PUOE 0                  0                0                         0

                 PUOV 0                  0                0                         0

                 DDOE 0                  0                CKOUT                     0

                 DDOV 0                  0                CKOUT                     0

                 PVOE OC0B ENABLE        0                CKOUT                     0

                 PVOV OC0B               0                CLK I/O                   0

                 DIEOE PCINT11 PCIE1   INT2 ENABLE      PCINT9 PCIE1            PCINT8 PCIE1
                                         PCINT10 PCIE1

                 DIEOV 1                 1                1                         1

                 DI      PCINT11 INPUT   INT2 INPUT       T1 INPUT                  T0 INPUT
                                         PCINT10 INPUT    PCINT9 INPUT              PCINT8 INPUT

                 AIO     AIN1 INPUT      AIN0 INPUT                               

                                                                                                    86

8152GAVR11/09
             ATmega164PA/324PA/644PA/1284P

13.3.3  Alternate Functions of Port C
                             The Port C pins with alternate functions are shown in Table 13-9.

        Table 13-9. Port C Pins Alternate Functions

        Port Pin Alternate Function

                     TOSC2 (Timer Oscillator pin 2)
        PC7

                     PCINT23 (Pin Change Interrupt 23)

        PC6  TOSC1 (Timer Oscillator pin 1)
             PCINT22 (Pin Change Interrupt 22)

        PC5  TDI (JTAG Test Data Input)
             PCINT21 (Pin Change Interrupt 21)

        PC4  TDO (JTAG Test Data Output)
             PCINT20 (Pin Change Interrupt 20)

        PC3  TMS (JTAG Test Mode Select)
             PCINT19 (Pin Change Interrupt 19)

        PC2  TCK (JTAG Test Clock)
             PCINT18 (Pin Change Interrupt 18)

        PC1  SDA (2-wire Serial Bus Data Input/Output Line)
             PCINT17 (Pin Change Interrupt 17)

        PC0  SCL (2-wire Serial Bus Clock Line)
             PCINT16 (Pin Change Interrupt 16)

         TOSC2/PCINT23 Port C, Bit7
        TOSC2, Timer Oscillator pin 2. The PC7 pin can serve as an external interrupt source to the
        MCU.

        PCINT23, Pin Change Interrupt source 23: The PC7 pin can serve as an external interrupt
        source.

         TOSC1/PCINT22 Port C, Bit 6
        TOSC1, Timer Oscillator pin 1. The PC6 pin can serve as an external interrupt source to the
        MCU.

        PCINT22, Pin Change Interrupt source 22: The PC6 pin can serve as an external interrupt
        source.

         TDI/PCINT21 Port C, Bit 5
        TDI, JTAG Test Data Input.

        PCINT21, Pin Change Interrupt source 21: The PC5 pin can serve as an external interrupt
        source.

         TDO/PCINT20 Port C, Bit 4
        TDO, JTAG Test Data Output.

        PCINT20, Pin Change Interrupt source 20: The PC4 pin can serve as an external interrupt
        source.

                                                                                                                                                                87

8152GAVR11/09
                     ATmega164PA/324PA/644PA/1284P

TMS/PCINT19 Port C, Bit 3
TMS, JTAG Test Mode Select.
PCINT19, Pin Change Interrupt source 19: The PC3 pin can serve as an external interrupt
source.

TCK/PCINT18 Port C, Bit 2
TCK, JTAG Test Clock.
PCINT18, Pin Change Interrupt source 18: The PC2 pin can serve as an external interrupt
source.

SDA/PCINT17 Port C, Bit 1
SDA, 2-wire Serial Bus Data Input/Output Line.
PCINT17, Pin Change Interrupt source 17: The PC1 pin can serve as an external interrupt
source.

SCL/PCINT16 Port C, Bit 0
SCL, 2-wire Serial Bus Clock Line.
PCINT16, Pin Change Interrupt source 16: The PC0 pin can serve as an external interrupt
source.
Table 13-10 and Table 13-11 relate the alternate functions of Port C to the overriding signals
shown in Figure 13-5 on page 80.

Table 13-10. Overriding Signals for Alternate Functions in PC7:PC4

Signal  PC7/TOSC2/       PC6/TOSC1/       PC5/TDI/                  PC4/TDO/
Name    PCINT23          PCINT22          PCINT21                   PCINT20
                                                                    JTAGEN
PUOE    AS2 EXCLK      AS2              JTAGEN                    1
                                                                    JTAGEN
PUOV    0                0                1                         SHIFT_IR +
                                                                    SHIFT_DR
DDOE    AS2 EXCLK      AS2              JTAGEN                    JTAGEN
                                                                    TDO
DDOV    0                0                0                         JTAGEN +
                                                                    PCINT20 PCIE2
PVOE    0                0                0                         JTAGEN
PVOV    0                0                0                         PCINT20 INPUT
DIEOE   AS2 EXCLK +                     JTAGEN +
DIEOV   PCINT23 PCIE2  AS2 +            PCINT21 PCIE2           
DI      AS2              PCINT22 PCIE2  JTAGEN
AIO     PCINT23 INPUT    EXCLK + AS2      PCINT21 INPUT

        T/C2 OSC OUTPUT  PCINT22 INPUT    TDI INPUT
                         T/C2 OSC
                         INPUT

                                                                                                                                                                88

8152GAVR11/09
                                       ATmega164PA/324PA/644PA/1284P

        Table 13-11. Overriding Signals for Alternate Functions in PC3:PC0

        Signal    PC3/TMS/             PC2/TCK/                           PC1/SDA/          PC0/SCL/
        Name      PCINT19              PCINT18                            PCINT17           PCINT16
                                                                                            TWEN
        PUOE      JTAGEN               JTAGEN                             TWEN              PORTC0 PUD
                                                                                            TWEN
        PUOV      1                    1                                  PORTC1 PUD      0
                                                                                            TWEN
        DDOE      JTAGEN               JTAGEN                             TWEN              SCL OUT

        DDOV      0                    0                                  0                 PCINT16 PCIE2

        PVOE      0                    0                                  TWEN              1
                                                                                            PCINT16 INPUT
        PVOV      0                    0                                  SDA OUT           SCL INPUT

        DIEOE     JTAGEN +             JTAGEN +                           PCINT17 PCIE2
                  PCINT19 PCIE2      PCINT18 PCIE2

        DIEOV     JTAGEN               JTAGEN                             1

        DI        PCINT19 INPUT        PCINT18 INPUT                      PCINT17 INPUT

        AIO       TMS INPUT            TCK INPUT                          SDA INPUT

13.3.4  Alternate Functions of Port D

        The Port D pins with alternate functions are shown in Table 13-12.

        Table 13-12. Port D Pins Alternate Functions

        Port Pin Alternate Function

             PD7                       OC2A (Timer/Counter2 Output Compare Match A Output)
                                       PCINT31 (Pin Change Interrupt 31)

                                       ICP1 (Timer/Counter1 Input Capture Trigger)

             PD6                       OC2B (Timer/Counter2 Output Compare Match B Output)

                                       PCINT30 (Pin Change Interrupt 30)

             PD5                       OC1A (Timer/Counter1 Output Compare Match A Output)
                                       PCINT29 (Pin Change Interrupt 29)

                                       OC1B (Timer/Counter1 Output Compare Match B Output)

             PD4                       XCK1 (USART1 External Clock Input/Output)

                                       PCINT28 (Pin Change Interrupt 28)

                                       INT1 (External Interrupt1 Input)

             PD3                       TXD1 (USART1 Transmit Pin)

                                       PCINT27 (Pin Change Interrupt 27)

                                       INT0 (External Interrupt0 Input)

             PD2                       RXD1 (USART1 Receive Pin)

                                       PCINT26 (Pin Change Interrupt 26)

             PD1                       TXD0 (USART0 Transmit Pin)
                                       PCINT25 (Pin Change Interrupt 25)

             PD0                       RXD0 (USART0 Receive Pin)
                                       PCINT24 (Pin Change Interrupt 24)

                                                                                                                                                                89

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   The alternate pin configuration is as follows:

                                    OC2A/PCINT31 Port D, Bit 7
                                   OC2A, Output Compare Match A output: The PD7 pin can serve as an external output for the
                                   Timer/Counter2 Output Compare A. The pin has to be configured as an output (DDD7 set (one))
                                   to serve this function. The OC2A pin is also the output pin for the PWM mode timer function.
                                   PCINT31, Pin Change Interrupt Source 31:The PD7 pin can serve as an external interrupt
                                   source.

                                    ICP1/OC2B/PCINT30 Port D, Bit 6
                                   ICP1, Input Capture Pin 1: The PD6 pin can act as an input capture pin for Timer/Counter1.
                                   OC2B, Output Compare Match B output: The PD6 pin can serve as an external output for the
                                   Timer/Counter2 Output Compare B. The pin has to be configured as an output (DDD6 set (one))
                                   to serve this function. The OC2B pin is also the output pin for the PWM mode timer function.
                                   PCINT30, Pin Change Interrupt Source 30: The PD6 pin can serve as an external interrupt
                                   source.

                                    OC1A/PCINT29 Port D, Bit 5
                                   OC1A, Output Compare Match A output: The PD5 pin can serve as an external output for the
                                   Timer/Counter1 Output Compare A. The pin has to be configured as an output (DDD5 set (one))
                                   to serve this function. The OC1A pin is also the output pin for the PWM mode timer function.
                                   PCINT29, Pin Change Interrupt Source 29: The PD5 pin can serve as an external interrupt
                                   source.

                                    OC1B/XCK1/PCINT28 Port D, Bit 4
                                   OC1B, Output Compare Match B output: The PB4 pin can serve as an external output for the
                                   Timer/Counter1 Output Compare B. The pin has to be configured as an output (DDD4 set (one))
                                   to serve this function. The OC1B pin is also the output pin for the PWM mode timer function.
                                   XCK1, USART1 External clock. The Data Direction Register (DDB4) controls whether the clock
                                   is output (DDD4 set "one") or input (DDD4 cleared). The XCK4 pin is active only when the
                                   USART1 operates in Synchronous mode.
                                   PCINT28, Pin Change Interrupt Source 28: The PD4 pin can serve as an external interrupt
                                   source.

                                    INT1/TXD1/PCINT27 Port D, Bit 3
                                   INT1, External Interrupt source 1. The PD3 pin can serve as an external interrupt source to the
                                   MCU.
                                   TXD1, Transmit Data (Data output pin for the USART1). When the USART1 Transmitter is
                                   enabled, this pin is configured as an output regardless of the value of DDD3.
                                   PCINT27, Pin Change Interrupt Source 27: The PD3 pin can serve as an external interrupt
                                   source.

                                                                                                                                                                90

8152GAVR11/09
                                     ATmega164PA/324PA/644PA/1284P

                  INT0/RXD1/PCINT26 Port D, Bit 2
                 INT0, External Interrupt source 0. The PD2 pin can serve as an external interrupt source to the
                 MCU.

                 RXD1, RXD0, Receive Data (Data input pin for the USART1). When the USART1 receiver is
                 enabled this pin is configured as an input regardless of the value of DDD2. When the USART
                 forces this pin to be an input, the pull-up can still be controlled by the PORTD2 bit.

                 PCINT26, Pin Change Interrupt Source 26: The PD2 pin can serve as an external interrupt
                 source.

                  TXD0/PCINT25 Port D, Bit 1
                 TXD0, Transmit Data (Data output pin for the USART0). When the USART0 Transmitter is
                 enabled, this pin is configured as an output regardless of the value of DDD1.

                 PCINT25, Pin Change Interrupt Source 25: The PD1 pin can serve as an external interrupt
                 source.

                  RXD0/PCINT24 Port D, Bit 0
                 RXD0, Receive Data (Data input pin for the USART0). When the USART0 receiver is enabled
                 this pin is configured as an input regardless of the value of DDD0. When the USART forces this
                 pin to be an input, the pull-up can still be controlled by the PORTD0 bit.

                 PCINT24, Pin Change Interrupt Source 24: The PD0 pin can serve as an external interrupt
                 source.

                 Table 13-13 on page 91 and Table 13-14 on page 92 relates the alternate functions of Port D to
                 the overriding signals shown in Figure 13-5 on page 80.

                 Table 13-13. Overriding Signals for Alternate Functions PD7:PD4

                 Signal Name  PD7/OC2A/      PD6/ICP1/      PD5/OC1A/             PD4/OC1B/XCK1/
                              PCINT31        OC2B/          PCINT29               PCINT28
                                             PCINT30                              0
                                                                                  0
                 PUOE         0              0              0                     0
                                                                                  0
                 PUOV         0              0              0                     OC1B ENABLE
                                                                                  OC1B
                 DDOE         0              0              0                     PCINT28 PCIE3
                                                                                  1
                 DDOV         0              0              0
                                                                                  PCINT28 INPUT
                 PVOE         OC2A ENABLE    OC2B ENABLE    OC1A ENABLE
                                                                                 
                 PVOV         OCA2A          OC2B           OC1A

                 DIEOE        PCINT31 PCIE3 PCINT30 PCIE3 PCINT29 PCIE3

                 DIEOV        1              1              1

                 DI           PCINT31 INPUT  ICP1 INPUT     PCINT29 INPUT
                                             PCINT30 INPUT

                 AIO                                      

                                                                                  91

8152GAVR11/09
                    ATmega164PA/324PA/644PA/1284P

Table 13-14. Overriding Signals for Alternate Functions in PD3:PD0(1)

Signal Name  PD3/INT1/TXD1/   PD2/INT0/RXD1/   PD1/TXD0/               PD0/RXD0/
             PCINT27          PCINT26          PCINT25                 PCINT27

PUOE         TXEN1            RXEN1            TXEN0                   RXEN1

PUOV         0                PORTD2 PUD     0                       PORTD0 PUD

DDOE         TXEN1            RXEN1            TXEN0                   RXEN1

DDOV         1                0                1                       0

PVOE         TXEN1            0                TXEN0                   0

PVOV         TXD1             0                TXD0                    0

DIEOE        INT1 ENABLE      INT2 ENABLE      PCINT25 PCIE3         PCINT24 PCIE3
             PCINT27 PCIE3  PCINT26 PCIE3

DIEOV        1                1                1                       1

DI           INT1 INPUT       INT0 INPUT       PCINT25 INPUT           RXD0
             PCINT27 INPUT    RXD1                                     PCINT24 INPUT
                              PCINT26 INPUT

AIO                                                                 

Note:  1. When enabled, the 2-wire Serial Interface enables Slew-Rate controls on the output pins PD0
           and PD1. This is not shown in this table. In addition, spike filters are connected between the
           AIO outputs shown in the port figure and the digital logic of the TWI module.

                                                                                                                                                                92

8152GAVR11/09
                                                   ATmega164PA/324PA/644PA/1284P

Register Description

13.3.5 MCUCR MCU Control Register

         Bit            7                       6  5       4       3       2       1       0

         0x35 (0x55)    JTD                BODS    BODSE   PUD                   IVSEL   IVCE    MCUCR

         Read/Write     R/W                R       R       R/W     R       R       R/W     R/W

         Initial Value  0                       0  0       0       0       0       0       0

13.3.6                         Bit 4 PUD: Pull-up Disable
                              When this bit is written to one, the pull-ups in the I/O ports are disabled even if the DDxn and
                              PORTxn Registers are configured to enable the pull-ups ({DDxn, PORTxn} = 0b01). See "Con-
                              figuring the Pin" on page 75 for more details about this feature.

         PORTA Port A Data Register

         Bit                7                  6       5       4       3       2       1       0   PORTA
         0x02 (0x22)    PORTA7             PORTA6  PORTA5  PORTA4  PORTA3  PORTA2  PORTA1  PORTA0
         Read/Write
         Initial Value    R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
                            0                  0       0       0       0       0       0       0

13.3.7   DDRA Port A Data Direction Register

         Bit               7                  6       5       4       3       2       1       0    DDRA
         0x01 (0x21)    DDA7               DDA6    DDA5    DDA4    DDA3    DDA2    DDA1    DDA0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value
                           0                  0       0       0       0       0       0       0

13.3.8   PINA Port A Input Pins Address

         Bit               7                  6       5       4       3       2       1       0    PINA
         0x00 (0x20)    PINA7              PINA6   PINA5   PINA4   PINA3   PINA2   PINA1   PINA0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value                                                                      R/W
                         N/A                N/A     N/A     N/A     N/A     N/A     N/A     N/A

13.3.9   PORTB Port B Data Register

         Bit                7                  6       5       4       3       2       1       0   PORTB
         0x05 (0x25)    PORTB7             PORTB6  PORTB5  PORTB4  PORTB3  PORTB2  PORTB1  PORTB0
         Read/Write
         Initial Value    R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
                            0                  0       0       0       0       0       0       0

13.3.10  DDRB Port B Data Direction Register

         Bit               7                  6       5       4       3       2       1       0    DDRB
         0x04 (0x24)    DDB7               DDB6    DDB5    DDB4    DDB3    DDB2    DDB1    DDB0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value
                           0                  0       0       0       0       0       0       0

13.3.11  PINB Port B Input Pins Address

         Bit               7                  6       5       4       3       2       1       0    PINB
         0x03 (0x23)    PINB7              PINB6   PINB5   PINB4   PINB3   PINB2   PINB1   PINB0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value                                                                      R/W
                         N/A                N/A     N/A     N/A     N/A     N/A     N/A     N/A

                                                                                                                                                                93

8152GAVR11/09
                                                ATmega164PA/324PA/644PA/1284P

13.3.12 PORTC Port C Data Register

         Bit                7                  6       5       4       3       2       1       0   PORTC
         0x08 (0x28)    PORTC7             PORTC6  PORTC5  PORTC4  PORTC3  PORTC2  PORTC1  PORTC0
         Read/Write
         Initial Value    R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
                            0                  0       0       0       0       0       0       0

13.3.13  DDRC Port C Data Direction Register

         Bit               7                  6       5       4       3       2       1       0    DDRC
         0x07 (0x27)    DDC7               DDC6    DDC5    DDC4    DDC3    DDC2    DDC1    DDC0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value
                           0                  0       0       0       0       0       0       0

13.3.14  PINC Port C Input Pins Address

         Bit               7                  6       5       4       3       2       1       0    PINC
         0x06 (0x26)    PINC7              PINC6   PINC5   PINC4   PINC3   PINC2   PINC1   PINC0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value                                                                      R/W
                         N/A                N/A     N/A     N/A     N/A     N/A     N/A     N/A

13.3.15  PORTD Port D Data Register

         Bit                7                  6       5       4       3       2       1       0   PORTD
         0x0B (0x2B)    PORTD7             PORTD6  PORTD5  PORTD4  PORTD3  PORTD2  PORTD1  PORTD0
         Read/Write
         Initial Value    R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
                            0                  0       0       0       0       0       0       0

13.3.16  DDRD Port D Data Direction Register

         Bit               7                  6       5       4       3       2       1       0    DDRD
         0x0A (0x2A)    DDD7               DDD6    DDD5    DDD4    DDD3    DDD2    DDD1    DDD0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value
                           0                  0       0       0       0       0       0       0

13.3.17  PIND Port D Input Pins Address

         Bit               7                  6       5       4       3       2       1       0    PIND
         0x09 (0x29)    PIND7              PIND6   PIND5   PIND4   PIND3   PIND2   PIND1   PIND0
         Read/Write      R/W                R/W     R/W     R/W     R/W     R/W     R/W
         Initial Value                                                                      R/W
                         N/A                N/A     N/A     N/A     N/A     N/A     N/A     N/A

                                                                                                                                                                94

8152GAVR11/09
                                   ATmega164PA/324PA/644PA/1284P

14. 8-bit Timer/Counter0 with PWM

14.1 Features      Two Independent Output Compare Units
14.2 Overview      Double Buffered Output Compare Registers
                   Clear Timer on Compare Match (Auto Reload)
                   Glitch Free, Phase Correct Pulse Width Modulator (PWM)
                   Variable PWM Period
                   Frequency Generator
                   Three Independent Interrupt Sources (TOV0, OCF0A, and OCF0B)

                  Timer/Counter0 is a general purpose 8-bit Timer/Counter module, with two independent Output
                  Compare Units, and with PWM support. It allows accurate program execution timing (event man-
                  agement) and wave generation.

                  A simplified block diagram of the 8-bit Timer/Counter is shown in Figure 14-1. For the actual
                  placement of I/O pins, see "Pin Configurations" on page 2. CPU accessible I/O Registers, includ-
                  ing I/O bits and I/O pins, are shown in bold. The device-specific I/O Register and bit locations
                  are listed in the "Register Description" on page 106.

                  Figure 14-1. 8-bit Timer/Counter Block Diagram

                                                   Count     Control Logic  clkTn   TOVn
                                                    Clear                           (Int.Req.)
                                                  Direction                         Clock Select

                                                             TOP BOTTOM                  Edge               Tn
                                                                                       Detector           OCnA
                                   Timer/Counter             =              =0
                                       TCNTn                                          ( From Prescaler )

                                     =                                             OCnA
                                                                                   (Int.Req.)
                                   OCRnA
                                                                                      Waveform
                                     =                                               Generation

                  DATA BUS         OCRnB                         Fixed             OCnB
                                                                 TOP               (Int.Req.)
                                                                Value
                                                                                      Waveform
                                                                                     Generation           OCnB

                                   TCCRnA                    TCCRnB

14.2.1 Registers

                  The Timer/Counter (TCNT0) and Output Compare Registers (OCR0A and OCR0B) are 8-bit
                  registers. Interrupt request (abbreviated to Int.Req. in the figure) signals are all visible in the
                  Timer Interrupt Flag Register (TIFR0). All interrupts are individually masked with the Timer Inter-
                  rupt Mask Register (TIMSK0). TIFR0 and TIMSK0 are not shown in the figure.

                  The Timer/Counter can be clocked internally, via the prescaler, or by an external clock source on
                  the T0 pin. The Clock Select logic block controls which clock source and edge the Timer/Counter

                                                                                                                                                                95

8152GAVR11/09
                                  ATmega164PA/324PA/644PA/1284P

                     uses to increment (or decrement) its value. The Timer/Counter is inactive when no clock source
                     is selected. The output from the Clock Select logic is referred to as the timer clock (clkT0).

                     The double buffered Output Compare Registers (OCR0A and OCR0B) are compared with the
                     Timer/Counter value at all times. The result of the compare can be used by the Waveform Gen-
                     erator to generate a PWM or variable frequency output on the Output Compare pins (OC0A and
                     OC0B). See Section "14.5" on page 97. for details. The Compare Match event will also set the
                     Compare Flag (OCF0A or OCF0B) which can be used to generate an Output Compare interrupt
                     request.

14.2.2  Definitions

                     Many register and bit references in this section are written in general form. A lower case "n"
                     replaces the Timer/Counter number, in this case 0. A lower case "x" replaces the Output Com-
                     pare Unit, in this case Compare Unit A or Compare Unit B. However, when using the register or
                     bit defines in a program, the precise form must be used, i.e., TCNT0 for accessing
                     Timer/Counter0 counter value and so on.

                     The definitions in Table 14-1 are also used extensively throughout the document.

                     Table 14-1. Definitions
                      BOTTOM The counter reaches the BOTTOM when it becomes 0x00.

                     MAX  The counter reaches its MAXimum when it becomes 0xFF (decimal 255).

                     TOP  The counter reaches the TOP when it becomes equal to the highest value in the
                          count sequence. The TOP value can be assigned to be the fixed value 0xFF
                          (MAX) or the value stored in the OCR0A Register. The assignment is depen-
                          dent on the mode of operation.

14.3 Timer/Counter Clock Sources

                                   The Timer/Counter can be clocked by an internal or an external clock source. The clock source
                                   is selected by the Clock Select logic which is controlled by the Clock Select (CS02:0) bits
                                   located in the Timer/Counter Control Register (TCCR0B). For details on clock sources and pres-
                                   caler, see "Timer/Counter Prescaler" on page 154.

14.4 Counter Unit

                                   The main part of the 8-bit Timer/Counter is the programmable bi-directional counter unit. Figure
                                   14-2 shows a block diagram of the counter and its surroundings.

                     Figure 14-2. Counter Unit Block Diagram                           TOVn
                                         DATA BUS                                      (Int.Req.)

                                                                                                   Clock Select

                                                               count                   clkTn         Edge              Tn
                                                               clear                               Detector
                                                             direction
                          TCNTn                                         Control Logic

                                                                                                   ( From Prescaler )

                                                             bottom     top

                     Signal description (internal signals):

                                                                                                                                                                96

8152GAVR11/09
                          ATmega164PA/324PA/644PA/1284P

count                     Increment or decrement TCNT0 by 1.

direction                 Select between increment and decrement.

clear                     Clear TCNT0 (set all bits to zero).

clkTn                     Timer/Counter clock, referred to as clkT0 in the following.
top                       Signalize that TCNT0 has reached maximum value.

bottom                    Signalize that TCNT0 has reached minimum value (zero).

Depending of the mode of operation used, the counter is cleared, incremented, or decremented
at each timer clock (clkT0). clkT0 can be generated from an external or internal clock source,
selected by the Clock Select bits (CS02:0). When no clock source is selected (CS02:0 = 0) the
timer is stopped. However, the TCNT0 value can be accessed by the CPU, regardless of
whether clkT0 is present or not. A CPU write overrides (has priority over) all counter clear or
count operations.

The counting sequence is determined by the setting of the WGM01 and WGM00 bits located in
the Timer/Counter Control Register (TCCR0A) and the WGM02 bit located in the Timer/Counter
Control Register B (TCCR0B). There are close connections between how the counter behaves
(counts) and how waveforms are generated on the Output Compare outputs OC0A and OC0B.
For more details about advanced counting sequences and waveform generation, see "Modes of
Operation" on page 100.

The Timer/Counter Overflow Flag (TOV0) is set according to the mode of operation selected by
the WGM02:0 bits. TOV0 can be used for generating a CPU interrupt.

14.5 Output Compare Unit

The 8-bit comparator continuously compares TCNT0 with the Output Compare Registers
(OCR0A and OCR0B). Whenever TCNT0 equals OCR0A or OCR0B, the comparator signals a
match. A match will set the Output Compare Flag (OCF0A or OCF0B) at the next timer clock
cycle. If the corresponding interrupt is enabled, the Output Compare Flag generates an Output
Compare interrupt. The Output Compare Flag is automatically cleared when the interrupt is exe-
cuted. Alternatively, the flag can be cleared by software by writing a logical one to its I/O bit
location. The Waveform Generator uses the match signal to generate an output according to
operating mode set by the WGM02:0 bits and Compare Output mode (COM0x1:0) bits. The max
and bottom signals are used by the Waveform Generator for handling the special cases of the
extreme values in some modes of operation ("Modes of Operation" on page 100).

Figure 14-3 shows a block diagram of the Output Compare unit.

                                                                                                                                                                97

8152GAVR11/09
                            ATmega164PA/324PA/644PA/1284P

        Figure 14-3. Output Compare Unit, Block Diagram

                                                       DATA BUS

                OCRnx                         TCNTn
                                                  OCFnx (Int.Req.)
                       = (8-bit Comparator )                OCnx

          top          Waveform Generator
        bottom
        FOCn

                       WGMn1:0 COMnX1:0

14.5.1                       The OCR0x Registers are double buffered when using any of the Pulse Width Modulation
14.5.2                       (PWM) modes. For the normal and Clear Timer on Compare (CTC) modes of operation, the dou-
14.5.3                       ble buffering is disabled. The double buffering synchronizes the update of the OCR0x Compare
                             Registers to either top or bottom of the counting sequence. The synchronization prevents the
                             occurrence of odd-length, non-symmetrical PWM pulses, thereby making the output glitch-free.

                             The OCR0x Register access may seem complex, but this is not case. When the double buffering
                             is enabled, the CPU has access to the OCR0x Buffer Register, and if double buffering is dis-
                             abled the CPU will access the OCR0x directly.

        Force Output Compare

                             In non-PWM waveform generation modes, the match output of the comparator can be forced by
                             writing a one to the Force Output Compare (FOC0x) bit. Forcing Compare Match will not set the
                             OCF0x Flag or reload/clear the timer, but the OC0x pin will be updated as if a real Compare
                             Match had occurred (the COM0x1:0 bits settings define whether the OC0x pin is set, cleared or
                             toggled).

        Compare Match Blocking by TCNT0 Write

                             All CPU write operations to the TCNT0 Register will block any Compare Match that occur in the
                             next timer clock cycle, even when the timer is stopped. This feature allows OCR0x to be initial-
                             ized to the same value as TCNT0 without triggering an interrupt when the Timer/Counter clock is
                             enabled.

        Using the Output Compare Unit

                             Since writing TCNT0 in any mode of operation will block all Compare Matches for one timer
                             clock cycle, there are risks involved when changing TCNT0 when using the Output Compare
                             Unit, independently of whether the Timer/Counter is running or not. If the value written to TCNT0
                             equals the OCR0x value, the Compare Match will be missed, resulting in incorrect waveform

                                                                                                                                                                98

8152GAVR11/09
        ATmega164PA/324PA/644PA/1284P

                                   generation. Similarly, do not write the TCNT0 value equal to BOTTOM when the counter is
                                   down-counting.

                                   The setup of the OC0x should be performed before setting the Data Direction Register for the
                                   port pin to output. The easiest way of setting the OC0x value is to use the Force Output Com-
                                   pare (FOC0x) strobe bits in Normal mode. The OC0x Registers keep their values even when
                                   changing between Waveform Generation modes.

                                   Be aware that the COM0x1:0 bits are not double buffered together with the compare value.
                                   Changing the COM0x1:0 bits will take effect immediately.

14.6 Compare Match Output Unit

                                   The Compare Output mode (COM0x1:0) bits have two functions. The Waveform Generator uses
                                   the COM0x1:0 bits for defining the Output Compare (OC0x) state at the next Compare Match.
                                   Also, the COM0x1:0 bits control the OC0x pin output source. Figure 14-4 shows a simplified
                                   schematic of the logic affected by the COM0x1:0 bit setting. The I/O Registers, I/O bits, and I/O
                                   pins in the figure are shown in bold. Only the parts of the general I/O Port Control Registers
                                   (DDR and PORT) that are affected by the COM0x1:0 bits are shown. When referring to the
                                   OC0x state, the reference is for the internal OC0x Register, not the OC0x pin. If a system reset
                                   occur, the OC0x Register is reset to "0".

                                   Figure 14-4. Compare Match Output Unit, Schematic

COMnx1  Waveform   DQ
COMnx0  Generator
FOCn

                         1                           OCnx
                                                      Pin
                   OCnx

                                                  0

                   DQ

        DATA BUS   PORT
                   DQ

                   DDR

clkI/O

The general I/O port function is overridden by the Output Compare (OC0x) from the Waveform
Generator if either of the COM0x1:0 bits are set. However, the OC0x pin direction (input or out-
put) is still controlled by the Data Direction Register (DDR) for the port pin. The Data Direction
Register bit for the OC0x pin (DDR_OC0x) must be set as output before the OC0x value is visi-
ble on the pin. The port override function is independent of the Waveform Generation mode.

The design of the Output Compare pin logic allows initialization of the OC0x state before the out-
put is enabled. Note that some COM0x1:0 bit settings are reserved for certain modes of
operation. See Section "14.9" on page 106.

                                                                                                                                                                99

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

14.6.1 Compare Output Mode and Waveform Generation

                                   The Waveform Generator uses the COM0x1:0 bits differently in Normal, CTC, and PWM modes.
                                   For all modes, setting the COM0x1:0 = 0 tells the Waveform Generator that no action on the
                                   OC0x Register is to be performed on the next Compare Match. For compare output actions in
                                   the non-PWM modes refer to Table 14-2 on page 106. For fast PWM mode, refer to Table 14-3
                                   on page 106, and for phase correct PWM refer to Table 14-4 on page 107.

                                   A change of the COM0x1:0 bits state will have effect at the first Compare Match after the bits are
                                   written. For non-PWM modes, the action can be forced to have immediate effect by using the
                                   FOC0x strobe bits.

14.7 Modes of Operation

14.7.1                       The mode of operation, i.e., the behavior of the Timer/Counter and the Output Compare pins, is
                             defined by the combination of the Waveform Generation mode (WGM02:0) and Compare Output
                             mode (COM0x1:0) bits. The Compare Output mode bits do not affect the counting sequence,
                             while the Waveform Generation mode bits do. The COM0x1:0 bits control whether the PWM out-
                             put generated should be inverted or not (inverted or non-inverted PWM). For non-PWM modes
                             the COM0x1:0 bits control whether the output should be set, cleared, or toggled at a Compare
                             Match (See Section "15.8" on page 124.).

                             For detailed timing information see "Timer/Counter Timing Diagrams" on page 104.

        Normal Mode

14.7.2                       The simplest mode of operation is the Normal mode (WGM02:0 = 0). In this mode the counting
                             direction is always up (incrementing), and no counter clear is performed. The counter simply
                             overruns when it passes its maximum 8-bit value (TOP = 0xFF) and then restarts from the bot-
                             tom (0x00). In normal operation the Timer/Counter Overflow Flag (TOV0) will be set in the same
                             timer clock cycle as the TCNT0 becomes zero. The TOV0 Flag in this case behaves like a ninth
                             bit, except that it is only set, not cleared. However, combined with the timer overflow interrupt
                             that automatically clears the TOV0 Flag, the timer resolution can be increased by software.
                             There are no special cases to consider in the Normal mode, a new counter value can be written
                             anytime.

                             The Output Compare Unit can be used to generate interrupts at some given time. Using the Out-
                             put Compare to generate waveforms in Normal mode is not recommended, since this will
                             occupy too much of the CPU time.

        Clear Timer on Compare Match (CTC) Mode

                 In Clear Timer on Compare or CTC mode (WGM02:0 = 2), the OCR0A Register is used to
                 manipulate the counter resolution. In CTC mode the counter is cleared to zero when the counter
                 value (TCNT0) matches the OCR0A. The OCR0A defines the top value for the counter, hence
                 also its resolution. This mode allows greater control of the Compare Match output frequency. It
                 also simplifies the operation of counting external events.

                 The timing diagram for the CTC mode is shown in Figure 14-5. The counter value (TCNT0)
                 increases until a Compare Match occurs between TCNT0 and OCR0A, and then counter
                 (TCNT0) is cleared.

                                                    100

8152GAVR11/09
                              ATmega164PA/324PA/644PA/1284P

                 Figure 14-5. CTC Mode, Timing Diagram

                                                              OCnx Interrupt Flag Set

                 TCNTn

                 OCn                                          (COMnx1:0 = 1)
                 (Toggle)

                 Period    1  2                         3  4

14.7.3                       An interrupt can be generated each time the counter value reaches the TOP value by using the
                             OCF0A Flag. If the interrupt is enabled, the interrupt handler routine can be used for updating
                             the TOP value. However, changing TOP to a value close to BOTTOM when the counter is run-
                             ning with none or a low prescaler value must be done with care since the CTC mode does not
                             have the double buffering feature. If the new value written to OCR0A is lower than the current
                             value of TCNT0, the counter will miss the Compare Match. The counter will then have to count to
                             its maximum value (0xFF) and wrap around starting at 0x00 before the Compare Match can
                             occur.

                             For generating a waveform output in CTC mode, the OC0A output can be set to toggle its logical
                             level on each Compare Match by setting the Compare Output mode bits to toggle mode
                             (COM0A1:0 = 1). The OC0A value will not be visible on the port pin unless the data direction for
                             the pin is set to output. The waveform generated will have a maximum frequency of fOC0 =
                             fclk_I/O/2 when OCR0A is set to zero (0x00). The waveform frequency is defined by the following
                             equation:

                                                                          fOCnx = -2-------N---------(f--c1--l-k--+-_---I-/O-O----C----R----n---x----)

                             The N variable represents the prescale factor (1, 8, 64, 256, or 1024).

                             As for the Normal mode of operation, the TOV0 Flag is set in the same timer clock cycle that the
                             counter counts from MAX to 0x00.

        Fast PWM Mode

                             The fast Pulse Width Modulation or fast PWM mode (WGM02:0 = 3 or 7) provides a high fre-
                             quency PWM waveform generation option. The fast PWM differs from the other PWM option by
                             its single-slope operation. The counter counts from BOTTOM to TOP then restarts from BOT-
                             TOM. TOP is defined as 0xFF when WGM2:0 = 3, and OCR0A when WGM2:0 = 7. In non-
                             inverting Compare Output mode, the Output Compare (OC0x) is cleared on the Compare Match
                             between TCNT0 and OCR0x, and set at BOTTOM. In inverting Compare Output mode, the out-
                             put is set on Compare Match and cleared at BOTTOM. Due to the single-slope operation, the
                             operating frequency of the fast PWM mode can be twice as high as the phase correct PWM
                             mode that use dual-slope operation. This high frequency makes the fast PWM mode well suited
                             for power regulation, rectification, and DAC applications. High frequency allows physically small
                             sized external components (coils, capacitors), and therefore reduces total system cost.

                             In fast PWM mode, the counter is incremented until the counter value matches the TOP value.
                             The counter is then cleared at the following timer clock cycle. The timing diagram for the fast

                                                                                       101

8152GAVR11/09
                                     ATmega164PA/324PA/644PA/1284P

                 PWM mode is shown in Figure 14-6. The TCNT0 value is in the timing diagram shown as a his-
                 togram for illustrating the single-slope operation. The diagram includes non-inverted and
                 inverted PWM outputs. The small horizontal line marks on the TCNT0 slopes represent Com-
                 pare Matches between OCR0x and TCNT0.
                 Figure 14-6. Fast PWM Mode, Timing Diagram

                                                                                                                                                                            OCRnx Interrupt Flag Set

                                                                                                                                                                            OCRnx Update and
                                                                                                                                                                            TOVn Interrupt Flag Set

                 TCNTn

                 OCnx                         (COMnx1:0 = 2)
                 OCnx                         (COMnx1:0 = 3)

                 Period  1  2  3  4  5  6  7

                 The Timer/Counter Overflow Flag (TOV0) is set each time the counter reaches TOP. If the inter-
                 rupt is enabled, the interrupt handler routine can be used for updating the compare value.

                 In fast PWM mode, the compare unit allows generation of PWM waveforms on the OC0x pins.
                 Setting the COM0x1:0 bits to two will produce a non-inverted PWM and an inverted PWM output
                 can be generated by setting the COM0x1:0 to three: Setting the COM0A1:0 bits to one allows
                 the OC0A pin to toggle on Compare Matches if the WGM02 bit is set. This option is not available
                 for the OC0B pin (See Table 14-3 on page 106). The actual OC0x value will only be visible on
                 the port pin if the data direction for the port pin is set as output. The PWM waveform is gener-
                 ated by setting (or clearing) the OC0x Register at the Compare Match between OCR0x and
                 TCNT0, and clearing (or setting) the OC0x Register at the timer clock cycle the counter is
                 cleared (changes from TOP to BOTTOM).

                 The PWM frequency for the output can be calculated by the following equation:

                                                                   fOCnxPWM = N-f--c---l-k--2_---I5-/-O--6-

                 The N variable represents the prescale factor (1, 8, 64, 256, or 1024).

                 The extreme values for the OCR0A Register represents special cases when generating a PWM
                 waveform output in the fast PWM mode. If the OCR0A is set equal to BOTTOM, the output will
                 be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR0A equal to MAX will result
                 in a constantly high or low output (depending on the polarity of the output set by the COM0A1:0
                 bits.)

                 A frequency (with 50% duty cycle) waveform output in fast PWM mode can be achieved by set-
                 ting OC0x to toggle its logical level on each Compare Match (COM0x1:0 = 1). The waveform
                 generated will have a maximum frequency of fOC0 = fclk_I/O/2 when OCR0A is set to zero. This

                                                              102

8152GAVR11/09
                         ATmega164PA/324PA/644PA/1284P

14.7.4                       feature is similar to the OC0A toggle in CTC mode, except the double buffer feature of the Out-
                             put Compare unit is enabled in the fast PWM mode.

        Phase Correct PWM Mode

                             The phase correct PWM mode (WGM02:0 = 1 or 5) provides a high resolution phase correct
                             PWM waveform generation option. The phase correct PWM mode is based on a dual-slope
                             operation. The counter counts repeatedly from BOTTOM to TOP and then from TOP to BOT-
                             TOM. TOP is defined as 0xFF when WGM2:0 = 1, and OCR0A when WGM2:0 = 5. In non-
                             inverting Compare Output mode, the Output Compare (OC0x) is cleared on the Compare Match
                             between TCNT0 and OCR0x while upcounting, and set on the Compare Match while down-
                             counting. In inverting Output Compare mode, the operation is inverted. The dual-slope operation
                             has lower maximum operation frequency than single slope operation. However, due to the sym-
                             metric feature of the dual-slope PWM modes, these modes are preferred for motor control
                             applications.

                             In phase correct PWM mode the counter is incremented until the counter value matches TOP.
                             When the counter reaches TOP, it changes the count direction. The TCNT0 value will be equal
                             to TOP for one timer clock cycle. The timing diagram for the phase correct PWM mode is shown
                             on Figure 14-7. The TCNT0 value is in the timing diagram shown as a histogram for illustrating
                             the dual-slope operation. The diagram includes non-inverted and inverted PWM outputs. The
                             small horizontal line marks on the TCNT0 slopes represent Compare Matches between OCR0x
                             and TCNT0.

                             Figure 14-7. Phase Correct PWM Mode, Timing Diagram

                                  OCnx Interrupt Flag Set

                                  OCRnx Update

                                  TOVn Interrupt Flag Set

                 TCNTn

                 OCnx             (COMnx1:0 = 2)
                 OCnx             (COMnx1:0 = 3)

                 Period  1  2  3

                 The Timer/Counter Overflow Flag (TOV0) is set each time the counter reaches BOTTOM. The
                 Interrupt Flag can be used to generate an interrupt each time the counter reaches the BOTTOM
                 value.

                 In phase correct PWM mode, the compare unit allows generation of PWM waveforms on the
                 OC0x pins. Setting the COM0x1:0 bits to two will produce a non-inverted PWM. An inverted
                 PWM output can be generated by setting the COM0x1:0 to three: Setting the COM0A0 bits to

                                                           103

8152GAVR11/09
                             ATmega164PA/324PA/644PA/1284P

                 one allows the OC0A pin to toggle on Compare Matches if the WGM02 bit is set. This option is
                 not available for the OC0B pin (See Table 14-4 on page 107). The actual OC0x value will only
                 be visible on the port pin if the data direction for the port pin is set as output. The PWM wave-
                 form is generated by clearing (or setting) the OC0x Register at the Compare Match between
                 OCR0x and TCNT0 when the counter increments, and setting (or clearing) the OC0x Register at
                 Compare Match between OCR0x and TCNT0 when the counter decrements. The PWM fre-
                 quency for the output when using phase correct PWM can be calculated by the following
                 equation:

                                                                 fOCnxPCPWM = N-f--c---l-k--5_---I1-/-O--0-

                 The N variable represents the prescale factor (1, 8, 64, 256, or 1024).

                 The extreme values for the OCR0A Register represent special cases when generating a PWM
                 waveform output in the phase correct PWM mode. If the OCR0A is set equal to BOTTOM, the
                 output will be continuously low and if set equal to MAX the output will be continuously high for
                 non-inverted PWM mode. For inverted PWM the output will have the opposite logic values.

                 At the very start of period 2 in Figure 14-7 OCnx has a transition from high to low even though
                 there is no Compare Match. The point of this transition is to guarantee symmetry around BOT-
                 TOM. There are two cases that give a transition without Compare Match.

14.8                           OCR0A changes its value from MAX, like in Figure 14-7. When the OCR0A value is MAX the
                                OCn pin value is the same as the result of a down-counting Compare Match. To ensure
                                symmetry around BOTTOM the OCn value at MAX must correspond to the result of an up-
                                counting Compare Match.

                               The timer starts counting from a value higher than the one in OCR0A, and for that reason
                                misses the Compare Match and hence the OCn change that would have happened on the way
                                up.

      Timer/Counter Timing Diagrams

                 The Timer/Counter is a synchronous design and the timer clock (clkT0) is therefore shown as a
                 clock enable signal in the following figures. The figures include information on when Interrupt
                 Flags are set. Figure 14-8 contains timing data for basic Timer/Counter operation. The figure
                 shows the count sequence close to the MAX value in all modes other than phase correct PWM
                 mode.

                 Figure 14-8. Timer/Counter Timing Diagram, no Prescaling

                  clkI/O     MAX - 1  MAX                                  BOTTOM         BOTTOM + 1
                  clkTn

                 (clkI/O/1)

                 TCNTn

                 TOVn

                 Figure 14-9 shows the same timing data, but with the prescaler enabled.

                                                                                                      104

8152GAVR11/09
                             ATmega164PA/324PA/644PA/1284P

                 Figure 14-9. Timer/Counter Timing Diagram, with Prescaler (fclk_I/O/8)

                  clkI/O     MAX - 1    MAX               BOTTOM                         BOTTOM + 1
                  clkTn

                 (clkI/O/8)

                 TCNTn

                 TOVn

                 Figure 14-10 shows the setting of OCF0B in all modes and OCF0A in all modes except CTC
                 mode and PWM mode, where OCR0A is TOP.

                 Figure 14-10. Timer/Counter Timing Diagram, Setting of OCF0x, with Prescaler (fclk_I/O/8)

                  clkI/O     OCRnx - 1  OCRnx             OCRnx + 1                      OCRnx + 2
                  clkTn

                 (clkI/O/8)

                 TCNTn

                 OCRnx                       OCRnx Value

                 OCFnx

                 Figure 14-11 shows the setting of OCF0A and the clearing of TCNT0 in CTC mode and fast
                 PWM mode where OCR0A is TOP.

                 Figure 14-11. Timer/Counter Timing Diagram, Clear Timer on Compare Match mode, with Pres-
                                    caler (fclk_I/O/8)

                  clkI/O     TOP - 1    TOP               BOTTOM                         BOTTOM + 1
                                                     TOP
                  clkTn

                 (clkI/O/8)

                 TCNTn
                 (CTC)

                 OCRnx

                 OCFnx

                                                                                                     105

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

14.9 Register Description

14.9.1 TCCR0A Timer/Counter Control Register A

                 Bit            7       6         5    4     3             2            1      0

                 0x24 (0x44)    COM0A1 COM0A0 COM0B1 COM0B0                           WGM01 WGM00 TCCR0A

                 Read/Write     R/W     R/W       R/W  R/W   R             R            R/W  R/W

                 Initial Value  0       0         0    0     0             0            0      0

                  Bits 7:6 COM0A1:0: Compare Match Output A Mode
                 These bits control the Output Compare pin (OC0A) behavior. If one or both of the COM0A1:0
                 bits are set, the OC0A output overrides the normal port functionality of the I/O pin it is connected
                 to. However, note that the Data Direction Register (DDR) bit corresponding to the OC0A pin
                 must be set in order to enable the output driver.

                 When OC0A is connected to the pin, the function of the COM0A1:0 bits depends on the
                 WGM02:0 bit setting. Table 14-2 shows the COM0A1:0 bit functionality when the WGM02:0 bits
                 are set to a normal or CTC mode (non-PWM).

                 Table 14-2.    Compare Output Mode, non-PWM Mode
                     COM0A1
                          0     COM0A0 Description
                          0
                          1          0       Normal port operation, OC0A disconnected.
                          1
                                     1       Toggle OC0A on Compare Match

                                     0       Clear OC0A on Compare Match

                                     1       Set OC0A on Compare Match

                 Table 14-3 shows the COM0A1:0 bit functionality when the WGM01:0 bits are set to fast PWM
                 mode.

                 Table 14-3.    Compare Output Mode, Fast PWM Mode(1)
                     COM0A1
                          0     COM0A0 Description
                          0
                                     0       Normal port operation, OC0A disconnected.
                          1
                                     1       WGM02 = 0: Normal Port Operation, OC0A Disconnected.
                          1                  WGM02 = 1: Toggle OC0A on Compare Match.

                                     0       Clear OC0A on Compare Match, set OC0A at BOTTOM,
                                             (non-inverting mode).

                                     1       Set OC0A on Compare Match, clear OC0A at BOTTOM,
                                             (inverting mode).

                 Note:  1. A special case occurs when OCR0A equals TOP and COM0A1 is set. In this case, the Com-
                            pare Match is ignored, but the set or clear is done at BOTTOM. See "Fast PWM Mode" on
                            page 101 for more details.

                 Table 14-4 on page 107 shows the COM0A1:0 bit functionality when the WGM02:0 bits are set

                 to phase correct PWM mode.

                                                                                                   106

8152GAVR11/09
                                 ATmega164PA/324PA/644PA/1284P

                 Table 14-4.  Compare Output Mode, Phase Correct PWM Mode(1)
                     COM0A1
                          0   COM0A0 Description
                          0
                              0  Normal port operation, OC0A disconnected.
                          1
                              1  WGM02 = 0: Normal Port Operation, OC0A Disconnected.
                          1      WGM02 = 1: Toggle OC0A on Compare Match.

                              0  Clear OC0A on Compare Match when up-counting. Set OC0A on
                                 Compare Match when down-counting.

                              1  Set OC0A on Compare Match when up-counting. Clear OC0A on
                                 Compare Match when down-counting.

                 Note:  1. A special case occurs when OCR0A equals TOP and COM0A1 is set. In this case, the Com-
                            pare Match is ignored, but the set or clear is done at TOP. See "Phase Correct PWM Mode" on
                            page 103 for more details.

                  Bits 5:4 COM0B1:0: Compare Match Output B Mode
                 These bits control the Output Compare pin (OC0B) behavior. If one or both of the COM0B1:0
                 bits are set, the OC0B output overrides the normal port functionality of the I/O pin it is connected
                 to. However, note that the Data Direction Register (DDR) bit corresponding to the OC0B pin
                 must be set in order to enable the output driver.

                 When OC0B is connected to the pin, the function of the COM0B1:0 bits depends on the
                 WGM02:0 bit setting. Table 14-2 on page 106 shows the COM0A1:0 bit functionality when the
                 WGM02:0 bits are set to a normal or CTC mode (non-PWM).

                 Table 14-5.  Compare Output Mode, non-PWM Mode
                     COM0B1
                          0   COM0B0 Description
                          0
                          1   0  Normal port operation, OC0B disconnected.
                          1
                              1  Toggle OC0B on Compare Match

                              0  Clear OC0B on Compare Match

                              1  Set OC0B on Compare Match

                 Table 14-6 shows the COM0B1:0 bit functionality when the WGM02:0 bits are set to fast PWM
                 mode.

                 Table 14-6.  Compare Output Mode, Fast PWM Mode(1)
                     COM0B1
                          0   COM0B0 Description
                          0
                          1   0  Normal port operation, OC0B disconnected.

                          1   1  Reserved

                              0  Clear OC0B on Compare Match, set OC0B at BOTTOM,
                                 (non-inverting mode).

                              1  Set OC0B on Compare Match, clear OC0B at BOTTOM,
                                 (inverting mode).

                 Note:  1. A special case occurs when OCR0B equals TOP and COM0B1 is set. In this case, the Com-
                            pare Match is ignored, but the set or clear is done atBOTTOM. See "Fast PWM Mode" on page
                            101 for more details.

                                                                                            107

8152GAVR11/09
                                               ATmega164PA/324PA/644PA/1284P

                 Table 14-7 on page 108 shows the COM0B1:0 bit functionality when the WGM02:0 bits are set
                 to phase correct PWM mode.

                 Table 14-7.     Compare Output Mode, Phase Correct PWM Mode(1)
                     COM0B1
                          0      COM0B0 Description
                          0
                          1      0             Normal port operation, OC0B disconnected.

                          1      1             Reserved

                                 0             Clear OC0B on Compare Match when up-counting. Set OC0B on
                                               Compare Match when down-counting.

                                 1             Set OC0B on Compare Match when up-counting. Clear OC0B on
                                               Compare Match when down-counting.

                 Note:  1. A special case occurs when OCR0B equals TOP and COM0B1 is set. In this case, the Com-
                            pare Match is ignored, but the set or clear is done at TOP. See "Phase Correct PWM Mode" on
                            page 103 for more details.

                  Bits 3:2 Res: Reserved Bits
                 These bits are reserved bits in the ATmega164PA/324PA and will always read as zero.

                  Bits 1:0 WGM01:0: Waveform Generation Mode
                 Combined with the WGM02 bit found in the TCCR0B Register, these bits control the counting
                 sequence of the counter, the source for maximum (TOP) counter value, and what type of wave-
                 form generation to be used, see Table 14-8 on page 108. Modes of operation supported by the
                 Timer/Counter unit are: Normal mode (counter), Clear Timer on Compare Match (CTC) mode,
                 and two types of Pulse Width Modulation (PWM) modes (see "Modes of Operation" on page
                 125).

                 Table 14-8. Waveform Generation Mode Bit Description

                 Mode   WGM2     WGM1          WGM0      Timer/Counter  TOP               Update of   TOV Flag
                                                         Mode of                           OCRx at   Set on(1)(2)
                                                         Operation                        Immediate
                                                                                                         MAX
                 0            0     0          0         Normal         0xFF                  TOP
                                                                                                      BOTTOM
                 1            0     0          1         PWM, Phase     0xFF              Immediate
                                                         Correct                          BOTTOM         MAX
                                                                                                         MAX
                 2            0     1          0         CTC            OCRA                    
                                                                                                           
                 3            0     1          1         Fast PWM       0xFF                  TOP
                                                                                                      BOTTOM
                 4            1     0          0         Reserved                              
                                                                                          BOTTOM           
                 5            1     0          1         PWM, Phase     OCRA                             TOP
                                                         Correct

                 6            1     1          0         Reserved      

                 7            1     1          1         Fast PWM       OCRA

                 Notes: 1. MAX = 0xFF
                             2. BOTTOM = 0x00

                                                                                                          108

8152GAVR11/09
                                       ATmega164PA/324PA/644PA/1284P

14.9.2 TCCR0B Timer/Counter Control Register B

                 Bit            7      6          5  4  3      2     1     0

                 0x25 (0x45)    FOC0A  FOC0B          WGM02  CS02  CS01  CS00                       TCCR0B

                 Read/Write     W      W          R  R  R/W    R/W   R/W   R/W

                 Initial Value  0      0          0  0  0      0     0     0

                  Bit 7 FOC0A: Force Output Compare A
                 The FOC0A bit is only active when the WGM bits specify a non-PWM mode.

                 However, for ensuring compatibility with future devices, this bit must be set to zero when
                 TCCR0B is written when operating in PWM mode. When writing a logical one to the FOC0A bit,
                 an immediate Compare Match is forced on the Waveform Generation unit. The OC0A output is
                 changed according to its COM0A1:0 bits setting. Note that the FOC0A bit is implemented as a
                 strobe. Therefore it is the value present in the COM0A1:0 bits that determines the effect of the
                 forced compare.

                 A FOC0A strobe will not generate any interrupt, nor will it clear the timer in CTC mode using
                 OCR0A as TOP.

                 The FOC0A bit is always read as zero.

                  Bit 6 FOC0B: Force Output Compare B
                 The FOC0B bit is only active when the WGM bits specify a non-PWM mode.

                 However, for ensuring compatibility with future devices, this bit must be set to zero when
                 TCCR0B is written when operating in PWM mode. When writing a logical one to the FOC0B bit,
                 an immediate Compare Match is forced on the Waveform Generation unit. The OC0B output is
                 changed according to its COM0B1:0 bits setting. Note that the FOC0B bit is implemented as a
                 strobe. Therefore it is the value present in the COM0B1:0 bits that determines the effect of the
                 forced compare.

                 A FOC0B strobe will not generate any interrupt, nor will it clear the timer in CTC mode using
                 OCR0B as TOP.

                 The FOC0B bit is always read as zero.

                  Bits 5:4 Res: Reserved Bits
                 These bits are reserved bits and will always read as zero.

                  Bit 3 WGM02: Waveform Generation Mode
                 See the description in the "TCCR0A Timer/Counter Control Register A" on page 106.

                                                                                                      109

8152GAVR11/09
                                              ATmega164PA/324PA/644PA/1284P

                  Bits 2:0 CS02:0: Clock Select
                 The three Clock Select bits select the clock source to be used by the Timer/Counter.

                 Table 14-9. Clock Select Bit Description

                 CS02 CS01 CS00 Description

                 0              0       0 No clock source (Timer/Counter stopped)

                 0              0       1     clkI/O/(No prescaling)

                 0              1       0     clkI/O/8 (From prescaler)

                 0              1       1     clkI/O/64 (From prescaler)

                 1              0       0     clkI/O/256 (From prescaler)

                 1              0       1     clkI/O/1024 (From prescaler)

                 1              1       0 External clock source on T0 pin. Clock on falling edge.

                 1              1       1 External clock source on T0 pin. Clock on rising edge.

14.9.3                       If external pin modes are used for the Timer/Counter0, transitions on the T0 pin will clock the
                             counter even if the pin is configured as an output. This feature allows software control of the
                             counting.

        TCNT0 Timer/Counter Register

                 Bit               7       6    5          4                3   2    1             0
                 0x26 (0x46)
                 Read/Write                                TCNT0[7:0]                                   TCNT0
                 Initial Value
                                   R/W     R/W  R/W        R/W             R/W  R/W  R/W           R/W

                                   0       0    0          0                0   0    0             0

                 The Timer/Counter Register gives direct access, both for read and write operations, to the
                 Timer/Counter unit 8-bit counter. Writing to the TCNT0 Register blocks (removes) the Compare
                 Match on the following timer clock. Modifying the counter (TCNT0) while the counter is running,
                 introduces a risk of missing a Compare Match between TCNT0 and the OCR0x Registers.

14.9.4  OCR0A Output Compare Register A

                 Bit               7       6    5          4                3   2    1             0
                 0x27 (0x47)
                 Read/Write                                OCR0A[7:0]                                   OCR0A
                 Initial Value
                                   R/W     R/W  R/W        R/W             R/W  R/W  R/W           R/W

                                   0       0    0          0                0   0    0             0

                 The Output Compare Register A contains an 8-bit value that is continuously compared with the
                 counter value (TCNT0). A match can be used to generate an Output Compare interrupt, or to
                 generate a waveform output on the OC0A pin.

                                                                                                        110

8152GAVR11/09
                                             ATmega164PA/324PA/644PA/1284P

14.9.5 OCR0B Output Compare Register B

                 Bit            7         6    5        4    3               2    1       0
                 0x28 (0x48)
                 Read/Write                             OCR0B[7:0]                                    OCR0B
                 Initial Value
                                R/W       R/W  R/W      R/W  R/W             R/W  R/W     R/W

                                0         0    0        0    0               0    0       0

                 The Output Compare Register B contains an 8-bit value that is continuously compared with the
                 counter value (TCNT0). A match can be used to generate an Output Compare interrupt, or to
                 generate a waveform output on the OC0B pin.

14.9.6  TIMSK0 Timer/Counter Interrupt Mask Register

                 Bit            7         6    5        4    3               2    1       0

                 (0x6E)                                                 OCIE0B OCIE0A TOIE0      TIMSK0

                 Read/Write     R         R    R        R    R               R/W  R/W     R/W

                 Initial Value  0         0    0        0    0               0    0       0

                  Bits 7:3 Res: Reserved Bits
                 These bits are reserved bits and will always read as zero.

                  Bit 2 OCIE0B: Timer/Counter Output Compare Match B Interrupt Enable
                 When the OCIE0B bit is written to one, and the I-bit in the Status Register is set, the
                 Timer/Counter Compare Match B interrupt is enabled. The corresponding interrupt is executed if
                 a Compare Match in Timer/Counter occurs, i.e., when the OCF0B bit is set in the Timer/Counter
                 Interrupt Flag Register TIFR0.

                  Bit 1 OCIE0A: Timer/Counter0 Output Compare Match A Interrupt Enable
                 When the OCIE0A bit is written to one, and the I-bit in the Status Register is set, the
                 Timer/Counter0 Compare Match A interrupt is enabled. The corresponding interrupt is executed
                 if a Compare Match in Timer/Counter0 occurs, i.e., when the OCF0A bit is set in the
                 Timer/Counter 0 Interrupt Flag Register TIFR0.

14.9.7                        Bit 0 TOIE0: Timer/Counter0 Overflow Interrupt Enable
                             When the TOIE0 bit is written to one, and the I-bit in the Status Register is set, the
                             Timer/Counter0 Overflow interrupt is enabled. The corresponding interrupt is executed if an
                             overflow in Timer/Counter0 occurs, i.e., when the TOV0 bit is set in the Timer/Counter 0 Inter-
                             rupt Flag Register TIFR0.

        TIFR0 Timer/Counter 0 Interrupt Flag Register

                 Bit            7         6    5        4    3               2    1       0

                 0x15 (0x35)                                            OCF0B OCF0A  TOV0        TIFR0

                 Read/Write     R         R    R        R    R               R/W  R/W     R/W

                 Initial Value  0         0    0        0    0               0    0       0

                  Bits 7:3 Res: Reserved Bits
                 These bits are reserved bits in the ATmega164PA/324PA and will always read as zero.

                                                                                                      111

8152GAVR11/09
                                     ATmega164PA/324PA/644PA/1284P

                  Bit 2 OCF0B: Timer/Counter 0 Output Compare B Match Flag
                 The OCF0B bit is set when a Compare Match occurs between the Timer/Counter and the data in
                 OCR0B Output Compare Register0 B. OCF0B is cleared by hardware when executing the cor-
                 responding interrupt handling vector. Alternatively, OCF0B is cleared by writing a logic one to
                 the flag. When the I-bit in SREG, OCIE0B (Timer/Counter Compare B Match Interrupt Enable),
                 and OCF0B are set, the Timer/Counter Compare Match Interrupt is executed.

                  Bit 1 OCF0A: Timer/Counter 0 Output Compare A Match Flag
                 The OCF0A bit is set when a Compare Match occurs between the Timer/Counter0 and the data
                 in OCR0A Output Compare Register0. OCF0A is cleared by hardware when executing the cor-
                 responding interrupt handling vector. Alternatively, OCF0A is cleared by writing a logic one to
                 the flag. When the I-bit in SREG, OCIE0A (Timer/Counter0 Compare Match Interrupt Enable),
                 and OCF0A are set, the Timer/Counter0 Compare Match Interrupt is executed.

                  Bit 0 TOV0: Timer/Counter0 Overflow Flag
                 The bit TOV0 is set when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware
                 when executing the corresponding interrupt handling vector. Alternatively, TOV0 is cleared by
                 writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow Interrupt
                 Enable), and TOV0 are set, the Timer/Counter0 Overflow interrupt is executed.

                 The setting of this flag is dependent of the WGM02:0 bit setting. Refer to Table 14-8, "Waveform
                 Generation Mode Bit Description" on page 108.

                 112

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

15. 16-bit Timer/Counter1 with PWM

15.1 Features    True 16-bit Design (i.e., Allows 16-bit PWM)
15.2 Overview    Two independent Output Compare Units
                  Double Buffered Output Compare Registers
                  One Input Capture Unit
                  Input Capture Noise Canceler
                  Clear Timer on Compare Match (Auto Reload)
                  Glitch-free, Phase Correct Pulse Width Modulator (PWM)
                  Variable PWM Period
                  Frequency Generator
                  External Event Counter
                  Four independent interrupt Sources (TOV1, OCF1A, OCF1B, and ICF1)

                 The 16-bit Timer/Counter unit allows accurate program execution timing (event management),
                 wave generation, and signal timing measurement.

                 Most register and bit references in this section are written in general form. A lower case "n"
                 replaces the Timer/Counter number, and a lower case "x" replaces the Output Compare unit
                 channel. However, when using the register or bit defines in a program, the precise form must be
                 used, i.e., TCNT1 for accessing Timer/Counter1 counter value and so on.

                 A simplified block diagram of the 16-bit Timer/Counter is shown in Figure 15-1. For the actual
                 placement of I/O pins, see "Pin Configurations" on page 2. CPU accessible I/O Registers, includ-
                 ing I/O bits and I/O pins, are shown in bold. The device-specific I/O Register and bit locations
                 are listed in the "Register Description" on page 134.

                 The PRTIM1 bit in "PRR Power Reduction Register" on page 49 must be written to zero to
                 enable Timer/Counter1 module.

                                                                                      113

8152GAVR11/09
                                    ATmega164PA/324PA/644PA/1284P

                  Figure 15-1. 16-bit Timer/Counter Block Diagram(Note:)

                                            Count     Control Logic  clkTn         TOVn
                                             Clear                                 (Int.Req.)
                                           Direction                               Clock Select

                                                      TOP BOTTOM                        Edge               Tn
                                                                                      Detector           OCnA
                            Timer/Counter             =              =0
                                TCNTn                                                ( From Prescaler )

                               =                                                  OCnA
                                                                                  (Int.Req.)
                            OCRnA
                                                                                     Waveform
                               =                                                    Generation

                  DATA BUS  OCRnB                            Fixed                OCnB                   OCnB
                              ICRn                            TOP                 (Int.Req.)
                                                            Values
                            TCCRnA                                                   Waveform
                                                                 ICFn (Int.Req.)    Generation
                                                                        Edge
                                                                                                   ( From Analog
                                                                      Detector                  Comparator Ouput )

                                                      TCCRnB                        Noise
                                                                                  Canceler

                                                                                                         ICPn

15.2.1 Registers  Note: Refer to Figure 1-1 on page 2 and "Alternate Port Functions" on page 80 for Timer/Counter1 pin
                              placement and description.

                  The Timer/Counter (TCNTn), Output Compare Registers (OCRnA/B/C), and Input Capture Reg-
                  ister (ICRn) are all 16-bit registers. Special procedures must be followed when accessing the 16-
                  bit registers. These procedures are described in the section "Accessing 16-bit Registers" on
                  page 115. The Timer/Counter Control Registers (TCCRnA/B/C) are 8-bit registers and have no
                  CPU access restrictions. Interrupt requests (abbreviated to Int.Req. in the figure) signals are all
                  visible in the Timer Interrupt Flag Register (TIFRn). All interrupts are individually masked with
                  the Timer Interrupt Mask Register (TIMSKn). TIFRn and TIMSKn are not shown in the figure.

                  The Timer/Counter can be clocked internally, via the prescaler, or by an external clock source on
                  the Tn pin. The Clock Select logic block controls which clock source and edge the Timer/Counter
                  uses to increment (or decrement) its value. The Timer/Counter is inactive when no clock source
                  is selected. The output from the Clock Select logic is referred to as the timer clock (clkTn).

                  The double buffered Output Compare Registers (OCRnA/B/C) are compared with the
                  Timer/Counter value at all time. The result of the compare can be used by the Waveform Gener-
                  ator to generate a PWM or variable frequency output on the Output Compare pin (OCnA/B/C).

                                                                                                                    114

8152GAVR11/09
                                 ATmega164PA/324PA/644PA/1284P

                     See Section "15.7" on page 122.. The compare match event will also set the Compare Match
                     Flag (OCFnA/B/C) which can be used to generate an Output Compare interrupt request.

                     The Input Capture Register can capture the Timer/Counter value at a given external (edge trig-
                     gered) event on either the Input Capture pin (ICPn) or on the Analog Comparator pins (See
                     Section "21." on page 239.) The Input Capture unit includes a digital filtering unit (Noise Can-
                     celer) for reducing the chance of capturing noise spikes.

                     The TOP value, or maximum Timer/Counter value, can in some modes of operation be defined
                     by either the OCRnA Register, the ICRn Register, or by a set of fixed values. When using
                     OCRnA as TOP value in a PWM mode, the OCRnA Register can not be used for generating a
                     PWM output. However, the TOP value will in this case be double buffered allowing the TOP
                     value to be changed in run time. If a fixed TOP value is required, the ICRn Register can be used
                     as an alternative, freeing the OCRnA to be used as PWM output.

15.2.2  Definitions

                     The following definitions are used extensively throughout the section:

                     Table 15-1. Definitions
                       BOTTOM The counter reaches the BOTTOM when it becomes 0x0000.

                     MAX  The counter reaches its MAXimum when it becomes 0xFFFF (decimal 65535).

                     TOP  The counter reaches the TOP when it becomes equal to the highest value in the count
                          sequence. The TOP value can be assigned to be one of the fixed values: 0x00FF, 0x01FF,
                          or 0x03FF, or to the value stored in the OCRnA or ICRn Register. The assignment is
                          dependent of the mode of operation.

15.3 Accessing 16-bit Registers

                     The TCNTn, OCRnA/B/C, and ICRn are 16-bit registers that can be accessed by the AVR CPU
                     via the 8-bit data bus. The 16-bit register must be byte accessed using two read or write opera-
                     tions. Each 16-bit timer has a single 8-bit register for temporary storing of the high byte of the 16-
                     bit access. The same temporary register is shared between all 16-bit registers within each 16-bit
                     timer. Accessing the low byte triggers the 16-bit read or write operation. When the low byte of a
                     16-bit register is written by the CPU, the high byte stored in the temporary register, and the low
                     byte written are both copied into the 16-bit register in the same clock cycle. When the low byte of
                     a 16-bit register is read by the CPU, the high byte of the 16-bit register is copied into the tempo-
                     rary register in the same clock cycle as the low byte is read.

                     Not all 16-bit accesses uses the temporary register for the high byte. Reading the OCRnA/B/C
                     16-bit registers does not involve using the temporary register.

                     To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low
                     byte must be read before the high byte.

                     The following code examples show how to access the 16-bit Timer Registers assuming that no
                     interrupts updates the temporary register. The same principle can be used directly for accessing
                     the OCRnA/B/C and ICRn Registers. Note that when using "C", the compiler handles the 16-bit
                     access.

                                                                                                   115

8152GAVR11/09
                        ATmega164PA/324PA/644PA/1284P

                 Assembly Code Examples(1)

                          ...
                          ; Set TCNTn to 0x01FF
                          ldi r17,0x01
                          ldi r16,0xFF
                          out TCNTnH,r17
                          out TCNTnL,r16
                          ; Read TCNTn into r17:r16
                          in r16,TCNTnL
                          in r17,TCNTnH
                          ...
                 C Code Examples(1)

                          unsigned int i;
                          ...
                          /* Set TCNTn to 0x01FF */
                          TCNTn = 0x1FF;
                          /* Read TCNTn into i */
                          i = TCNTn;
                          ...

                 Note:  1. The example code assumes that the part specific header file is included.
                            For I/O Registers located in extended I/O map, "IN", "OUT", "SBIS", "SBIC", "CBI", and "SBI"
                            instructions must be replaced with instructions that allow access to extended I/O. Typically
                            "LDS" and "STS" combined with "SBRS", "SBRC", "SBR", and "CBR".

                 The assembly code example returns the TCNTn value in the r17:r16 register pair.

                 It is important to notice that accessing 16-bit registers are atomic operations. If an interrupt
                 occurs between the two instructions accessing the 16-bit register, and the interrupt code
                 updates the temporary register by accessing the same or any other of the 16-bit Timer Regis-
                 ters, then the result of the access outside the interrupt will be corrupted. Therefore, when both
                 the main code and the interrupt code update the temporary register, the main code must disable
                 the interrupts during the 16-bit access.

                                                                                                  116

8152GAVR11/09
                        ATmega164PA/324PA/644PA/1284P

                 The following code examples show how to do an atomic read of the TCNTn Register contents.
                 Reading any of the OCRnA/B/C or ICRn Registers can be done by using the same principle.

                 Assembly Code Example(1)
                       TIM16_ReadTCNTn:
                          ; Save global interrupt flag
                          in r18,SREG
                          ; Disable interrupts
                          cli
                          ; Read TCNTn into r17:r16
                          in r16,TCNTnL
                          in r17,TCNTnH
                          ; Restore global interrupt flag
                          out SREG,r18
                          ret

                 C Code Example(1)
                       unsigned int TIM16_ReadTCNTn( void )
                       {
                          unsigned char sreg;
                          unsigned int i;
                          /* Save global interrupt flag */
                          sreg = SREG;
                          /* Disable interrupts */
                          _CLI();
                          /* Read TCNTn into i */
                          i = TCNTn;
                          /* Restore global interrupt flag */
                          SREG = sreg;
                          return i;
                       }

                 Note:  1. The example code assumes that the part specific header file is included.
                            For I/O Registers located in extended I/O map, "IN", "OUT", "SBIS", "SBIC", "CBI", and "SBI"
                            instructions must be replaced with instructions that allow access to extended I/O. Typically
                            "LDS" and "STS" combined with "SBRS", "SBRC", "SBR", and "CBR".

                 The assembly code example returns the TCNTn value in the r17:r16 register pair.

                                                                                                  117

8152GAVR11/09
                                ATmega164PA/324PA/644PA/1284P

                 The following code examples show how to do an atomic write of the TCNTn Register contents.
                 Writing any of the OCRnA/B/C or ICRn Registers can be done by using the same principle.

                 Assembly Code Example(1)
                       TIM16_WriteTCNTn:
                          ; Save global interrupt flag
                          in r18,SREG
                          ; Disable interrupts
                          cli
                          ; Set TCNTn to r17:r16
                          out TCNTnH,r17
                          out TCNTnL,r16
                          ; Restore global interrupt flag
                          out SREG,r18
                          ret

                 C Code Example(1)
                       void TIM16_WriteTCNTn( unsigned int i )
                       {
                          unsigned char sreg;
                          unsigned int i;
                          /* Save global interrupt flag */
                          sreg = SREG;
                          /* Disable interrupts */
                          _CLI();
                          /* Set TCNTn to i */
                          TCNTn = i;
                          /* Restore global interrupt flag */
                          SREG = sreg;
                       }

                 Note:  1. The example code assumes that the part specific header file is included.
                            For I/O Registers located in extended I/O map, "IN", "OUT", "SBIS", "SBIC", "CBI", and "SBI"
                            instructions must be replaced with instructions that allow access to extended I/O. Typically
                            "LDS" and "STS" combined with "SBRS", "SBRC", "SBR", and "CBR".

                 The assembly code example requires that the r17:r16 register pair contains the value to be writ-

                 ten to TCNTn.

15.3.1  Reusing the Temporary High Byte Register

                                   If writing to more than one 16-bit register where the high byte is the same for all registers written,
                                   then the high byte only needs to be written once. However, note that the same rule of atomic
                                   operation described previously also applies in this case.

15.4 Timer/Counter Clock Sources

                 The Timer/Counter can be clocked by an internal or an external clock source. The clock source
                 is selected by the Clock Select logic which is controlled by the Clock Select (CSn2:0) bits
                 located in the Timer/Counter control Register B (TCCRnB). For details on clock sources and
                 prescaler, see "Timer/Counter Prescaler" on page 154.

                                                                118

8152GAVR11/09
                                      ATmega164PA/324PA/644PA/1284P

15.5 Counter Unit

                                   The main part of the 16-bit Timer/Counter is the programmable 16-bit bi-directional counter unit.
                                   Figure 15-2 shows a block diagram of the counter and its surroundings.

                 Figure 15-2. Counter Unit Block Diagram

                            DATA BUS (8-bit)

                                                                    TOVn
                                                                    (Int.Req.)

                        TEMP (8-bit)

                                                                                         Clock Select

                 TCNTnH (8-bit)       TCNTnL (8-bit)     Count      Control Logic clkTn    Edge              Tn
                                                         Clear                           Detector

                        TCNTn (16-bit Counter)           Direction

                                                                                         ( From Prescaler )

                                                                    TOP BOTTOM

                 Signal description (internal signals):

                 Count                          Increment or decrement TCNTn by 1.

                 Direction                      Select between increment and decrement.

                 Clear                          Clear TCNTn (set all bits to zero).

                 clkTn                          Timer/Counter clock.
                 TOP                            Signalize that TCNTn has reached maximum value.

                 BOTTOM                         Signalize that TCNTn has reached minimum value (zero).

                 The 16-bit counter is mapped into two 8-bit I/O memory locations: Counter High (TCNTnH) con-
                 taining the upper eight bits of the counter, and Counter Low (TCNTnL) containing the lower eight
                 bits. The TCNTnH Register can only be indirectly accessed by the CPU. When the CPU does an
                 access to the TCNTnH I/O location, the CPU accesses the high byte temporary register (TEMP).
                 The temporary register is updated with the TCNTnH value when the TCNTnL is read, and
                 TCNTnH is updated with the temporary register value when TCNTnL is written. This allows the
                 CPU to read or write the entire 16-bit counter value within one clock cycle via the 8-bit data bus.
                 It is important to notice that there are special cases of writing to the TCNTn Register when the
                 counter is counting that will give unpredictable results. The special cases are described in the
                 sections where they are of importance.

                 Depending on the mode of operation used, the counter is cleared, incremented, or decremented
                 at each timer clock (clkTn). The clkTn can be generated from an external or internal clock source,
                 selected by the Clock Select bits (CSn2:0). When no clock source is selected (CSn2:0 = 0) the
                 timer is stopped. However, the TCNTn value can be accessed by the CPU, independent of
                 whether clkTn is present or not. A CPU write overrides (has priority over) all counter clear or
                 count operations.

                 The counting sequence is determined by the setting of the Waveform Generation mode bits
                 (WGMn3:0) located in the Timer/Counter Control Registers A and B (TCCRnA and TCCRnB).
                 There are close connections between how the counter behaves (counts) and how waveforms
                 are generated on the Output Compare outputs OCnx. For more details about advanced counting
                 sequences and waveform generation, see "Modes of Operation" on page 125.

                                                                                                                 119

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   The Timer/Counter Overflow Flag (TOVn) is set according to the mode of operation selected by
                                   the WGMn3:0 bits. TOVn can be used for generating a CPU interrupt.

15.6 Input Capture Unit

                                   The Timer/Counter incorporates an Input Capture unit that can capture external events and give
                                   them a time-stamp indicating time of occurrence. The external signal indicating an event, or mul-
                                   tiple events, can be applied via the ICPn pin or alternatively, via the analog-comparator unit. The
                                   time-stamps can then be used to calculate frequency, duty-cycle, and other features of the sig-
                                   nal applied. Alternatively the time-stamps can be used for creating a log of the events.
                                   The Input Capture unit is illustrated by the block diagram shown in Figure 15-3. The elements of
                                   the block diagram that are not directly a part of the Input Capture unit are gray shaded. The
                                   small "n" in register and bit names indicates the Timer/Counter number.

                                   Figure 15-3. Input Capture Unit Block Diagram
                                                                                         DATA BUS (8-bit)

                                                                                    TEMP (8-bit)

                       ICRnH (8-bit)           ICRnL (8-bit)            TCNTnH (8-bit)  TCNTnL (8-bit)

                       WRITE  ICRn (16-bit Register)                    TCNTn (16-bit Counter)

                                         ACO*  ACIC*          ICNC        ICES

                                 Analog                         Noise     Edge
                              Comparator                      Canceler  Detector

                                                                                                ICFn (Int.Req.)

                 ICPn

                 When a change of the logic level (an event) occurs on the Input Capture pin (ICPn), alternatively
                 on the Analog Comparator output (ACO), and this change confirms to the setting of the edge
                 detector, a capture will be triggered. When a capture is triggered, the 16-bit value of the counter
                 (TCNTn) is written to the Input Capture Register (ICRn). The Input Capture Flag (ICFn) is set at
                 the same system clock as the TCNTn value is copied into ICRn Register. If enabled (ICIEn = 1),
                 the Input Capture Flag generates an Input Capture interrupt. The ICFn Flag is automatically
                 cleared when the interrupt is executed. Alternatively the ICFn Flag can be cleared by software
                 by writing a logical one to its I/O bit location.

                 Reading the 16-bit value in the Input Capture Register (ICRn) is done by first reading the low
                 byte (ICRnL) and then the high byte (ICRnH). When the low byte is read the high byte is copied
                 into the high byte temporary register (TEMP). When the CPU reads the ICRnH I/O location it will
                 access the TEMP Register.

                 The ICRn Register can only be written when using a Waveform Generation mode that utilizes
                 the ICRn Register for defining the counter's TOP value. In these cases the Waveform Genera-

                                                                                                                 120

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

15.6.1                       tion mode (WGMn3:0) bits must be set before the TOP value can be written to the ICRn
15.6.2                       Register. When writing the ICRn Register the high byte must be written to the ICRnH I/O location
15.6.3                       before the low byte is written to ICRnL.

                             For more information on how to access the 16-bit registers refer to "Accessing 16-bit Registers"
                             on page 115.

        Input Capture Trigger Source

                             The main trigger source for the Input Capture unit is the Input Capture pin (ICPn).
                             Timer/Counter1 can alternatively use the Analog Comparator output as trigger source for the
                             Input Capture unit. The Analog Comparator is selected as trigger source by setting the Analog
                             Comparator Input Capture (ACIC) bit in the Analog Comparator Control and Status Register
                             (ACSR). Be aware that changing trigger source can trigger a capture. The Input Capture Flag
                             must therefore be cleared after the change.

                             Both the Input Capture pin (ICPn) and the Analog Comparator output (ACO) inputs are sampled
                             using the same technique as for the Tn pin (Figure 15-1 on page 114). The edge detector is also
                             identical. However, when the noise canceler is enabled, additional logic is inserted before the
                             edge detector, which increases the delay by four system clock cycles. Note that the input of the
                             noise canceler and edge detector is always enabled unless the Timer/Counter is set in a Wave-
                             form Generation mode that uses ICRn to define TOP.

                             An Input Capture can be triggered by software by controlling the port of the ICPn pin.

        Noise Canceler

                             The noise canceler improves noise immunity by using a simple digital filtering scheme. The
                             noise canceler input is monitored over four samples, and all four must be equal for changing the
                             output that in turn is used by the edge detector.

                             The noise canceler is enabled by setting the Input Capture Noise Canceler (ICNCn) bit in
                             Timer/Counter Control Register B (TCCRnB). When enabled the noise canceler introduces addi-
                             tional four system clock cycles of delay from a change applied to the input, to the update of the
                             ICRn Register. The noise canceler uses the system clock and is therefore not affected by the
                             prescaler.

        Using the Input Capture Unit

                             The main challenge when using the Input Capture unit is to assign enough processor capacity
                             for handling the incoming events. The time between two events is critical. If the processor has
                             not read the captured value in the ICRn Register before the next event occurs, the ICRn will be
                             overwritten with a new value. In this case the result of the capture will be incorrect.

                             When using the Input Capture interrupt, the ICRn Register should be read as early in the inter-
                             rupt handler routine as possible. Even though the Input Capture interrupt has relatively high
                             priority, the maximum interrupt response time is dependent on the maximum number of clock
                             cycles it takes to handle any of the other interrupt requests.

                             Using the Input Capture unit in any mode of operation when the TOP value (resolution) is
                             actively changed during operation, is not recommended.

                             Measurement of an external signal's duty cycle requires that the trigger edge is changed after
                             each capture. Changing the edge sensing must be done as early as possible after the ICRn
                             Register has been read. After a change of the edge, the Input Capture Flag (ICFn) must be

                 121

8152GAVR11/09
                                        ATmega164PA/324PA/644PA/1284P

                                   cleared by software (writing a logical one to the I/O bit location). For measuring frequency only,
                                   the clearing of the ICFn Flag is not required (if an interrupt handler is used).

15.7 Output Compare Units

                                   The 16-bit comparator continuously compares TCNTn with the Output Compare Register
                                   (OCRnx). If TCNT equals OCRnx the comparator signals a match. A match will set the Output
                                   Compare Flag (OCFnx) at the next timer clock cycle. If enabled (OCIEnx = 1), the Output Com-
                                   pare Flag generates an Output Compare interrupt. The OCFnx Flag is automatically cleared
                                   when the interrupt is executed. Alternatively the OCFnx Flag can be cleared by software by writ-
                                   ing a logical one to its I/O bit location. The Waveform Generator uses the match signal to
                                   generate an output according to operating mode set by the Waveform Generation mode
                                   (WGMn3:0) bits and Compare Output mode (COMnx1:0) bits. The TOP and BOTTOM signals
                                   are used by the Waveform Generator for handling the special cases of the extreme values in
                                   some modes of operation (See Section "15.9" on page 125.)

                                   A special feature of Output Compare unit A allows it to define the Timer/Counter TOP value (i.e.,
                                   counter resolution). In addition to the counter resolution, the TOP value defines the period time
                                   for waveforms generated by the Waveform Generator.

                                   Figure 15-4 shows a block diagram of the Output Compare unit. The small "n" in the register and
                                   bit names indicates the device number (n = n for Timer/Counter n), and the "x" indicates Output
                                   Compare unit (A/B/C). The elements of the block diagram that are not directly a part of the Out-
                                   put Compare unit are gray shaded.

                                   Figure 15-4. Output Compare Unit, Block Diagram
                                                                                                         DATA BUS (8-bit)

                                                                                                                              TEMP (8-bit)

                 OCRnxH Buf. (8-bit) OCRnxL Buf. (8-bit)  TCNTnH (8-bit)                  TCNTnL (8-bit)
                         OCRnx Buffer (16-bit Register)
                                                            TCNTn (16-bit Counter)

                 OCRnxH (8-bit)  OCRnxL (8-bit)

                 OCRnx (16-bit Register)

                    TOP                    = (16-bit Comparator )                                         OCnx
                 BOTTOM
                                                                        OCFnx (Int.Req.)

                                          Waveform Generator

                                          WGMn3:0 COMnx1:0

                 The OCRnx Register is double buffered when using any of the twelve Pulse Width Modulation
                 (PWM) modes. For the Normal and Clear Timer on Compare (CTC) modes of operation, the
                 double buffering is disabled. The double buffering synchronizes the update of the OCRnx Com-
                 pare Register to either TOP or BOTTOM of the counting sequence. The synchronization

                                                                                                                122

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

15.7.1                       prevents the occurrence of odd-length, non-symmetrical PWM pulses, thereby making the out-
15.7.2                       put glitch-free.
15.7.3
                             The OCRnx Register access may seem complex, but this is not case. When the double buffering
                             is enabled, the CPU has access to the OCRnx Buffer Register, and if double buffering is dis-
                             abled the CPU will access the OCRnx directly. The content of the OCR1x (Buffer or Compare)
                             Register is only changed by a write operation (the Timer/Counter does not update this register
                             automatically as the TCNT1 and ICR1 Register). Therefore OCR1x is not read via the high byte
                             temporary register (TEMP). However, it is a good practice to read the low byte first as when
                             accessing other 16-bit registers. Writing the OCRnx Registers must be done via the TEMP Reg-
                             ister since the compare of all 16 bits is done continuously. The high byte (OCRnxH) has to be
                             written first. When the high byte I/O location is written by the CPU, the TEMP Register will be
                             updated by the value written. Then when the low byte (OCRnxL) is written to the lower eight bits,
                             the high byte will be copied into the upper 8-bits of either the OCRnx buffer or OCRnx Compare
                             Register in the same system clock cycle.

                             For more information of how to access the 16-bit registers refer to "Accessing 16-bit Registers"
                             on page 115.

        Force Output Compare

                             In non-PWM Waveform Generation modes, the match output of the comparator can be forced by
                             writing a one to the Force Output Compare (FOCnx) bit. Forcing compare match will not set the
                             OCFnx Flag or reload/clear the timer, but the OCnx pin will be updated as if a real compare
                             match had occurred (the COMn1:0 bits settings define whether the OCnx pin is set, cleared or
                             toggled).

        Compare Match Blocking by TCNTn Write

                             All CPU writes to the TCNTn Register will block any compare match that occurs in the next timer
                             clock cycle, even when the timer is stopped. This feature allows OCRnx to be initialized to the
                             same value as TCNTn without triggering an interrupt when the Timer/Counter clock is enabled.

        Using the Output Compare Unit

                             Since writing TCNTn in any mode of operation will block all compare matches for one timer clock
                             cycle, there are risks involved when changing TCNTn when using any of the Output Compare
                             channels, independent of whether the Timer/Counter is running or not. If the value written to
                             TCNTn equals the OCRnx value, the compare match will be missed, resulting in incorrect wave-
                             form generation. Do not write the TCNTn equal to TOP in PWM modes with variable TOP
                             values. The compare match for the TOP will be ignored and the counter will continue to 0xFFFF.
                             Similarly, do not write the TCNTn value equal to BOTTOM when the counter is downcounting.

                             The setup of the OCnx should be performed before setting the Data Direction Register for the
                             port pin to output. The easiest way of setting the OCnx value is to use the Force Output Com-
                             pare (FOCnx) strobe bits in Normal mode. The OCnx Register keeps its value even when
                             changing between Waveform Generation modes.

                             Be aware that the COMnx1:0 bits are not double buffered together with the compare value.
                             Changing the COMnx1:0 bits will take effect immediately.

                 123

8152GAVR11/09
                         ATmega164PA/324PA/644PA/1284P

15.8 Compare Match Output Unit

                                   The Compare Output mode (COMnx1:0) bits have two functions. The Waveform Generator uses
                                   the COMnx1:0 bits for defining the Output Compare (OCnx) state at the next compare match.
                                   Secondly the COMnx1:0 bits control the OCnx pin output source. Figure 15-5 shows a simplified
                                   schematic of the logic affected by the COMnx1:0 bit setting. The I/O Registers, I/O bits, and I/O
                                   pins in the figure are shown in bold. Only the parts of the general I/O Port Control Registers
                                   (DDR and PORT) that are affected by the COMnx1:0 bits are shown. When referring to the
                                   OCnx state, the reference is for the internal OCnx Register, not the OCnx pin. If a system reset
                                   occur, the OCnx Register is reset to "0".

                                   Figure 15-5. Compare Match Output Unit, Schematic

                 COMnx1  Waveform   DQ
                 COMnx0  Generator
                 FOCnx

                                          1                           OCnx
                                                                      Pin
                                    OCnx

                                                                   0

                                    DQ

                         DATA BUS   PORT
                                    DQ

                                    DDR

                 clkI/O

                 The general I/O port function is overridden by the Output Compare (OCnx) from the Waveform
                 Generator if either of the COMnx1:0 bits are set. However, the OCnx pin direction (input or out-
                 put) is still controlled by the Data Direction Register (DDR) for the port pin. The Data Direction
                 Register bit for the OCnx pin (DDR_OCnx) must be set as output before the OCnx value is visi-
                 ble on the pin. The port override function is generally independent of the Waveform Generation
                 mode, but there are some exceptions. Refer to Table 15-2, Table 15-3 and Table 15-4 for
                 details.

                 The design of the Output Compare pin logic allows initialization of the OCnx state before the out-
                 put is enabled. Note that some COMnx1:0 bit settings are reserved for certain modes of
                 operation. See Section "15.11" on page 134.

                 The COMnx1:0 bits have no effect on the Input Capture unit.

                                                                            124

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

15.8.1 Compare Output Mode and Waveform Generation

                                   The Waveform Generator uses the COMnx1:0 bits differently in normal, CTC, and PWM modes.
                                   For all modes, setting the COMnx1:0 = 0 tells the Waveform Generator that no action on the
                                   OCnx Register is to be performed on the next compare match. For compare output actions in the
                                   non-PWM modes refer to Table 15-2 on page 134. For fast PWM mode refer to Table 15-3 on
                                   page 135, and for phase correct and phase and frequency correct PWM refer to Table 15-4 on
                                   page 135.

                                   A change of the COMnx1:0 bits state will have effect at the first compare match after the bits are
                                   written. For non-PWM modes, the action can be forced to have immediate effect by using the
                                   FOCnx strobe bits.

15.9 Modes of Operation

15.9.1                       The mode of operation, i.e., the behavior of the Timer/Counter and the Output Compare pins, is
                             defined by the combination of the Waveform Generation mode (WGMn3:0) and Compare Output
                             mode (COMnx1:0) bits. The Compare Output mode bits do not affect the counting sequence,
                             while the Waveform Generation mode bits do. The COMnx1:0 bits control whether the PWM out-
                             put generated should be inverted or not (inverted or non-inverted PWM). For non-PWM modes
                             the COMnx1:0 bits control whether the output should be set, cleared or toggle at a compare
                             match (See Section "15.8" on page 124.)

                             For detailed timing information refer to "Timer/Counter Timing Diagrams" on page 132.

        Normal Mode

15.9.2                       The simplest mode of operation is the Normal mode (WGMn3:0 = 0). In this mode the counting
                             direction is always up (incrementing), and no counter clear is performed. The counter simply
                             overruns when it passes its maximum 16-bit value (MAX = 0xFFFF) and then restarts from the
                             BOTTOM (0x0000). In normal operation the Timer/Counter Overflow Flag (TOVn) will be set in
                             the same timer clock cycle as the TCNTn becomes zero. The TOVn Flag in this case behaves
                             like a 17th bit, except that it is only set, not cleared. However, combined with the timer overflow
                             interrupt that automatically clears the TOVn Flag, the timer resolution can be increased by soft-
                             ware. There are no special cases to consider in the Normal mode, a new counter value can be
                             written anytime.

                             The Input Capture unit is easy to use in Normal mode. However, observe that the maximum
                             interval between the external events must not exceed the resolution of the counter. If the interval
                             between events are too long, the timer overflow interrupt or the prescaler must be used to
                             extend the resolution for the capture unit.

                             The Output Compare units can be used to generate interrupts at some given time. Using the
                             Output Compare to generate waveforms in Normal mode is not recommended, since this will
                             occupy too much of the CPU time.

        Clear Timer on Compare Match (CTC) Mode

                 In Clear Timer on Compare or CTC mode (WGMn3:0 = 4 or 12), the OCRnA or ICRn Register
                 are used to manipulate the counter resolution. In CTC mode the counter is cleared to zero when
                 the counter value (TCNTn) matches either the OCRnA (WGMn3:0 = 4) or the ICRn (WGMn3:0 =
                 12). The OCRnA or ICRn define the top value for the counter, hence also its resolution. This
                 mode allows greater control of the compare match output frequency. It also simplifies the opera-
                 tion of counting external events.

                                                    125

8152GAVR11/09
                              ATmega164PA/324PA/644PA/1284P

                 The timing diagram for the CTC mode is shown in Figure 15-6. The counter value (TCNTn)
                 increases until a compare match occurs with either OCRnA or ICRn, and then counter (TCNTn)
                 is cleared.

                 Figure 15-6. CTC Mode, Timing Diagram

                                                              OCnA Interrupt Flag Set
                                                              or ICFn Interrupt Flag Set
                                                              (Interrupt on TOP)

                 TCNTn

                 OCnA                                         (COMnA1:0 = 1)
                 (Toggle)

                 Period    1  2                         3  4

                 An interrupt can be generated at each time the counter value reaches the TOP value by either
                 using the OCFnA or ICFn Flag according to the register used to define the TOP value. If the
                 interrupt is enabled, the interrupt handler routine can be used for updating the TOP value. How-
                 ever, changing the TOP to a value close to BOTTOM when the counter is running with none or a
                 low prescaler value must be done with care since the CTC mode does not have the double buff-
                 ering feature. If the new value written to OCRnA or ICRn is lower than the current value of
                 TCNTn, the counter will miss the compare match. The counter will then have to count to its max-
                 imum value (0xFFFF) and wrap around starting at 0x0000 before the compare match can occur.
                 In many cases this feature is not desirable. An alternative will then be to use the fast PWM mode
                 using OCRnA for defining TOP (WGMn3:0 = 15) since the OCRnA then will be double buffered.

                 For generating a waveform output in CTC mode, the OCnA output can be set to toggle its logical
                 level on each compare match by setting the Compare Output mode bits to toggle mode
                 (COMnA1:0 = 1). The OCnA value will not be visible on the port pin unless the data direction for
                 the pin is set to output (DDR_OCnA = 1). The waveform generated will have a maximum fre-
                 quency of fOCnA = fclk_I/O/2 when OCRnA is set to zero (0x0000). The waveform frequency is
                 defined by the following equation:

                                                              fOCnA = -2-------N---------(-f-1c---l-k-+-_---I-O/--O---C----R----n---A----)-

15.9.3                       The N variable represents the prescaler factor (1, 8, 64, 256, or 1024).

                             As for the Normal mode of operation, the TOVn Flag is set in the same timer clock cycle that the
                             counter counts from MAX to 0x0000.

        Fast PWM Mode

                             The fast Pulse Width Modulation or fast PWM mode (WGMn3:0 = 5, 6, 7, 14, or 15) provides a
                             high frequency PWM waveform generation option. The fast PWM differs from the other PWM
                             options by its single-slope operation. The counter counts from BOTTOM to TOP then restarts
                             from BOTTOM. In non-inverting Compare Output mode, the Output Compare (OCnx) is cleared
                             on the compare match between TCNTn and OCRnx, and set at BOTTOM. In inverting Compare
                             Output mode output is set on compare match and cleared at BOTTOM. Due to the single-slope
                             operation, the operating frequency of the fast PWM mode can be twice as high as the phase cor-

                                                                                          126

8152GAVR11/09
                               ATmega164PA/324PA/644PA/1284P

                 rect and phase and frequency correct PWM modes that use dual-slope operation. This high
                 frequency makes the fast PWM mode well suited for power regulation, rectification, and DAC
                 applications. High frequency allows physically small sized external components (coils, capaci-
                 tors), hence reduces total system cost.

                 The PWM resolution for fast PWM can be fixed to 8-, 9-, or 10-bit, or defined by either ICRn or
                 OCRnA. The minimum resolution allowed is 2-bit (ICRn or OCRnA set to 0x0003), and the max-
                 imum resolution is 16-bit (ICRn or OCRnA set to MAX). The PWM resolution in bits can be
                 calculated by using the following equation:

                                                                 RFPWM = -l-o---g----(-l-o-T--g-O---(--P-2---)-+-----1----)

                 In fast PWM mode the counter is incremented until the counter value matches either one of the
                 fixed values 0x00FF, 0x01FF, or 0x03FF (WGMn3:0 = 5, 6, or 7), the value in ICRn (WGMn3:0 =
                 14), or the value in OCRnA (WGMn3:0 = 15). The counter is then cleared at the following timer
                 clock cycle. The timing diagram for the fast PWM mode is shown in Figure 15-7. The figure
                 shows fast PWM mode when OCRnA or ICRn is used to define TOP. The TCNTn value is in the
                 timing diagram shown as a histogram for illustrating the single-slope operation. The diagram
                 includes non-inverted and inverted PWM outputs. The small horizontal line marks on the TCNTn
                 slopes represent compare matches between OCRnx and TCNTn. The OCnx Interrupt Flag will
                 be set when a compare match occurs.

                 Figure 15-7. Fast PWM Mode, Timing Diagram

                                                                   OCRnx/TOP Update and
                                                                   TOVn Interrupt Flag Set and
                                                                   OCnA Interrupt Flag Set
                                                                   or ICFn Interrupt Flag Set
                                                                   (Interrupt on TOP)

                 TCNTn

                 OCnx                                              (COMnx1:0 = 2)
                 OCnx                                              (COMnx1:0 = 3)

                 Period  1  2  3  4  56                      7  8

                 The Timer/Counter Overflow Flag (TOVn) is set each time the counter reaches TOP. In addition
                 the OCnA or ICFn Flag is set at the same timer clock cycle as TOVn is set when either OCRnA
                 or ICRn is used for defining the TOP value. If one of the interrupts are enabled, the interrupt han-
                 dler routine can be used for updating the TOP and compare values.

                 When changing the TOP value the program must ensure that the new TOP value is higher or
                 equal to the value of all of the Compare Registers. If the TOP value is lower than any of the
                 Compare Registers, a compare match will never occur between the TCNTn and the OCRnx.
                 Note that when using fixed TOP values the unused bits are masked to zero when any of the
                 OCRnx Registers are written.

                 The procedure for updating ICRn differs from updating OCRnA when used for defining the TOP
                 value. The ICRn Register is not double buffered. This means that if ICRn is changed to a low

                                                                                                127

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

                 value when the counter is running with none or a low prescaler value, there is a risk that the new
                 ICRn value written is lower than the current value of TCNTn. The result will then be that the
                 counter will miss the compare match at the TOP value. The counter will then have to count to the
                 MAX value (0xFFFF) and wrap around starting at 0x0000 before the compare match can occur.
                 The OCRnA Register however, is double buffered. This feature allows the OCRnA I/O location
                 to be written anytime. When the OCRnA I/O location is written the value written will be put into
                 the OCRnA Buffer Register. The OCRnA Compare Register will then be updated with the value
                 in the Buffer Register at the next timer clock cycle the TCNTn matches TOP. The update is done
                 at the same timer clock cycle as the TCNTn is cleared and the TOVn Flag is set.

                 Using the ICRn Register for defining TOP works well when using fixed TOP values. By using
                 ICRn, the OCRnA Register is free to be used for generating a PWM output on OCnA. However,
                 if the base PWM frequency is actively changed (by changing the TOP value), using the OCRnA
                 as TOP is clearly a better choice due to its double buffer feature.

                 In fast PWM mode, the compare units allow generation of PWM waveforms on the OCnx pins.
                 Setting the COMnx1:0 bits to two will produce a non-inverted PWM and an inverted PWM output
                 can be generated by setting the COMnx1:0 to three (see Table on page 135). The actual OCnx
                 value will only be visible on the port pin if the data direction for the port pin is set as output
                 (DDR_OCnx). The PWM waveform is generated by setting (or clearing) the OCnx Register at
                 the compare match between OCRnx and TCNTn, and clearing (or setting) the OCnx Register at
                 the timer clock cycle the counter is cleared (changes from TOP to BOTTOM).

                 The PWM frequency for the output can be calculated by the following equation:

                 fOCnxPWM  =  ----------f--c--l-k--_---I-/--O-----------
                              N  (1 + TOP)

15.9.4                       The N variable represents the prescaler divider (1, 8, 64, 256, or 1024).

                             The extreme values for the OCRnx Register represents special cases when generating a PWM
                             waveform output in the fast PWM mode. If the OCRnx is set equal to BOTTOM (0x0000) the out-
                             put will be a narrow spike for each TOP+1 timer clock cycle. Setting the OCRnx equal to TOP
                             will result in a constant high or low output (depending on the polarity of the output set by the
                             COMnx1:0 bits.)

                             A frequency (with 50% duty cycle) waveform output in fast PWM mode can be achieved by set-
                             ting OCnA to toggle its logical level on each compare match (COMnA1:0 = 1). This applies only
                             if OCR1A is used to define the TOP value (WGM13:0 = 15). The waveform generated will have
                             a maximum frequency of fOCnA = fclk_I/O/2 when OCRnA is set to zero (0x0000). This feature is
                             similar to the OCnA toggle in CTC mode, except the double buffer feature of the Output Com-
                             pare unit is enabled in the fast PWM mode.

        Phase Correct PWM Mode

                             The phase correct Pulse Width Modulation or phase correct PWM mode (WGMn3:0 = 1, 2, 3,
                             10, or 11) provides a high resolution phase correct PWM waveform generation option. The
                             phase correct PWM mode is, like the phase and frequency correct PWM mode, based on a dual-
                             slope operation. The counter counts repeatedly from BOTTOM (0x0000) to TOP and then from
                             TOP to BOTTOM. In non-inverting Compare Output mode, the Output Compare (OCnx) is
                             cleared on the compare match between TCNTn and OCRnx while upcounting, and set on the
                             compare match while downcounting. In inverting Output Compare mode, the operation is
                             inverted. The dual-slope operation has lower maximum operation frequency than single slope

                                                                                                128

8152GAVR11/09
                         ATmega164PA/324PA/644PA/1284P

                 operation. However, due to the symmetric feature of the dual-slope PWM modes, these modes
                 are preferred for motor control applications.

                 The PWM resolution for the phase correct PWM mode can be fixed to 8-, 9-, or 10-bit, or defined
                 by either ICRn or OCRnA. The minimum resolution allowed is 2-bit (ICRn or OCRnA set to
                 0x0003), and the maximum resolution is 16-bit (ICRn or OCRnA set to MAX). The PWM resolu-
                 tion in bits can be calculated by using the following equation:

                                                                RPCPWM = l--o---g----(-l-o-T--g-O---(--P-2---)-+-----1----)

                 In phase correct PWM mode the counter is incremented until the counter value matches either
                 one of the fixed values 0x00FF, 0x01FF, or 0x03FF (WGMn3:0 = 1, 2, or 3), the value in ICRn
                 (WGMn3:0 = 10), or the value in OCRnA (WGMn3:0 = 11). The counter has then reached the
                 TOP and changes the count direction. The TCNTn value will be equal to TOP for one timer clock
                 cycle. The timing diagram for the phase correct PWM mode is shown on Figure 15-8. The figure
                 shows phase correct PWM mode when OCRnA or ICRn is used to define TOP. The TCNTn
                 value is in the timing diagram shown as a histogram for illustrating the dual-slope operation. The
                 diagram includes non-inverted and inverted PWM outputs. The small horizontal line marks on
                 the TCNTn slopes represent compare matches between OCRnx and TCNTn. The OCnx Inter-
                 rupt Flag will be set when a compare match occurs.

                 Figure 15-8. Phase Correct PWM Mode, Timing Diagram

                                                                         OCRnx/TOP Update and
                                                                         OCnA Interrupt Flag Set
                                                                         or ICFn Interrupt Flag Set
                                                                         (Interrupt on TOP)

                                                                         TOVn Interrupt Flag Set
                                                                         (Interrupt on Bottom)

                 TCNTn

                 OCnx                                                    (COMnx1:0 = 2)
                 OCnx                                                    (COMnx1:0 = 3)

                 Period  1  2  3                                      4

                 The Timer/Counter Overflow Flag (TOVn) is set each time the counter reaches BOTTOM. When
                 either OCRnA or ICRn is used for defining the TOP value, the OCnA or ICFn Flag is set accord-
                 ingly at the same timer clock cycle as the OCRnx Registers are updated with the double buffer
                 value (at TOP). The Interrupt Flags can be used to generate an interrupt each time the counter
                 reaches the TOP or BOTTOM value.

                 When changing the TOP value the program must ensure that the new TOP value is higher or
                 equal to the value of all of the Compare Registers. If the TOP value is lower than any of the
                 Compare Registers, a compare match will never occur between the TCNTn and the OCRnx.
                 Note that when using fixed TOP values, the unused bits are masked to zero when any of the

                                                                                                     129

8152GAVR11/09
                 ATmega164PA/324PA/644PA/1284P

                 OCRnx Registers are written. As the third period shown in Figure 15-8 illustrates, changing the
                 TOP actively while the Timer/Counter is running in the phase correct mode can result in an
                 unsymmetrical output. The reason for this can be found in the time of update of the OCRnx Reg-
                 ister. Since the OCRnx update occurs at TOP, the PWM period starts and ends at TOP. This
                 implies that the length of the falling slope is determined by the previous TOP value, while the
                 length of the rising slope is determined by the new TOP value. When these two values differ the
                 two slopes of the period will differ in length. The difference in length gives the unsymmetrical
                 result on the output.

                 It is recommended to use the phase and frequency correct mode instead of the phase correct
                 mode when changing the TOP value while the Timer/Counter is running. When using a static
                 TOP value there are practically no differences between the two modes of operation.

                 In phase correct PWM mode, the compare units allow generation of PWM waveforms on the
                 OCnx pins. Setting the COMnx1:0 bits to two will produce a non-inverted PWM and an inverted
                 PWM output can be generated by setting the COMnx1:0 to three (See Table on page 135). The
                 actual OCnx value will only be visible on the port pin if the data direction for the port pin is set as
                 output (DDR_OCnx). The PWM waveform is generated by setting (or clearing) the OCnx Regis-
                 ter at the compare match between OCRnx and TCNTn when the counter increments, and
                 clearing (or setting) the OCnx Register at compare match between OCRnx and TCNTn when
                 the counter decrements. The PWM frequency for the output when using phase correct PWM can
                 be calculated by the following equation:

                                                                fOCnxPCPWM = 2------f--cN---l-k--_---IT-/-O--O----P--

15.9.5                       The N variable represents the prescaler divider (1, 8, 64, 256, or 1024).

                             The extreme values for the OCRnx Register represent special cases when generating a PWM
                             waveform output in the phase correct PWM mode. If the OCRnx is set equal to BOTTOM the
                             output will be continuously low and if set equal to TOP the output will be continuously high for
                             non-inverted PWM mode. For inverted PWM the output will have the opposite logic values. If
                             OCR1A is used to define the TOP value (WGM13:0 = 11) and COM1A1:0 = 1, the OC1A output
                             will toggle with a 50% duty cycle.

        Phase and Frequency Correct PWM Mode

                             The phase and frequency correct Pulse Width Modulation, or phase and frequency correct PWM
                             mode (WGMn3:0 = 8 or 9) provides a high resolution phase and frequency correct PWM wave-
                             form generation option. The phase and frequency correct PWM mode is, like the phase correct
                             PWM mode, based on a dual-slope operation. The counter counts repeatedly from BOTTOM
                        &nbs