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

型号

产品描述

搜索
 

ATMEGA64C1-15AD

器件型号:ATMEGA64C1-15AD
器件类别:半导体    嵌入式处理器和控制器   
厂商名称:Microchip
厂商官网:https://www.microchip.com
标准:
下载文档

器件描述

IC MCU 8BIT 64KB FLASH 32TQFP

参数

产品属性属性值
核心处理器:AVR
核心尺寸:8-位
速度:16MHz
连接性:CANbus,LINbus,SPI,UART/USART
外设:欠压检测/复位,POR,PWM,温度传感器,WDT
程序存储容量:64KB(32K x 16)
程序存储器类型:闪存
EEPROM 容量:2K x 8
RAM 容量:4K x 8
电压 - 电源(Vcc/Vdd):2.7 V ~ 5.5 V
数据转换器:A/D 11x10b;D/A 1x10b
振荡器类型:内部
工作温度:-40°C ~ 150°C(TA)
封装/外壳:32-TQFP
供应商器件封装:32-TQFP(7x7)

ATMEGA64C1-15AD器件文档内容

   ATmega16M1/ATmega32M1/ATmega64M1/

      ATmega32C1/ATmega64C1 Automotive

          8-bit  AVR Microcontroller with 16K/32K/64Kbytes

                                                                        In-system

                                                                        DATASHEET

Features

●  High performance, low power AVR® 8-bit microcontroller

●  Advanced RISC architecture

   ●  131 powerful instructions - most single clock cycle execution

   ●  32 x 8 general purpose working registers

   ●  Fully static operation

   ●  Up to 1MIPS throughput per MHz

   ●  On-chip 2-cycle multiplier

●  Data and non-volatile program memory

   ●  16K/32K/64Kbytes flash of in-system programmable program memory

      ●   Endurance: 10,000 write/erase cycles

   ●  Optional boot code section with independent lock bits

   ●  In-system programming by on-chip boot program

      ●   True read-while-write operation

   ●  512/1024/2048 Bytes of in-system programmable EEPROM

      ●   Endurance: 100,000 write/erase cycles

●  Programming lock for flash program and EEPROM data security

●  1024/2048/4096 bytes internal SRAM

●  On chip debug interface (debugWIRE)

●  CAN 2.0A/B with 6 message objects - ISO 16845 certified(1)

●  LIN 2.1 and 1.3 controller or 8-Bit UART

●  One 12-bit high-speed PSC (power stage controller) (only Atmel®

   ATmega16/32/64M1)

   ●  Non overlapping inverted PWM output pins with flexible dead-time

   ●  Variable PWM duty cycle and frequency

   ●  Synchronous update of all PWM registers

   ●  Auto stop function for emergency event

●  Peripheral features

   ●  One 8-bit general purpose Timer/Counter with separate prescaler, compare mode

      and capture mode

   ●  One 16-bit general purpose Timer/Counter with separate prescaler, compare

      mode and capture mode

   ●  One master/slave SPI serial interface

                                                                        7647O-AVR-01/15
   ●      10-bit ADC

          ●    Up to 11 single ended channels and 3 fully differential ADC channel  pairs

          ●    Programmable gain (5x, 10x, 20x, 40x) on differential channels

          ●    Internal reference voltage

          ●    Direct power supply voltage measurement

   ●      10-bit DAC for variable voltage reference (comparators, ADC)

   ●      Four analog comparators with variable threshold detection

   ●      100µA ±6% current source (LIN node identification)

   ●      Interrupt and wake-up on pin change

   ●      Programmable watchdog timer with separate on-chip oscillator

   ●      On-chip temperature sensor

●  Special microcontroller features

   ●      Low power idle, noise reduction, and power down modes

   ●      Power on reset and programmable brown out detection

   ●      In-system programmable via SPI port

   ●      High precision crystal oscillator for CAN operations (16MHz)

          ●    Internal calibrated RC oscillator (8MHz)

          ●    On-chip PLL for fast PWM (32MHz, 64MHz) and CPU (16MHz)         (only  Atmel®  ATmega16/32/64M1)

   ●      Operating voltage:

          ●    2.7V - 5.5V

   ●      Extended operating temperature:

          ●    –40°C to +125°C

   ●      Core speed grade:

          ●    0 - 8MHz at 2.7 - 4.5V

          ●    0 - 16MHz at 4.5 - 5.5V

          Note:    1.  See certification on Atmel web site and note on Section 16.4.3 “Baud Rate” on page 148.

Table 1.       ATmega32/64/M1/C1 Product Line-up

   Part Number              ATmega32C1         ATmega64C1               ATmega16M1            ATmega32M1         ATmega64M1

   Flash size                 32Kbyte                    64Kbyte        16Kbyte               32Kbyte            64Kbyte

   RAM size                   2048 bytes       4096 bytes               1024 bytes            2048 bytes         4096 bytes

   EEPROM size                1024 bytes       2048 bytes               512 bytes             1024 bytes         2048 bytes

   8-bit timer                                                                 Yes

   16-bit timer                                                                Yes

          PSC                              No                                                 Yes

   PWM outputs                  4                        4                     10             10                 10

   Fault inputs (PSC)           0                        0                     3              3                  3

          PLL                              No                                                 Yes

10-bit ADC channels                                                     11 single

                                                                        3 differential

   10-bit DAC                                                                  Yes

analog comparators                                                             4

   Current source                                                              Yes

          CAN                                                                  Yes

   LIN/UART                                                                    Yes

   On-chip temp.                                                               Yes

      sensor

   SPI interface                                                               Yes

2         ATmega16/32/64/M1/C1 [DATASHEET]

          7647O–AVR–01/15
1.  Pin Configurations

    Figure 1-1.  ATmega16/32/64M1 TQFP32/QFN32 (7*7mm) Package

                                                       PD1 (PCINT17/PSCIN0/CLKO)   PE0 (PCINT24/RESET/OCD)   PC0 (PCINT8/INT3/PSCOUT1A)  PD0 (PCINT16/PSCOUT0A)                    PB7 (ADC4/PSCOUT0B/SCK/PCINT7)  PB6 (ADC7/PSCOUT1B/PCINT6)      PB5 (ADC6/INT2/ACMPN1/AMP2-/PCINT5)  PC7 (D2A/AMP2+/PCINT15)

                                                       32                          31                        30                          29                                        28                              27                              26                                   25

                 (PCINT18/PSCIN2/OC1A/MISO_A) PD2  1                                                                                                                                                                                                                                                                   24  PB4 (AMP0+/PCINT4)

           (PCINT19/TXD/TXLIN/OC0A/MOSI_A) PD3     2                                                                                                                                                                                                                                                                   23  PB3 (AMP0-/PCINT3)

                 (PCINT9/PSCIN1/OC1B/SS_A) PC1     3                                                                                                                                                                                                                                                                   22  PC6 (ADC10-/ACMP1/PCINT14)

                                              VCC  4                                                                                                                                                                                                                                                                   21  AREF(ISRC)

                                              GND  5                                                                                                                                                                                                                                                                   20  AGND

                          (PCINT10/T0/TXCAN) PC2   6                                                                                                                                                                                                                                                                   19  AVCC

                 (PCINT11/T1/RXCAN/ICP1B) PC3      7                                                                                                                                                                                                                                                                   18  PC5 (ADC9/ACMP3/AMP1+/PCINT13)

                 (PCINT0/MISO/PSCOUT2A) PB0        8                                                                                                                                                                                                                                                                   17  PC4 (ADC8/ACMPN3/AMP1-/PCINT12)

                                                       9                           10                        11                          12                                        13                              14                              15                                   16

                                                       (PCINT1/MOSI/PSCOUT2B) PB1  (PCINT25/OC0B/XTAL1) PE1  (PCINT26/ADC0/XTAL2) PE2    (PCINT20/ADC1/RXD/RXLIN/ICP1A/SCK_A) PD4  (ADC2/ACMP2/PCINT21) PD5        (ADC3/ACMPN2/INT0/PCINT22) PD6  (ACMP0/PCINT23) PD7                  (ADC5/INT1/ACMPN0/PCINT2) PB2

    Note:        On the   engineering samples  (Parts  marked                                                AT90PWM324), the ACMPN3 alternate                                                                                                                                                                                         function is not located  on

                 PC4. It  is located on PE2.

                                                                                                                                                                                                                                                   ATmega16/32/64/M1/C1                                                                [DATASHEET]                  3

                                                                                                                                                                                                                                                                                                                                       7647O–AVR–01/15
   Figure  1-2.  ATmega32/64C1 TQFP32/QFN32          (7*7                     mm) Package

                                                          PD1 (PCINT17/CLKO)  PE0 (PCINT24/RESET/OCD)   PC0 (PCINT8/INT3)         PD0 (PCINT16)                             PB7 (ADC4/SCK/PCINT7)     PB6 (ADC7/PCINT6)               PB5 (ADC6/INT2/ACMPN1/AMP2-/PCINT5)  PC7 (D2A/AMP2+/PCINT15)

                                                          32                  31                        30                        29                                        28                        27                              26                                   25

                    (PCINT18/OC1A/MISO_A) PD2     1                                                                                                                                                                                                                                                       24   PB4 (AMP0+/PCINT4)

           (PCINT19/TXD/TXLIN/OC0A/MOSI_A) PD3    2                                                                                                                                                                                                                                                       23   PB3 (AMP0-/PCINT3)

                    (PCINT9/OC1B/SS_A) PC1        3                                                                                                                                                                                                                                                       22   PC6 (ADC10-/ACMP1/PCINT14)

                    VCC                           4                                                                                                                                                                                                                                                       21   AREF(ISRC)

                    GND                           5                                                                                                                                                                                                                                                       20   AGND

                    (PCINT10/T0/TXCAN) PC2        6                                                                                                                                                                                                                                                       19   AVCC

                    (PCINT11/T1/RXCAN/ICP1B) PC3  7                                                                                                                                                                                                                                                       18   PC5 (ADC9/ACMP3/AMP1+/PCINT13)

                    (PCINT0/MISO) PB0             8                                                                                                                                                                                                                                                       17   PC4 (ADC8/ACMPN3/AMP1-/PCINT12)

                                                          9                   10                        11                        12                                        13                        14                              15                                   16

                                                          (PCINT1/MOSI) PB1   (PCINT25/OC0B/XTAL1) PE1  (PCINT26/ADC0/XTAL2) PE2  (PCINT20/ADC1/RXD/RXLIN/ICP1A/SCK_A) PD4  (ADC2/ACMP2/PCINT21) PD5  (ADC3/ACMPN2/INT0/PCINT22) PD6  (ACMP0/PCINT23) PD7                  (ADC5/INT1/ACMPN0/PCINT2) PB2

   Note:         On the first engineering samples (Parts                      marked AT90PWM324),                                                                                                                                                                                                         the  ACMPN3 alternate function is not  located

                 on PC4. It is located on PE2.

4  ATmega16/32/64/M1/C1 [DATASHEET]

   7647O–AVR–01/15
1.1  Pin Descriptions

     Table 1-1.    Pin Out Description

     QFN32 Pin

     Number        Mnemonic             Type      Name, Function and Alternate Function

            5          GND              Power     Ground: 0V reference

            20         AGND             Power     Analog Ground: 0V reference for analog part

            4          VCC              Power     Power Supply

                                                  Analog Power Supply: This is the power supply voltage for analog

            19         AVCC             Power     part

                                                  For a normal use this pin must be connected.

                                                  Analog Reference: reference for analog converter. This is the

            21         AREF             Power     reference voltage of the A/D converter. As output, can be used by

                                                  external analog

                                                  ISRC (Current Source Output)

                                                  MISO (SPI Master In Slave Out)

            8          PB0              I/O       PSCOUT2A (PSC Module 2 Output A)

                                                  PCINT0 (Pin Change Interrupt 0)

                                                  MOSI (SPI Master Out Slave In)

            9          PB1              I/O       PSCOUT2B (PSC Module 2 Output B)

                                                  PCINT1 (Pin Change Interrupt 1)

                                                  ADC5 (Analog Input Channel 5 )

            16         PB2              I/O       INT1 (External Interrupt 1 Input)

                                                  ACMPN0 (analog comparator 0 Negative Input)

                                                  PCINT2 (Pin Change Interrupt 2)

            23         PB3              I/O       AMP0- (Analog Differential Amplifier 0 Negative Input)

                                                  PCINT3 (Pin Change Interrupt 3)

            24         PB4              I/O       AMP0+ (Analog Differential Amplifier 0 Positive Input)

                                                  PCINT4 (Pin Change Interrupt 4)

                                                  ADC6 (Analog Input Channel 6)

                                                  INT2 (External Interrupt 2 Input)

            26         PB5              I/O       ACMPN1 (analog comparator 1 Negative Input)

                                                  AMP2- (Analog Differential Amplifier 2 Negative Input)

                                                  PCINT5 (Pin Change Interrupt 5)

                                                  ADC7 (Analog Input Channel 7)

            27         PB6              I/O       PSCOUT1B (PSC Module 1 Output A)

                                                  PCINT6 (Pin Change Interrupt 6)

                                                  ADC4 (Analog Input Channel 4)

            28         PB7              I/O       PSCOUT0B (PSC Module 0 Output B)

                                                  SCK (SPI Clock)

                                                  PCINT7 (Pin Change Interrupt 7)

                                                  PSCOUT1A (PSC Module 1 Output A)

            30         PC0              I/O       INT3 (External Interrupt 3 Input)

                                                  PCINT8 (Pin Change Interrupt 8)

     Note:     1.  On the first engineering samples (Parts marked AT90PWM324), the ACMPN3 alternate function is not located

                   on PC4. It is located on PE2.

                                                                   ATmega16/32/64/M1/C1 [DATASHEET]                          5

                                                                                                7647O–AVR–01/15
   Table 1-1.    Pin Out Description  (Continued)

   QFN32 Pin

   Number           Mnemonic          Type         Name, Function and Alternate Function

                                                   PSCIN1 (PSC Digital Input 1)

          3         PC1               I/O          OC1B (Timer 1 Output Compare B)

                                                   SS_A (Alternate SPI Slave Select)

                                                   PCINT9 (Pin Change Interrupt 9)

                                                   T0 (Timer 0 clock input)

          6         PC2               I/O          TXCAN (CAN Transmit Output)

                                                   PCINT10 (Pin Change Interrupt 10)

                                                   T1 (Timer 1 clock input)

          7         PC3               I/O          RXCAN (CAN Receive Input)

                                                   ICP1B (Timer 1 input capture alternate B input)

                                                   PCINT11 (Pin Change Interrupt 11)

                                                   ADC8 (Analog Input Channel 8)

          17        PC4               I/O          AMP1- (Analog Differential Amplifier 1 Negative Input)

                                                   ACMPN3 (analog comparator 3 Negative Input)

                                                   PCINT12 (Pin Change Interrupt 12)

                                                   ADC9 (Analog Input Channel 9)

          18        PC5               I/O          AMP1+ (Analog Differential Amplifier 1 Positive Input)

                                                   ACMP3 (analog comparator 3 Positive Input)

                                                   PCINT13 (Pin Change Interrupt 13)

                                                   ADC10 (Analog Input Channel 10)

          22        PC6               I/O          ACMP1 (analog comparator 1 Positive Input)

                                                   PCINT14 (Pin Change Interrupt 14)

                                                   D2A (DAC output)

          25        PC7               I/O          AMP2+ (Analog Differential Amplifier 2 Positive Input)

                                                   PCINT15 (Pin Change Interrupt 15)

          29        PD0               I/O          PSCOUT0A (PSC Module 0 Output A)

                                                   PCINT16 (Pin Change Interrupt 16)

                                                   PSCIN0 (PSC Digital Input 0)

          32        PD1               I/O          CLKO (System Clock Output)

                                                   PCINT17 (Pin Change Interrupt 17)

                                                   OC1A (Timer 1 Output Compare A)

          1         PD2               I/O          PSCIN2 (PSC Digital Input 2)

                                                   MISO_A (Programming and alternate SPI Master In Slave Out)

                                                   PCINT18 (Pin Change Interrupt 18)

                                                   TXD (UART Tx data)

                                                   TXLIN (LIN Transmit Output)

          2         PD3               I/O          OC0A (Timer 0 Output Compare A)

                                                   SS (SPI Slave Select)

                                                   MOSI_A (Programming and alternate Master Out SPI Slave In)

                                                   PCINT19 (Pin Change Interrupt 19)

   Note:     1.  On the first engineering samples (Parts marked AT90PWM324), the ACMPN3 alternate function is not located

                 on PC4. It is located on PE2.

6  ATmega16/32/64/M1/C1 [DATASHEET]

   7647O–AVR–01/15
Table 1-1.     Pin Out Description  (Continued)

QFN32 Pin

Number         Mnemonic             Type         Name, Function and Alternate Function

                                                 ADC1 (Analog Input Channel 1)

                                                 RXD (UART Rx data)

       12      PD4                  I/O          RXLIN (LIN Receive Input)

                                                 ICP1A (Timer 1 input capture alternate A input)

                                                 SCK_A (Programming and alternate SPI Clock)

                                                 PCINT20 (Pin Change Interrupt 20)

                                                 ADC2 (Analog Input Channel 2)

       13      PD5                  I/O          ACMP2 (analog comparator 2 Positive Input)

                                                 PCINT21 (Pin Change Interrupt 21)

                                                 ADC3 (Analog Input Channel 3)

       14      PD6                  I/O          ACMPN2 (analog comparator 2 Negative Input)

                                                 INT0 (External Interrupt 0 Input)

                                                 PCINT22 (Pin Change Interrupt 22)

       15      PD7                  I/O          ACMP0 (analog comparator 0 Positive Input)

                                                 PCINT23 (Pin Change Interrupt 23)

                                                 RESET (Reset Input)

       31      PE0                  I/O or I     OCD (On Chip Debug I/O)

                                                 PCINT24 (Pin Change Interrupt 24)

                                                 XTAL1 (XTAL Input)

       10      PE1                  I/O          OC0B (Timer 0 Output Compare B)

                                                 PCINT25 (Pin Change Interrupt 25)

                                                 XTAL2 (XTAL Output)

       11      PE2                  I/O          ADC0 (Analog Input Channel 0)

                                                 PCINT26 (Pin Change Interrupt 26)

Note:      1.  On the first engineering samples (Parts marked AT90PWM324), the ACMPN3 alternate function is not located

               on PC4. It is located on PE2.

                                                 ATmega16/32/64/M1/C1 [DATASHEET]                                        7

                                                                                                  7647O–AVR–01/15
2.   Overview

     The Atmel® ATmega16/32/64/M1/C1 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 Atmel ATmega16/32/64/M1/C1 achieves

     throughputs approaching 1MIPS per MHz allowing the system designer to optimize power consumption versus processing

     speed.

2.1  Block Diagram

     Figure 2-1.  Block Diagram

                                                                                              Data Bus 8-bit

                                 Flash                Program                                 Status and      Interrupt

                                 Program              Counter                                 Control         Unit

                                 Memory

                                                                                                              SPI

                                                                                              32 x 8          Unit

                      Instruction                                                             General

                                 Register                                                     Purpose         Watchdog

                                                                                              Registers       Timer

                                                                         Indirect Addressing                  4 Analog

                      Instruction                     Direct Addressing                                       Comparators

                                 Decoder                                                      ALU

                                                                                                              HW LIN/UART

                      Control Lines

                                                                                                              Timer 0

                                                                                              Data            Timer 1

                                                                                              SRAM

                                                                                                              ADC

                                                                                              EEPROM          DAC

                                                                                              I/O Lines       MPSC

                                                                                              Current Source  CAN

     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 conventional CISC microcontrollers.

     The Atmel ATmega16/32/64/M1/C1 provides the following features: 16K/32K/64K bytes of In-System Programmable Flash

     with Read-while-write capabilities, 512/1024/2048 bytes EEPROM, 1024/2048/4096 bytes SRAM, 27 general purpose I/O

     lines, 32 general purpose working registers, one Motor Power Stage Controller, two flexible Timer/Counters with compare

     modes and PWM, one UART with HW LIN, an 11-channel 10-bit ADC with two differential input stages with programmable

     gain, a 10-bit DAC, a programmable Watchdog Timer with Internal Individual Oscillator, an SPI serial port, an On-chip Debug

     system and four software selectable power saving modes.

8    ATmega16/32/64/M1/C1 [DATASHEET]

     7647O–AVR–01/15
       The Idle mode stops the CPU while allowing the SRAM, Timer/Counters, SPI ports, CAN, LIN/UART 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. The ADC noise reduction mode stops the CPU and all I/O modules

       except 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 consumption.

       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 ATmega16/32/64/M1/C1 is a powerful microcontroller that

       provides a highly flexible and cost effective solution to many embedded control applications.

       The ATmega16/32/64/M1/C1 AVR is supported with a full suite of program and system development tools including: C

       compilers, macro assemblers, program debugger/simulators, in-circuit emulators, and evaluation kits.

2.2    Automotive Quality Grade

       The Atmel® ATmega16/32/64/M1/C1 have been developed and manufactured according to the most stringent requirements

       of the international standard ISO-TS-16949. This data sheet contains limit values extracted from the results of extensive

       characterization (Temperature and Voltage). The quality and reliability of the ATmega16/32/64/M1/C1 have been verified

       during regular product qualification as per AEC-Q100 grade 1.

       As indicated in the ordering information paragraph, the products are available in only one temperature grade.

       Table 2-1.  Temperature Grade Identification for Automotive Products

            Temperature                  Temperature Identifier                                       Comments

            –40, +125                               Z                        Full automotive temperature range

2.3    Pin Descriptions

2.3.1  VCC

       Digital supply voltage.

2.3.2  GND

       Ground.

2.3.3  Port B (PB7..PB0)

       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 Atmel ATmega16/32/64/M1/C1 as listed in Section 9.3.2

       “Alternate Functions of Port B” on page 58.

2.3.4  Port C (PC7..PC0)

       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 special features of the ATmega16/32/64/M1/C1 as listed in Section 9.3.3 “Alternate

       Functions of Port C” on page 61.

                                                                      ATmega16/32/64/M1/C1 [DATASHEET]                                     9

                                                                                                             7647O–AVR–01/15
2.3.5  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 Atmel® ATmega16/32/64/M1/C1 as listed on 64.

2.3.6  Port E (PE2..0) RESET/ XTAL1/ XTAL2

       Port E is an 3-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The port E output buffers have

       symmetrical drive characteristics with both high sink and source capability. As inputs, port E pins that are externally pulled

       low will source current if the pull-up resistors are activated. The Port E pins are tri-stated when a reset condition becomes

       active, even if the clock is not running.

       If the RSTDISBL fuse is programmed, PE0 is used as an I/O pin. Note that the electrical characteristics of PE0 differ from

       those of the other pins of Port E.

       If the RSTDISBL fuse is unprogrammed, PE0 is used as a Reset input. A low level on this pin for longer than the minimum

       pulse length will generate a Reset, even if the clock is not running. The minimum pulse length is given in Table 7-1 on page

       39. Shorter pulses are not guaranteed to generate a reset.

       Depending on the clock selection fuse settings, PE1 can be used as input to the inverting oscillator amplifier and input to the

       internal clock operating circuit.

       Depending on the clock selection fuse settings, PE2 can be used as output from the inverting oscillator amplifier.

       The various special features of Port E are elaborated in Section 9.3.5 “Alternate Functions of Port E” on page 67 and Section

       5.1 “Clock Systems and their Distribution” on page 25.

2.3.7  AVCC

       AVCC is the supply voltage pin for the A/D converter, D/A converter, current source. It should be externally connected to

       VCC, even if the ADC, DAC are not used. If the ADC is used, it should be connected to VCC through a low-pass filter (see
       Section 18.6.2 “Analog Noise Canceling Techniques” on page 204).

2.3.8  AREF

       This is the analog reference pin for the A/D converter.

2.4    About Code Examples

       This documentation contains simple code examples that briefly show how to use various parts of the device. These code

       examples assume that the part specific header file is included before compilation. 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 documentation for more details.

10     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
3.   AVR CPU Core

3.1  Introduction

     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.

3.2  Architectural Overview

     Figure 3-1.  Block Diagram of the AVR Architecture

                                                                                Data Bus 8-bit

                             Flash      Program                                 Status and

                             Program    Counter                                 Control

                             Memory

                                                                                32 x 8          Interrupt

                                                                                General         Unit

                         Instruction                                            Purpose

                             Register                                           Registers

                                                                                                SPI

                                                                                                Unit

                         Instruction    Direct Addressing  Indirect Addressing                  Watchdog

                             Decoder                                            ALU             Timer

                         Control Lines                                                          Analog

                                                                                                Comparator

                                                                                                I/O Module 1

                                                                                Data

                                                                                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 instruction 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 typical 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.

                                                                                ATmega16/32/64/M1/C1 [DATASHEET]                      11

                                                                                                        7647O–AVR–01/15
     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 operation, 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 format. 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 (store program memory) 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 position. The lower the interrupt vector address, the higher is the priority.

     The I/O memory space contains 64 addresses for CPU peripheral functions as control registers, 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 Atmel ATmega16/32/64/M1/C1 has extended I/O space from 0x60 - 0xFF in SRAM where only the

     ST/STS/STD and LD/LDS/LDD instructions can be used.

3.3  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.

3.4  Status Register

     The status register contains information about the result of the most recently executed arithmetic 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 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.

     The AVR Status Register – SREG – is defined as:

        Bit               7  6              5        4    3            2               1    0

                          I  T              H        S    V            N               Z    C    SREG

        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 – I: Global Interrupt Enable

     The global interrupt enable bit must be set to enabled the interrupts. The individual interrupt 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.

