1.6 ATmega 16 单片机的系统控制

本节将介绍ATmega 16单片机的系统控制。

1.时钟系统

ATmega 16单片机通过Flash熔丝位来选择系统时钟,如表1-3所示。时钟输入到AVR时钟发生器,再分频到相关的模块。器件出厂时默认设置为CKSEL =“0010”,SUT=“10”。这种默认设置的时钟源为1MHz的内部RC振荡器,启动时间最长,保证用户可以通过ISP或者并行编程器得到所需的时钟源。

表1-3 ATmega 16时钟选项

说明:对于所有熔丝位,1表示未编程,0表示已编程。

1)晶体振荡器

XTAL1和XTAL2分别是晶体振荡器的反向放大器的输入端和输出端,如图1-5所示。

图1-5 晶体振荡器

这个振荡器可以使用石英晶体或者陶瓷谐振器,熔丝位CKOPT用来选择这两种放大器模式之一。当CKOPT被编程时振荡器在输出引脚产生满幅度的振荡,这种模式适合于噪声环境及需要通过XTAL2驱动第2个时钟缓冲器的情况,而且这种模式的频率范围比较大。当保持CKOPT未编程状态时,振荡器输出信号幅度比较小,其优点是功耗大大降低,但频率范围较小且不能驱动其他时钟缓冲器。

对于谐振器,CKOPT未编程时最大频率为8MHz;CKOPT编程时最大频率为16MHz。C1和C2的数值要相同,振荡器可以在3种模式下工作,每一种模式都有一个优化的频率范围,如表1-4所示。

表1-4 晶体振荡器

表1-5给出了熔丝位CKSEL[0]及SUT[1:0]用于选择的启动时间。

表1-5 晶体振荡器启动时间

2)低频晶体振荡器

为了使用32.768kHz钟表晶体作为器件的时钟源,必须将熔丝位CKSEL[3:0]设置为“1001”已选择低频晶体振荡器。用户可以通过对CKOPT的编程选择使能XTAL1和XTAL2的内部电容(标定值为36pF),从而去掉外部电容。此时启动时间由熔丝位SUT确定,如表1-6所示。

表1-6 低频晶体振荡器启动时间

3)外部RC振荡器

对时间不敏感的应用可以使用外部RC振荡器,如图1-6所示。振荡器频率可以通过公式 f =1(/ 3× RC)来计算,图中电容至少需要22pF。用户可以通过编程熔丝位CKOPT来使能XTAL1和GND之间的片内36pF电容,从而省去外部电容。

图1-6 外部RC振荡器

振荡器具有4种工作模式,每种模式都有优化的频率范围,通过熔丝位CKSEL[3:0]设定,如表1-7所示。

表1-7 外部RC振荡器

表1-8给出了外部RC振荡器的启动时间。

表1-8 外部RC振荡器的启动时间

4)标定的片内RC振荡器

标定的片内RC振荡器提供了固定的1.0MHz、2.0MHz、4.0MHz和8.0MHz的时钟,这些频率都是在5V、25℃的条件下的标定值。表1-9给出了其熔丝位编程值,选择这个时钟(此时不能对CKOPT进行编程)之后无须外部器件。复位时硬件将标定的字节加载到OSCCAL寄存器,自动完成对RC振荡器的标定。

表1-9 内部RC振荡器的熔丝位编程值

表1-10给出了内部RC振荡器启动时间。

表1-10 内部RC振荡器的启动时间

振荡器标定寄存器OSCCAL定义如下:

位[7:0]-CAL[7:0]:振荡器标定数据。

