购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

任务3
单片机最小系统及系统控制

1.单片机最小系统

单片机最小系统又称为单片机基本系统,是指用最少的元器件能使单片机工作起来的一个最基本的应用系统。在这种系统中,使用ATmega16单片机的一些内部资源就能够满足硬件设计需求,不需扩展外部的存储器或I/O接口等器件,通过用户编写的程序,单片机就能够达到控制的要求。

单片机的最小系统结构只能使用在控制较简单的场合,该系统包括单片机、时钟电路、复位电路等。同时,单片机要正常运行,还必须具备电源正常、时钟正常、复位正常3个基本条件。ATmega16单片机组成的最小系统电路原理图如图1-3所示。

从图1-3中可以看出,电路以ATmega16单片机为核心,ATmega16的第12脚和第13脚外接由C1、C2和X1构成的石英晶体振荡器电路(即时钟电路);ATmega16的第9脚外接由R1、C3构成的复位电路。当然,ATmega16单片机要正常工作,还需提供电源,因此在实际电路中,ATmega16的第11脚应该接地,而第10脚应该接电源+5V。

图1-3 ATmega16单片机最小系统电路原理图

图1-3所示的单片机最小系统通上电后,单片机即可开始工作,4组端口的数据寄存器PORTx处于0x00状态;数据方向寄存器DDRx处于0x00(表示为输入)状态;输入引脚寄存器PINx处于高阻状态。在这种情况下,是否说明单片机正常工作呢?单片机要完成相应的任务操作,还必须用程序来进行控制,没有固化程序的单片机系统是无法完成任何实质上的工作的。所以图1-3所示的电路,严格地说,通电后单片机进入了工作准备就绪状态。

2.时钟系统控制

【时钟系统和时钟分配】 ATmega16的主要时钟系统及其分布如图1-4所示,这些时钟并不需要同时工作。为了降低功耗,可以使用不同的睡眠模式来禁止无须工作的模块时钟。

ATmega16时钟系统将产生的时钟信号主要有clk CPU (CPU时钟)、clk I/O (I/O时钟)、clk Flash (Flash时钟)、clk ASY (异步定时器时钟)、clk ADC (ADC时钟)。

clk CPU (CPU时钟)与操作AVR内核的子系统相连,如通用寄存器文件、状态寄存器及保存堆栈指针的数据存储器。如果终止CPU 时钟,将使CPU内核停止工作。

clk I/O (I/O时钟)用于主要的I/O模块,如定时器/计数器、SPI和USART。clk I/O 还用于外部中断模块。由于某些外部中断是通过异步逻辑检测的,因此即使clk I/O 停止了,这些中断仍然可以得到监控。此外,TWI模块的地址识别功能在没有clk I/O 的情况下也是异步实现的,使得这个功能在任何睡眠模式下都可以正常工作。

clk Flash 控制Flash接口的操作,此时钟通常与CPU时钟同时挂起或激活。

clk ASY 允许异步定时器/计数器与LCD控制器直接由外部32kHz时钟晶体驱动,使得此定时器/计数器即使在睡眠模式下仍然可以为系统提供一个实时时钟。

ADC具有专门的时钟clk ADC 。这样可以在ADC工作时,停止CPU和I/O时钟以降低数字电路产生的噪声,从而提高ADC转换精度。

图1-4 ATmega16的主要时钟系统及其分布

【时钟源】 ATmega16芯片可以通过Flash熔丝位来选择系统的时钟源,见表1-7。对于所有的熔丝位,“1”表示未编程;“0”表示已编程。时钟输入到AVR时钟发生器,再分配到相应的模块。器件出厂时,默认设置为CKSEL=“0010”,SUT=“10”。这种默认设置的时钟源为1MHz的内部RC振荡器,启动时间最长,保证用户可以通过ISP或并行编程器得到所需的时钟源。

表1-7 ATmega16芯片时钟源选择

【外部晶体振荡器】 XTAL1与XTAL2分别为片内振荡器的反向放大器的输入端和输出端。在XTAL1与XTAL2引脚上外接振荡器和电容可组成谐振回路,配合片内的OSC振荡回路构成稳定的自激振荡器,如图1-5所示。这个外接振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位CKOPT用于选择这两种放大器模式的其中之一。当CKOPT被编程时,振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2驱动第2个时钟缓冲器的情况,而且这种模式的频率范围比较宽。当保持CKOPT为未编程状态时,振荡器的输出信号幅度比较小,其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。