12   ATmega16/32/64/M1/C1 [DATASHEET]

     7647O–AVR–01/15
     •  Bit 6 – T: Bit Copy Storage

     The bit copy instructions BLD (Bit LoaD) and BST (Bit STore) use the T-bit as source or destination 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.

3.5  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

                                                                  ATmega16/32/64/M1/C1 [DATASHEET]                                    13

                                                                                          7647O–AVR–01/15
       Figure 3-2 shows the structure of the 32 general purpose working registers in the CPU.

       Figure  3-2.   AVR    CPU  General  Purpose Working     Registers

                                           7                0          Addr.

                                                   R0                  0x00

                                                   R1                  0x01

                                                   R2                  0x02

                                                   …

                                                   R13                 0x0D

                    General                        R14                 0x0E

               Purpose                             R15                 0x0F

               Working                             R16                 0x10

               Registers                           R17                 0x11

                                                   …

                                                   R26                 0x1A           X-register Low Byte

                                                   R27                 0x1B           X-register High Byte

                                                   R28                 0x1C           Y-register Low Byte

                                                   R29                 0x1D           Y-register High Byte

                                                   R30                 0x1E           Z-register Low Byte

                                                   R31                 0x1F           Z-register High Byte

       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 3-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 implemented 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.

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

       The registers R26..R31 have some added functions to their general purpose usage. These registers 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 3-3.

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

                                    15                  XH                        XL              0

              X-register            7                   0                         7               0

                                           R27 (0x1B)                                 R26 (0x1A)

                                    15                  YH                        YL              0

              Y-register            7                   0                         7               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).

14     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
3.6  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. The stack pointer register always points to the top of the stack. Note that the stack is

     implemented as growing from higher memory locations to lower memory locations. This implies that a Stack PUSH

     command decreases the stack pointer.

     The stack pointer points to the data SRAM stack area where the subroutine and interrupt stacks are located. This stack

     space in the data SRAM must be defined by the program before any subroutine calls are executed or interrupts are enabled.

     The stack pointer must be set to point above 0x100. The stack pointer is decremented by one when data is pushed onto the

     stack with the PUSH instruction, and it is decremented by two when the return address is pushed onto the stack with

     subroutine call or interrupt. The stack pointer is incremented by one when data is popped from the stack with the POP

     instruction, and it is incremented by two when data is popped from the stack with return from subroutine RET or return from

     interrupt RETI.

     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. 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.

     Bit                 15    14          13          12        11      10          9           8

                         SP15  SP14        SP13        SP12      SP11    SP10        SP9         SP8      SPH

                         SP7   SP6         SP5         SP4       SP3     SP2         SP1         SP0      SPL

                         7     6           5           4         3           2       1           0

     Read/Write          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     R/W         R/W         R/W

     Initial Value                   Top address of the SRAM (0x04FF/0x08FF/0x10FF)

3.7  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 3-4 shows the parallel instruction fetches and instruction executions enabled by the Harvard architecture and the fast-

     access Register File concept. This is the basic pipelining 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 3-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

                                                                             ATmega16/32/64/M1/C1 [DATASHEET]                        15

                                                                                                          7647O–AVR–01/15
       Figure 3-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 destination   register.

       Figure 3-5.  Single Cycle ALU Operation

                                                             T1  T2                             T3               T4

                                     clkCPU

                           Total Execution Time

                        Register Operands Fetch

                        ALU Operation Execute

                           Result Write Back

3.8    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 Section 25. “Memory Programming” on page 255 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 Section 8. “Interrupts” on page 47. 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 ANACOMP0 –

       the analog comparator 0 interrupt. 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 Section 8. “Interrupts” on page 47 for more information. The reset

       vector can also be moved to the start of the boot flash section by programming the BOOTRST fuse, see Section 24. “Boot

       Loader Support – Read-while-write Self-Programming ATmega16/32/64/M1/C1” on page 241.

3.8.1  Interrupt Behavior

       When an interrupt occurs, the global interrupt enable I-bit is cleared and all interrupts are disabled. 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 vector 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.

       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.

16     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
       Assembly Code Example

       in                         r16,   SREG                          ;     store   SREG   value

       cli                                                             ;     disable     interrupts      during      timed  sequence

       sbi                        EECR,       EEMWE                    ;     start   EEPROM    write

       sbi                        EECR,       EEWE

       out                        SREG,       r16                      ;     restore     SREG  value     (I-bit)

       C Code Example

       char   cSREG;

       cSREG           =  SREG;                                        /*     store   SREG     value     */

       /*   disable           interrupts          during  timed     sequence     */

       _CLI();

       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 executed 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

       _SEI();            /*  set  Global         Interrupt    Enable  */

       _SLEEP();              /*  enter       sleep,   waiting    for  interrupt     */

       /*   note:         will     enter      sleep    before   any    pending   interrupt(s)      */

3.8.2  Interrupt Response Time

       The interrupt execution response for all the enabled AVR® interrupts is four clock cycles minimum. After four clock cycles the

       program vector address for the actual interrupt handling routine is executed. during this four 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 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 execution response time is increased by four

       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 four clock cycles. during these four clock cycles, the program counter (two

       bytes) is popped back from the stack, the stack pointer is incremented by two, and the I-bit in SREG is set.

                                                                                ATmega16/32/64/M1/C1 [DATASHEET]                            17

                                                                                                             7647O–AVR–01/15
4.   Memories

     This section describes the different memories in the Atmel® ATmega16/32/64/M1/C1. The AVR architecture has two main

     memory spaces, the data memory and the program memory space. In addition, the Atmel ATmega16/32/64/M1/C1 features

     an EEPROM Memory for data storage. All three memory spaces are linear and regular.

4.1  In-system Reprogrammable Flash Program Memory

     The Atmel ATmega16/32/64/M1/C1 contains 16K/32K/64K 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 8K x 16, 16K x 16 , 32K x 16.

     For software security, the flash program memory 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 Atmel ATmega16/32/64/M1/C1 program

     counter (PC) is 14/15 bits wide, thus addressing the 8K/16K/32K program memory locations. The operation of boot program

     section and associated boot lock bits for software protection are described in detail in Section 24. “Boot Loader Support –

     Read-while-write Self-Programming ATmega16/32/64/M1/C1” on page 241. Section 25. “Memory Programming” on page

     255 contains a detailed description on flash programming in SPI or parallel programming mode.

     Constant tables can be allocated within the entire program memory address space (see the LPM – Load Program Memory.

     Timing diagrams for instruction fetch and execution are presented in Section 3.7 “Instruction Execution Timing” on page 15.

     Figure 4-1.  Program Memory Map

                                       Program Memory

                                                                   0x0000

                                      Application Flash Section

                                       Boot Flash Section

                                                                   0x1FFF/0x3FFF/0x7F

4.2  SRAM Data Memory

     Figure 4-2 shows how the Atmel ATmega16/32/64/M1/C1 SRAM memory is organized.

     The Atmel ATmega16/32/64/M1/C1 is a complex microcontroller with more peripheral units than can be supported within the

     64 locations reserved in the Opcode for the IN and OUT instructions. For the extended I/O space from 0x60 - 0xFF in SRAM,

     only the ST/STS/STD and LD/LDS/LDD instructions can be used.

     The lower 2304 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 1024/2048/4096 locations address the internal data SRAM.

     The five different addressing modes for the data memory cover: Direct, Indirect with Displacement, Indirect, Indirect with Pre-

     decrement, and Indirect with Post-increment. In the register File, registers R26 to R31 feature the indirect addressing pointer

     registers.

18   ATmega16/32/64/M1/C1 [DATASHEET]

     7647O–AVR–01/15
       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-increment, the address registers X,

       Y, and Z are decremented or incremented.

       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 Atmel® ATmega16/32/64/M1/C1 are all accessible through all these addressing modes. The

       register file is described in Section 3.5 “General Purpose Register File” on page 13.

       Figure 4-2.  Data Memory Map for 1024/2048/4096 Internal SRAM

                                                     Data Memory

                                                     32 Registers       0x0000 - 0x001F

                                                     64 I/O Registers   0x0020 - 0x005F

                                                 160 Ext I/O Registers  0x0060 - 0x00FF

                                                     Internal SRAM      0x0100

                                                     (1024x8)

                                                     (2048x8)           0x04FF/0x08FF/0x10FF

                                                     (4096x8)

4.2.1  SRAM Data 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 4-3 on page 19.

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

                                                 T1                     T2                    T3

                    clkCPU

                    Address    Compute Address                          Address valid

                    Data

                                                                                                                     Write

                    WR

                    Data

                                                                                                                     Read

                    RD

                                                 Memory Access Instruction                    Next Instruction

                                                                                ATmega16/32/64/M1/C1 [DATASHEET]                        19

                                                                                                                7647O–AVR–01/15
4.3    EEPROM Data Memory

       The Atmel® ATmega16/32/64/M1/C1 contains 512/1024/2048 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

       Registers, the EEPROM Data Register, and the EEPROM Control Register.

       For a detailed description of SPI and Parallel data downloading to the EEPROM, see Section 25.9 “Serial Downloading” on

       page 270, and Section 25.6 “Parallel Programming Parameters, Pin Mapping, and Commands” on page 259 respectively.

4.3.1  EEPROM Read/Write Access

       The EEPROM Access Registers are accessible in the I/O space.

       The write access time for the EEPROM is given in Table 4-2. A self-timing function, however, lets the user software detect

       when the next byte can be written. If the user code contains 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. Section 4.3.5

       “Preventing EEPROM Corruption” on page 23 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.

4.3.2  The EEPROM Address Registers – EEARH and EEARL

          Bit            15     14     13            12   11         10       9      8

                         –      –      –             –    –      EEAR10   EEAR9      EEAR8     EEARH

                         EEAR7  EEAR6  EEAR5  EEAR4       EEAR3  EEAR2    EEAR1      EEAR0     EEARL

                         7      6      5             4    3          2        1      0

          Read/Write     R      R      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

          Initial Value  0      0      0             0    0          X        X      X

                         X      X      X             X    X          X        X      X

       •  Bits 15.11 – Reserved Bits

       These bits are reserved bits in the ATmega16/32/64/M1/C1 and will always read as zero.

       •  Bits 9..0 – EEAR10..0: EEPROM Address

       The EEPROM address registers – EEARH and EEARL specify the EEPROM address in the 512/1024/2048 bytes EEPROM

       space. The EEPROM data bytes are addressed linearly between 0 and 511/1023/2047. The initial value of EEAR is

       undefined. A proper value must be written before the EEPROM may be accessed.

4.3.3  The EEPROM Data Register – EEDR

          Bit            7      6      5             4    3          2        1      0

                         EEDR7  EEDR6  EEDR5  EEDR4       EEDR3  EEDR2    EEDR1      EEDR0     EEDR

          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

       •  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.

20     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
4.3.4  The EEPROM Control Register – EECR

              Bit        7        6        5         4      3             2    1          0

                         –        –  EEPM1         EEPM0  EERIE  EEMWE         EEWE       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 – Reserved Bits

       These bits are reserved bits in the ATmega16/32/64/M1/C1 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 triggered when writing EEWE.         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 operations. The Programming times for the different modes are shown in Table 4-1.

       While EEWE 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 4-1.        EEPROM Mode Bits

          EEPM1          EEPM0       Programming Time          Operation

              0             0                 3.4ms            Erase and write in one operation (atomic operation)

              0             1                 1.8ms            Erase only

              1             0                 1.8ms            Write only

              1             1                   –              Reserved for future use

       •  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 interrupt when EEWE is cleared. The interrupt will not be

       generated during EEPROM write or SPM.

       •  Bit 2 – EEMWE: EEPROM Master Write Enable

       The EEMWE bit determines whether setting EEWE to one causes the EEPROM to be written. When EEMWE is set, setting

       EEWE within four clock cycles will write data to the EEPROM at the selected address If EEMWE is zero, setting EEWE will

       have no effect. When EEMWE has been written to one by software, hardware clears the bit to zero after four clock cycles.

       See the description of the EEWE bit for an EEPROM write procedure.

       •  Bit 1 – EEWE: EEPROM Write Enable

       The EEPROM Write Enable Signal EEWE is the write strobe to the EEPROM. When address and data are correctly set up,

       the EEWE bit must be written to one to write the value into the EEPROM. The EEMWE bit must be written to one before a

       logical one is written to EEWE, otherwise 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 EEWE becomes zero.

          2.  Wait until SPMEN (Store Program Memory Enable) in SPMCSR (Store Program Memory control and status regis-

              ter) 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 EEMWE bit while writing a zero to EEWE in EECR.

          6.  Within four clock cycles after setting EEMWE, write a logical one to EEWE.

       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

       Section 24. “Boot Loader Support – Read-while-write Self-Programming ATmega16/32/64/M1/C1” on page 241 for details

       about Boot programming.

                                                                               ATmega16/32/64/M1/C1 [DATASHEET]                   21

                                                                                                      7647O–AVR–01/15
    Caution:     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.

                 When the write access time has elapsed, the EEWE bit is cleared by hardware. The user software can poll this

                 bit and wait for a zero before writing the next byte. When EEWE 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 EEWE 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 4-2 lists the typical programming time for EEPROM

    access from the CPU.

    Table 4-2.   EEPROM Programming Time.

    Symbol                                 Number of Calibrated RC Oscillator Cycles               Typ Programming Time

    EEPROM write (from                                            26368                                     3.3 ms

    CPU)

    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 globally) 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,EEWE

                     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      EEMWE

                     sbi                      EECR,EEMWE

                     ;    Start       eeprom   write      by  setting        EEWE

                     sbi                      EECR,EEWE

                     ret

    C Code Example

              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  EEMWE      */

                     EECR      |=     (1<
                     /*   Start        eeprom   write     by      setting    EEWE  */

                     EECR      |=     (1<
              }

22  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
       The next code examples show assembly and C functions for reading the EEPROM.             The  examples  assume  that        interrupts

       are controlled so that no interrupts will occur during execution of these functions.

       Assembly Code Example

                EEPROM_read:

                         ;   Wait     for      completion         of  previous  write

                         sbic                     EECR,EEWE

                         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

                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;

                }

4.3.5  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. Secondly, 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 completed provided that the power supply voltage is sufficient.

4.4    I/O Memory

       The I/O space definition of the ATmega16/32/64/M1/C1 is shown in Section 29. “Register Summary” on page 299.

       All Atmel® ATmega16/32/64/M1/C1 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 Atmel ATmega16/32/64/M1/C1 is a complex microcontroller with more peripheral units than can be supported within the

       64 location reserved in Opcode for the IN and OUT instructions. For the Extended I/O space from 0x60 - 0xFF in SRAM, only

       the ST/STS/STD and LD/LDS/LDD instructions can be used.

                                                                                     ATmega16/32/64/M1/C1 [DATASHEET]                          23

                                                                                                               7647O–AVR–01/15
       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 AVR’s, 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 registers 0x00 to 0x1F only.

       The I/O and peripherals control registers are explained in later sections.

4.5    General Purpose I/O Registers

       The Atmel® ATmega16/32/64/M1/C1 contains four general purpose I/O registers. These registers can be used for storing

       any information, and they are particularly useful for storing global variables and status flags.

       The general purpose I/O registers, within the address range 0x00 - 0x1F, are directly bit-accessible using the SBI, CBI,

       SBIS, and SBIC instructions.

4.5.1  General Purpose I/O Register 0 – GPIOR0

       Bit              7            6    5        4                    3          2    1                0

                        GPIOR07  GPIOR06  GPIOR05  GPIOR04  GPIOR03        GPIOR02      GPIOR01  GPIOR00      GPIOR0

       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

4.5.2  General Purpose I/O Register 1 – GPIOR1

       Bit              7            6    5        4                    3          2    1                0

                        GPIOR17  GPIOR16  GPIOR15  GPIOR14  GPIOR13        GPIOR12      GPIOR11  GPIOR10      GPIOR1

       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

4.5.3  General Purpose I/O Register 2 – GPIOR2

       Bit              7            6    5        4                    3          2    1                0

                        GPIOR27  GPIOR26  GPIOR25  GPIOR24  GPIOR23        GPIOR22      GPIOR21  GPIOR20      GPIOR2

       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

24     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
5.     System Clock

5.1    Clock Systems and their Distribution

       Figure 5-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 unused modules can be halted by using different sleep

       modes, as described in Section 6. “Power Management and Sleep Modes” on page 34. The clock systems are detailed

       below.

       Figure 5-1.  Clock Distribution

                    Fast Peripherals    General I/O  ADC                          CPU Core     RAM             Flash and

                                        Modules                                                                EEPROM

                           clkPLL                                  clkADC

                           PLL          clkI/O       AVR Clock                    clkCPU

                                                     Control Unit

                                                                                  clkFLASH

                                                                                  Reset Logic  Watchdog Timer

                                                                   Source  Clock              Watchdog Clock

                    PLL Input                        Clock                                     Watchdog

                    Multiplexer                      Multiplexer                               Oscillator

                                                     External Clock               Crystal                      Calibrated RC

                                                                                  Oscillator                   Oscillator

5.1.1  CPU Clock – clkCPU

       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.

5.1.2  I/O Clock – clkI/O

       The I/O clock is used by the majority of the I/O modules, like Timer/Counters, SPI, UART. The I/O clock is also used by the

       External Interrupt module, but note that some external interrupts are detected by asynchronous logic, allowing such

       interrupts to be detected even if the I/O clock is halted.

5.1.3  Flash Clock – clkFLASH

       The Flash clock controls operation of the Flash interface. The flash clock is usually active simultaneously with the CPU clock.

                                                                                  ATmega16/32/64/M1/C1 [DATASHEET]                      25

                                                                                                               7647O–AVR–01/15
5.1.4  PLL Clock – clkPLL

       The PLL clock allows the fast peripherals to be clocked directly from a 64/32MHz clock. A 16MHz clock is also derived for

       the CPU.

5.1.5  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.

5.2    Clock Sources

       The device has the following clock source options, selectable by Flash Fuse bits as illustrated in Table 5-1. The clock from

       the selected source is input to the AVR clock generator, and routed to the appropriate modules.

       Table 5-1.    Device Clocking Options Select(1)

                                                                           System

       Device Clocking Option                                              Clock         PLL Input      CKSEL3..0

       External crystal/ceramic resonator                                  Ext Osc       RC Osc         1111 - 1000

       PLL output divided by 4: 16MHz / PLL driven by external             Ext Osc       Ext Osc                    0100

       crystal/ceramic resonator

       PLL output divided by 4: 16MHz / PLL driven by external             PLL / 4       Ext Osc                    0101

       crystal/ceramic resonator

       Reserved                                                            N/A           N/A                          0110

       Reserved                                                            N/A           N/A                          0111

       PLL output divided by 4: 16MHz                                      PLL / 4       RC Osc                       0011

       Calibrated internal RC oscillator                                   RC Osc        RC Osc                     0010

       PLL output divided by 4: 16MHz/PLL driven by external clock         PLL / 4       Ext Clk                    0001

       External clock                                                      Ext Clk       RC Osc                     0000

       Notes:    1.  For all fuses “1” means unprogrammed while “0” means programmed.

                 2.  Ext Osc: External oscillator

                 3.  RC Osc: Internal RC oscillator

                 4.  Ext Clk: External clock input

       The various choices for each clocking option is given in the following sections. When the CPU wakes up from power-down or

       power-save, the selected clock source is used to time the start-up, ensuring stable oscillator operation before instruction

       execution starts. When the CPU starts from reset, there is an additional delay allowing the power to reach a stable level

       before starting normal operation. The watchdog oscillator is used for timing this real-time part of the start-up time. The

       number of WDT oscillator cycles used for each time-out is shown in Table 5-2 on page 26. The frequency of the Watchdog

       Oscillator is voltage dependent as shown in Section 27-31 “Watchdog Oscillator Frequency versus VCC” on page 294.

       Table 5-2.    Number of Watchdog Oscillator Cycles

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

                        4.1ms                                       4.3ms                               4K (4,096)

                        65ms                                        69ms                                64K (65,536)

26     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
5.3  Default Clock Source

     The device is shipped with CKSEL = “0010”, SUT = “10”, and CKDIV8 programmed. The default clock source setting is the

     Internal RC Oscillator with longest start-up time and an initial system clock prescaling of 8. This default setting ensures that

     all users can make their desired clock source setting using an in-system or parallel programmer.

5.4  Low Power Crystal Oscillator

     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 5-2. Either a quartz crystal or a ceramic resonator may be used.

     This crystal oscillator is a low power oscillator, with reduced voltage swing on the XTAL2 output. It gives the lowest power

     consumption, but is not capable of driving other clock inputs.

     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. Some initial

     guidelines for choosing capacitors for use with crystals are given in Table 5-3. For ceramic resonators, the capacitor values

     given by the manufacturer should be used. For more information on how to choose capacitors and other details on Oscillator

     operation, refer to the multi-purpose oscillator application note.

     Figure 5-2.    Crystal Oscillator Connections

                                                             C2

                                                                           XTAL2

                                                             C1

                                                                           XTAL1

                                                                           GND

     The Oscillator can operate in three different modes, each optimized for a specific frequency range. The operating mode is

     selected by the fuses CKSEL3..1 as shown in Table 5-3.

     Table 5-3.     Crystal Oscillator Operating Modes

                                                                           Recommended Range for Capacitors    C1  and             C2  for

     CKSEL3..1             Frequency Range (MHz)                                  Use with Crystals (pF)

            100(1)                 0.4 - 0.9                                                           –

            101                    0.9 - 3.0                                                          12 - 22

            110                    3.0 - 8.0                                                          12 - 22

            111                    8.0 -16.0                                                          12 - 22

     Note:  1.      This option should not be used with crystals,    only  with ceramic resonators.

                                                                           ATmega16/32/64/M1/C1 [DATASHEET]                            27

                                                                                                               7647O–AVR–01/15
     The CKSEL0 Fuse together with the SUT1..0 Fuses select the start-up times as shown in Table 5-4.

     Table 5-4.     Start-up Times for the Oscillator Clock Selection

                               Start-up Time from Power-              Additional Delay from

     CKSEL0           SUT1..0  down and Power-save                       Reset (VCC = 5.0V)  Recommended Usage

             0        00                  258 CK(1)                          14CK + 4.1ms    Ceramic resonator, fast rising

                                                                                             power

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

                                                                                             power

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

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

                                                                                             power

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

                                                                                             power

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

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

                                                                                             power

             1        11                  16K CK                             14CK + 65ms     Crystal Oscillator, slowly 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 frequency of the device, and if fre-

                    quency stability at start-up is not important for the application.

5.5  Calibrated Internal RC Oscillator

     By default, the Internal RC OScillator provides an approximate 8.0MHz clock. Though voltage and temperature dependent,

     this clock can be very accurately calibrated by the user. The device is shipped with the CKDIV8 Fuse programmed. See

     Section 5.10 “System Clock Prescaler” on page 32 for more details.

     This clock may be selected as the system clock by programming the CKSEL Fuses as shown in Table 5-1 on page 26. 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 calibrates the RC oscillator. The accuracy of this calibration is shown

     as factory calibration in Table 26-1 on page 276.

     By changing the OSCCAL register from SW, see Section 5.5.1 “Oscillator Calibration Register – OSCCAL” on page 29, 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 Section 26.3 “Clock Characteristics” on page 276.

     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 calibration value, see the section.

     Table 5-5.     Internal Calibrated RC Oscillator Operating Modes(1)(2)

                      Frequency Range (MHz)                                                  CKSEL3..0

                               7.3 - 8.1                                                             0010

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

                2.  If 8MHz frequency exceeds the specification of the device (depends on VCC), the CKDIV8 fuse can be pro-

                    grammed in order to divide the internal frequency by 8.

28   ATmega16/32/64/M1/C1 [DATASHEET]

     7647O–AVR–01/15
       When this oscillator is selected, start-up times are determined by the SUT fuses as shown in Table 5-6 on page 29.

       Table 5-6.        Start-up times for the internal calibrated RC Oscillator clock selection

                                         Start-up Time from Power-down and            Additional Delay from         Reset

       Power Conditions                               Power-save                                      (VCC = 5.0V)                 SUT1..0

       BOD enabled                                                6 CK                                14CK(1)                           00

       Fast rising power                                          6 CK                             14CK + 4.1ms                         01

       Slowly rising power                                        6 CK                      14CK + 65ms(2)                              10

                                                         Reserved                                                                       11

       Notes:     1.     If the RSTDISBL fuse is programmed, this start-up time will be increased to

                         14CK + 4.1 ms to ensure programming mode can be entered.

                  2.     The device is shipped with this option selected.

5.5.1  Oscillator Calibration Register – OSCCAL

             Bit            7      6            5     4                 3          2  1               0

                          CAL7     CAL6         CAL5  CAL4            CAL3   CAL2     CAL1            CAL0  OSCCAL

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

          Initial Value                         Device Specific Calibration Value

       •  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. The factory-calibrated value is automatically written to this register during chip reset, giving an oscillator

       frequency of 8.0MHz at 25°C. The application software can write this register to change the oscillator frequency. The

       oscillator can be calibrated to any frequency in the range 7.3 - 8.1MHz within ±1% accuracy. 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.8MHz. 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 frequency 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. Incrementing CAL6..0 by 1 will give a frequency

       increment of less than 2% in the frequency range 7.3 - 8.1MHz.

5.6    PLL