将标定数据写入这个地址可以对内部振荡器进行调节以消除生产工艺所带来的振荡器频率偏差。复位时1MHz的标定数据(标识数据的高字节,地址为0x00)自动加载到OSCCAL寄存器。如果需要内部RC振荡器以其他频率工作,则标定数据必须人工加载:首先通过编程器读取标识数据,然后将标定数据保存到Flash或EEPROM中。这些数据可以通过软件读取,然后加载到OSCCAL寄存器。当OSCCAL为零时振荡器以最低频率工作;当对其写入不为零的数据时内部振荡器的频率将增大。写入0xFF即得到最高频率,标定的振荡器用来为访问EEPROM和Flash定时。在写EEPROM和Flash的操作时不要将频率标定到超过标准频率的10%,否则写操作有可能失败。要注意振荡器只对1.0MHz、2.0MHz、4.0MHz和8.0MHz这4种频率进行了标定,其他频率则无法保证。

5)外部时钟

为了从外部时钟源驱动芯片,XTAL1必须如图1-7所示进行连接,同时熔丝位CKSEL必须编程为“0000”。若熔丝位CKOPT也被编程,则用户可以使用内部的XTAL1和GND之间的36pF电容。

图1-7 外部时钟

在选择外部时钟时,启动时间由熔丝位SUT确定,如表1-11所示。

表1-11 外部时钟启动时间

6)T/C振荡器

对于拥有T/C振荡器引脚(TOSC1和TSOC20)的AVR单片机来说,晶体可以直接连接这两个引脚,而无须外部电容。此振荡器对32.768kHz的钟表晶体做了优化,不建议在TOSC1引脚直接输入振荡信号。

2.电源管理及睡眠模式

睡眠模式可以使AVR单片机关掉没有使用到的模块从而降低功耗,AVR单片机具有不同的睡眠模式允许用户根据实际应用来实施剪裁。进入睡眠模式的条件是执行寄存器MCUCR的SE,然后执行SLEEP指令。具体进入哪一种睡眠模式(空闲模式、ADC噪声抑制模式、掉电模式、省电模式、Standby模式或扩展的Standby模式)由MCUCR寄存器的SM[2:0]决定。进入睡眠模式之后,使能的中断可以将AVR唤醒。经过启动时间,外加4个时钟周期AVR就可以运行中断服务程序了,然后回到SLEEP之后的下一条指令。唤醒时不会改变寄存器文件和SRAM的内容,如果在睡眠过程中发生了复位,则AVR唤醒后从中断向量开始运行。

AVR控制寄存器包含了电源管理的控制位。

位7、5、4-SM[2:0]为休眠模式选择位,如表1-12所示。

表1-12 休眠模式选择位

注意:仅在使用外部晶体或谐振器时Standby模式和扩展的Standby模式才可用。

位6-SE为休眠模式使能位。

为了使AVR在执行SLEEP指令之后进入休眠模式,SE必须置位,建议在SLEEP指令的前一条指令置位SE,AVR在唤醒之后立即清除SE位。

ATmega 16单片机的各种唤醒模式下的时钟和唤醒源请参考数据表。

3.复位系统

ATmega 16有5个复位源:上电复位、外部复位、看门狗复位、掉电检测复位及JTAG复位。复位时所有的I/O寄存器都被设置为初始值,程序从复位向量开始执行。复位向量处的指令必须是绝对跳转指令JMP,以使程序跳转到复位处理例程。请参考数据表查看各种复位模式的时序。

MCU控制和状态寄存器提供了AVR复位源的信息。

● 位4-JTRF:JTAG复位标志。通过JTAG指令AVR_RESET可以使JTAG复位寄存器置位,并引发AVR复位及JTRF置位。上电复位将使其清零,也可以通过写0来清除。

● 位3-WDRF:看门狗复位标志。看门狗复位发生时置位,上电复位将使其清零,也可以通过写0来清除。

● 位2-BORF:掉电检测复位标志。掉电检测复位发生时置位,上电复位将使其清零,也可以通过写0来清除。

● 位1-EXTRF:外部复位标志。外部复位发生时置位,上电复位将使其清零,也可以通过写0来清除。

● 位0-PORF:上电复位标志。上电复位发生时置位,只能通过写0来清除。

为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了解。