图1-5 外部晶振连接图

对于谐振器,其频率可在0~16MHz之间选择,CKOPT未编程时的选择谐振器的最高频率为8MHz,CKOPT编程时选择谐振器的最高频率为16MHz。C1和C2的数值要一样,不管使用的是晶体还是谐振器。最佳的数值不仅与使用的晶体或谐振器有关,还与杂散电容和环境电磁噪声有关。振荡器可以工作在3种不同的模式,每一种都有一个优化的频率范围,见表1-8。

表1-8 晶体振荡器工作模式

注:此选项只能用于陶瓷谐振器,不适用于晶体。

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

表1-9 晶体振荡器的启动时间的选择

说明:

注1:这些选项不适用于晶体,只适用于陶瓷谐振器。只能用于工作频率不太接近于最大频率,而且启动时的频率稳定性对于应用而言不是十分重要的情况。

注2:这些选项是为陶瓷谐振器设计的,可以保证启动时频率足够稳定。如果工作频率不太接近于最大频率,而且启动时的频率稳定性对于应用而言不十分重要时也适用于晶体。

【外部低频晶体振荡器】 为了使用32.768kHz时钟晶体作为器件的时钟源,必须将熔丝位CKSEL设置为“1001”以选择低频晶体振荡器。外部低频晶体振荡的连接也采用如图1-6所示的方式。通过对熔丝位CKOPT的编程,用户可以使能XTAL1和XTAL2的内部电容(内部电容的标定数值为36pF),从而去除外部电容。选择这个振荡器后,启动时间由熔丝位SUT确定,见表1-10。

表1-10 晶体振荡器工作模式

注:这些选项只能用于启动时频率稳定性对应用而言不十分重要的情况。

【外部RC振荡器】 对于时间不敏感的应用可以使用图1-6所示的外部 RC 振荡器。频率可以通过方程f=1/(3RC)进行粗略的估计。电容C至少要22pF。通过编程熔丝位CKOPT,用户可以使能XTAL1和GND之间的片内36pF电容,从而省去外部电容。

振荡器可以工作于4种不同的模式,每个模式有自己的优化频率。工作模式通过熔丝位CKSEL[3..0]选取(见表1-11)。

图1-6 外部RC振荡器连接图

表1-11 外部RC振荡器工作模式

选择了这个振荡器后,启动时间由熔丝位SUT确定,见表1-12。

注意:

在SUT[1..0]为“11”时,只能用于工作频率不太接近于最大频率时的情况。

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

【标定的片内RC振荡器】 标定的片内RC振荡器提供了固定的1.0MHz、2.0MHz、4.0MHz或8.0MHz的时钟。这些频率都是在5V、25℃条件下的标定值。这个时钟也可以作为系统时钟,只要按照表1-13所列对熔丝位CKSEL进行编程即可。选择这个时钟(此时不能对CKOPT进行编程)后就无须外部器件了。复位时,硬件将标定字节加载到OSCCAL寄存器,自动完成对RC振荡器的标定。在5V、25℃和频率为1.0MHz时,这种标定可以提供标称频率的±1%的精度。当使用这个振荡器作为系统时钟时,看门狗仍然使用自己的看门狗定时器作为溢出复位的依据。

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

注:出厂时的设置

选择这个振荡器后,启动时间由熔丝位SUT确定,见表1-14。XTAL1和XTAL2要保持为空。

表1-14 内部标定RC振荡器的启动时间

注:出厂时的设置

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

