本文教导您如何使用电路图和C程序将32K外部晶体源添加到AVR Micro Contract(Atmega8)。

介绍

定时是由微控制器执行的基本功能之一。每个微控制器的体系结构中至少有一个计时器/计数器模块。但是,如果计数器在内部计时,在某些情况下可能会出现一些问题。有时时钟频率可能不稳定,有时时钟频率可能过高。S有时,外部时钟需要具备所需的质量。为了解决这些问题,一些AVR微控制器提供了一种内置振荡器,支持32.768KHz晶体。用户只需将槽电路与32K晶体一起连接即可。

为了演示这一点,我们会尝试闪烁发光二极管. 我们将使用定时器的输出。这里使用的微控制器是Atmega8..组件列表如下所示:

组成部分

QTY.

Atmega8.

1

引领

1

电阻器

1

按钮开关

1

32768Hz晶体

1

33pF陶瓷电容器

2

额外的:程序员,面包板,5V电源

现在,我们有一个输入捕获寄存器,我们可以在OC2引脚(PORTB,PIN 3)中获得电气输出。在编程时,我们必须记住以下几点:

  • 人眼可以感知任何周期性活动,周期至少为100毫秒。TCNT2 Pre scalar可以将时钟频率降低到1024个大气压TH.部分,脉冲宽度调制(PWM)模式将频率划分为256TH.部分。这可以提供最多8秒的周期(1024*256/32768)。在本演示中,我们将时钟预缩放为1024TH.部分
  • 我们也可以使用非脉宽调制模式(如CTC模式)闪烁LED。在这个演示中,我们使用的是CTC模式。
  • DDRXN位(数据方向寄存器'x',位'n')必须是'1',到哪个,连接OC2(定时器/计数器2的输出比较)。在ATMEGA8的情况下,IC的PIN号17。相应的数据方向寄存器是DDRB,引脚否为3。

所以让我们制作电路并编写程序。

将外部时钟源/ 32K水晶添加到AVR ATMEGA8

图:电路图

//为Atmega8编写的计划
#define f_cpu 1000000.
#包括
#包括
#包括

void inittimr()
{ASSR=0x08;//ASSR启用计时
//来自32kcrystal.
TCNT2=0x00;
OCR2 = 32;//由于这是一个CTC模式
// OCR2的值确定
// 时期
TCCR2 = 0B10011111;//配置为CTC模式的TCCR2。
//频率预先缩放到
// 1024th部分。
//OCR2在比较匹配中切换
while((ASSR&0x07));//等待更新
//以上3个寄存器完成
TIFR=0x00;
}

int main()
{DDRB = 0B00001000;// ddrxn位必须是'1'
//对应于OCR2
_delay_ms(2000);
initTimr();
Sleep_cpu();//停止CPU。在这里,你
//可以使用'(1);'''''''
返回0;
}

块:程序

如何将外部晶体添加到Avr Atmega8

图:在面包板上测试

这是我的实验的YouTube视频!!

异步状态寄存器–ASSR

异步状态寄存器–ASSR

一点

7.

6.

5.

4.

3.

2

1

0.

-

-

-

-

AS2

TCN2UB

OCR2ub.

tcr2ub.

读/写

R.

R.

R.

R.

rw.

R.

R.

R.

初始值

0.

0.

0.

0.

0.

0.

0.

0.

位3–AS2:异步定时器/计数器2

当AS2写入零时,定时器/计数器2从I / O时钟,CLKI / O时钟。当AS2写入一个时,定时器/计数器2从连接到定时器振荡器1(TOSC1)引脚的晶体振荡器时钟。当改变AS2的值时,TCNT2,OCR2和TCCR2的内容可能会损坏。

Bit 2 - TCN2ub:定时器/计数器2更新忙
位1–OCR2UB:输出比较寄存器2更新忙
位0 - TCR2ub:定时器/计数器控制寄存器2更新忙

这些比特的意义

如果在设置update busy标志时写入三个定时器/计数器2寄存器中的任何一个,则更新后的值可能会损坏并导致意外中断。读取TCNT2、OCR2和TCCR2的机制不同。读取TCNT2时,将读取实际定时器值。读取OCR2或TCCR2时,将读取读取临时存储寄存器。计时器/计数器2的异步操作当计时器/计数器2异步操作时,必须考虑一些因素。

定时器/计数器控制寄存器 - TCCR2

定时器/计数器控制寄存器 - TCCR2
一点

7.

6.

5.

4.

3.

2

1

0.

FOC2

WGM20.

COM21.

Com20.

WGM21.

CS22

CS21.

CS20

读/写

W.

rw.

rw.

rw.

rw.

rw.

rw.

rw.

初始值

0.

0.

0.

0.

0.

0.

0.

0.

位7 - FOC2:力输出比较
第6位:3 - WGM21:0:波形生成模式

这些位控制计数器的计数序列,最大(顶部)计数器值的源,以及要使用的类型的波形生成类型。定时器/计数器单元支持的操作模式是:正常模式,比较匹配(CTC)模式的清晰计时器,以及两种类型的脉冲宽度调制(PWM)模式。

位5:4–COM21:0:比较匹配输出模式