5.6.1  Internal PLL

       The internal PLL in the Atmel® ATmega16/32/64/M1/C1 generates a clock frequency that is 64x multiplied from its nominal

       1MHz input. The source of the 1MHz PLL input clock can be:

          ●    the output of the internal RC oscillator divided by 8

          ●    the output of the crystal oscillator divided by 8

          ●    the external clock divided by 8

       See Figure 5-3 on page 30.

       When the PLL is locked on the RC Oscillator, adjusting the RC Oscillator via OSCCAL Register, will also modify the PLL

       clock output. However, even if the possibly divided RC Oscillator is taken to a higher frequency than 8MHz, the PLL output

       clock frequency saturates at 70MHz (worst case) and remains oscillating at the maximum frequency. It should be noted that

       the PLL in this case is not locked any more with its 1MHz source clock.

                                                                                      ATmega16/32/64/M1/C1 [DATASHEET]                       29

                                                                                                                    7647O–AVR–01/15
    Therefore it is recommended not to take the OSCCAL adjustments to a higher frequency than 8MHz in order to keep the PLL

    in the correct operating range.

    The internal PLL is enabled only when the PLLE bit in the register PLLCSR is set. The bit PLOCK from the register PLLCSR

    is set when PLL is locked.

    Both internal 8MHz RC Oscillator, Crystal Oscillator and PLL are switched off in Power-down and Standby sleep

    modes.01/15

    Table 5-7.   Start-up Times when the PLL is selected as system clock

                                      Start-up Time from Power-down and                      Additional Delay from  Reset

    CKSEL3..0        SUT1..0          Power-save                                                      (VCC = 5.0V)

                     00                          1K CK                                                14CK

    0011             01                          1K CK                                                14CK + 4ms

    RC Osc           10                          1K CK                                                14CK + 64ms

                     11                          16K CK                                               14CK

                     00                          1K CK                                                14CK

    0101             01                          1K CK                                                14CK + 4ms

    Ext Osc          10                          16K CK                                               14CK + 4ms

                     11                          16K CK                                               14CK + 64ms

                     00                          6 CK(1)                                              14CK

    0001             01                          6 CK(1)                                              14CK + 4ms

    Ext Clk          10                          6 CK(1)                                              14CK + 64ms

                     11                                                  Reserved

    Note:  1.     This value do  not  provide a proper restart; do not use PD in this clock  scheme.

    Figure 5-3.  PLL Clocking System

                     OSCCAL           CKSEL3..0           PLLE                               PLLF

                                                                          Lock                              PLOCK

                                                                          Detector

                     RC Oscillator               Divide   PLL                                Divide         CLKPLL

                     8MHz                        by 8     64x                                by 2

                                                                                             Divide

                                                                                             by 4

                                                                                                            CKSOURCE

           XTAL1         Oscillators

           XTAL2

30  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
5.6.2  PLL control and status register – PLLCSR

             Bit         7          6            5  4                  3    2        1      0

          $29 ($29)      –          –            –  –                  –    PLLF     PLLE   PLOCK  PLLCSR

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

          Initial Value  0          0            0  0                  0    0        0/1    0

       •  Bit 7..3 – Res: Reserved Bits

       These bits are reserved bits in the ATmega16/32/64/M1/C1 and always read as zero.

       •  Bit 2 – PLLF: PLL Factor

       The PLLF bit is used to select the division factor of the PLL.

       If PLLF is set, the PLL output is 64MHz.

       If PLLF is clear, the PLL output is 32MHz.

       •  Bit 1 – PLLE: PLL Enable

       When the PLLE is set, the PLL is started and if not yet started the internal RC oscillator is started as PLL reference clock.  If

       PLL is selected as a system clock source the value for this bit is always 1.

       •  Bit 0 – PLOCK: PLL Lock Detector

       When the PLOCK bit is set, the PLL is locked to the reference clock, and it is safe to enable CLKPLL for Fast Peripherals.
       After the PLL is enabled, it takes about 100µs for the PLL to lock.

5.7    128 kHz Internal Oscillator

       The 128 kHz internal oscillator is a low power Oscillator providing a clock of 128 kHz. The frequency is nominal at 3V and

       25°C. This clock is used by the Watchdog Oscillator.

5.8    External Clock

       To drive the device from an external clock source, XTAL1 should be driven as shown in Figure 5-4. To run the device on an

       external clock, the CKSEL fuses must be programmed to “0000”.

       Figure 5-4.       External Clock Drive Configuration

                                                             NC                      XTAL2

                                                    EXTERNAL

                                                    CLOCK                            XTAL1

                                                    SIGNAL

                                                                                     GND

       Table 5-8.        External Clock Frequency

       CKSEL3..0                                             Frequency Range

       0000                                                  0 - 16MHz

                                                                                 ATmega16/32/64/M1/C1 [DATASHEET]                     31

                                                                                                   7647O–AVR–01/15
      When this clock source is selected, start-up times are determined by the SUT fzses as shown in Table 5-9.

      Table 5-9.    Start-up Times for the External Clock Selection

                       Start-up Time from Power-down and  Additional Delay from Reset

      SUT1..0              Power-save                                       (VCC = 5.0V)                 Recommended Usage

          00                  6 CK                                              14CK            BOD enabled

          01                  6 CK                                          14CK + 4.1ms        Fast rising power

          10                  6 CK                                          14CK + 65ms         Slowly rising power

          11                                                                Reserved

      When applying an external clock, it is required to avoid sudden changes in the applied clock frequency 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. It is required to ensure that the MCU is kept in reset during such changes in the clock frequency.

      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 Section 5.10 “System Clock Prescaler” on page 32 for details.

5.9   Clock Output Buffer

      When the CKOUT fuse is programmed, the system Clock will be output on CLKO. This mode is suitable when chip clock is

      used to drive other circuits on the system. The clock will be output also during reset and the normal operation of I/O pin will

      be overridden when the fuse is programmed. Any clock source, including internal RC oscillator, can be selected when CLKO

      serves as clock output. If the system clock prescaler is used, it is the divided system clock that is output (CKOUT fuse

      programmed).

5.10  System Clock Prescaler

      The Atmel® ATmega16/32/64/M1/C1 system clock can be divided by setting the clock prescale register – CLKPR. This

      feature can be used to decrease power consumption when the requirement 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 clkFLASH are divided by a factor as shown in Table 5-10.

      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 neither the clock frequency corresponding to the previous

      setting, nor the clock frequency corresponding 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 written, 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.

32    ATmega16/32/64/M1/C1 [DATASHEET]

      7647O–AVR–01/15
5.10.1  Clock Prescaler Register – CLKPR

           Bit                7   6                5  4              3  2       1            0

                          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 synchronous peripherals is reduced when a division factor is used. The division factors are

        given in Table 5-10.

        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

        operating 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 5-10.       Clock  Prescaler Select

           CLKPS3                 CLKPS2              CLKPS1            CLKPS0                    Clock Division Factor

                0                    0                   0                   0                              1

                0                    0                   0                   1                              2

                0                    0                   1                   0                              4

                0                    0                   1                   1                              8

                0                    1                   0                   0                       16

                0                    1                   0                   1                       32

                0                    1                   1                   0                       64

                0                    1                   1                   1                       128

                1                    0                   0                   0                       256

                1                    0                   0                   1                       Reserved

                1                    0                   1                   0                       Reserved

                1                    0                   1                   1                       Reserved

                1                    1                   0                   0                       Reserved

                1                    1                   0                   1                       Reserved

                1                    1                   1                   0                       Reserved

                1                    1                   1                   1                       Reserved

                                                                           ATmega16/32/64/M1/C1 [DATASHEET]                               33

                                                                                                     7647O–AVR–01/15
6.     Power Management and Sleep Modes

       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.

       To enter any of the five 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 (Idle, ADC noise reduction, Power-

       down, Power-save, or Standby) will be activated by the SLEEP instruction. See Table 6-1 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.

       Figure 5-1 on page 25 presents the different clock systems in the Atmel® ATmega16/32/64/M1/C1, and their distribution. The

       figure is helpful in selecting an appropriate sleep mode.

6.1    Sleep Mode Control Register

6.1.1  Sleep Mode Control Register – SMCR

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

              Bit        7              6        5  4                 3          2      1       0

                         –              –        –  –                 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..1 – SM2..0: Sleep Mode Select Bits 2, 1, and 0

       These bits select between the five available sleep modes as shown in Table 6-1.

       Table 6-1.        Sleep Mode Select

              SM2                       SM1              SM0               Sleep Mode

                   0                       0             0                 Idle

                   0                       0             1                 ADC noise reduction

                   0                       1             0                 Power-down

                   0                       1             1                 Reserved

                   1                       0             0                 Reserved

                   1                       0             1                 Reserved

                   1                       1             0                 Standby(1)

                   1                       1             1                 Reserved

       Note:       1.    Standby  mode  is only  recommended for use  with external crystals or resonators.

       •  Bit 1 – 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.

34     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
6.2  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 SPI, UART, analog comparator, ADC, Timer/Counters, watchdog, and the interrupt system to continue operating.

     This sleep mode basically halt 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

     UART 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 automatically when this mode is entered.

6.3  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, Timer/Counter (if their clock source is external - T0 or T1) 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 from the ADC conversion complete interrupt, only an

     external reset, a watchdog reset, a brown-out reset, a Timer/Counter interrupt, an SPM/EEPROM ready interrupt, an

     external level interrupt on INT3:0 can wake up the MCU from ADC noise reduction mode.

6.4  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 and the watchdog continue operating (if enabled). Only an

     external reset, a watchdog reset, a brown-out reset, a PSC interrupt, an external level interrupt on INT3:0 can wake up the

     MCU. This sleep mode basically halts all generated clocks, allowing operation of asynchronous 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 Section 10. “External Interrupts” on page 70 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 Section 5.2 “Clock Sources” on page 26.

6.5  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.

     Table 6-2.  Active Clock Domains and Wake-up Sources in the Different Sleep Modes

                                   Active Clock Domains                        Oscillators                                      Wake-up Sources

                           clkCPU  clkFLASH     clkIO     clkADC     clkPLL       Main Clock  Source Enabled        INT3..0     PSC  SPM/EEPROM  Ready  ADC  WDT  OtherI/O

     Sleep Mode

     Idle                                    X         X          X            X                              X              X       X                  X    X    X

     ADC Noise                                         X          X            X                              X(2)           X       X                  X    X

     Reduction

     Power-down                                                                                               X(2)                                           X

     Standby(1)                                                                X                              X(2)                                           X

     Notes:  1.  Only      recommended       with  external       crystal  or  resonator  selected as clock source.

             2.  Only      level interrupt.

                                                                                              ATmega16/32/64/M1/C1 [DATASHEET]                                    35

                                                                                                                                        7647O–AVR–01/15
6.6    Power Reduction Register

       The power reduction register, PRR, provides 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 module, which is done by clearing the bit in PRR, puts the module in the same state

       as before shutdown.

       A full predictable behavior of a peripheral is not guaranteed during and after a cycle of stopping and starting of its clock. So

       its recommended to stop a peripheral before stopping its clock with PRR register.

       Module shutdown can be used in Idle mode and Active mode to significantly reduce the overall power consumption. In all

       other sleep modes, the clock is already stopped.

6.6.1  Power Reduction Register - PRR

          Bit            7  6          5                 4           3       2            1        0

                         -  PRCAN    PRPSC    PRTIM1                 PRTIM0  PRSPI  PRLIN          PRADC  PRR

          Read/Write     R  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 - Res: Reserved Bit

       This bit is unused bit in the ATmega16/32/64/M1/C1, and will always read as zero.

       •  Bit 6 - PRCAN: Power Reduction CAN

       Writing a logic one to this bit reduces the consumption of the CAN by stopping the clock to this module. When waking up the

       CAN again, the CAN should be re initialized to ensure proper operation.

       •  Bit 5 - PRPSC: Power Reduction PSC

       Writing a logic one to this bit reduces the consumption of the PSC by stopping the clock to this module. When waking up the

       PSC again, the PSC should be re initialized to ensure proper operation.

       •  Bit 4 - PRTIM1: Power Reduction Timer/Counter1

       Writing a logic one to this bit reduces the consumption of the Timer/Counter1 module. When the Timer/Counter1 is enabled,

       operation will continue like before the setting of this bit.

       •  Bit 3 - PRTIM0: Power Reduction Timer/Counter0

       Writing a logic one to this bit reduces the consumption of the Timer/Counter0 module. When the Timer/Counter0 is enabled,

       operation will continue like before the setting of this bit.

       •  Bit 2 - PRSPI: Power Reduction Serial Peripheral Interface

       Writing a logic one to this bit reduces the consumption of the serial peripheral interface by stopping the clock to this module.

       When waking up the SPI again, the SPI should be re initialized to ensure proper operation.

       •  Bit 1 - PRLIN: Power Reduction LIN

       Writing a logic one to this bit reduces the consumption of the UART controller by stopping the clock to this module. When

       waking up the UART controller again, the UART controller should be re initialized to ensure proper operation.

       •  Bit 0 - PRADC: Power Reduction ADC

       Writing a logic one to this bit reduces the consumption of the ADC by stopping the clock to this module. The ADC must be

       disabled before using this function. The analog comparator cannot use the ADC input MUX when the clock of ADC is

       stopped.

36     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
6.7    Minimizing Power Consumption

       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.

6.7.1  Analog to Digital Converter

       If enabled, the ADC will be enabled in all sleep modes. To save power, the ADC should be disabled before entering any

       sleep mode. When the ADC is turned off and on again, the next conversion will be an extended conversion. Refer to Section

       18. “Analog to Digital Converter - ADC” on page 197 for details on ADC operation.

6.7.2  Analog Comparator

       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 Section 20.

       “Analog Comparator” on page 225 for details on how to configure the analog comparator.

6.7.3  Brown-out Detector

       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 significantly to the total current consumption. Refer to Section 7.2.3 “Brown-out Detection”

       on page 40 for details on how to configure the brown-out detector.

6.7.4  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 Section 7.3 “Internal Voltage

       Reference” on page 42 for details on the start-up time.

6.7.5  Watchdog Timer

       If the watchdog timer is not needed in the application, the module should be turned off. If the 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 consumption. Refer to Section 7.4 “Watchdog Timer” on page 43 for details on how to

       configure the watchdog timer.

6.7.6  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

       Section 9. “I/O-Ports” on page 51 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 “Digital Input Disable Register 1– DIDR1” and “Digital Input Disable Register

       0 – DIDR0” on 232 and 214 for details.

6.7.7  On-chip Debug System

       If the on-chip debug system is enabled by OCDEN Fuse and the chip enter 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.

                                                                           ATmega16/32/64/M1/C1 [DATASHEET]                                37

                                                                                                                7647O–AVR–01/15
7.   System Control and Reset

7.1  Resetting the AVR

     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 7-1 on page 38 shows the reset logic. Table 7-1 on page 39 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 different selections for the delay period are presented in

     Section 5.2 “Clock Sources” on page 26.

7.2  Reset Sources

     The Atmel ATmega16/32/64/M1/C1 has four 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.

     Figure 7-1.  Reset Logic

                                                                               DATA BUS

                                                                               MCU Status

                                                                         Register (MCUSR)

                                                                         PORF  BORF  EXTRF  WDRF

                      VCC                                Power-on Reset

                                                         Circuit

                                                         Brown-out

                  BODLEVEL   [2..  0]                    Reset Circuit

                                       Pull-up Resistor

                                                                                                                                          Q  INTERNAL

                      RESET            Spike             Reset Circuit                                                           S           RESET

                                       Filter

                                                                                                                                 R

                                                         Watchdog                                                 COUNTER RESET

                                                         Timer

                                                         Watchdog

                                                         Oscillator

                                                         Clock           CK                       Delay Counters

                                                         Generator                                                               TIMEOUT

                                                         CKSEL[3:0]

                                                         SUT[1:0]

38   ATmega16/32/64/M1/C1              [DATASHEET]

     7647O–AVR–01/15
       Table 7-1.   Reset Characteristics

       Parameter                                                 Symbol       Min            Typ               Max           Unit

       Power-on reset threshold voltage (rising)                 VPOT         1.1            1.4               1.7                  V

       Power-on reset threshold voltage (falling)(1)                          0.8            0.9               1.6                  V

       VCC max. start voltage to ensure internal power-on reset  VPORMAX                                       0.4                  V

       signal

       VCC min. start voltage to ensure internal power-on reset  VPORMIN      –0.1                                                  V

       signal

       VCC rise rate to ensure power-on reset                    VCCRR        0.01                                           V/ms

       RESET pin threshold voltage                               VRST         0.1 VCC                  0.9VCC                       V

       Minimum pulse width on RESET pin                          tRST         2.5            -                 -                  µs

       Note:   1.   Before rising, the supply has to be between  VPORMIN and  VPORMAX to     ensure a  reset.

7.2.1  Power-on Reset

       A power-on reset (POR) pulse is generated by an on-chip detection circuit. The detection level is defined in Table 7-1. 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.

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

                              VCCRR

                    VCC

                                           VPORMAX

                                           VPORMIN

                    RESET                  VRST

                                                       tTOUT

                    TIME-OUT

                   INTERNAL

                    RESET

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

                       VCC                 VPOT

                    RESET                                        VRST

                                                                       tTOUT

                    TIME-OUT

                    INTERNAL

                    RESET

                                                                              ATmega16/32/64/M1/C1 [DATASHEET]                         39

                                                                                                       7647O–AVR–01/15
7.2.2  External Reset

       An external reset is generated by a low level on the RESET pin. Reset pulses longer than the minimum pulse width (see

       Table 7-1) 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 7-4.  External Reset during Operation

                        VCC

                        RESET

                                           VRST

                                                                  tTOUT

                    TIME-OUT

                    INTERNAL

                        RESET

7.2.3  Brown-out Detection

       ATmega16/32/64/M1/C1 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 interpreted as

       VBOT+ = VBOT + VHYST/2 and VBOT- = VBOT – VHYST/2.

       Table 7-2.   BODLEVEL Fuse Coding(1)(2)

                              BODLEVEL 2..0 Fuses                              Typ VBOT         Unit

                                      111                                      Disabled

                                      110                                      4.5              V

                                      011                                      4.4              V

                                      100                                      4.3              V

                                      010                                      4.2              V

                                      001                                      2.8              V

                                      101                                      2.7              V

                                      000                                      2.6              V

       Notes:  1.   VBOT may be below nominal minimum operating voltage for some devices. For devices where this is the case,

                    the device is tested down to VCC = VBOT during the production test. This guarantees that a brown-out reset will
                    occur before VCC drops to a voltage where correct operation of the microcontroller is no longer guaranteed.
                    The test is performed using BODLEVEL = 010 for low operating voltage and BODLEVEL = 101 for high operat-

                    ing voltage.

               2.   Values are guidelines only.

       Table 7-3.   Brown-out Characteristics(1)

       Parameter                                           Symbol        Min.       Typ.  Max.                                    Unit

       Brown-out Detector Hysteresis                       VHYST                    80                                            mV

       Min Pulse Width on Brown-out Reset                  tBOD                     2                                             µs

       Note:   1.   Values are guidelines only.

40     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
       When the BOD is enabled, and VCC decreases to a value below the trigger level (VBOT- in Figure 7-5 on page 41), the brown-
       out reset is immediately activated. When VCC increases above the trigger level (VBOT+ in Figure 7-5 on page 41), 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 longer than tBOD given in
       Table 7-3.

       Figure 7-5.  Brown-out Reset during Operation

                              VCC

                                                      VBOT-                 VBOT+

                              RESET

                                                                            tTOUT

                              TIME-OUT

                              INTERNAL

                              RESET

7.2.4  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  Section 7.4 “Watchdog Timer” on page      43 for      details on

       operation of the watchdog timer.

       Figure 7-6.  Watchdog Reset during Operation

                    VCC

                    RESET

                                         1 CK Cycle

                    WDT

                    TIME-OUT

                    RESET                             tTOUT

                    Time-OUT

                    INTERNAL

                    RESET

                                                                            ATmega16/32/64/M1/C1 [DATASHEET]                                  41

                                                                                   7647O–AVR–01/15
7.2.5  MCU Status Register – MCUSR

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

              Bit        7         6                  5  4              3  2          1            0

                         –         –                  –  –       WDRF      BORF       EXTRF    PORF                MCUSR

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

          Initial Value  0         0                  0  0                    See Bit Description

       •  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.

7.3    Internal Voltage Reference

       ATmega16/32/64/M1/C1 features an internal bandgap reference. This reference is used for brown-out detection, and it can

       be used as an input to the analog comparators or the ADC. The VREF 2.56V reference to the ADC, DAC or analog
       comparators is generated from the internal bandgap reference.

7.3.1  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

       Table 7-4. 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.

          4.  When the DAC is enabled.

       Thus, when the BOD is not enabled, after setting the ACBG bit or enabling the ADC or the DAC, the user must always allow

       the reference to start up before the output from the analog comparator or ADC or DAC 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.

7.3.2  Voltage Reference Characteristics

       Table 7-4.        Internal Voltage Reference Characteristics(1)

       Parameter                                         Symbol            Condition     Min.                  Typ.       Max.     Unit

       Bandgap reference voltage                            VBG                                                1.1                 V

       Bandgap reference start-up time                      tBG                                                40                  µs

       Bandgap reference current consumption                IBG                                                15                  µA

       Note:       1.    Values are guidelines only.

