Proteus—AVR单片机(ATMEGA16单片机)系统时钟及时钟选项设置
扫描二维码
随时随地手机看文章
在设置之前呢,我得把ATMEGA16里面的datasheet里面的资料说说,当然是关于系统时钟和时钟选项的
一、系统时钟及时钟选项(这里主要是介绍原理,三里面会介绍如何设置,其实你会了一,那后面的二和三就相当简单了~~你懂得,就是根据一来的)
1. 时钟系统及其分布:
Figure 11为AVR的主要时钟系统及其分布。这些时钟并不需要同时工作。为了降低功耗,
可以通过使用不同的睡眠模式来禁止无需工作的模块的时钟。
1)CPU 时钟- clkCPU
CPU时钟与操作AVR内核的子系统相连,如通用寄存器文件、状态寄存器及保存堆栈指针
的数据存储器。终止CPU 时钟将使内核停止工作和计算。
2)I/O 时钟- clkI/O
I/O时钟用于主要的I/O 模块,如定时器/ 计数器、SPI 和USART。I/O 时钟还用于外部中断
模块。要注意的是有些外部中断由异步逻辑检测,因此即使I/O 时钟停止了这些中断仍然
可以得到监控。此外, USI 模块的起始条件检测在没有clkI/O 的情况下也是异步实现的,
使得这个功能在任何睡眠模式下都可以正常工作。
3)Flash 时钟- clkFLASH
Flash 时钟控制Flash 接口的操作。此时钟通常与CPU 时钟同时挂起或激活。
4)异步定时器时钟- clkASY
异步定时器时钟允许异步定时器/ 计数器与LCD 控制器直接由外部32 kHz 时钟晶体驱
动。使得此定时器/ 计数器即使在睡眠模式下仍然可以为系统提供一个实时时钟。
5)ADC 时钟- clkADC
ADC具有专门的时钟。这样可以在ADC工作的时候停止CPU和I/O时钟以降低数字电路产
生的噪声,从而提高ADC 转换精度。
2.时钟源
ATmega16芯片有如下几种通过Flash熔丝位进行选择的时钟源。时钟输入到AVR时钟发
生器,再分配到相应的模块。(这个还是很好理解的,就是通过CKSEL3~0位既4位来确定是使用外部晶振、外部低频晶振、外部RC振荡器、标定的内部RC振荡器还是外部时钟,很简单吧)
3.默认时钟源
器件出厂时CKSEL = “0010”, SUT = “10”。这个默认设置的时钟源是1 MHz 的内部RC
振荡器,启动时间为最长。这种设置保证用户可以通过ISP 或并行编程器得到所需的时钟
源。(这里STU可能还不明白,后面还有介绍的~~)
4.晶体振荡器(从现在开始,就真正要介绍他们的系统时钟和时钟选项了)
XTAL1 与XTAL2 分别为用作片内振荡器的反向放大器的输入和输出,如Figure 12 所示,
这个振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位CKOPT 用来选择这两种
放大器模式的其中之一。当CKOPT 被编程时振荡器在输出引脚产生满幅度的振荡。这种
模式适合于噪声环境,以及需要通过XTAL2 驱动第二个时钟缓冲器的情况。而且这种模
式的频率范围比较宽。当保持CKOPT 为未编程状态时,振荡器的输出信号幅度比较小。
其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器, CKOPT 未编程时的最大频率为8 MHz, CKOPT 编程时为16 MHz。C1
和C2 的数值要一样,不管使用的是晶体还是谐振器。最佳的数值与使用的晶体或谐振器
有关,还与杂散电容和环境的电磁噪声有关。Table8 给出了针对晶体选择电容的一些指
南。对于陶瓷谐振器,应该使用厂商提供的数值。若想得到更多的有关如何选择电容以及
振荡器如何工作的信息,请参考多用途振荡器应用手册。
振荡器可以工作于三种不同的模式,每一种都有一个优化的频率范围。工作模式通过熔丝
位CKSEL3..1 来选择,如Table 4 所示。(这里可能会有一点疑问,不是CKSEL3~0用来选择器件的,怎么CKSEL3~1用来选择什么鸟频率范围,对喽,就是这个样子,CKSEL3~1就是用来选择你选择好的晶体振荡器工作模式的(顺便给出了范围),这就是为什么上面CKSEL3~0为什么选择器件有个范围的原因了。然后就是CKSEL0位呢?熔丝位CKSEL0以及STU1~0用来选择启动时间的,下面会有介绍的)
如Table 5 所示,熔丝位CKSEL0 以及SUT1..0 用于选择启动时间。
5)低频晶体振荡器
为了使用32.768 kHz 钟表晶体作为器件的时钟源,必须将熔丝位CKSEL 设置为“1001”
以选择低频晶体振荡器。晶体的连接方式如Figure 12 所示(此图跟晶体振荡器的连接图一样的~~)。通过对熔丝位CKOPT 的编程,用户可以使能XTAL1 和XTAL2 的内部电容,从而去除外部电容。内部电容的标称数
值为36 pF。
选择了这个振荡器之后,启动时间由熔丝位SUT 确定,如Table 6 所示。
6)外部RC振荡器
对于时间不敏感的应用可以使用Figure 13 的外部RC 振荡器。频率可以通过方程f =
1/(3RC) 进行粗略地鼓估计。电容C 至少要22 pF。
通过编程熔丝位CKOPT,用户可以使能XTAL1 和GND 之间的片内 36 pF 电容,从而无需外部电容。
振荡器可以工作于四个不同的模式,每个模式有自己的优化频率范围。工作模式通过熔丝
位CKSEL3..0 选取,如Table 7 所示。
选择了这个振荡器之后,启动时间由熔丝位SUT 确定,如Table 8 所示。
7)标定的片内RC振荡器
标定的片内RC 振荡器提供了固定的1.0、2.0、4.0 或8.0 MHz 的时钟。这些频率都是
5V、25°C 下的标称数值。这个时钟也可以作为系统时钟,只要按照Table 9 对熔丝位
CKSEL进行编程即可。选择这个时钟(此时不能对CKOPT进行编程)之后就无需外部器件
了。复位时硬件将标定字节加载到OSCCAL 寄存器,自动完成对RC 振荡器的标定。在
5V,25°C 和频率为1.0 MHz 时,这种标定可以提供标称频率 ± 1% 的精度。当使用这个振
荡器作为系统时钟时,看门狗仍然使用自己的看门狗定时器作为溢出复位的依据。
选择了这个振荡器之后,启动时间由熔丝位SUT 确定,如Table 10 所示。XTAL1 和
XTAL2 要保持为空(NC)。
8)振荡器标定寄存器- OSCCAL(这个寄存器主要是对内部振荡器进行调节的,可以消除由于生产工艺所带来的振荡器频率偏差~~后面有详细介绍的,说实话,我还真的没有用过~~)
? Bits 7..0 – CAL7..0: 振荡器标定数据
将标定数据写入这个地址可以对内部振荡器进行调节以消除由于生产工艺所带来的振荡
器频率偏差。复位时1 MHz 的标定数据( 标识数据的高字节,地址为0x00) 自动加载到
OSCCAL 寄存器。如果需要内部RC 振荡器工作于其他频率,标定数据必须人工加载。
首先通过编程器读取标识数据,然后将标定数据保存到Flash 或EEPROM 之中。这些数据
可以通过软件读取,然后加载到OSCCAL 寄存器。当OSCCAL 为零时振荡器以最低频
率工作。当对其写如不为零的数据时内部振荡器的频率将增长。写入0xFF 即得到最高频
率。标定的振荡器用来为访问EEPROM 和Flash 定时。有写EEPROM 和Flash 的操作
时不要将频率标定到超过标称频率的10%,否则写操作有可能失败。要注意振荡器只对
1.0、2.0、4.0 和8.0 MHz 这四种频率进行了标定,其他频率则无法保证。
9)外部时钟
为了从外部时钟源驱动芯片, XTAL1 必须如Figure 14 所示的进行连接。同时,熔丝位
CKSEL必须编程为“0000”。若熔丝位CKOPT也被编程,用户就可以使用内部的XTAL1和
GND 之间的36 pF 电容。
10)定时/计数器振荡器
对于拥有定时器/ 振荡器引脚(TOSC1 和TOSC2) 的AVR 微处理器,晶体可以直接与这
两个引脚连接,无需外部电容。此振荡器针对32.768 kHz 的钟表晶体作了优化。不建议
在TOSC1 引脚输入振荡信号。
二、IAR for AVR设置熔丝位(暂时还真的不会啊~~等会了再贴出来吧~~~,先简短的略过吧)
三、Proteus中的相关设置
啊~~~马上就哦了
Proteus中ATMEGA16的component如下:
这里我就不一一介绍了吧,主要的说说就哦了:
CKOPT位1是未编程,0代表编程
CKSEL这个必须知道,熔丝位设置,这里面有你想设置的熔丝位,什么晶体振荡器,低频晶体振荡器,外部RC振荡器,标定的片内RC振荡器以及外部时钟都是从这里找的~~~(我一般选择片内RC振荡器,而且是8MHZ的)
然后是boot loder size,这个是一个引导程序大小的设置,暂时放着先不管~~
STU这个设置对于启动时间还是很重要的出厂时的设置是10,电源是缓慢上升的(上面可是有图有解释的~~~这里我就不改动了)
现在看看我的设置吧,但是我还不知道怎么用外部晶振~~~这篇文章持续更新,以后知道了再给补上,上面说的都是些基础~~你懂得,毕竟我也是个小菜鸟,呵呵