这些位控制输出比较引脚(OC2)行为。如果设置了一个或两个比特中的一个或两个,则OC2输出会覆盖它连接到的I / O引脚的正常端口功能。但是,请注意必须设置与OC2引脚对应的数据方向寄存器(DDR)位,以便启用输出驱动器。当OC2连接到引脚时,COM21:0位的功能取决于WGM21:0比特设置。表43示出了当WGM21:0位被设置为正常或CTC模式(非PWM)时的COM21:0比特功能。表44显示了WGM21:0位设置为快速PWM模式时的COM21:0位功能。

位2:0–CS22:0:时钟选择

三个时钟选择位选择定时器/计数器使用的时钟源。

在异步模式下配置TCNT2的步骤

在定时器/计数器2的异步和同步时钟之间切换时,定时器寄存器TCNT2、OCR2和TCCR2可能损坏。设置时钟源的安全程序是:

  • 通过适当设置AS2来选择时钟源
  • 将新值写入TCNT2,OCR2和TCCR2
  • 切换到异步操作:等待TCN2ub,OCR2ub和TCR2ub
  • 清除计时器/反应2中断标志
  • 如果需要,启用中断

在写入寄存器TCNT2,OCR2或TCCR2之一时,该值被传送到临时寄存器,并在TOSC1上的两个正边缘后锁定。在临时寄存器的内容已被传输到目的地之前,用户不应写入新值。三个上述寄存器中的每一个都具有它们的各个临时寄存器,这意味着例如,写入TCNT2不会干扰OCR2在进行中写入。要检测到到目标寄存器的转移发生,因此已实现异步状态寄存器 - ASSR

选择异步操作时,定时器/计数器2的32.768kHZ振荡器始终运行,断电和待机模式除外。在通电复位或从断电或待机模式唤醒后,用户应意识到此振荡器可能需要1秒的时间才能稳定。建议用户等待或在通电或从断电或待机模式唤醒后,在使用定时器/计数器2之前至少一秒钟。由于启动时时钟信号不稳定,从断电或待机模式唤醒后,必须认为所有定时器/计数器2寄存器的内容丢失,无论振荡器是否正在使用或时钟信号应用于TOSC1引脚

在异步操作期间,异步计时器中断标志的同步需要三个处理器周期加上一个计时器周期。因此,在处理器能够读取导致中断标志设置的计时器值之前,计时器至少提前一个周期。输出比较引脚在计时器时钟上发生变化,并且未与处理器时钟同步。

Pin行为详细信息

XTAL2 PIN.

XTAL2:芯片时钟振荡器引脚2.用作晶体振荡器或低频晶体振荡器的时钟引脚。当用作时钟引脚时,引脚不能用作I / O引脚。TOSC2: Timer Oscillator pin 2. Used only if internal calibrated RC Oscillator is selected as chip clock source, and the asynchronous timer is enabled by the correct setting in ASSR.当设置ASSR中的AS2位(一个)以启用定时器/计数器2的异步时钟时,引脚PB7与端口断开,并且成为振荡器放大器的反相输出。在此模式下,晶体振荡器连接到该引脚,销不能用作I / O引脚。

如果XATAL2引脚用作时钟引脚,则与端口相关联的寄存器的对应位将读取0. DDBXN,PORTXN和PINXN全部读取0;其中'x'是端口名称,'n'是bit。

XTAL1引脚

XTAL1:芯片时钟振荡器引脚1.用于除内部校准的RC振荡器外的所有芯片时钟源。当用作时钟引脚时,引脚不能用作I / O引脚。TOSC1: Timer Oscillator pin 1. Used only if internal calibrated RC Oscillator is selected as chip clock source, and the asynchronous timer is enabled by the correct setting in ASSR.当设置ASSR中的AS2位(一个)以启用定时器/计数器2的异步时钟时,引脚PB6与端口断开,并成为反相振荡器放大器的输入。在此模式下,晶体振荡器连接到该引脚,销不能用作I / O引脚。

如果XATAL1引脚用作时钟引脚,则与端口相关联的寄存器的对应位将读取0. DDBXN,PORTXN和PINXN全部读取0;其中'x'是端口名称,'n'是bit。

4.注释

  1. kezo.

    你留下了一些#includes不完整。您能告诉是否需要包含哪些头文件?

  2. 迈克尔

    我知道的旧文章......但对于未来的读者,我认为只需要外部电容器,因为作者没有启用Atmega的内部电容器。

    要使用内部电容器32kHz晶体,请将CKOPT保险丝进行编程,并设置适当的Cksel位。请参阅Atmega8数据表中的“低频晶体振荡器”部分。

  3. 艾哈迈德

    我不认为你需要两个低频旁路电容器。

    • rakesh.

      艾哈迈德,
      可能是,实际上我也尝试了没有电容器,但我失败了。所以我决定在图中包含22pf电容器。如果您通过Atmel Micro Controllers使用Atmel Micro Controllers使用32kHz晶体,请参阅Atmel手册,他们说明不需要附加任何电容器。并且Ccrystal应该用那些XTAL1和XTAL2引脚焊接在空气中。但正如我实际上没有成功的那样,如果设定不起作用,我会建议每个人都准备留在22pf上限。

Baidu