42     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
7.4  Watchdog Timer

     ATmega16/32/64/M1/C1 has an enhanced watchdog timer (WDT). The main features                                                                are:

     ●   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

     Figure 7-7.  Watchdog Timer

                                128kHz                               Watchdog

                             Oscillator                                      Prescaler

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

                                RESET

                                         WDP0

                                         WDP1

                                         WDP2

                                         WDP3

                                WDE

                                                                                                                                                       MCU  RESET

                                WDIF

                                                                                                                                                       INTERRUPT

                                WDIE

     The watchdog timer (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 counter before the time-out value is reached. If the system

     doesn't restart the counter, an interrupt or system reset will be issued.

     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 interrupt 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 Timer Always On” (WDTON) fuse, if programmed, will force the watchdog timer to system 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, alterations to the watchdog set-up must follow timed sequences. The sequence for clearing

     WDE and changing time-out configuration is as follows:

     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.

                                                                                                        ATmega16/32/64/M1/C1 [DATASHEET]                                     43

                                                                                                                                                            7647O–AVR–01/15
    The following code example shows one assembly and one C function for turning off the Watchdog 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,         (0xff       &   (0<
                     out           MCUSR,    r16

                     ;   Write         logical       one     to     WDCE  and    WDE

                     ;   Keep      old      prescaler           setting     to   prevent  unintentional  time-out

                     lds   r16,        WDTCSR

                     ori           r16,     (1<
                     sts   WDTCSR,           r16

                     ;   Turn      off      WDT

                     ldi           r16,     (0<
                     sts   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();

             }

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

             2.  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 initialization routine, even if the

                 watchdog is not in use.

44  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
       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

                         lds       r16,   WDTCSR

                         ori         r16,   (1<
                         sts       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<
                         sts       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     sequence    */

                         WDTCSR       |=   (1<
                         /*    Set    new   prescaler(time-out)            value     =  64K  cycles     (~0.5   s)  */

                         WDTCSR       =   (1<
                         __enable_interrupt();

                   }

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

                   2.    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;

7.4.1  Watchdog Timer Control Register - WDTCSR

             Bit         7            6          5          4        3          2            1          0

                         WDIF       WDIE    WDP3        WDCE         WDE      WDP2           WDP1    WDP0       WDTCSR

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

          Initial Value  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 configured 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.

                                                                                   ATmega16/32/64/M1/C1 [DATASHEET]                          45

                                                                                                                    7647O–AVR–01/15
    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 useful 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 system reset will be applied.

    Table 7-5.    Watchdog Timer Configuration

       WDTON(1)            WDE        WDIE        Mode                                   Action on Time-out

              1              0        0           Stopped                                None

              1              0        1           Interrupt mode                         Interrupt

              1              1        0           System reset mode                      Reset

              1              1        1           Interrupt and system reset mode        Interrupt, then go to system reset

                                                                                         mode

              0              x        x           System reset mode                      Reset

    Note:     1.  For the WDTON fuse “1” means unprogrammed while “0” means programmed.

    •  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 conditions causing failure, and a safe start-up after the

    failure.

    •  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 running. The different prescaling

    values and their corresponding time-out periods are shown in Table 7-6 on page 46.

    Table 7-6.    Watchdog Timer Prescale Select

                                                                                                  Typical Time-out                at

       WDP3          WDP2       WDP1  WDP0        Number of WDT Oscillator Cycles                   VCC = 5.0V

           0         0          0        0                 2K (2048) cycles                         16ms

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

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

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

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

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

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

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

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

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

           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

46  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
8.   Interrupts

     This section describes the specifics of the interrupt handling as performed in ATmega16/32/64/M1/C1. For a general

     explanation of the AVR interrupt handling, refer to Section 3.8 “Reset and Interrupt Handling” on page 16.

8.1  Interrupt Vectors in ATmega16/32/64/M1/C1

     Table 8-1.  Reset and Interrupt Vectors

     Vector      Program

     No.         Address         Source         Interrupt Definition

     1           0x0000          RESET          External pin, power-on reset, brown-out reset, watchdog reset,

                                                and emulation AVR reset

     2           0x0002          ANACOMP 0      Analog comparator 0

     3           0x0004          ANACOMP 1      Analog comparator 1

     4           0x0006          ANACOMP 2      Analog comparator 2

     5           0x0008          ANACOMP 3      Analog comparator 3

     6           0x000A          PSC FAULT(3)   PSC fault

     7           0x000C          PSC EC(3)      PSC end of cycle

     8           0x000E          INT0           External interrupt request 0

     9           0x0010          INT1           External interrupt request 1

     10          0x0012          INT2           External interrupt request 2

     11          0x0014          INT3           External interrupt request 3

     12          0x0016          TIMER1 CAPT    Timer/Counter1 capture event

     13          0x0018          TIMER1 COMPA   Timer/Counter1 compare match A

     14          0x001A          TIMER1 COMPB   Timer/Counter1 compare match B

     15          0x001C          TIMER1 OVF     Timer/Counter1 overflow

     16          0x001E          TIMER0 COMPA   Timer/Counter0 compare match A

     17          0x0020          TIMER0 COMPB   Timer/Counter0 compare match B

     18          0x0022          TIMER0 OVF     Timer/Counter0 overflow

     19          0x0024          CAN INT        CAN MOB, burst, general errors

     20          0x0026          CAN TOVF       CAN timer overflow

     21          0x0028          LIN TC         LIN transfer complete

     22          0x002A          LIN ERR        LIN error

     23          0x002C          PCINT0         Pin change interrupt request 0

     24          0x002E          PCINT1         Pin change interrupt request 1

     25          0x0030          PCINT2         Pin change interrupt request 2

     26          0x0032          PCINT3         Pin change interrupt request 3

     27          0x0034          SPI, STC       SPI serial transfer complete

     28          0x0036          ADC            ADC conversion complete

     29          0x0038          WDT            Watchdog time-Out interrupt

     30          0x003A          EE READY       EEPROM ready

     31          0x003C          SPM READY      Store program memory ready

     Notes:  1.  When the BOOTRST fuse is programmed, the device will jump to the boot loader address at reset, see Sec-

                 tion 24. “Boot Loader Support – Read-while-write Self-Programming ATmega16/32/64/M1/C1” on page 241.

             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.

             3.  These vectors are not used by Atmel ATmega32/64C1.

                                                                     ATmega16/32/64/M1/C1 [DATASHEET]                             47

                                                                                7647O–AVR–01/15
    Table 8-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 8-2.     Reset and Interrupt Vectors Placement in ATmega16/32/64/M1/C1(1)

           BOOTRST          IVSEL     Reset Address                     Interrupt Vectors Start Address

                1            0        0x000                             0x001

                1            1        0x000                             Boot reset address + 0x002

                0            0        Boot reset address                0x001

                0            1        Boot reset address                Boot reset address + 0x002

    Note:  1.      The boot reset address is shown in Table 24-4 on page 244. 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 ATmega16/32/64/M1/C1 is:

    Address          Labels Code                     Comments

           0x000             jmp      RESET                   ;  Reset   Handler

           0x002             jmp      ANA_COMP_0              ;  analog     comparator      0   Handler

           0x004             jmp      ANA_COMP_1              ;  analog     comparator      1   Handler

           0x006             jmp      ANA_COMP_2              ;  analog     comparator      2   Handler

           0x008             jmp      ANA_COMP_3              ;  analog     comparator      3   Handler

           0x00A             jmp      PSC_FAULT               ;  PSC   Fault    Handler

           0x00C             jmp      PSC_EC                  ;  PSC   End  of  Cycle    Handler

           0x00E             jmp      EXT_INT0                ;  IRQ0   Handler

           0x010             jmp      EXT_INT1                ;  IRQ1   Handler

           0x012             jmp      EXT_INT2                ;  IRQ2   Handler

           0x014             jmp      EXT_INT3                ;  IRQ3   Handler

           0x016             jmp      TIM1_CAPT               ;  Timer1     Capture   Handler

           0x018             jmp      TIM1_COMPA              ;  Timer1     Compare   A  Handler

           0x01A             jmp      TIM1_COMPB              ;  Timer1     Compare   B  Handler

           0x01C             jmp      TIM1_OVF                ;  Timer1     Overflow     Handler

           0x01E             jmp      TIM0_COMPA              ;  Timer0     Compare   A  Handler

           0x020             jmp      TIM0_COMPB              ;  Timer0     Compare   B  Handler

           0x022             jmp      TIM0_OVF                ;  Timer0     Overflow     Handler

           0x024             jmp      CAN_INT                 ;  CAN   MOB,Burst,General        Errors   Handler

           0x026             jmp      CAN_TOVF                ;  CAN   Timer    Overflow       Handler

           0x028             jmp      LIN_TC                  ;  LIN   Transfer      Complete   Handler

           0x02A             jmp      LIN_ERR                 ;  LIN   Error    Handler

           0x02C             jmp      PCINT0                  ;  Pin   Change   Int   Request     0  Handler

           0x02E             jmp      PCINT1                  ;  Pin   Change   Int   Request     1  Handler

           0x030             jmp      PCINT2                  ;  Pin   Change   Int   Request     2  Handler

           0x032             jmp      PCINT3                  ;  Pin   Change   Int   Request     3  Handler

           0x034             jmp      SPI_STC                 ;  SPI   Transfer      Complete   Handler

           0x036             jmp      ADC                     ;  ADC   Conversion     Complete       Handler

           0x038             jmp      WDT                     ;  Watchdog     Timer   Handler

           0x03A             jmp      EE_RDY                  ;  EEPROM     Ready    Handler

           0x03C             jmp      SPM_RDY                 ;  Store   Program     Memory     Ready    Handler

           ;

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

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

           0x040             ldi      r16,      low(RAMEND)

           0x041             out      SPL,r16

           0x042             sei                              ;  Enable     interrupts

           0x043               xxx

           ...       ...     ...      ...

48  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
When the BOOTRST fuse is unprogrammed, the Boot section size set to 2K 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 in ATmega16/32/64/M1/C1 is:

Address          Labels Code                     Comments

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

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

0x002            ldi      r16,low(RAMEND)

0x003            out      SPL,r16

0x004            sei                             ;  Enable  interrupts

0x005                           xxx

;

.org   0xC02

0xC02            jmp      ANA_COMP_0             ;  analog  comparator                   0   Handler

0xC04            jmp      ANA_COMP_1             ;  analog  comparator                   1   Handler

...              ...      ...                    ;

0xC3C            jmp      SPM_RDY                ;  Store   Program             Memory       Ready    Handler

When the BOOTRST fuse is programmed and the boot section size set to 2Kbytes, the most typical and general program

setup for the reset and interrupt vector addresses in ATmega16/32/64/M1/C1 is:

Address          Labels Code                     Comments

.org   0x002

0x002            jmp      ANA_COMP_0             ;  analog  comparator                   0   Handler

0x004            jmp      ANA_COMP_1             ;  analog  comparator                   1   Handler

...              ...      ...                    ;

0x03C            jmp      SPM_RDY                ;  Store   Program             Memory       Ready    Handler

;

.org   0xC00

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

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

0xC02            ldi      r16,low(RAMEND)

0xC03            out      SPL,r16

0xC04            sei                             ;  Enable  interrupts

0xC05                           xxx

When the BOOTRST fuse is programmed, the boot section size set to 2Kbytes 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 in ATmega16/32/64/M1/C116/32 is:

Address          Labels Code                     Comments

;

.org   0xC00

0xC00            jmp      RESET                  ;  Reset   handler

0xC02            jmp      ANA_COMP_0             ;  analog  comparator                   0   Handler

0xC04            jmp      ANA_COMP_1             ;  analog  comparator                   1   Handler

...                       ...               ...  ;

0xC3C            jmp      SPM_RDY                ;  Store   Program             Memory       Ready    Handler

;

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

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

0xC40            ldi      r16,low(RAMEND)

0xC41            out      SPL,r16

0xC42            sei                             ;  Enable  interrupts

0xC43                           xxx

                                                    ATmega16/32/64/M1/C1 [DATASHEET]                                     49

                                                                                                  7647O–AVR–01/15
8.1.1  Moving Interrupts Between Application and Boot Space

       The MCU control register controls the placement of the interrupt vector table.

8.1.2  MCU Control Register – MCUCR

              Bit         7             6  5                4           3        2          1       0

                         SPIPS          –  –               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 determined by the BOOTSZ fuses. Refer to Section 24. “Boot Loader Support – Read-while-write

       Self-Programming ATmega16/32/64/M1/C1” on page 241 for details. To avoid unintentional changes of Interrupt vector

       tables, a special write procedure must be followed to change the IVSEL bit:

          1.  Write the interrupt vector change enable (IVCE) bit to one.

          2.  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 Section 24. “Boot Loader Support – Read-while-write Self-Programming ATmega16/32/64/M1/C1” on

                         page 241 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 code example below.

          Assembly Code Example

                   Move_interrupts:

                          ;    Enable      change  of   Interrupt       Vectors

                          ldi              r16,         (1<
                          out              MCUCR,           r16

                          ;    Move     interrupts     to   Boot        Flash  section

                          ldi              r16,         (1<
                          out              MCUCR,           r16

                          ret

          C Code Example

                   void  Move_interrupts(void)

                   {

                          /*    Enable     change   of     Interrupt       Vectors  */

                          MCUCR      =     (1<
                          /*    Move       interrupts   to        Boot  Flash  section  */

                          MCUCR      =     (1<
                   }

50     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
9.   I/O-Ports

9.1  Introduction

     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 changing 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. All

     port pins have individually 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 9-1. Refer to Section 26. “Electrical Characteristics” on page 273 for a
     complete list of parameters.

     Figure 9-1.  I/O Pin Equivalent Schematic

                                                      Rpu

                                   Pxn

                                                                             Logic

                                                      See Figure

                                                Cpin  ”General Digital I/O”

                                                      for Details

     All registers and bit references in this section are written in general form. A lower case “x” represents 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 registers and bit locations are listed in “Register Description for I/O-Ports”.

     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

     corresponding 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”. 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 Section 9.3 “Alternate Port Functions” on page 55. Refer to the individual module sections for a full description

     of the alternate functions.

     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.

                                                      ATmega16/32/64/M1/C1 [DATASHEET]                                                   51

                                                                                                   7647O–AVR–01/15
9.2    Ports as General Digital I/O

       The ports are bi-directional I/O ports  with  optional  internal  pull-ups.     Figure    9-2  shows a     functional  description  of  one  I/O-port

       pin, here generically called Pxn.

       Figure 9-2.  General Digital I/O(1)

                                                                                                                  PUD

                                                                                                      Q        D

                                                                                                         DDxn

                                                                                                      Q  CLR

                                                                                                      RESET       WDx

                                                                                                                  RDx

                                                                                                                              1    DATA BUS

                        Pxn                                                                           Q        D

                                                                                                      PORTxn                  0

                                                                                                      Q  CLR                  WPx

                                                     SLEEP                                            RESET                   WRx

                                                                                                                  RRx

                                                                         Synchronizer

                                                                                                                  RPx

                                                                D        Q     D              Q

                                                                                       PINxn

                                                                L        Q                    Q

                                                                                                                  CLKI/O

                                          PUD:       PULL-UP 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 PORTx REGISTER

       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.

9.2.1  Configuring the Pin

       Each port pin consists of three register bits: DDxn, PORTxn, and PINxn. As shown in Section 9.4 “Register Description for

       I/O-Ports” on page 68, 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.

       If PORTxn is written logic one when the pin is configured as an output pin, the port pin is driven high (one). If PORTxn is

       written logic zero when the pin is configured as an output pin, the port pin is driven low (zero).

52     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
9.2.2  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.

9.2.3  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 acceptable, 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 9-1 summarizes the control signals for the pin value.

       Table 9-1.   Port Pin Configurations

                              PUD

       DDxn         PORTxn    (in MCUCR)                     I/O               Pull-up       Comment

       0                 0    X                              Input             No            Default configuration after reset.

                                                                                             Tri-state (Hi-Z)

       0                 1    0                              Input             Yes           Pxn will source current if ext. pulled low.

       0                 1    1                              Input             No            Tri-state (Hi-Z)

       1                 0    X                              Output            No            Output low (sink)

       1                 1    X                              Output            No            Output high (source)

9.2.4  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 9-2, the PINxn register bit and the preceding latch constitute 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 9-3 shows a timing

       diagram of the synchronization when reading an externally applied pin value. The maximum and minimum propagation

       delays are denoted tpd,max and tpd,min respectively.

       Figure 9-3.  Synchronization when Reading an Externally Applied Pin Value

                              SYSTEM CLK

                              INSTRUCTIONS                   XXX               XXX           in r17, PINx

                              SYNC LATCH

                              PINxn

                              r17                                    0x00                                       0xFF

                                                                     tpd, max

                                                                               tpd,     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 indicated 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.

                                                                                        ATmega16/32/64/M1/C1 [DATASHEET]                   53

                                                                                                                      7647O–AVR–01/15
    When reading back a software assigned pin value, a nop instruction must be inserted as indicated in Figure 9-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 9-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

                                                                           tpd

    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.

    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*/

                     _NOP();

                     /*     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.

54  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
9.2.5  Digital Input Enable and Sleep Modes

       As shown in Figure 9-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 Section 9.3

       “Alternate Port Functions” on page 55.

       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 modes, as the clamping in these sleep modes produces the

       requested logic change.

9.3    Alternate Port Functions

       Most port pins have alternate functions in addition to being general digital I/Os. Figure 9-5 shows how the port pin control

       signals from the simplified Figure 9-2 can be overridden 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.

                                               ATmega16/32/64/M1/C1 [DATASHEET]                                                       55

                                               7647O–AVR–01/15
    Figure  9-5.  Alternate  Port  Functions(1)

                                                         PUOExn

                                           1             PUOVxn

                                           0                                                                 PUD

                                                         DDOExn

                                           1             DDOVxn

                                           0                                                    Q        D

                                                                                                   DDxn

                                                                                                Q  CLR

                                                                                                RESET        WDx

                                                                                                             RDx

                                                         PVOExn

                                           1             PVOVxn

            Pxn                                                                                                   1                      DATA BUS

                                           0                                                    Q        D

                                                                                                PORTxn            0

                                                         DIEOExn                                Q  CLR                         PTOExn

                                           1             DIEOVxn                                RESET                          WPx

                                                                                                                      WRx

                                           0             SLEEP                                               RRx

                                                                  Synchronizer

                                                                                                             RPx

                                                               D  SET  Q  D            Q

                                                                                PINxn

                                                               L  CLR  Q        CLR Q

                                                                                                                CLKI/O

                                                                                                                DIxn

                                                                                                                AIOxn

                  PUOExn:   Pxn PULL-UP OVERRIDE ENABLE                                PUD:     PULL-UP 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                    CLK:I/O  I/O CLOCK

                  SLEEP:    SLEEP CONTROL                                              DIxn:    DIGITAL INPUT PIN n ON  PORTx

                  PTOExn:   Pxn, PORT TOGGLE OVERRIDE ENABLE                           AIOxn:   ANALOG INPUT/OUTPUT     PIN n ON  PORTx

    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.

56  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
       Table 9-2 summarizes the function of the overriding signals. The pin and port indexes from Figure 9-5 on page 56 are not

       shown in the succeeding tables. The overriding signals are generated internally in the modules having the alternate function.

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

       Signal Name              Full Name                  Description

                                                           If this signal is set, the pull-up enable is controlled by the PUOV signal. If

       PUOE                     Pull-up override enable    this signal is cleared, the pull-up is enabled when {DDxn, PORTxn, PUD} =

                                                           0b010.

       PUOV                     Pull-up override value     If PUOE is set, the pull-up is enabled/disabled when PUOV is set/cleared,

                                                           regardless of the setting of the DDxn, PORTxn, and PUD register bits.

                                Data direction override    If this signal is set, the output driver enable is controlled by the DDOV

       DDOE                     enable                     signal. If this signal is cleared, the output driver is enabled by the DDxn

                                                           register bit.

       DDOV                     Data direction override    If DDOE is set, the output driver is enabled/disabled when DDOV is

                                value                      set/cleared, regardless of the setting of the DDxn register bit.

                                Port value override        If this signal is set and the output driver is enabled, the port value is

       PVOE                     enable                     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 override value  If PVOE is set, the port value is set to PVOV, regardless of the setting of the

                                                           PORTxn register bit.

       PTOE                     Port toggle override       If PTOE is set, the PORTxn register bit is inverted.

                                enable

                                Digital input enable       If this bit is set, the digital input enable is controlled by the DIEOV signal. If

       DIEOE                    override enable            this signal is cleared, the digital input enable is determined by MCU state

                                                           (normal mode, sleep mode).

       DIEOV                    Digital input enable       If DIEOE is set, the digital Input is enabled/disabled when DIEOV is

                                override value             set/cleared, regardless of the MCU state (normal mode, sleep mode).

                                                           This is the digital input to alternate functions. In the figure, the signal is

       DI                       Digital Input              connected to the output of the schmitt trigger but 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 input/output        This is the analog input/output to/from alternate functions. The 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.

9.3.1  MCU Control Register – MCUCR

            Bit          7             6         5         4              3      2           1      0

                         SPIPS         –         –         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 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).

                                                                                 ATmega16/32/64/M1/C1 [DATASHEET]                              57

                                                                                                                 7647O–AVR–01/15
9.3.2  Alternate Functions of Port B

       The Port B pins with alternate functions are shown in Table 9-3.

       Table 9-3.   Port B Pins Alternate Functions

          Port Pin      Alternate Functions

                        PSCOUT0B (PSC output 0B)

          PB7           ADC4 (Analog Input Channel 4)

                        SCK (SPI Bus Serial Clock)

                        PCINT7 (Pin Change Interrupt 7)

                        ADC7 (Analog Input Channel 7)

          PB6           PSCOUT1B (PSC output 1B)

                        PCINT6 (Pin Change Interrupt 6)

                        ADC6 (Analog Input Channel 6)

                        INT2 (External Interrupt 2)

          PB5           ACMPN1 (analog comparator 1 Negative Input)

                        AMP2- (Analog Differential Amplicator 2 Negative Input)

                        PCINT5 (Pin Change Interrupt 5)

          PB4           AMP0+ (Analog Differential Amplifier 0 Positive Input)

                        PCINT4 (Pin Change Interrupt 4)

          PB3           AMP0- (Analog Differential Amplifier 0 Negative Input)

                        PCINT3 (Pin Change Interrupt 3)

                        ADC5 (Analog Input Channel5 )

          PB2           INT1 (External Interrupt 1)

                        ACMPN0 (analog comparator 0 Negative Input)

                        PCINT2 (Pin Change Interrupt 2)

                        MOSI (SPI Master Out Slave In)

          PB1           PSCOUT2B (PSC output 2B)

                        PCINT1 (Pin Change Interrupt 1)

                        MISO (SPI Master In Slave Out)

          PB0           PSCOUT2A (PSC output 2A)

                        PCINT0 (Pin Change Interrupt 0)

       The alternate pin configuration is as follows:

       •  ADC4/PSCOUT0B/SCK/PCINT7 – Bit 7

       PSCOUT0B, output 0B of PSC.

       ADC4, analog to digital converter, input channel 4.

       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 SPI 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.

       PCINT7, pin change interrupt 7.

       •  ADC7/PSCOUT1B/PCINT6 – Bit 6

       ADC7, analog to digital converter, input channel 7.

       PSCOUT1B, output 1B of PSC.

       PCINT6, pin change interrupt 6.

58     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
•  ADC6/INT2/ACMPN1/AMP2-/PCINT5 – Bit 5

ADC6, analog to digital converter, input channel 6.

INT2, external interrupt source 2. This pin can serve as an External Interrupt source to the MCU.

ACMPN1, analog comparator 1 negative input. Configure the port pin as input with the internal pull-up switched off to avoid

the digital port function from interfering with the function of the analog comparator.

PCINT5, pin change interrupt 5.

•  APM0+/PCINT4 – Bit 4

AMP0+, analog differential amplifier 0 positive input channel.

PCINT4, pin change interrupt 4.

•  AMP0-/PCINT3 – Bit 3

AMP0-, analog differential amplifier 0 negative input channel. Configure the port pin as input with the internal pull-up

switched off to avoid the digital port function from interfering with the function of the analog amplifier.

PCINT3, pin change interrupt 3.

•  ADC5/INT1/ACMPN0/PCINT2 – Bit 2

ADC5, analog to digital converter, input channel 5.

INT1, external interrupt source 1. This pin can serve as an external interrupt source to the MCU.

ACMPN0, analog comparator 0 negative input. Configure the port pin as input with the internal pull-up switched off to avoid

the digital port function from interfering with the function of the analog comparator.

PCINT2, pin change interrupt 2.

•  PCINT1/MOSI/PSCOUT2B – Bit 1

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 DDB1 When the SPI is enabled as a master, the data direction of this pin is controlled

by DDB1. When the pin is forced to be an input, the pull-up can still be controlled by the PORTB1 and PUD bits.

PSCOUT2B, output 2B of PSC.

PCINT1, pin change interrupt 1.

•  PCINT0/MISO/PSCOUT2A – Bit 0

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 DDB0. When the SPI is enabled as a slave, the data direction of this pin is controlled

by DDB0. When the pin is forced to be an input, the pull-up can still be controlled by the PORTB0 and PUD bits.

PSCOUT2A, output 2A of PSC.

PCINT0, pin change interrupt 0.

                                                                ATmega16/32/64/M1/C1 [DATASHEET]                                 59

                                                                                                             7647O–AVR–01/15
    Table 9-4 and Table 9-5 relates the alternate functions of Port B to the overriding  signals shown in Figure 9-5 on page 56.

    Table 9-4.  Overriding Signals for Alternate Functions in PB7..PB4

                     PB7/ADC4/                      PB6/ADC7/                            PB5/ADC6/

                     PSCOUT0B/SCK/                  PSCOUT1B/                            INT2/ACMPN1/       PB4/AMP0+/

    Signal Name      PCINT7                         PCINT6                               AMP2-/PCINT5       PCINT4

    PUOE             SPE  MSTR  SPIPS             0                                    0                  0

    PUOV             PB7 PUD  SPIPS              0                                    0                  0

    DDOE             SPE  MSTR  SPIPS +           PSCen11                              0                  0

                     PSCen01

    DDOV             PSCen01                        1                                    0                  0

    PVOE             SPE  MSTR  SPIPS             PSCen11                              0                  0

                     PSCout01  SPIPS + PSCout01 

    PVOV             PSCen01  SPIPS                PSCOUT11                             0                  0

                     + PSCout01  PSCen01  SPIPS

    DIEOE            ADC4D                          ADC7D                                ADC6D + In2en      AMP0ND

    DIEOV            0                              0                                    In2en              0

    DI               SCKin  SPIPS  ireset         ICP1B                                INT2

    AIO              ADC4                           ADC7                                 ADC6               AMP0+

    Table 9-5.  Overriding Signals for Alternate Functions in PB3..PB0

                                                                                         PB1/MOSI/          PB0/MISO/

                     PB3/AMP0-/                     PB2/ADC5/INT1/                       PSCOUT2B/          PSCOUT2A/

    Signal Name      PCINT3                         ACMPN0/PCINT2                        PCINT1             PCINT0

    PUOE             0                              0                                    –                  –

    PUOV             0                              0                                    –                  –

    DDOE             0                              0                                    –                  –

    DDOV             0                              0                                    –                  –

    PVOE             0                              0                                    –                  –

    PVOV             0                              0                                    –                  –

    DIEOE            AMP0ND                         ADC5D + In1en                        0                  0

    DIEOV            0                              In1en                                0                  0

    DI                                              INT1                                 MOSI_IN  SPIPS   MISO_IN SPIPS       

                                                                                         ireset             ireset

    AIO              AMP0-                          ADC5                                 –                  –

60  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
9.3.3  Alternate Functions of Port C

       The Port C pins with alternate functions are shown in Table 9-6.

       Table 9-6.  Port C Pins Alternate Functions

                   Port Pin               Alternate Function

                                          D2A (DAC output)

                   PC7                    AMP2+ (Analog Differential Amplifier 2 Positive Input)

                                          PCINT15 (Pin Change Interrupt 15)

                                          ADC10 (Analog Input Channel 10)

                   PC6                    ACMP1 (analog comparator 1 Positive Input )

                                          PCINT14 (Pin Change Interrupt 14)

                                          ADC9 (Analog Input Channel 9)

                   PC5                    AMP1+ (Analog Differential Amplifier 1 Input Channel)

                                          ACMP3 (Analog Comparator 3 Positive Input)

                                          PCINT13 (Pin Change Interrupt 13)

                                          ADC8 (Analog Input Channel 8)

                   PC4                    AMP1- (Analog Differential Amplifier 1 Input Channel )

                                          ACMPN3 (Analog Comparator 3 Negative Input)

                                          PCINT12 (Pin Change Interrupt 12)

                                          T1 (Timer 1 clock input)

                   PC3                    RXCAN (CAN Rx Data)

                                          ICP1B (Timer 1 Input Capture Alternate Input)

                                          PCINT11 (Pin Change Interrupt 11)

                                          T0 (Timer 0 clock input)

                   PC2                    TXCAN (CAN Tx Data)

                                          PCINT10 (Pin Change Interrupt 10)

                                          PSCIN1 (PSC 1 Digital Input)

                   PC1                    OC1B (Timer 1 Output Compare B)

                                          SS_A (Alternate SPI Slave Select)

                                          PCINT9 (Pin Change Interrupt 9)

                                          PSCOUT1A (PSC output 2A)

                   PC0                    INT3 (External Interrupt 3)

                                          PCINT8 (Pin Change Interrupt 8)

       Note:       On the engineering samples (Parts marked AT90PWM324), the ACMPN3 alternate     function  is  not  located             on

                   PC4. It is located on PE2.

       The alternate pin configuration is as follows:

       •  D2A/AMP2+/PCINT15 – Bit 7

       D2A, digital to analog output

       AMP2+, analog differential amplifier 2 positive input. Configure the port pin as input with the internal pull-up switched off to

       avoid the digital port function from interfering with the function of the amplifier.

       PCINT15, pin change interrupt 15.

                                                                             ATmega16/32/64/M1/C1 [DATASHEET]                            61

                                                                                                  7647O–AVR–01/15
    •  ADC10/ACMP1/PCINT14 – Bit 6

    ADC10, analog to digital converter, input channel 10.

    ACMP1, analog comparator 1 positive input. Configure the port pin as input with the internal pull-up switched off to avoid the

    digital port function from interfering with the function of the analog comparator.

    PCINT14, pin change interrupt 14.

    •  ADC9/ACMP3/AMP1+/PCINT13 – Bit 5

    ADC9, analog to digital converter, input channel 9.

    ACMP3, analog comparator 3 positive input. Configure the port pin as input with the internal pull-up switched off to avoid the

    digital port function from interfering with the function of the analog comparator.

    AMP1+, analog differential amplifier 1 positive input channel. Configure the port pin as input with the internal pull-up

    switched off to avoid the digital port function from interfering with the function of the analog amplifier.

    PCINT13, pin change interrupt 13.

    •  ADC8/AMP1-/ACMPN3/PCINT12 – Bit 4

    ADC8, analog to digital converter, input channel 8.

    AMP1-, analog differential amplifier 1 negative input channel. Configure the port pin as input with the internal pull-up

    switched off to avoid the digital port function from interfering with the function of the analog amplifier.

    ACMPN3, analog comparator 3 negative input. Configure the port pin as input with the internal pull-up switched off to avoid

    the digital port function from interfering with the function of the analog comparator.

    PCINT12, pin change interrupt 12.

    •  PCINT11/T1/RXCAN/ICP1B – Bit 3

    T1, Timer/Counter1 counter source.

    RXCAN, CAN Rx data.

    ICP1B, input capture pin: The PC3 pin can act as an input capture pin for Timer/Counter1.

    PCINT11, pin change interrupt 11.

    •  PCINT10/T0/TXCAN – Bit 2

    T0, Timer/Counter0 counter source.

    TXCAN, CAN Tx data.

    PCINT10, pin change interrupt 10.

    •  PCINT9/PSCIN1/OC1B/SS_A – Bit 1

    PCSIN1, PSC 1 digital input.

    OC1B, output compare match B output: This pin can serve as an external output for the Timer/Counter1 output compare B.

    The pin has to be configured as an output (DDC1 set “one”) to serve this function. This pin is also the output pin for the PWM

    mode timer function.

    SS_A: Slave port select input. When the SPI is enabled as a slave, this pin is configured as an input regardless of the setting

    of DDD0. 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 DDD0. When the pin is forced to be an input, the pull-up can still be controlled by the PORTD0 bit.

    PCINT9, pin change interrupt 9.

    •  PCINT8/PSCOUT1A/INT3 – Bit 0

    PSCOUT1A, output 1A of PSC.

    INT3, external interrupt source 3: This pin can serve as an external interrupt source to the MCU.

    PCINT8, pin change interrupt 8.

62  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
Table 9-7 and Table 9-8 relate the alternate functions of port C to the overriding signals shown in Figure 9-5 on page 56.

Table 9-7.      Overriding Signals for Alternate Functions in PC7..PC4

                                PC6/ADC10/                              PC5/ADC9/     PC4/ADC8/

                PC7/D2A/AMP2+/  ACMP1/                                  AMP1+/ACMP3/  AMP1-/ACMPN3/

Signal Name     PCINT15         PCINT14                                 PCINT13       PCINT12

PUOE               0                0                                      0

PUOV               0                0                                      0

DDOE            DAEN                0                                      0          0

DDOV               0                0                                      0          0

PVOE               0                0                                      0          –

PVOV               0                0                                      0          –

DIEOE           DAEN            ADC10D                                  ADC9D         ADC8D

DIEOV              0                0                                      0          0

            DI

AIO                –            ADC10 Amp1                              ADC9 Amp1+    ADC8 Amp1-

                                                                                      ACMPN3

Table 9-8.      Overriding Signals for Alternate Functions in PC3..PC0

                                                                        PC1/PSCIN1/   PC0/INT3/

                PC3/T1/RXCAN/   PC2/T0/TXCAN/                           OC1B/SS_A/    PSCOUT1A/

Signal Name     ICP1B/PCINT11   PCINT10                                 PCINT9        PCINT8

PUOE            0               0                                       0             0

PUOV            0               0                                       0             0

DDOE                                                                    0             PSCen10

DDOV            1               1                                       0             1

PVOE                                                                    OC1Ben        PSCen10

PVOV                                                                    OC1B          PSCout10

DIEOE                                                                                 In3en

DIEOV                                                                                 In3en

            DI  T1              T0                                      PSCin1        INT3

                                                                        SS_A

AIO

                                               ATmega16/32/64/M1/C1 [DATASHEET]                                             63

                                                                                      7647O–AVR–01/15
9.3.4  Alternate Functions of Port D

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

       Table 9-9.   Port D Pins Alternate Functions

          Port Pin      Alternate Function

          PD7           ACMP0 (Analog Comparator 0 Positive Input)

                        PCINT23 (Pin Change Interrupt 23)

                        ADC3 (Analog Input Channel 3)

          PD6           ACMPN2 (Analog Comparator 2 Negative Input)

                        INT0 (External Interrupt 0)

                        PCINT22 (Pin Change Interrupt 22)

                        ADC2 (Analog Input Channel 2)

          PD5           ACMP2 (Analog Comparator 2 Positive Input)

                        PCINT21 (Pin Change Interrupt 21)

                        ADC1 (Analog Input Channel 1)

                        RXD/RXLIN (LIN/UART Rx Data)

          PD4           ICP1A (Timer 1 Input Capture)

                        SCK_A (Programming and Alternate SPI Clock)

                        PCINT20 (Pin Change Interrupt 20)

                        TXD/TXLIN (LIN/UART Tx Data)

                        OC0A (Timer 0 Output Compare A)

          PD3           SS (SPI Slave Select)

                        MOSI_A (Programming and Alternate SPI Master Out Slave In)

                        PCINT19 (Pin Change Interrupt 19)

                        PSCIN2 (PSC Digital Input 2)

          PD2           OC1A (Timer 1 Output Compare A)

                        MISO_A (Programming and Alternate Master In SPI Slave Out)

                        PCINT18 (Pin Change Interrupt 18)

                        PSCIN0 (PSC Digital Input 0)

          PD1           CLKO (System Clock Output)

                        PCINT17 (Pin Change Interrupt 17)

          PD0           PSCOUT0A (PSC Output 0A)

                        PCINT16 (Pin Change Interrupt 16)

       The alternate pin configuration is as follows:

       •  ACMP0/PCINT23 – Bit 7

       ACMP0, analog comparator 0 positive input. Configure the port pin as input with the internal pull-up switched off to avoid the

       digital port function from interfering with the function of the analog comparator.

       PCINT23, pin change interrupt 23.

       •  ADC3/ACMPN2/INT0/PCINT22 – Bit 6

       ADC3, analog to digital converter, input channel 3.

       ACMPN2, analog comparator 2 negative input. Configure the port pin as input with the internal pull-up switched off to avoid

       the digital port function from interfering with the function of the analog comparator.

       INT0, external interrupt source 0. This pin can serve as an external interrupt source to the MCU.

       PCINT22, pin change interrupt 23.

64     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
•  ADC2/ACMP2/PCINT21 – Bit 5

ADC2, analog to digital converter, input channel 2.

ACMP2, analog comparator 1 positive input. Configure the port pin as input with the internal pull-up switched off to avoid the

digital port function from interfering with the function of the analog comparator.

PCINT21, pin change interrupt 21.

•  PCINT20/ADC1/RXD/RXLIN/ICP1/SCK_A – Bit 4

ADC1, analog to digital converter, input channel 1.

RXD/RXLIN, LIN/UART receive pin. Receive data (data input pin for the LIN/UART). When the LIN/UART receiver is

enabled this pin is configured as an input regardless of the value of DDRD4. When the UART forces this pin to be an input,

a logical one in PORTD4 will turn on the internal pull-up.

ICP1, input capture pin1: This pin can act as an input capture pin for Timer/Counter1.

SCK_A: 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 DDD4. When the SPI is enabled as a master, the data direction of this pin is

controlled by DDD4. When the pin is forced to be an input, the pull-up can still be controlled by the PORTD4 bit.

PCINT20, pin change interrupt 20.

•  PCINT19/TXD/TXLIN/OC0A/SS/MOSI_A, Bit 3

TXD/TXLIN, LIN/UART transmit pin. Data output pin for the LIN/UART. When the LIN/UART Transmitter is enabled, this pin

is configured as an output regardless of the value of DDD3.

OC0A, output compare match A output: This pin can serve as an external output for the Timer/Counter0 output compare A.

The pin has to be configured as an output (DDD3 set “one”) to serve this function. The OC0A pin is also the output pin for the

PWM mode

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

DDD3. 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 DDD3. When the pin is forced to be an input, the pull-up can still be controlled by the PORTD3 bit.

MOSI_A: 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 DDD3 When the SPI is enabled as a master, the data direction of this pin is controlled

by DDD3. When the pin is forced to be an input, the pull-up can still be controlled by the PORTD3 bit.

PCINT19, pin change Interrupt 19.

•  PCINT18/PSCIN2/OC1A/MISO_A, Bit 2

PCSIN2, PSC digital input 2.

OC1A, output compare match A output: This pin can serve as an external output for the Timer/Counter1 output compare A.

The pin has to be configured as an output (DDD2 set “one”) to serve this function. The OC1A pin is also the output pin for the

PWM mode timer function.

MISO_A: 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 DDD2. When the SPI is enabled as a slave, the data direction of this pin is

controlled by DDD2. When the pin is forced to be an input, the pull-up can still be controlled by the PORTD2 bit.

PCINT18, pin change interrupt 18.

•  PCINT17/PSCIN0/CLKO – Bit 1

PCSIN0, PSC digital input 0.

CLKO, divided system clock: The divided system clock can be output on this pin. The divided system clock will be output if

the CKOUT fuse is programmed, regardless of the PORTD1 and DDD1 settings. It will also be output during reset.

PCINT17, pin change interrupt 17.

•  PCINT16/PSCOUT0A – Bit 0

PSCOUT0A: Output 0 of PSC 0.

PCINT16, pin change interrupt 16.

                                                             ATmega16/32/64/M1/C1 [DATASHEET]                                     65

                                                                                                        7647O–AVR–01/15
    Table 9-10 and Table 9-11 relates the alternate functions of Port D to the overriding signals shown  in Figure 9-5 on page 56.

    Table 9-10.  Overriding Signals for Alternate Functions PD7..PD4

                     PD7/                    PD6/ADC3/                                                   PD4/ADC1/RXD/

                     ACMP0/                  ACMPN2/INT0/                PD5/ADC2/                       RXLIN/ICP1A/

    Signal Name      PCINT23                 PCINT22                     ACMP2/PCINT21                   SCK_A/PCINT20

    PUOE             0                       0                           0                               RXEN + SPE •

                                                                                                         MSTR  SPIPS

    PUOV             0                       0                           0                               PD4  PUD

    DDOE             0                       0                           0                               RXEN + SPE 

                                                                                                         MSTR  SPIPS

    DDOV             0                       0                           0                               0

    PVOE             0                       0                           0                               SPE  MSTR  SPIPS

    PVOV             0                       0                           0                               –

    DIEOE            ACMP0D                  ADC3D + In0en               ADC2D                           ADC1D

    DIEOV            0                       In0en                       0                               0

    DI               –                       INT0                                                        ICP1A

    AIO              ACOMP0                  ADC3                        ADC2                            ADC1

                                             ACMPM                       ACOMP2

    Table 9-11.  Overriding Signals for Alternate Functions in PD3..PD0

                     PD3/TXD/TXLIN/          PD2/PSCIN2/                 PD1/PSCIN0/

                     OC0A/SS/MOSI_A/         OC1A/MISO_A/                CLKO/                           PD0/PSCOUT0A/

    Signal Name      PCINT19                 PCINT18                     PCINT17                         XCK/PCINT16

    PUOE             TXEN + SPE                      –                     0                            SPE 

                     MSTR  SPIPS                                                                        MSTR  SPIPS

    PUOV             TXEN  SPE  MSTR               –                     0                            PD0  PUD

                     SPIPS  PD3  PUD

    DDOE             TXEN + SPE                      –                     0                            PSCen00 + SPE 

                     MSTR  SPIPS                                                                        MSTR  SPIPS

    DDOV             TXEN                             0                     0                            PSCen00

    PVOE             TXEN + OC0en + SPE              –                     0                            PSCen00 + UMSEL

                     MSTR  SPIPS

                     TXEN  TXD + TXEN 

    PVOV             (OC0en  OC0 + OC0en            –                     0                            –

                     SPIPS  MOSI)

    DIEOE               0                             0                     0                            0

    DIEOV               0                             0                     0                            0

    DI                  SS

                     MOSI_Ain

    AIO

66  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
9.3.5  Alternate Functions of Port E

       The Port E pins with alternate functions are shown in Table 9-12.

       Table 9-12.    Port E Pins Alternate Functions

          Port Pin    Alternate Function

                      XTAL2 (XTAL Output)

              PE2     ADC0 (Analog Input Channel 0)

                      PCINT26 (Pin Change Interrupt 26)

                      XTAL1 (XTAL Input)

              PE1     OC0B (Timer 0 Output Compare B)

                      PCINT25 (Pin Change Interrupt 25)

                      RESET# (Reset Input)

              PE0     OCD (On Chip Debug I/O)

                      PCINT24 (Pin Change Interrupt 24)

       Note:          On the engineering samples (Parts marked  AT90PWM324),          the  ACMPN3  alternate  function  is  not  located  on

                      PC4. It is located on PE2.

       The alternate  pin configuration is as follows:

       •  PCINT26/XTAL2/ADC0 – Bit 2

       XTAL2: Chip clock oscillator pin 2. Used as clock pin for crystal oscillator or low-frequency crystal oscillator. When used as a

       clock pin, the pin can not be used as an I/O pin.

       ADC0, analog to digital converter, input channel 0.

       PCINT26, pin change interrupt 26.

       •  PCINT25/XTAL1/OC0B – Bit 1

       XTAL1: Chip clock oscillator pin 1. Used for all chip clock sources except internal calibrated RC oscillator. When used as a

       clock pin, the pin can not be used as an I/O pin.

       OC0B, output compare Match B output: This pin can serve as an external output for the Timer/Counter0 output compare B.

       The pin has to be configured as an output (DDE1 set “one”) to serve this function. This pin is also the output pin for the PWM

       mode timer function.

       PCINT25, pin change interrupt 25.

       •  PCINT24/RESET/OCD – Bit 0

       RESET, reset pin: When the RSTDISBL Fuse is programmed, this pin functions as a normal I/O pin, and the part will have to

       rely on power-on reset and brown-out reset as its reset sources. When the RSTDISBL Fuse is unprogrammed, the reset

       circuitry is connected to the pin, and the pin can not be used as an I/O pin.

       If PE0 is used as a reset pin, DDE0, PORTE0 and PINE0 will all read 0.

       PCINT24, pin change interrupt 24.

                                                                               ATmega16/32/64/M1/C1 [DATASHEET]                           67

                                                                                                              7647O–AVR–01/15
       Table 9-13 relates the alternate functions of Port E to the overriding signals shown in Figure       9-5  on  page 56.

       Table  9-13.   Overriding  Signals  for Alternate Functions     in  PE2..PE0

                                           PE2/ADC0/XTAL2/                 PE1/XTAL1/OC0B/                             PE0/RESET/

              Signal Name                       PCINT26                              PCINT25                         OCD/PCINT24

                      PUOE                         0                                 0                                  0

                      PUOV                         0                                 0                                  0

                      DDOE                         0                                 0                                  0

                      DDOV                         0                                 0                                  0

                      PVOE                         0                                 OC0Ben                             0

                      PVOV                         0                                 OC0B                               0

                   DIEOE                          ADC0D                              0                                  0

                   DIEOV                           0                                 0                                  0

                      DI

                      AIO                     Osc Output                   Osc / Clock input

                                                  ADC0

9.4    Register Description for I/O-Ports

9.4.1  Port B Data Register – PORTB

       Bit                  7     6        5            4           3      2            1              0

                      PORTB7    PORTB6     PORTB5  PORTB4   PORTB3         PORTB2    PORTB1   PORTB0             PORTB

       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

9.4.2  Port B Data Direction Register – DDRB

       Bit                  7     6        5            4           3      2            1              0

                        DDB7      DDB6     DDB5       DDB4  DDB3           DDB2      DDB1     DDB0               DDRB

       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

9.4.3  Port B Input Pins Address – PINB

       Bit                  7     6        5            4           3      2            1              0

                        PINB7     PINB6    PINB5   PINB4    PINB3          PINB2     PINB1    PINB0              PINB

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

       Initial Value       N/A    N/A      N/A        N/A   N/A            N/A          N/A            N/A

9.4.4  Port C Data Register – PORTC

       Bit                  7     6        5            4           3      2            1              0

                      PORTC7    PORTC6     PORTC5  PORTC4   PORTC3         PORTC2    PORTC1   PORTC0             PORTC

       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

68     ATmega16/32/64/M1/C1 [DATASHEET]

       7647O–AVR–01/15
9.4.5   Port C Data Direction Register – DDRC

        Bit            7       6          5    4       3       2       1       0

                       DDC7    DDC6    DDC5    DDC4    DDC3    DDC2    DDC1    DDC0    DDRC

        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

9.4.6   Port C Input Pins Address – PINC

        Bit            7       6          5    4       3       2       1       0

                       PINC7   PINC6   PINC5   PINC4   PINC3   PINC2   PINC1   PINC0   PINC

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

        Initial Value  N/A     N/A     N/A     N/A     N/A     N/A     N/A     N/A

9.4.7   Port D Data Register – PORTD

        Bit            7       6          5    4       3       2       1       0

                       PORTD7  PORTD6  PORTD5  PORTD4  PORTD3  PORTD2  PORTD1  PORTD0  PORTD

        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

9.4.8   Port D Data Direction Register – DDRD

        Bit            7       6          5    4       3       2       1       0

                       DDD7    DDD6    DDD5    DDD4    DDD3    DDD2    DDD1    DDD0    DDRD

        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

9.4.9   Port D Input Pins Address – PIND

        Bit            7       6          5    4       3       2       1       0

                       PIND7   PIND6   PIND5   PIND4   PIND3   PIND2   PIND1   PIND0   PIND

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

        Initial Value  N/A     N/A     N/A     N/A     N/A     N/A     N/A     N/A

9.4.10  Port E Data Register – PORTE

        Bit            7       6          5    4       3       2       1       0

                       –       –          –    –       –       PORTE2  PORTE1  PORTE0  PORTE

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

        Initial Value  0       0          0    0       0       0       0       0

9.4.11  Port E Data Direction Register – DDRE

        Bit            7       6          5    4       3       2       1       0

                       –       –          –    –       –       DDE2    DDE1    DDE0    DDRE

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

        Initial Value  0       0          0    0       0       0       0       0

9.4.12  Port E Input Pins Address – PINE

        Bit            7       6          5    4       3       2       1       0

                       –       –          –    –       –       PINE2   PINE1   PINE0   PINE

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

        Initial Value  0       0          0    0       0       N/A     N/A     N/A

                                                                  ATmega16/32/64/M1/C1 [DATASHEET]      69

                                                                                       7647O–AVR–01/15
10.   External Interrupts

      The external interrupts are triggered by the INT3:0 pins or any of the PCINT23..0 pins. Observe that, if enabled, the

      interrupts will trigger even if the INT3:0 or PCINT23..0 pins are configured as outputs. This feature provides a way of

      generating a software interrupt. The pin change interrupt PCI2 will trigger if any enabled PCINT23..16 pin toggles. The pin

      change interrupt PCI1 will trigger if any enabled PCINT14..8 pin toggles. The pin change interrupt PCI0 will trigger if any

      enabled PCINT7..0 pin toggles. The PCMSK3, PCMSK2, PCMSK1 and PCMSK0 registers control which pins contribute to

      the pin change interrupts. Pin change interrupts on PCINT26..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 INT3:0 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 register A – EICRA. When the INT3:0 interrupts are enabled and are configured as level

      triggered, the interrupts will trigger as long as the pin is held low. Note that recognition of falling or rising edge interrupts on

      INT3:0 requires the presence of an I/O clock, described in Section 5.1 “Clock Systems and their Distribution” on page 25.

      Low level interrupt on INT3:0 is detected asynchronously. This implies that this interrupt 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 interrupt will be generated. The start-up time is defined by the SUT and CKSEL Fuses as

      described in Section 5.1 “Clock Systems and their Distribution” on page 25.

10.1  Pin Change Interrupt Timing

      An example of timing of a pin change interrupt is shown in Figure 10-1

      Figure 10-1.  Timing of a Pin Change Interrupts

                                                                                        0

                                                                                                      pcint_sync     pcint_set/flag

      PCINT[i]                      pin_lat        pin_sync                pcint_in[i]                                                  PCIFn

                       D   Q                 D  Q                                               D  Q  D           Q  D               Q

      pin                                                                                                                               (interrupt flag)

                       LE                                                               7

           clk                                               PCINT[i] bit                  clk

                                                             (of PCMSKn)

                           clk

                    PCINT[i] pin

                       pin_lat

                       pin_sync

                       pcint_in[i]

                       pcint_sync

                    pcint_set/flag

                       PCIFn

70    ATmega16/32/64/M1/C1 [DATASHEET]

      7647O–AVR–01/15
10.2    External Interrupt Control Register A – EICRA

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

               Bit        7                  6  5            4      3      2      1                         0

                          ISC31     ISC30       ISC21        ISC20  ISC11  ISC10  ISC01                ISC00      EICRA

           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 – ISC31, ISC30 - ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0

        The external interrupts 3 - 0 are activated by the external pins INT3: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 interrupt are defined in Table 10-1.

        Edges on INT3..INT0 are registered asynchronously. The value on the INT3:0 pins are sampled before detecting edges. If

        edge or toggle interrupt is selected, pulses that last longer than one clock period will generate an interrupt. Shorter pulses

        are not guaranteed to generate an interrupt. Observe that CPU clock frequency can be lower than XTAL frequency if the

        XTAL divider is enabled. If low level interrupt is selected, the low level must be held until the completion 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.

        Table 10-1.       Interrupt Sense Control(1)

           ISCn1          ISCn0                 Description

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

               0                 1              Any logical change on INTn generates an interrupt request.

               1                 0              The falling edge between two samples of INTn generates an interrupt request.

               1                 1              The rising edge between two samples of INTn generates an interrupt request.

        Note:       1.    n = 3, 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.

10.2.1  External Interrupt Mask Register – EIMSK

               Bit        7                  6  5            4      3      2      1                         0

                          –                  –  –            –      INT3   INT2   INT1                      INT0  EIMSK

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

           Initial Value  0                  0  0            0      0      0      0                         0

        •  Bit 7..4 – Res: Reserved Bits

        These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

        •  Bit 3..0 – INT3 - 0: External Interrupt Request 3:0 Enable

        When an INT3 – INT0 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 A - 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.

                                                                              ATmega16/32/64/M1/C1 [DATASHEET]                                  71

                                                                                                                  7647O–AVR–01/15
10.2.2  External Interrupt Flag Register – EIFR

           Bit            7  6            5              4          3      2             1      0

                          –  –            –              –          INTF3  INTF2         INTF1  INTF0  EIFR

           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 7..4 – Res: Reserved Bits

        These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

        •  Bit 3..0 – INTF3 - INTF0: External Interrupt Flag 3 - 0

        When an edge or logic change on the INT3:0 pin triggers an interrupt request, INTF3:0 becomes set (one). If the I-bit in

        SREG and the corresponding interrupt enable bit INT3: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 INT3:0 are configured as a level interrupt.

10.2.3  Pin Change Interrupt Control Register - PCICR

           Bit            7  6            5              4          3      2             1      0

                          –  –            –              –          PCIE3  PCIE2         PCIE1  PCIE0  PCICR

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

           Initial Value  0  0            0              0          0      0             0      0

        •  Bit 7..4 - Res: Reserved Bits

        These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

        •  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 PCINT26..24 pin will cause an interrupt. The corresponding interrupt of pin change interrupt request

        is executed from the PCI3 interrupt vector. PCINT26..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 interrupt. 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 interrupt. 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.

        •  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.

72      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
10.2.4  Pin Change Interrupt Flag Register - PCIFR

           Bit               7        6        5          4             3  2        1          0

                             –        –        –          –   PCIF3        PCIF2    PCIF1      PCIF0               PCIFR

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

           Initial Value     0        0        0          0             0  0        0          0

        •  Bit 7..4 - Res: Reserved Bits

        These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

        •  Bit 3 - PCIF3: Pin Change Interrupt Flag 3

        When a logic change on any PCINT26..24 pin triggers an interrupt request, PCIF3 becomes set (one). If the I-bit in SREG

        and the PCIE3 bit in PCICR are set (one), the MCU will jump to the corresponding 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.

        •  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 PCICR are set (one), the MCU will jump to the corresponding 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.

        •  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 PCICR are set (one), the MCU will jump to the corresponding 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.

        •  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 PCICR are set (one), the MCU will jump to the corresponding 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.

10.2.5  Pin Change Mask Register 3 – PCMSK3

           Bit            7        6        5          4      3            2        1          0

                          -        -        -          -          -        PCINT26  PCINT25    PCINT24             PCMSK3

           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..3 – Res: Reserved Bit

        These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

        •  Bit 2..0 – PCINT26..24: Pin Change Enable Mask 26..24

        Each PCINT26..24-bit selects whether pin change interrupt is enabled on the corresponding I/O pin. If PCINT26..24 is set

        and the PCIE3 bit in PCICR is set, pin change interrupt is enabled on the corresponding I/O pin. If PCINT23..24 is cleared,

        pin change interrupt on the corresponding I/O pin is disabled.

10.2.6  Pin Change Mask Register 2 – PCMSK2

           Bit            7        6        5          4      3            2        1          0

                          PCINT23  PCINT22  PCINT21  PCINT20  PCINT19      PCINT18  PCINT17    PCINT16             PCMSK2

           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 – 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.

                                                                              ATmega16/32/64/M1/C1 [DATASHEET]                       73

                                                                                                                   7647O–AVR–01/15
10.2.7  Pin Change Mask Register 1 – PCMSK1

           Bit            7           6     5                4      3        2        1       0

                          PCINT15  PCINT14  PCINT13  PCINT12        PCINT11  PCINT10  PCINT9  PCINT8  PCMSK1

           Read/Write     R        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 – Res: Reserved Bit

        This bit is an unused bit in the ATmega16/32/64/M1/C1, and will always read as zero.

        •  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 PCICR 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.

10.2.8  Pin Change Mask Register 0 – PCMSK0

           Bit            7           6     5                4      3        2        1       0

                          PCINT7   PCINT6   PCINT5   PCINT4         PCINT3   PCINT2   PCINT1  PCINT0  PCMSK0

           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 corresponding I/O pin. If PCINT7..0 is cleared,  pin      change

        interrupt on the corresponding I/O pin is disabled.

74      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
11.   Timer/Counter0 and Timer/Counter1 Prescalers

      Timer/Counter1 and Timer/Counter0 share the same prescaler module, but the Timer/Counters can have different prescaler

      settings. The description below applies to both Timer/Counter1 and Timer/Counter0.

11.1  Internal Clock Source

      The Timer/Counter can be clocked directly by the system clock (by setting the CSn2:0 = 1). This provides the fastest

      operation, with a maximum Timer/Counter clock frequency equal to system clock frequency (fCLK_I/O). Alternatively, one of
      four taps from the prescaler can be used as a clock source. The prescaled clock has a frequency of either fCLK_I/O/8,
      fCLK_I/O/64, fCLK_I/O/256, or fCLK_I/O/1024.

11.2  Prescaler Reset

      The prescaler is free running, i.e., operates independently of the clock select logic of the Timer/Counter, and it is shared by

      Timer/Counter1 and Timer/Counter0. Since the prescaler is not affected by the Timer/Counter’s clock select, the state of the

      prescaler will have implications for situations where a prescaled clock is used. One example of prescaling artifacts occurs

      when the timer is enabled and clocked by the prescaler (6 > CSn2:0 > 1). The number of system clock cycles from when the

      timer is enabled to the first count occurs can be from 1 to N+1 system clock cycles, where N equals the prescaler divisor (8,

      64, 256, or 1024).

      It is possible to use the prescaler reset for synchronizing the Timer/Counter to program execution. However, care must be

      taken if the other Timer/Counter that shares the same prescaler also uses prescaling. A prescaler reset will affect the

      prescaler period for all Timer/Counters it is connected to.

11.3  External Clock Source

      An external clock source applied to the Tn pin can be used as Timer/Counter clock (clkT1/clkT0). The Tn pin is sampled once
      every system clock cycle by the pin synchronization logic. The synchronized (sampled) signal is then passed through the

      edge detector. Figure 11-1 shows a functional equivalent block diagram of the Tn/T0 synchronization and edge detector

      logic. The registers are clocked at the positive edge of the internal system clock (clkI/O). The latch is transparent in the high
      period of the internal system clock.

      The edge detector generates one clkT1/clkT0 pulse for each positive (CSn2:0 = 7) or negative (CSn2:0 = 6) edge it detects.

      Figure 11-1. Tn Pin Sampling

      Tn                  D   Q                D    Q                              D      Q                 Tn_sync

                                                                                                            (to Clock

                                                                                                            Select Logic)

                          LE

      clkI/O

                                 Synchronization                                             Edge Detector

      The synchronization and edge detector logic introduces a delay of 2.5 to 3.5 system clock cycles from an edge has been

      applied to the Tn/T0 pin to the counter is updated.

      Enabling and disabling of the clock input must be done when Tn/T0 has been stable for at least one system clock cycle,

      otherwise it is a risk that a false Timer/Counter clock pulse is generated.

      Each half period of the external clock applied must be longer than one system clock cycle to ensure correct sampling. The

      external clock must be guaranteed to have less than half the system clock frequency (fExtClk < fclk_I/O/2) given a 50/50% duty
      cycle. Since the edge detector uses sampling, the maximum frequency of an external clock it can detect is half the sampling

      frequency (Nyquist sampling theorem). However, due to variation of the system clock frequency and duty cycle caused by

      Oscillator source (crystal, resonator, and capacitors) tolerances, it is recommended that maximum frequency of an external

      clock source is less than fclk_I/O/2.5.

      An external clock source can not be prescaled.

                                                                                   ATmega16/32/64/M1/C1 [DATASHEET]                      75

                                                                                             7647O–AVR–01/15
        Figure 11-2.      Prescaler  for  Timer/Counter0  and   Timer/Counter1(1)

               clkI/O                                           Clear                        10-bit T/C Prescaler

                                                                          CK/8                  CK/64              CK/256         CK/1024

           PSRSYNC

                    T0       Synchronization

                    T1       Synchronization              0                                                        0

                                              CS10                                              CS00

                                              CS11                                              CS01

                                              CS12                                              CS02

                                                                Timer/Counter1 Clock Source                                Timer/Counter0 Clock Source

                                                                   clkT1                                                          clkT0

        Note:       1.    The synchronization logic on the input pins (Tn) is shown in Figure 11-1.

11.3.1  General Timer/Counter Control Register – GTCCR

               Bit           7            6         5        4  3         2                  1         0

                             TSM     ICPSEL1        –        –  –         –                  –         PSRSYNC             GTCCR

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

           Initial Value     0            0         0        0  0         0                  0         0

        •  Bit 7 – TSM: Timer/Counter Synchronization Mode

        Writing the TSM bit to one activates the Timer/Counter synchronization mode. In this mode, the value that is written to the

        PSRSYNC bit is kept, hence keeping the corresponding prescaler reset signals asserted. This ensures that the

        corresponding Timer/Counters are halted and can be configured to the same value without the risk of one of them advancing

        during configuration. When the TSM bit is written to zero, the PSRSYNC bit is cleared by hardware, and the Timer/Counters

        start counting simultaneously.

        •  Bit6 – ICPSEL1: Timer 1 Input Capture Selection

        Timer 1 capture function has two possible inputs ICP1A (PD4) and ICP1B (PC3). The selection is made thanks to ICPSEL1

        bit as described in Table 11-1.

        Table 11-1.       ICPSEL1

                    ICPSEL1          Description

                          0          Select ICP1A as trigger for timer 1 input capture

                          1          Select ICP1B as trigger for timer 1 input capture

        •  Bit 0 – PSRSYNC: Prescaler Reset

        When this bit is one, Timer/Counter1 and Timer/Counter0 prescaler will be Reset. This bit is normally cleared immediately by

        hardware, except if the TSM bit is set. Note that Timer/Counter1 and Timer/Counter0 share the same prescaler and a reset

        of this prescaler will affect both timers.

76      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
12.   8-bit Timer/Counter0 with PWM

      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 management) and wave generation. The main features

      are:

      ●       Two independent output compare units

      ●       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)

12.1  Overview

      A simplified block diagram of the 8-bit Timer/Counter is shown in Figure 12-1. For the actual placement of I/O pins, refer to

      Section 2.3 “Pin Descriptions” on page 9. CPU accessible I/O registers, including I/O bits and I/O pins, are shown in bold.

      The device-specific I/O Register and bit locations are listed in Section 12.8 “8-bit Timer/Counter Register Description” on

      page 86.

      The PRTIM0 bit in Section 6.6 “Power Reduction Register” on page 36 must be written to zero to enable Timer/Counter0

      module.

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

                                                                                                 TOVn (Int. Req.)

                                                        Count

                                                        Clear   Control Logic          Clock Select

                                                     Direction                         Edge

                                                                                clkTn  Detector          Tn

                                                                TOP      BOTTOM        (from Prescaler)

                                   Timer/Counter

                                   TCNTn

                                                                      =         =0

                                                                                                 OCnA (Int. Req.)

                                              =                                        Waveform          OCnA

                                                                                       Generation

                                   OCRnx

                                                                         Fixed

                     DATA BUS                                            TOP

                                                                         Value                   OCnB (Int. Req.)

                                              =                                        Waveform          OCnB

                                                                                       Generation

                                   OCRnx

                                   TCCRnA                             TCCRnB

                                                                               ATmega16/32/64/M1/C1 [DATASHEET]                      77

                                                                                                         7647O–AVR–01/15
12.1.1  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 compare 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 12-1 are also used extensively throughout the document.

        Table 12-1.     Definitions

        Definitions

        BOTTOM                       The counter reaches the BOTTOM when it becomes 0x00.

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

                                     The counter reaches the TOP when it becomes equal to the highest value in the count

        TOP                          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 dependent on the mode of operation.

12.1.2  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 interrupt 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 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 generator to generate a PWM or variable frequency output on

        the output compare pins (OC0A and OC0B). See Section 13.6.3 “Using the Output Compare Unit” on page 101 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.

12.2    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 prescaler, see Section 11. “Timer/Counter0 and Timer/Counter1 Prescalers” on page 75.

12.3    Counter Unit

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

        of the counter and its surroundings.

        Figure 12-2. Counter Unit Block Diagram

                         DATA BUS                                          TOVn

                                                                           (Int. Req.)

                                                                                           Clock Select

                                                 count                                     Edge

                                                 clear                     clkTn           Detector          Tn

                         TCNTn                              Control Logic

                                                 direction

                                                                                           (from Prescaler)

                                                 bottom     top

78      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
      Signal description (internal signals):

      ●  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 Section 12.6

      “Modes of Operation” on page 81.

      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.

12.4  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 executed. 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 (Section 12.6 “Modes of Operation” on page 81).

      Figure 12-3 shows a block diagram of the output compare unit.

      Figure 12-3. Output Compare Unit, Block Diagram

                                                             DATA BUS

                                                   OCRnx                            TCNTn

                                                          =  (8-bit Comparator)

                                                                                    OCFnx  (Int. Req.)

                                              Top

                           Bottom                         Waveform Generator               OCnx

                           FOCn

                                                          WGMn1:0         COMnx1:0

                                                                          ATmega16/32/64/M1/C1 [DATASHEET]                          79

                                                                                                        7647O–AVR–01/15
        The OCR0x registers are double buffered when using any of the 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 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 disabled the CPU will access the OCR0x directly.

12.4.1  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).

12.4.2  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 initialized to the same value as TCNT0 without triggering an

        interrupt when the Timer/Counter clock is enabled.

12.4.3  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 generation. Similarly, do not write the TCNT0 value equal to BOTTOM when the counter is downcounting.

        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 compare (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.

12.5    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 12-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”.

80      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
        Figure 12-4. Compare Match Output Unit, Schematic

                            COMnx1

                            COMnx0  Waveform               D        Q

                            FOCn    Generator

                                                                       1

                                                                                                           OCnx

                                                              OCnx                                               Pin

                                                                       0

                                                           D        Q

                                    DATA BUS               PORT

                                                           D        Q

                            clkI/O                            DDR

        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 output) 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 visible 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 output is enabled. Note that

        some COM0x1:0 bit settings are reserved for certain modes of operation. See Section 12.8 “8-bit Timer/Counter Register

        Description” on page 86.

12.5.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 12-2 on page 87. For fast PWM mode, refer to

        Table 12-3 on page 87, and for phase correct PWM refer to Table 12-4 on page 87.

        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.

12.6    Modes of Operation

        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 output 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 12.5 “Compare Match Output

        Unit” on page 80).

        For detailed timing information refer to Section 12.7 “Timer/Counter Timing Diagrams” on page 85.

                                                                       ATmega16/32/64/M1/C1 [DATASHEET]                               81

                                                                                                                 7647O–AVR–01/15
12.6.1  Normal Mode

        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 bottom (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 output compare to generate

        waveforms in normal mode is not recommended, since this will occupy too much of the CPU time.

12.6.2  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 12-5. The counter value (TCNT0) increases until a compare match

        occurs between TCNT0 and OCR0A, and then counter (TCNT0) is cleared.

        Figure 12-5. CTC Mode, Timing Diagram

                                                                                                       OCnx Interrupt

                                                                                                       Flag Set

                  TCNTn

                  OCnx                                                                                 (COMnx1:0 = 1)

                  (Toggle)

                  Period    1                                               2  3  4

        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 running 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  =  -----------------f--c--l-k---_--I--/-O------------------
                  2  N  1 + OCRnx

        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.

82      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
12.6.3  Fast PWM Mode

        The fast pulse width modulation or fast PWM mode (WGM02:0 = 3 or 7) provides a high frequency 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 BOTTOM. 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 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 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 PWM mode is shown in Figure 12-6. The TCNT0 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 TCNT0 slopes represent compare matches between OCR0x

        and TCNT0.

        Figure 12-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 interrupt 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 12-6 on page 88). 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 generated 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    =  -f--c--l-k---_--I--/-O--
                       N  256

        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.)

                                                                                 ATmega16/32/64/M1/C1 [DATASHEET]                      83

                                                                                          7647O–AVR–01/15
        A frequency (with 50% duty cycle) waveform output in fast PWM mode can be achieved by setting 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 feature is similar to the OC0A toggle in CTC mode, except the double buffer feature of the

        output compare unit is enabled in the fast PWM mode.

12.6.4  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 BOTTOM. 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 downcounting. 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 symmetric 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 12-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 12-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 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 12-7 on page 88). 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 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 frequency for the

        output when using phase correct PWM can be calculated by the following equation:

        fOCnxPCPWM       =  -f--c--l-k---_--I--/-O--
                            N  510

        The N variable represents the prescale factor (1, 8, 64, 256, or 1024).

84      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
      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 12-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 BOTTOM. There are two cases that give a transition without

      compare match.

      ●  OCRnx changes its value from MAX, like in Figure 12-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 OCnx 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 OCRnx, and for that reason misses the compare match

         and hence the OCnx change that would have happened on the way up.

12.7  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 12-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 12-8. Timer/Counter Timing Diagram, no Prescaling

                      clkI/O

                      clkTn

               (clkI/O/1)

                      TCNTn   MAX - 1  MAX                                     BOTTOM  BOTTOM + 1

                      TOVn

      Figure 12-9 shows the same timing data, but with the prescaler enabled.

      Figure 12-9. Timer/Counter Timing Diagram, with Prescaler (fclk_I/O/8)

                      clkI/O

                      clkTn

               (clkI/O/8)

                      TCNTn   MAX - 1  MAX                                     BOTTOM  BOTTOM + 1

                      TOVn

                                                                               ATmega16/32/64/M1/C1 [DATASHEET]                       85

                                                                                       7647O–AVR–01/15
        Figure 12-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 12-10.Timer/Counter Timing Diagram, Setting of OCF0x, with Prescaler (fclk_I/O/8)

                          clkI/O

                          clkTn

                          (clkI/O/8)

                          TCNTn               OCRnx - 1          OCRnx               OCRnx + 1         OCRnx + 2

                          OCRnx                                         OCRnx Value

                          OCFnx

        Figure 12-11 shows the setting of OCF0A and the clearing of TCNT0 in CTC mode and fast PWM mode where OCR0A                      is

        TOP.

        Figure 12-11.Timer/Counter Timing Diagram, Clear Timer on Compare Match mode, with Prescaler (fclk_I/O/8)

                          clkI/O

                          clkTn

                          (clkI/O/8)

                          TCNTn               TOP - 1            TOP                 BOTTOM            BOTTOM + 1

                          (CTC)

                          OCRnx                                         TOP

                          OCFnx

12.8    8-bit Timer/Counter Register Description

12.8.1  Timer/Counter Control Register A – TCCR0A

              Bit         7           6       5          4       3      2                    1  0

                          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 12-2 on

        page 87 shows the COM0A1:0 bit functionality when the WGM02:0 bits are set to a normal or CTC mode (non-PWM).

86      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
Table 12-2.  Compare Output Mode, non-PWM Mode

   COM0A1    COM0A0            Description

       0                    0  Normal port operation, OC0A disconnected.

       0                    1  Toggle OC0A on compare match

       1                    0  Clear OC0A on compare match

       1                    1  Set OC0A on compare match

Table 12-3 shows the COM0A1:0 bit functionality when the WGM01:0 bits are set to fast PWM mode.

Table 12-3.  Compare Output Mode, Fast PWM Mode(1)

   COM0A1    COM0A0            Description

       0                    0  Normal port operation, OC0A disconnected.

       0                    1  WGM02 = 0: Normal port operation, OC0A disconnected.

                               WGM02 = 1: Toggle OC0A on compare match.

       1                    0  Clear OC0A on compare match, set OC0A at TOP

       1                    1  Set OC0A on compare match, clear OC0A at TOP

Note:  1.    A special case occurs when OCR0A equals TOP and COM0A1 is set. In this case, the compare match is

             ignored, but the set or clear is done at TOP. See Section 12.6.3 “Fast PWM Mode” on page 83 for more details.

Table 12-4 shows the COM0A1:0 bit functionality when the WGM02:0 bits are set to phase correct PWM mode.

Table 12-4.  Compare Output Mode, Phase Correct PWM Mode(1)

   COM0A1    COM0A0            Description

       0                    0  Normal port operation, OC0A disconnected.

       0                    1  WGM02 = 0: Normal port operation, OC0A cisconnected.

                               WGM02 = 1: Toggle OC0A on compare match.

       1                    0  Clear OC0A on compare match when up-counting. Set OC0A on compare match

                               when down-counting.

       1                    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 compare match is

             ignored, but the set or clear is done at TOP. See Section 13.8.4 “Phase Correct PWM Mode” on page 105 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 12-5

shows the COM0B1:0 bit functionality when the WGM02:0 bits are set to a normal or CTC mode (non-PWM).

Table 12-5.  Compare Output Mode, non-PWM Mode

   COM0B1    COM0B0            Description

       0                    0  Normal port operation, OC0B disconnected.

       0                    1  Toggle OC0B on compare match

       1                    0  Clear OC0B on compare match

       1                    1  Set OC0B on compare match

                                                             ATmega16/32/64/M1/C1 [DATASHEET]                                    87

                                                                                                 7647O–AVR–01/15
    Table 12-6 shows the COM0B1:0 bit functionality when the WGM02:0 bits are set to fast PWM mode.

    Table 12-6.  Compare Output Mode, Fast PWM Mode(1)

       COM0B1           COM0B0         Description

             0                  0      Normal port operation, OC0B disconnected.

             0                  1      Reserved

             1                  0      Clear OC0B on compare match, set OC0B at TOP

             1                  1      Set OC0B on compare match, clear OC0B at TOP

    Note:    1.  A special case occurs when OCR0B equals TOP and COM0B1 is set. In this case, the compare match is

                 ignored, but the set or clear is done at TOP. See Section 12.6.3 “Fast PWM Mode” on page 83 for more details.

    Table 12-7 shows the COM0B1:0 bit functionality when the WGM02:0 bits are set to phase correct PWM mode.

    Table 12-7.  Compare Output Mode, Phase Correct PWM Mode(1)

       COM0B1           COM0B0         Description

             0                  0      Normal port operation, OC0B disconnected.

             0                  1      Reserved

             1                  0      Clear OC0B on compare match when up-counting. Set OC0B on compare match

                                       when down-counting.

             1                  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 compare match is

                 ignored, but the set or clear is done at TOP. See Section 12.6.4 “Phase Correct PWM Mode” on page 84 for

                 more details.

    •  Bits 3, 2 – Res: Reserved Bits

    These bits are reserved bits in the ATmega16/32/64/M1/C1 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 waveform generation to be used, see Table 12-8. 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 Section 12.6 “Modes of Operation” on page 81).

    Table 12-8.  Waveform Generation Mode Bit Description

                                                     Timer/Counter                          Update of         TOV Flag

       Mode      WGM02          WGM01  WGM00         Mode of Operation   TOP                OCRx at           Set on(1)(2)

       0             0             0   0             Normal              0xFF               Immediate         MAX

       1             0             0   1             PWM, phase correct  0xFF               TOP               BOTTOM

       2             0             1   0             CTC                 OCRA               Immediate         MAX

       3             0             1   1             Fast PWM            0xFF               TOP               MAX

       4             1             0   0             Reserved                     –         –                          –

       5             1             0   1             PWM, phase correct  OCRA               TOP               BOTTOM

       6             1             1   0             Reserved                     –         –                          –

       7             1             1   1             Fast PWM            OCRA               TOP               TOP

    Notes:   1.  MAX    = 0xFF

             2.  BOTTOM = 0x00

88  ATmega16/32/64/M1/C1 [DATASHEET]

    7647O–AVR–01/15
12.8.2  Timer/Counter Control Register B – TCCR0B

           Bit               7   6             5         4             3      2         1        0

                          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 in the ATmega16/32/64/M1/C1 and will always read as zero.

        •  Bit 3 – WGM02: Waveform Generation Mode

        See the description in Section 12.8.1 “Timer/Counter Control Register A – TCCR0A” on page 86.

        •  Bits 2:0 – CS02:0: Clock Select

        The three clock select bits select the clock source to be used by the Timer/Counter.

        Table 12-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.

        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.

                                                                              ATmega16/32/64/M1/C1 [DATASHEET]                       89

                                                                                                        7647O–AVR–01/15
12.8.3  Timer/Counter Register – TCNT0

           Bit            7    6           5                  4    3              2  1          0

                                                              TCNT0[7:0]                               TCNT0

           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

        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.

12.8.4  Output Compare Register A – OCR0A

           Bit            7    6           5                  4    3              2  1          0

                                                OCR0A[7:0]                                             OCR0A

           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

        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.

12.8.5  Output Compare Register B – OCR0B

           Bit            7    6           5    4                  3              2  1          0

                                                OCR0B[7:0]                                             OCR0B

           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

        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.

12.8.6  Timer/Counter Interrupt Mask Register – TIMSK0

           Bit            7    6           5    4                  3              2  1          0

                          –    –           –    –                  –      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 in the ATmega16/32/64/M1/C1 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.

        •  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 interrupt flag register – TIFR0.

90      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
12.8.7  Timer/Counter 0 Interrupt Flag Register – TIFR0

           Bit            7       6        5           4  3            2    1                   0

                          –       –        –           –  –  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 ATmega16/32/64/M1/C1 and will always read as zero.

        •  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 corresponding 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 corresponding 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 12-8, “Waveform Generation Mode Bit

        Description” on page 88.

                                                                          ATmega16/32/64/M1/C1 [DATASHEET]                            91

                                                                                                      7647O–AVR–01/15
13.   16-bit Timer/Counter1 with PWM

      The 16-bit Timer/Counter unit allows accurate program execution timing  (event  management),  wave  generation,  and           signal

      timing measurement. The main features are:

      ●  True 16-bit design (i.e., allows 16-bit PWM)

      ●  Two independent output compare units

      ●  Double buffered output compare registers

      ●  One input capture unit

      ●  Input capture noise canceler

      ●  Retriggering function by external signal (ICP1A or ICP1B)

      ●  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)

13.1  Overview

      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 13-1. For the actual placement of I/O pins, refer to

      Section 1.1 “Pin Descriptions” on page 5. CPU accessible I/O registers, including I/O bits and I/O pins, are shown in bold.

      The device-specific I/O register and bit locations are listed in Section 13.10 “16-bit Timer/Counter Register Description” on

      page 110.

      The PRTIM1 bit in Section 6.6 “Power Reduction Register” on page 36 must be written to zero to enable Timer/Counter1

      module.

92    ATmega16/32/64/M1/C1 [DATASHEET]

      7647O–AVR–01/15
        Figure  13-1.     16-bit  Timer/Counter Block Diagram(1)

                                                                                                              TOVn (Int. Req.)

                                                  Count

                                                  Clear           Control  Logic                              Clock Select

                                                  Direction                                                   Edge

                                                                                  clkTn                       Detector                Tn

                                                         RTG      TOP      BOTTOM                          (from Prescaler)

                                  Timer/Counter

                                          TCNTn

                                                                  =               =0

                                                                                                    OCnA (Int. Req.)

                                          =                                                                Waveform                   OCnA

                                                                                                    Generation

                                          OCRnA

                DATA BUS                                                   Fixed

                                                                           TOP                      OCnB (Int. Req.)

                                                                           Value

                                          =                                                                Waveform                   OCnB

                                                                                                    Generation

                                          OCRnB

                                                                                                              AC1ICE         ICPSEL1

                                                                                  ICFn (Int. Req.)

                                                                                                                                   0  ICPnA

                                          ICRn                                    Edge              Noise

                                                                                  Detector          Canceler

                                                                                                                                   1  ICPnB

                                          TCCRnA                  TCCRnB                                      Analog Comparator 1

                                                                                                                        Interrupt

        Note:   1.        Refer to Table  on page 5 for Timer/Counter 1 pin placement and description.

13.1.1  Registers

        The Timer/Counter (TCNTn), output compare registers (OCRnx), and input capture register (ICRn) are all 16-bit registers.

        Special procedures must be followed when accessing the 16-bit registers. These procedures are described in Section 13.2

        “Accessing 16-bit Registers” on page 94. The Timer/Counter control registers (TCCRnx) 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 (OCRnx) are compared with the Timer/Counter value at all time. The result of

        the compare can be used by the waveform generator to generate a PWM or variable frequency output on the output

        compare pin (OCnx). See Section 13.6 “Output Compare Units” on page 99 The compare match event will also set the

        compare match flag (OCFnx) which can be used to generate an output compare interrupt request.

                                                                                  ATmega16/32/64/M1/C1 [DATASHEET]                            93

                                                                                                                             7647O–AVR–01/15
        The input capture register can capture the Timer/Counter value at a given external (edge triggered) event on either the input

        capture pin (ICPn). The input capture unit includes a digital filtering unit (noise canceler) 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.

13.1.2  Definitions

        The following definitions are used extensively throughout the section:

        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.

13.2    Accessing 16-bit Registers

        The TCNTn, OCRnx, 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 operations. 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 temporary 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 OCRnx 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 OCRnx and ICRn Registers. Note that when

        using “C”, the compiler handles the 16-bit access.

        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”.

94      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
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 registers, 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.

The following code examples show how to do an atomic read of the TCNTn Register contents. Reading any of the OCRnx 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.

                                                                           ATmega16/32/64/M1/C1 [DATASHEET]                      95

                                                                                       7647O–AVR–01/15
        The following code examples show how to do an atomic write of the TCNTn register contents. Writing any of the OCRnx 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 written to TCNTn.

13.2.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.

13.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 (CSn2:0) bits located in the Timer/Counter Control Register B (TCCRnB).

        For details on clock sources and prescaler, see Section 11. “Timer/Counter0 and Timer/Counter1 Prescalers” on page 75.

96      ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
13.4  Counter Unit

      The main part of the 16-bit Timer/Counter is the programmable 16-bit bi-directional counter unit. Figure 13-2 shows a block

      diagram of the counter and its surroundings.

      Figure 13-2. Counter Unit Block Diagram

                    DATA BUS  (8-bit)

                                                                                          TOVn

             TEMP (8-bit)                                                                 (Int. Req.)

                                                                                                       Clock Select

                                                    Count                                              Edge

      TCNTnH (8-bit)          TCNTnL (8-bit)                   Clear                      clkTn        Detector                  Tn

                                                                           Control Logic

                    TCNTnH (16-bit Counter)         Direction

                                                                                                       (From Prescaler)

                                                                      RTG  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).

      RTG                  An external event (ICP1A or ICP1B) asks for a TOP like action.

      The 16-bit counter is mapped into two 8-bit I/O memory locations: Counter High (TCNTnH) containing 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 Section 13. “16-bit Timer/Counter1 with PWM” on page 92.

      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.

                                                                                ATmega16/32/64/M1/C1 [DATASHEET]                         97

                                                                                                             7647O–AVR–01/15
13.5  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 multiple 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 signal 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 13-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 13-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)

                             Analog  Comparator  1  Interrupt

                                     ICPSEL1                   AC1ICE         ICNC       ICES

                       ICPnA

                                                                              Noise      Edge           ICFn (Int. Req.)

                                                                              Canceler   Detector

                       ICPnB

      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 Generation mode (WGMn3:0) bits must be set before the TOP value can

      be written to the ICRn register. When writing the ICRn register the high byte must be written to the ICRnH I/O location before

      the low byte is written to ICRnL.

      For more information on how to access the 16-bit registers refer to Section 13.2 “Accessing 16-bit Registers” on page 94.

      The ICF1 output can be used to retrigger the timer counter. It has the same effect than the TOP signal.

98    ATmega16/32/64/M1/C1 [DATASHEET]

      7647O–AVR–01/15
13.5.1  Input Capture Trigger Source

        The trigger sources for the input capture unit are the Input Capture pin (ICP1A and ICP1B).

        Be aware that changing trigger source can trigger a capture. The input capture flag must therefore be cleared after the

        change.

        The Input Capture pin (ICPn) IS sampled using the same technique as for the Tn pin (Figure 11-1 on page 75). 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 Waveform Generation mode that uses ICRn to define TOP.

        An input capture can be triggered by software by controlling the port of the ICPn pin.

13.5.2  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 additional 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.

13.5.3  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 interrupt 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 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).

13.5.4  Using the Input Capture Unit as TCNT1 Retrigger Input

        TCNT1 counts from BOTTOM to TOP. The TOP value can be a fixed value, ICR1, or OCR1A. When enabled the retrigger

        input forces to reach the TOP value. It means that ICF1 output is ored with the TOP signal.

13.6    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 compare 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 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

        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 13. “16-bit Timer/Counter1 with PWM” on page 92)

        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 13-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 (x). The elements of the block diagram

        that are not directly a part of the output compare unit are gray shaded.

                                                                                  ATmega16/32/64/M1/C1 [DATASHEET]                       99

                                                                                                     7647O–AVR–01/15
        Figure  13-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)

                                                               =       (16-bit Comparator)

                                                                                            OCFnx (Int. Req.)

                                                  TOP

                                                               Waveform Generator                                        OCnx

                               BOTTOM

                                                               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 compare register 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 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 disabled 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 register 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 Section 13.2 “Accessing 16-bit Registers” on page 94.

13.6.1  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).

13.6.2  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.

100     ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
13.6.3  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 waveform 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 compare (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.

13.7    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 13-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 13-5. Compare Match Output Unit, Schematic

        COMnx1

        COMnx0                         Waveform                      D        Q

        FOCnx                          Generator

                                                                                                 1

                                                                                                      OCnx

                                                                        OCnx                          Pin

                                                                                                 0

                                                                     D        Q

                                       DATA BUS                      PORT

                                                                     D        Q

                                                                        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 output) 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 visible on the pin. The port override function is generally independent of the waveform generation mode, but there

        are some exceptions. Refer to Table 13-1, Table 13-2 and Table 13-3 on page 111 for details.

        The design of the Output Compare pin logic allows initialization of the OCnx state before the output is enabled. Note that

        some COMnx1:0 bit settings are reserved for certain modes of operation. See Section 13.10 “16-bit Timer/Counter Register

        Description” on page 110.

        The COMnx1:0 bits have no effect on the input capture unit.

                                                                                 ATmega16/32/64/M1/C1 [DATASHEET]                        101

                                                                                                      7647O–AVR–01/15
13.7.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 13-1 on page 110. For fast PWM mode refer to

        Table 13-2 on page 110, and for phase correct and phase and frequency correct PWM refer to Table 13-3 on page 111.

        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.

13.8    Modes of Operation

        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 output 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 13.7 “Compare Match Output

        Unit” on page 101). For detailed timing information refer to Section 13.9 “Timer/Counter Timing Diagrams” on page 108.

13.8.1  Normal Mode

        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 software. 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.

13.8.2  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 operation of

        counting external events.

        The timing diagram for the CTC mode is shown in Figure 13-6. The counter value (TCNTn) increases until a compare match

        occurs with either OCRnA or ICRn, and then counter (TCNTn) is cleared.

        Figure 13-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

102     ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
        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. However, 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 buffering 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 maximum 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 frequency 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+--_---IO-/--O--C----R----n----A----

        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.

13.8.3  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 set on the compare match between TCNTn and OCRnx, and cleared at TOP. In inverting compare output mode

        output is cleared on compare match and set at TOP. Due to the single-slope operation, the operating frequency of the fast

        PWM mode can be twice as high as the phase correct 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, capacitors), 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 maximum 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-To---g-O-----P2-----+-----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

        13-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.

                                                                                            ATmega16/32/64/M1/C1 [DATASHEET]            103

                                                                                             7647O–AVR–01/15
     Figure 13-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  5  6  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 handler 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 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 110). 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

     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 output 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.)

104  ATmega16/32/64/M1/C1 [DATASHEET]

     7647O–AVR–01/15
        A frequency (with 50% duty cycle) waveform output in fast PWM mode can be achieved by setting 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 Compare unit is enabled in

        the fast PWM mode.

13.8.4  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 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 resolution in bits can be calculated by using the following equation:

        RPCPWM  =  l--o---g------T----O-----P-----+-----1---
                   log 2

        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 13-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 Interrupt flag will be set when a compare match occurs.

        Figure 13-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

                                                                             ATmega16/32/64/M1/C1 [DATASHEET]                         105

                                                                                                          7647O–AVR–01/15
        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 accordingly 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

        OCRnx Registers are written. As the third period shown in Figure 13-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 Register. 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 111). 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 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       =  ------f--c--l--k--_--I--/-O--------
                            2  N  TOP

        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.

13.8.5  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 waveform 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 (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 compare output mode, the operation is inverted. The dual-slope operation gives a lower

        maximum operation frequency compared to the single-slope operation. However, due to the symmetric feature of the dual-

        slope PWM modes, these modes are preferred for motor control applications.

        The main difference between the phase correct, and the phase and frequency correct PWM mode is the time the OCRnx

        Register is updated by the OCRnx buffer register, (see Figure 13-8 and Figure 13-9 on page 107).

        The PWM resolution for the phase and frequency correct PWM mode can be 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 resolution in bits can be calculated using the following equation:

        RPFCPWM  =       l--o---g-----l-To---g-O-----P2-----+-----1---

106     ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
In phase and frequency correct PWM mode the counter is incremented until the counter value matches either the value in

ICRn (WGMn3:0 = 8), or the value in OCRnA (WGMn3:0 = 9). 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

and frequency correct PWM mode is shown on Figure 13-9. The figure shows phase and frequency 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

interrupt flag will be set when a compare match occurs.

Figure 13-9. Phase and Frequency Correct PWM Mode, Timing Diagram

                                                                                         OCnA Interrupt Flag Set

                                                                                         or ICFn Interrupt Flag Set

                                                                                         (Interrupt on TOP)

                                                                                         OCRnx/ TOP Update and

                                                                                         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 at the same timer clock cycle as the OCRnx registers are updated with the

double buffer value (at BOTTOM). When either OCRnA or ICRn is used for defining the TOP value, the OCnA or ICFn flag is

set when TCNTn has reached TOP. The interrupt flags can then 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.

As Figure 13-9 shows the output generated is, in contrast to the phase correct mode, symmetrical in all periods. Since the

OCRnx registers are updated at BOTTOM, the length of the rising and the falling slopes will always be equal. This gives

symmetrical output pulses and is therefore frequency correct.

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 phase and frequency 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 111). 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 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 and frequency correct PWM can be calculated by the following equation:

fOCnxPFCPWM  =  ------f--c--l--k--_--I--/-O--------
                2  N  TOP

The N variable represents the prescaler divider (1, 8, 64, 256, or 1024).

                                                                           ATmega16/32/64/M1/C1 [DATASHEET]                                107

                                                                                         7647O–AVR–01/15
      The extreme values for the OCRnx register represents 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 set to 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 = 9) and COM1A1:0 = 1, the OC1A output will toggle with a 50% duty

      cycle.

13.9  Timer/Counter Timing Diagrams

      The Timer/Counter is a synchronous design and the timer clock (clkTn) is therefore shown as a clock enable signal in the
      following figures. The figures include information on when Interrupt Flags are set, and when the OCRnx register is updated

      with the OCRnx buffer value (only for modes utilizing double buffering). Figure 13-10 shows a timing diagram for the setting

      of OCFnx.

      Figure 13-10.Timer/Counter Timing Diagram, Setting of OCFnx, no Prescaling

                       clkI/O

                       clkTn

                 (clkI/O/1)

                       TCNTn   OCRnx - 1  OCRnx                                 OCRnx + 1       OCRnx + 2

                       OCRnx                     OCRnx Value

                       OCFnx

      Figure 13-11 shows the same timing data, but with the prescaler enabled.

      Figure 13-11.Timer/Counter Timing Diagram, Setting of OCFnx, with Prescaler (fclk_I/O/8)

                       clkI/O

                       clkTn

                 (clkI/O/8)

                       TCNTn   OCRnx - 1  OCRnx                                 OCRnx + 1       OCRnx + 2

                       OCRnx                     OCRnx Value

                       OCFnx

108   ATmega16/32/64/M1/C1 [DATASHEET]

      7647O–AVR–01/15
Figure 13-12 shows the count sequence close to TOP in various modes. When using phase and frequency correct PWM

mode the OCRnx register is updated at BOTTOM. The timing diagrams will be the same, but TOP should be replaced by

BOTTOM, TOP-1 by BOTTOM+1 and so on. The same renaming applies for modes that set the TOVn Flag at BOTTOM.

Figure 13-12.Timer/Counter Timing Diagram, no Prescaling

       clkI/O

       clkTn

(clkI/O/1)

TCNTn             TOP  -  1                               TOP             BOTTOM          BOTTOM +  1

(CTC and FPWM)

TCNTn             TOP  -  1                               TOP             TOP - 1         TOP - 2

(PC and PFC PWM)

TOVn (FPWM)

and ICFn

(if used as TOP)

OCRnx                     Old  OCRnx  Value                               New      OCRnx  Value

(Update at TOP)

Figure 13-13 shows the same timing data, but with the prescaler enabled.

Figure 13-13.Timer/Counter Timing Diagram, with Prescaler (fclk_I/O/8)

       clkI/O

       clkTn

(clkI/O/8)

TCNTn             TOP  -  1                               TOP             BOTTOM          BOTTOM +  1

(CTC and FPWM)

TCNTn

(PC and PFC PWM)  TOP  -  1                               TOP             TOP - 1         TOP - 2

TOVn (FPWM)

and ICFn

(if used as TOP)

OCRnx                     Old  OCRnx  Value                               New      OCRnx  Value

(Update at TOP)

                                                               ATmega16/32/64/M1/C1 [DATASHEET]                    109

                                                                                          7647O–AVR–01/15
13.10    16-bit Timer/Counter Register Description

13.10.1  Timer/Counter1 Control Register A – TCCR1A

                Bit           7    6          5             4       3  2         1      0

                           COM1A1  COM1A0     COM1B1        COM1B0  –  –         WGM11  WGM10  TCCR1A

            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

         •  Bit 7:6 – COMnA1:0: Compare Output Mode for Channel A

         •  Bit 5:4 – COMnB1:0: Compare Output Mode for Channel B

         The COMnA1:0 and COMnB1:0 control the output compare pins (OCnA and OCnB respectively) behavior. If one or both of

         the COMnA1:0 bits are written to one, the OCnA output overrides the normal port functionality of the I/O pin it is connected

         to. If one or both of the COMnB1:0 bit are written to one, the OCnB 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 OCnA or OCnB pin

         must be set in order to enable the output driver.

         When the OCnA or OCnB is connected to the pin, the function of the COMnx1:0 bits is dependent of the WGMn3:0 bits

         setting. Table 13-1 shows the COMnx1:0 bit functionality when the WGMn3:0 bits are set to a Normal or a CTC mode (non-

         PWM).

         Table 13-1.       Compare Output Mode, non-PWM

            COMnA1/COMnB1                     COMnA0/COMnB0         Description

                           0                       0                Normal port operation, OCnA/OCnB disconnected.

                           0                       1                Toggle OCnA/OCnB on compare match.

                           1                       0                Clear OCnA/OCnB on compare match (set output to low level).

                           1                       1                Set OCnA/OCnB on compare match (set output to high level).

         Table 13-2 shows the COMnx1:0 bit functionality when the WGMn3:0 bits are set to the fast PWM mode.

         Table 13-2.       Compare Output Mode, Fast PWM(1)

            COMnA1/COMnB1                     COMnA0/COMnB0         Description

                           0                       0                Normal port operation, OCnA/OCnB disconnected.

                                                                    WGMn3:0 = 14 or 15: Toggle OC1A on compare match, OC1B

                           0                       1                disconnected (normal port operation). For all other WGM1

                                                                    settings, normal port operation, OC1A/OC1B disconnected.

                           1                       0                Clear OCnA/OCnB on compare match, set OCnA/OCnB at TOP

                           1                       1                Set OCnA/OCnB on compare match, clear OCnA/OCnB at TOP

         Note:       1.    A special case occurs when OCRnA/OCRnB equals TOP and COMnA1/COMnB1 is set. In this case the com-

                           pare match is ignored, but the set or clear is done at TOP. See Section 13.8.3 “Fast PWM Mode” on page 103

                           for more details.

110      ATmega16/32/64/M1/C1 [DATASHEET]

         7647O–AVR–01/15
       Table 13-3 shows the COMnx1:0 bit functionality when the WGMn3:0 bits are set to the phase correct or the phase and

       frequency correct, PWM mode.

       Table 13-3.  Compare Output Mode, Phase Correct and Phase and Frequency Correct PWM(1)

             COMnA1/COMnB1           COMnA0/COMnB0        Description

                    0                   0                 Normal port operation, OCnA/OCnB disconnected.

                                                          WGMn3:0 = 8, 9 10 or 11: Toggle OCnA on compare match,

                    0                   1                 OCnB disconnected (normal port operation). For all other WGM1

                                                          settings, normal port operation, OC1A/OC1B disconnected.

                    1                   0                 Clear OCnA/OCnB on compare match when up-counting. Set

                                                          OCnA/OCnB on compare match when downcounting.

                    1                   1                 Set OCnA/OCnB on compare match when up-counting. Clear

                                                          OCnA/OCnB on compare match when downcounting.

       Note:    1.  A special case occurs when OCRnA/OCRnB equals TOP and COMnA1/COMnB1 is set. See Section 13.8.4

                    “Phase Correct PWM Mode” on page 105 for more details.

       •     Bit 1:0 – WGMn1:0: Waveform Generation Mode

       Combined with the WGMn3:2 bits found in the TCCRnB register, these bits control the counting sequence of the counter, the

       source for maximum (TOP) counter value, and what type of waveform generation to be used, see Table 13-4. Modes of

       operation supported by the Timer/Counter unit are: normal mode (counter), clear timer on compare match (CTC) mode, and

       three types of Pulse Width Modulation (PWM) modes (see Section 13. “16-bit Timer/Counter1 with PWM” on page 92).

Table 13-4.  Waveform Generation Mode Bit Description(1)

                    WGMn2   WGMn1    WGMn0                                                                 Update of     TOVn Flag

Mode      WGMn3     (CTCn)  (PWMn1)  (PWMn0)  Timer/Counter Mode of Operation                TOP           OCRnx at      Set on

0            0         0    0        0        Normal                                         0xFFFF        Immediate     MAX

1            0         0    0        1        PWM, phase correct, 8-bit                      0x00FF        TOP           BOTTOM

2            0         0    1        0        PWM, phase correct, 9-bit                      0x01FF        TOP           BOTTOM

3            0         0    1        1        PWM, phase correct, 10-bit                     0x03FF        TOP           BOTTOM

4            0         1    0        0        CTC                                            OCRnA         Immediate     MAX

5            0         1    0        1        Fast PWM, 8-bit                                0x00FF        TOP           TOP

6            0         1    1        0        Fast PWM, 9-bit                                0x01FF        TOP           TOP

7            0         1    1        1        Fast PWM, 10-bit                               0x03FF        TOP           TOP

8            1         0    0        0        PWM, phase and frequency correct               ICRn          BOTTOM        BOTTOM

9            1         0    0        1        PWM, phase and frequency correct               OCRnA         BOTTOM        BOTTOM

10           1         0    1        0        PWM, phase correct                             ICRn          TOP           BOTTOM

11           1         0    1        1        PWM, phase correct                             OCRnA         TOP           BOTTOM

12           1         1    0        0        CTC                                            ICRn          Immediate     MAX

13           1         1    0        1        (Reserved)                                     –             –             –

14           1         1    1        0        Fast PWM                                       ICRn          TOP           TOP

15           1         1    1        1        Fast PWM                                       OCRnA         TOP           TOP

Note:  1.    The CTCn and PWMn1:0 bit definition names are obsolete. Use the WGMn2:0         definitions.  However, the  functionality

             and location of these bits are compatible with previous versions of the timer.

                                                                            ATmega16/32/64/M1/C1 [DATASHEET]                      111

                                                                                                              7647O–AVR–01/15
13.10.2  Timer/Counter1 Control Register B – TCCR1B

            Bit                 7        6          5      4        3                2    1            0

                           ICNC1    ICES1        RTGEN     WGM13    WGM12           CS12  CS11       CS10          TCCR1B

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

            Initial Value       0        0          0      0        0                0    0            0

         •  Bit 7 – ICNCn: Input Capture Noise Canceler

         Setting this bit (to one) activates the input capture noise canceler. When the noise canceler is activated, the input from the

         input capture pin (ICPn) is filtered. The filter function requires four successive equal valued samples of the ICPn pin for

         changing its output. The input capture is therefore delayed by four oscillator cycles when the noise canceler is enabled.

         •  Bit 6 – ICESn: Input Capture Edge Select

         This bit selects which edge on the input capture pin (ICPn) that is used to trigger a capture event. When the ICESn bit is

         written to zero, a falling (negative) edge is used as trigger, and when the ICESn bit is written to one, a rising (positive) edge

         will trigger the capture.

         When a capture is triggered according to the ICESn setting, the counter value is copied into the input capture register

         (ICRn). The event will also set the input capture flag (ICFn), and this can be used to cause an input capture interrupt, if this

         interrupt is enabled.

         When the ICRn is used as TOP value (see description of the WGMn3:0 bits located in the TCCRnA and the TCCRnB

         register), the ICPn is disconnected and consequently the input capture function is disabled.

         •  Bit 5 – RTGEN

         Set this bit to enable the ICP1A as a Timer/Counter retrigger input.

         (This bit is reserved for future use. For ensuring compatibility with future devices, this bit must be written to zero when

         TCCRnB is written.)

         •  Bit 4:3 – WGMn3:2: Waveform Generation Mode

         See TCCRnA register description.

         •  Bit 2:0 – CSn2:0: Clock Select

         The three clock select bits select the clock source to be used by the Timer/Counter, see Figure 13-10 and Figure 13-11.

         Table 13-5.       Clock Select  Bit  Description

            CSn2           CSn1               CSn0     Description

            0                   0             0        No clock source (Timer/Counter     stopped).

            0                   0             1        clkI/O/1 (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 Tn pin.   Clock on   falling edge.

            1                   1             1        External clock source on Tn pin.   Clock on   rising edge.

         If external pin modes are used for the Timer/Countern, transitions on the Tn pin will clock the counter even if the pin is

         configured as an output. This feature allows software control of the counting.

112      ATmega16/32/64/M1/C1 [DATASHEET]

         7647O–AVR–01/15
13.10.3  Timer/Counter1 Control Register C – TCCR1C

            Bit            7       6            5       4      3     2    1    0

                           FOC1A  FOC1B         –       –      –     –    –    –    TCCR1C

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

            Initial Value  0       0            0       0      0     0    0    0

         •  Bit 7 – FOCnA: Force Output Compare for Channel A

         •  Bit 6 – FOCnB: Force Output Compare for Channel B

         The FOCnA/FOCnB bits are only active when the WGMn3:0 bits specifies a non-PWM mode. However, for ensuring

         compatibility with future devices, these bits must be set to zero when TCCRnA is written when operating in a PWM mode.

         When writing a logical one to the FOCnA/FOCnB bit, an immediate compare match is forced on the waveform generation

         unit. The OCnA/OCnB output is changed according to its COMnx1:0 bits setting. Note that the FOCnA/FOCnB bits are

         implemented as strobes. Therefore it is the value present in the COMnx1:0 bits that determine the effect of the forced

         compare.

         A FOCnA/FOCnB strobe will not generate any interrupt nor will it clear the timer in clear timer on Compare match (CTC)

         mode using OCRnA as TOP.

         The FOCnA/FOCnB bits are always read as zero.

13.10.4  Timer/Counter1 – TCNT1H and TCNT1L

            Bit            7       6            5       4      3     2    1    0

                                                        TCNT1[15:8]                 TCNT1H

                                                        TCNT1[7:0]                  TCNT1L

            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

         The two Timer/Counter I/O locations (TCNTnH and TCNTnL, combined TCNTn) give direct access, both for read and for

         write operations, to the Timer/Counter unit 16-bit counter. To ensure that both the high and low bytes are read and written

         simultaneously when the CPU accesses these registers, the access is performed using an 8-bit temporary high byte register

         (TEMP). This temporary register is shared by all the other 16-bit registers. See Section 13.2 “Accessing 16-bit Registers” on

         page 94. Modifying the counter (TCNTn) while the counter is running introduces a risk of missing a compare match between

         TCNTn and one of the OCRnx registers.

         Writing to the TCNTn register blocks (removes) the compare match on the following timer clock for all compare units.

13.10.5  Output Compare Register 1 A – OCR1AH and OCR1AL

            Bit            7       6            5       4      3     2    1    0

                                                        OCR1A[15:8]                 OCR1AH

                                                        OCR1A[7:0]                  OCR1AL

            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.10.6  Output Compare Register 1 B – OCR1BH and OCR1BL

            Bit            7       6            5       4      3     2    1    0

                                                        OCR1B[15:8]                 OCR1BH

                                                        OCR1B[7:0]                  OCR1BL

            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

         The output compare registers contain a 16-bit value that is continuously compared with the counter value (TCNTn). A match

         can be used to generate an output compare interrupt, or to generate a waveform output on the OCnx pin.

         The output compare registers are 16-bit in size. To ensure that both the high and low bytes are written simultaneously when

         the CPU writes to these registers, the access is performed using an 8-bit temporary high byte register (TEMP). This

         temporary register is shared by all the other 16-bit registers. See Section 13.2 “Accessing 16-bit Registers” on page 94.

                                                                        ATmega16/32/64/M1/C1 [DATASHEET]                                113

                                                                                    7647O–AVR–01/15
13.10.7  Input Capture Register 1 – ICR1H and ICR1L

            Bit            7        6               5  4             3     2       1            0

                                                       ICR1[15:8]                                      ICR1H

                                                          ICR1[7:0]                                    ICR1L

            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

         The input capture is updated with the counter (TCNTn) value each time an event occurs on the ICPn pin (or optionally on the

         analog comparator output for Timer/Counter1). The input capture can be used for defining the counter TOP value.

         The input capture register is 16-bit in size. To ensure that both the high and low bytes are read simultaneously when the

         CPU accesses these registers, the access is performed using an 8-bit temporary High Byte Register (TEMP). This

         temporary register is shared by all the other 16-bit registers. See Section 13.2 “Accessing 16-bit Registers” on page 94.

13.10.8  Timer/Counter1 Interrupt Mask Register – TIMSK1

            Bit            7        6      5           4             3     2       1            0

                           –        –      ICIE1       –             –     OCIE1B  OCIE1A       TOIE1  TIMSK1

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

            Initial Value  0        0      0           0             0     0       0            0

         •  Bit 7, 6 – Res: Reserved Bits

         These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

         •  Bit 5 – ICIE1: Timer/Counter1, Input Capture Interrupt Enable

         When this bit is written to one, and the I-flag in the status register is set (interrupts globally enabled), the Timer/Counter1

         input capture interrupt is enabled. The corresponding interrupt vector (Table 8-2 on page 48) is executed when the ICF1 flag,

         located in TIFR1, is set.

         •  Bit 4, 3 – Res: Reserved Bits

         These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

         •  Bit 2 – OCIE1B: Timer/Counter1, Output Compare B Match Interrupt Enable

         When this bit is written to one, and the I-flag in the status register is set (interrupts globally enabled), the Timer/Counter1

         output compare B match interrupt is enabled. The corresponding interrupt vector (Table 8-2 on page 48) is executed when

         the OCF1B flag, located in TIFR1, is set.

         •  Bit 1 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable

         When this bit is written to one, and the I-flag in the status register is set (interrupts globally enabled), the Timer/Counter1

         output compare A match interrupt is enabled. The corresponding interrupt vector (Table 8-2 on page 48) is executed when

         the OCF1A flag, located in TIFR1, is set.

         •  Bit 0 – TOIE1: Timer/Counter1, Overflow Interrupt Enable

         When this bit is written to one, and the I-flag in the status register is set (interrupts globally enabled), the Timer/Counter1

         overflow interrupt is enabled. The corresponding interrupt vector (Table 8-2 on page 48) is executed when the TOV1 flag,

         located in TIFR1, is set.

114      ATmega16/32/64/M1/C1 [DATASHEET]

         7647O–AVR–01/15
13.10.9  Timer/Counter1 Interrupt Flag Register – TIFR1

            Bit            7  6                    5          4  3      2               1           0

                           –  –                    ICF1       –  –  OCF1B    OCF1A              TOV1   TIFR1

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

            Initial Value  0  0                    0          0  0      0               0           0

         •  Bit 7, 6 – Res: Reserved Bits

         These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

         •  Bit 5 – ICF1: Timer/Counter1, Input Capture Flag

         This flag is set when a capture event occurs on the ICP1 pin. When the input capture register (ICR1) is set by the WGMn3:0

         to be used as the TOP value, the ICF1 Flag is set when the counter reaches the TOP value.

         ICF1 is automatically cleared when the input capture interrupt vector is executed. Alternatively, ICF1 can be cleared by

         writing a logic one to its bit location.

         •  Bit 4, 3 – Res: Reserved Bits

         These bits are unused bits in the ATmega16/32/64/M1/C1, and will always read as zero.

         •  Bit 2 – OCF1B: Timer/Counter1, Output Compare B Match Flag

         This flag is set in the timer clock cycle after the counter (TCNT1) value matches the output compare register B (OCR1B).

         Note that a forced output compare (FOC1B) strobe will not set the OCF1B flag.

         OCF1B is automatically cleared when the output compare match B interrupt vector is executed. Alternatively, OCF1B can be

         cleared by writing a logic one to its bit location.

         •  Bit 1 – OCF1A: Timer/Counter1, Output Compare A Match Flag

         This flag is set in the timer clock cycle after the counter (TCNT1) value matches the output compare register A (OCR1A).

         Note that a forced output compare (FOC1A) strobe will not set the OCF1A flag.

         OCF1A is automatically cleared when the output compare match A interrupt vector is executed. Alternatively, OCF1A can be

         cleared by writing a logic one to its bit location.

         •  Bit 0 – TOV1: Timer/Counter1, Overflow Flag

         The setting of this flag is dependent of the WGMn3:0 bits setting. In normal and CTC modes, the TOV1 flag is set when the

         timer overflows. Refer to Table 13-4 on page 111 for the TOV1 flag behavior when using another WGMn3:0 bit setting.

         TOV1 is automatically cleared when the Timer/Counter1 overflow interrupt vector is executed. Alternatively, TOV1 can be

         cleared by writing a logic one to its bit location.

                                                                           ATmega16/32/64/M1/C1 [DATASHEET]                          115

                                                                                                       7647O–AVR–01/15
14.   Power Stage Controller – (PSC) (only ATmega16/32/64M1)

      The power stage controller is a high performance waveform controller.

14.1  Features

      ●  PWM waveform generation function with 6 complementary programmable outputs (able to control 3 half-bridges)

      ●  Programmable dead time control

      ●  PWM up to 12 bit resolution

      ●  PWM clock frequency up to 64MHz (via PLL)

      ●  Programmable ADC trigger

      ●  Automatic overlap protection

      ●  Failsafe emergency inputs - 3 (to force all outputs to high impedance or in inactive state - fuse configurable)

      ●  Center aligned and edge aligned modes synchronization

14.2  Overview

      Many register and bit references in this section are written in general form.

      ●  A lower case “n” replaces the PSC module number, in this case 0, 1 or 2. However, when using the register or bit

         defines in a program, the precise form must be used, i.e., POCR0SAH for accessing module 0 POCRnSAH register

         and so on.

      ●  A lower case “x” replaces the PSC part, in this case A or B. However, when using the register or bit defines in a

         program, the precise form must be used, i.e., OCR0SAH for accessing part A OCR0SxH register and so on.

      The purpose of the power stage controller (PSC) is to control an external power interface. It has six outputs to drive for

      example a 3 half-bridge. This feature allows you to generate three phase waveforms for applications such as Asynchronous

      or BLDC motor drives, lighting systems...

      The PSC also has 3 inputs, the purpose of which is to provide fast emergency stop capability.

      The PSC outputs are programmable as “active high” or “active low”. All the timing diagrams in the following examples are

      given in the “active high” polarity.

14.3  Accessing 16-bit Registers

      Some PSC registers are 16-bit registers. These registers can be accessed by the AVR CPU via the 8-bit data bus. The 16-

      bit registers must be byte accessed using two read or write operations. The PSC 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 PSC 16-bit registers.

      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 temporary register in the same clock cycle as the low byte is read.

      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.

116   ATmega16/32/64/M1/C1 [DATASHEET]

      7647O–AVR–01/15
14.4  PSC Description

      Figure 14-1. Power Stage  Controller Block  Diagram

                                                  PSC Counter                                      CLKIO

                                                                            Prescaler              CLKPLL

                                POCR0RB           =

                                                                                                   Module  0

                                                               Waveform                                       PSCOUT0B

                                POCR0SB           =            Generator B

                                                                                 (Analog Comparator 0

                                                                                          Output)

      DATA BUS                                                              PSC  Input 0                      AC0O

                                                               Overlap

                                POCR0RA           =            Protection                                     PSCIN0

                                                                                          PISEL0

                                                               Waveform                                       PSCOUT0A

                                POCR0SA           =            Generator A

                                                                                                   Module  1

                                                               Waveform                                       PSCOUT1B

                                POCR1SB           =            Generator B

                                                                                 (Analog Comparator 1

                                                                                          Output)

                                                                            PSC  Input 1                      AC1O

                                                               Overlap

                                POCR1RA           =            Protection                                     PSCIN1

                                                                                          PISEL1

                                                               Waveform                                       PSCOUT1A

                                POCR1SA           =            Generator A

                                                                                                   Module  2

                                                               Waveform                                       PSCOUT2B

                                POCR2SB           =            Generator B

                                                                                 (Analog Comparator 2

                                                                                          Output)

                                                                            PSC  Input 2                      AC2O

                                                               Overlap

                                POCR2RA           =            Protection                                     PSCIN2

                                                                                          PISEL2

                                                               Waveform                                       PSCOUT2A

                                POCR2SA           =            Generator A

                                PSOCn

                                PCNFn                PFRCnB

                                PCTLn                PFRCnA

                                                                           ATmega16/32/64/M1/C1               [DATASHEET]      117

                                                                                                              7647O–AVR–01/15
        The PSC is based on the use of a free-running 12-bit counter (PSC counter). This counter is able to count up to a top value

        determined by the contents of POCR_RB register and then according to the selected running mode, count down or reset to

        zero for another cycle.

        As can be seen from the block diagram Figure 14-1, the PSC is composed of 3 modules.

        Each of the 3 PSC modules can be seen as two symetrical entities. One entity named part A which generates the output

        PSCOUTnA and the second one named part B which generates the PSCOUTnB output.

        Each module has its own PSC Input circuitry which manages the corresponding input.

14.5    Functional Description

14.5.1  Generation of Control Waveforms

        In general, the drive of a 3 phase motor requires the generation of 6 PWM signals. The duty cycle of these signals must be

        independently controlled to adjust the speed or torque of the motor or to produce the wanted waveform on the 3 voltage lines

        (trapezoidal, sinusoidal...)

        In case of cross conduction or overtemperature, having inputs which can immediately disable the waveform generator’s

        outputs is desirable.

        These considerations are common for many systems which require PWM signals to drive power systems such as lighting,

        DC/DC converters.

14.5.2  Waveform Cycles

        Each of the 3 modules has 2 waveform generators which jointly compose the output signal.

        The first part of the waveform is relative to part A or PSCOUTnA output. This waveform corresponds to sub-cycle A in the

        following figure.

        The second part of the waveform is relative to part B or PSCOUTnB output. This waveform corresponds to sub-cycle B in the

        following figure.

        The complete waveform is terminated at the end of the sub-cycle B, whereupon any changes to the settings of the waveform

        generator registers will be implemented, for the next cycle.

        The PSC can be configured in one of two modes (1Ramp Mode or Centered Mode). This configuration will affect the

        operation of all the waveform generators.

        Figure  14-2.  Cycle   Presentation in One Ramp Mode

                                          One PSC Cycle

                                      Sub Cycle A        Sub Cycle A

                       PSC Counter Value

                                                                      Update

118     ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
          Figure 14-3. Cycle Presentation in Centered Mode

                                                                       One PSC Cycle

                         PSC Counter Value

                                                                                                     Update

          Figure 14-2 on page 118 and Figure 14-3 graphically illustrate the values held in the PSC counter. Centered Mode is like one

          ramp mode which counts down and then up.

          Notice that the update of the waveform generator registers is done regardless of ramp mode at the end of the PSC cycle.

14.5.3    Operation Mode Descriptions

          Waveforms and duration of output signals are determined by parameters held in the registers (POCRnSA, POCRnRA,

          POCRnSB, POCR_RB) and by the running mode. Two modes are possible:

          ●       One ramp mode: In this mode, all the 3 PSCOUTnB outputs are edge-aligned and the 3 PSCOUTnA can be also

                  edge-aligned when setting the same values in the dedicated registers.

                  In this mode, the PWM frequency is twice the center aligned mode PWM frequency.

          ●       Center aligned mode: In this mode, all the 6 PSC outputs are aligned at the center of the period. Except when using

                  the same duty cycles on the 3 modules, the edges of the outputs are not aligned. So the PSC outputs do not commute

                  at the same time, thus the system which is driven by these outputs will generate less commutation noise.

                  In this mode, the PWM frequency is twice slower than in one ramp mode.

14.5.3.1  One Ramp Mode (Edge-Aligned)

          The following figure shows the resultant outputs PSCOUTnA and PSCOUTnB operating in one ramp mode over a PSC

          cycle.

          Figure  14-4.  PSCOUTnA and PSCOUTnB              Basic Waveforms in One Ramp   Mode

                                                                                          POCRnRB

                                                                                POCRnSB

                                                                       POCRnRA

                         PSC Counter

                                            POCRnSA

                                            0

                                                            On Time A                     On Time B

                         PSCOUTnA

                         PSCOUTnB

                                               Dead Time A             Dead Time B

                                                                       PSC Cycle

                                                                                      ATmega16/32/64/M1/C1 [DATASHEET]                  119

                                                                                                     7647O–AVR–01/15
          On-time A = (POCRnRAH/L - POCRnSAH/L)  1/Fclkpsc

          On-time B = (POCRnRBH/L - POCRnSBH/L)  1/Fclkpsc

          Dead-time A = (POCRnSAH/L + 1)  1/Fclkpsc

          Dead-time B = (POCRnSBH/L – POCRnRAH/L)  1/Fclkpsc

          Minimal value for dead-time A = 1/Fclkpsc

          If the overlap protection is disabled, in one-ramp mode, PSCOUTnA and PSCOUTnB           outputs     can  be  configured  to  overlap

          each other, though in normal use this is not desirable.

          Figure 14-5. Controlled Start and Stop Mechanism in One-Ramp Mode

                 POCRnRB

                 POCRnSB

                 POCRnRA

                 POCRnSA

          PSC Counter

                  Run

          PSCOUTnA

          PSCOUTnB

          Note:           See Section 14.16.8 “PSC Control Register – PCTL” on page 130 (PCCYC =         1)

14.5.3.2  Center Aligned Mode

          In center aligned mode, the center of PSCOUTnA and PSCOUTnB signals are centered.

          Figure  14-6.   PSCOUTnA and PSCOUTnB Basic              Waveforms  in  Center  Aligned  Mode

                                     PSC Counter

                           POCRnRB

                           POCRnSB

                           POCRnSA

                                                                              0

                                                                   On Time 0

                                     On                                                                  On

                                     Time 1                                                              Time  1

                           PSCOUTnA

                           PSCOUTnB

                                     Dead Time                     PSC Cycle              Dead Time

120       ATmega16/32/64/M1/C1 [DATASHEET]

          7647O–AVR–01/15
      On-time 0 = 2  POCRnSAH/L  1/Fclkpsc

      On-time 1 = 2  (POCRnRBH/L – POCRnSBH/L + 1)  1/Fclkpsc

      Dead-time = (POCRnSBH/L – POCRnSAH/L)  1/Fclkpsc

      PSC cycle = 2  (POCRnRBH/L + 1)  1/Fclkpsc

      Minimal value for PSC cycle = 2  1/Fclkpsc

      Note that in center aligned mode, POCRnRAH/L is not required (as it is in one-ramp mode) to control PSC Output               waveform

      timing. This allows POCRnRAH/L to be freely used to adjust ADC synchronization (See Section 14.12 “Analog

      Synchronization” on page 126).

      Figure 14-7. Controlled Start and Stop Mechanism in Centered Mode

              POCRnRB

              POCRnSB

              POCRnSA

      PSC Counter

              Run

             PSCOUTnA

      PSCOUTnB

      Note:          See Section 14.16.8 “PSC Control Register – PCTL” on page 130 (PCCYC = 1)

14.6  Update of Values

      To avoid unasynchronous and incoherent values in a cycle, if an update of one of several values is necessary, all values are

      updated at the same time at the end of the cycle by the PSC. The new set of values is calculated by software and the update

      is initiated by software.

      Figure  14-8.  Update      at  the  End of Complete PSC Cycle

                                                    Regulation Loop          Writting in

                                                    Calculation              PSC Registers  Request for

                                          Software                                          an Update

                                                    Cycle        Cycle       Cycle          Cycle

                                                    with Set i   with Set i  with Set i   with Set i

                                          PSC

                                                                                                      Cycle

                                                                                                      with Set j

                                                                                            End of Cycle

      The software can stop the cycle before the end to update the values and restart a new PSC cycle.

                                                                                    ATmega16/32/64/M1/C1 [DATASHEET]                121

                                                                                                                  7647O–AVR–01/15
14.6.1  Value Update Synchronization

        New timing values or PSC output configuration can be written during the PSC cycle. Thanks to LOCK configuration bit, the

        new whole set of values can be taken into account after the end of the PSC cycle.

        When LOCK configuration bit is set, there is no update. The update of the PSC internal registers will be done at the end of

        the PSC cycle if the LOCK bit is released to zero.

        The registers which update is synchronized thanks to LOCK are POC, POM2, POCRnSAH/L, POCRnRAH/L, POCRnSBH/L

        and POCRnRBH/L.

        See these register’s description starting on in Section 14.16.7 “PSC Configuration Register – PCNF” on page 130

14.7    Overlap Protection

        Thanks to overlap protection two outputs on a same module cannot be active at the same time. So it cannot generate cross

        conduction. This feature can be disactivated thanks to POVEn (PSC overlap enable).

        For ATmega16/64M1, and ATmega32M1 since rev C, the overlap protection is activated with only one condition:

        1.  POVENn=0 (PSC module n overlap enable)

        Up to rev B of ATmega32M1, the overlap protection was activated with the 2 following conditions:

        2.  POVENn=0 (PSC module n overlap enable)

        3.  The two channels A and B of a pwm pair n must be activated (POENnA = POENnB = 1)

        This difference can induce some behavior change between rev B and rev C of ATmega32M1, when only one channel of a

        PWM pair output is active.

        To avoid such behavior, it is recommended in case of using only one channel of a pwm pair, to disable overlap protection bit

        (POVENn = 1).

14.8    Signal Description

        Figure 14-9. PSC External Block View

                                              CLKPLL

                                              CLKI/O

                                      POCRRB[11:0]          12                             PSCOUT0A

                                      POCR0SB[11:0]         12                             PSCOUT0B

                                      POCR0RA[11:0]         12                             PSCOUT1A

                                                            12                             PSCOUT1B

                                      POCR0SA[11:0]

                                                            12                             PSCOUT2A

                                      POCR1SB[11:0]                                        PSCOUT2B

                                      POCR1RA[11:0]         12

                                                            12                             AC2O

                                      POCR1SA[11:0]                                        AC1O

                                      POCR2SB[11:0]         12                             AC0O

                                      POCR2RA[11:0]         12                             PSCIN2

                                                            12                             PSCIN1

                                      POCR2SA[11:0]                                        PSCIN0

                                                                IRQPSC  PSCASY

122     ATmega16/32/64/M1/C1 [DATASHEET]

        7647O–AVR–01/15
14.8.1  Input Description

        Table 14-1.  Internal  Inputs

        Name                   Description                                                          Type Width

        POCR_RB[11:0]          Compare value which reset signal on part B (PSCOUTnB)                Register, 12 bits

        POCRnSB[11:0]          Compare value which set Signal on part B (PSCOUTnB)                  Register, 12 bits

        POCRnRA[11:0]          Compare value which reset signal on part A (PSCOUTnA)                Register, 12 bits

        POCRnSA[11:0]          Compare value which set signal on part A (PSCOUTnA)                  Register, 12 bits

        CLK I/O                Clock input from I/O clock                                           Signal

        CLK PLL                Clock input from PLL                                                 Signal

        AC0O                   Analog comparator 0 output                                           Signal

        AC1O                   Analog comparator 1 output                                           Signal

        AC2O                   Analog comparator 2 output                                           Signal

        Table 14-2.  Block Inputs

        Name                   Description                                                          Type Width

        PSCIN0                 Input 0 used  for fault function                                     Signal

        PSCIN1                 Input 1 used  for fault function                                     Signal

        PSCIN2                 Input 2 used  for fault function                                     Signal

14.8.2  Output Description

        Table 14-3.  Block  Outputs

        Name                   Description                                                          Type Width

        PSCOUT0A               PSC module    0 output A                                             Signal

        PSCOUT0B               PSC module    0 output B                                             Signal

        PSCOUT1A               PSC module    1 output A                                             Signal

        PSCOUT1B               PSC module    1 output B                                             Signal

        PSCOUT2A               PSC module    2 output A                                             Signal

        PSCOUT2B               PSC module    2 output B                                             Signal

        Table 14-4.  Internal Outputs

                                                                                                    Type

        Name                   Description                                                          Width

        IRQPSCn                PSC interrupt request: two sources, overflow, fault                  Signal

        PSCASY                 ADC synchronization (+ amplifier syncho.)(1)                         Signal

        Note:    1.  See Section 14.12 “Analog Synchronization” on page 126.

                                                                              ATmega16/32/64/M1/C1  [DATASHEET]        123

                                                                                                    7647O–AVR–01/15
14.9      PSC Input

          For detailed information on the PSC, please refer to the Application Note “AVR138: PSC Cookbook”, available on the Atmel®

          web site.

          Each module 0, 1 and 2 of PSC has its own system to take into account one PSC input. According to PSC module n input

          control register (See Section 14.16.9 “PSC Module n Input Control Register – PMICn” on page 131), PSCINn input can act

          has a Retrigger or fault input.

          Each block A or B is also configured by this PSC module n input control register (PMICn).

          Figure 14-10.    PSC Input Module

                                                               PAOCnA (PAOCnB)

                                                                   0

                     PSCINn                0

                                                      Digital      1

                         Analog                       Filter

                     Comparator            1

                     n Output                                      PFLTEnA

                                                      CLKPSC       (PFLTEnB)

                                 PISELnA

                                 (PISELnB)

                                                PELEVnA/PCAEnA             2    Input

                                              (PELEVnB/PCAEnB)                  Processing

                                                      PRFMnA3:0            4    (retriggering)

                                                      (PRFMnB3:0)  CLKPSC

                                                                                PSC Core              Control

                                                                                (Counter,             of the      PSCOUTnA

                                                                                Waveform              6 outputs   PSCOUTnB

                                                                                Generator, ...)

                                                                   CLKPSC

14.9.1    PSC Input Configuration

          The PSC input configuration is done by programming bits in configuration registers.

14.9.1.1  Filter Enable

          If the “Filter Enable” bit is set, a digital filter of 4 cycles is inserted before evaluation of the signal. The disable of this function

          is mainly needed for prescaled PSC clock sources, where the noise cancellation gives too high latency.

          Important: If the digital filter is active, the level sensitivity is true also with a disturbed PSC clock to deactivate the outputs

          (emergency protection of external component). Likewise when used as fault input, PSC Module n Input A or Input B have to

          go through PSC to act on PSCOUTn0/1/2 outputs. This way needs that CLKPSC is running. So thanks to PSC asynchronous
          output control bit (PAOCnA/B), PSCINn input can desactivate directly the PSC outputs. Notice that in this case, input is still

          taken into account as usually by input module system as soon as CLKPSC is running.

          Figure 14-11.    PSC Input Filtering

                                              CLKPSC

                                                                   Digital              PSC Module n Input

                                                                   Filter

                                                                   4 x CLKPSC

                                                PSC Input                       Output           PSCOUTnX

                                                Module X                        Stage            PIN

124       ATmega16/32/64/M1/C1 [DATASHEET]

          7647O–AVR–01/15
14.9.1.2  Signal Polarity

          One can select the active edge (edge modes) or the active level (level modes). See PELEVnx bit description in Section

          14.16.9 “PSC Module n Input Control Register – PMICn” on page 131.

          If PELEVnx bit set, the significant edge of PSCn Input A or B is rising (edge modes) or the active level is high (level modes)

          and vice versa for unset/falling/low

          ●      In 2- or 4-ramp mode, PSCn Input A is taken into account only during Dead-Time0 and On-Time0 period (respectively

                 Dead-Time1 and On-Time1 for PSCn input B).

          ●      In 1-ramp-mode PSC Input A or PSC Input B act on the whole ramp.

14.9.1.3  Input Mode Operation

          Thanks to 4 configuration bits (PRFM3:0), it’s possible to define the mode of the PSC inputs.

          Table 14-5.    PSC Input Mode Operation

          PRFMn2:0            Description

          000b                No action, PSC input is ignored

          001b                Disactivate module n outputs A

          010b                Disactivate module n output B

          011b                Disactivate module n output A and B

          10x                 Disactivate all PSC output

          11xb                Halt PSC and wait for software action

          Note:          All  following examples are given with rising edge  or   high  level  active  inputs.

14.10     PSC Input Modes 001b to 10xb: Deactivate Outputs without Changing Timing

          Figure 14-12.  PSC Behavior versus PSCn Input in Mode 001b to 10xb

                                         DT0    OT0  DT1  OT1  DT0 OT0            DT1   OT1    DT0     OT0      DT1  OT1

                              PSCOUTnA

                              PSCOUTnB

                              PSC Input

          Figure 14-13.  PSC Behavior versus PSCn Input A or Input B in Fault Mode 4

                                         DT0    OT0  DT1  OT1  DT0           OT0  DT1   OT1    DT0     OT0      DT1  OT1

                              PSCOUTnA

                              PSCOUTnB

                              PSC Input

          PSCn Input acts indifferently on On-Time0/Dead-Time0 or on On-Time1/Dead-Time1.

                                                                                  ATmega16/32/64/M1/C1 [DATASHEET]                        125