☺ CAL7~CAL0(Bit7~Bit0)为振荡器标定数值。将标定数值写入这个地址可以对内部振荡器进行调节,以消除由于生产工艺所带来的振荡器频率偏差。复位时,1MHz 的标定数据(标志数据的高字节,地址为 0x00)自动加载到 OSCCAL 寄存器。如果需要内部 RC振荡器工作于其他频率,标定数据必须人工加载,即首先通过编程器读取标志数据,然后将标定数据保存到 Flash 或 E2PROM 中。这些数据可以通过软件读取,然后加载到 OSCCAL寄存器。当 OSCCAL 为“0x00”时,振荡器以最低频率工作;当对其写不为 0 的数据时,内部振荡器的频率将增加;写入 0xFF 即得到最高频率。标定的振荡器用于为访问 E2PROM和Flash定时。在写E2PROM和Flash的操作时,不要将频率标定到超过标称频率的10%,否则写操作有可能失败。

注意:

振荡器只对1.0MHz、2.0MHz、4.0MHz和8.0MHz这4种频率进行了标定,其他频率则无法保证,见表1-15。

表1-15 内部RC振荡器频率范围

【外部时钟源】 为了从外部时钟源驱动芯片,XTAL1必须按图1-7所示的方法进行连接。同时,熔丝位CKSEL必须编程为“0000”。若熔丝位CKOPT也被编程,用户就可以使用内部的XTAL1和GND之间的36pF 电容。选择了这个振荡器后,启动时间由熔丝位SUT确定,见表1-16。

图1-7 外部时钟配置图

为了保证MCU能够稳定工作,不能突然改变外部时钟源的振荡频率。工作频率突变超过2%将会产生异常现象。应该在MCU保持复位状态时改变外部时钟的振荡频率。

表1-16 外部时钟的启动时间

【定时器 / 计数器振荡器】 对于拥有定时器/振荡器引脚(TOSC1和TOSC2)的AVR微处理器,晶体可以直接与这两个引脚连接,无须外部电容。此振荡器针对32.768kHz的时钟晶体作了优化。建议不在TOSC1引脚输入振荡信号。

3.电源管理——睡眠模式

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

表1-17 休眠模式选择

注:仅在使用外部晶振或谐振器时Standby模式下才能使用。

ATmega16控制寄存器MCUCR包含了电源管理的控制位,各位的定义如下:

☺ SM2~SM0(Bit7、Bit5、Bit4):休眠模式选择位。

☺ SE(Bit6):休眠使能。为了使 MCU 在执行 SLEEP指令后进入休眠模式,SE必须置“1”。为了确保进入休眠模式,建议在SLEEP指令的前一条指令将SE置“1”。MCU一旦唤醒立即清除SE位。

4.复位系统控制

ATmega16有5个复位源,即上电复位、外部复位、看门狗复位、掉电检测复位和JTAG复位。复位时,所有的I/O寄存器都被设置为初始值,程序从复位向量处开始执行。所有的复位信号消失后,芯片内部的1个延迟计数器被激活,将内部复位的时间延长。这种处理方式使得在MCU正常工作前有一定的时间让电源达到稳定的电平。

MCUCSR为MCU控制和状态寄存器,它提供了有关引起MCU复位的复位源的信息,各位的定义如下:

☺ JTD(Bit7):禁止/允许 JTAG 接口。此位为“0”时,如果 JTAGEN 熔丝位被编程,则JTAG接口使能。如果该位为“1”,JTAG接口禁止。

☺ ISC2(Bit6):中断2触发方式控制。

☺ JTRF(Bit4):JTAG 复位标志。通过 JTAG 指令 AVR_RESET 可以使 JTAG 复位寄存器置位,并引发 MCU 复位,并使 JTRF 置“1”。上电复位将使其清“0”,也可以通过软件清“0”。

☺ WDRF(Bit3):看门狗复位标志。看门狗复位发生时置“1”。上电复位将使其清“0”,也可以通过软件清“0”。

☺ BORF(Bit2):掉电检测复位标志。掉电检测复位发生时置“1”。上电复位将使其清“0”,也可以通过软件清“0”。

☺ EXTRF(Bit1):外部复位标志。外部复位发生时置“1”。上电复位将使其清“0”,也可以通过软件清“0”。

☺ PORF(Bit0):上电复位标志。上电复位发生时置“1”,只能通过软件清“0”。 cjFuUda5eUZAOjPeuaCM7YmoK/eoiESgBHHR5DhXZjikMNVitQAu8cwU70ZChKAw

点击中间区域
呼出菜单
上一章
目录
下一章
×