0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样在两种不同模式下使用ATmega168上的Timer0

454398 来源:工程师吴畏 2019-07-31 17:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

原理图

怎样在两种不同模式下使用ATmega168上的Timer0

为什么要使用计时器?

大多数微控制器项目都需要使用精心计时的事件,包括多任务,位冲击协议,测量等等。这些定时事件可以通过在循环的每次迭代中使用递增计数器来在软件中完成。但是,这会浪费可用于执行其他操作的CPU资源,并且此类循环的使用可能难以正确计时。这就是定时器被引入微控制器的原因。现在它们非常普遍,很少找到没有控制器的控制器。

大多数ATmega设备至少有一个定时器,ATmega168有三个定时器。因此,在本教程中,我们将看看定时器0以及在两种不同模式下使用时如何将它用于定时事件:正常和比较。

定时器0

定时器0是一个通用的8位定时器,具有一些相当强大的功能,包括比较模式,快速PWM生成和波形生成功能。虽然定时器0可能看起来很复杂,但实际上它使用起来相当简单,只要你了解其工作原理背后的基础知识。

定时器0外设布局

首先,AVR上的定时器几乎与一个由链中的一堆触发器组成的简单向上计数器相同。每次定时器计时时,它都会递增一个计数器寄存器,用于跟踪当前定时器的值。

当定时器达到最大值然后计时时(timer0是一个8位计数器,这意味着它最大值为255),定时器回绕到0并设置定时器溢出位。此位可用于查看计数器是否已溢出,并且在确定特定代码段是否已停止或未响应的情况下非常有用。

定时器通常可以来自不同的源,包括内部时钟源和外部I/O引脚。这意味着外部电路可以提供方波,使定时器递增,或者微控制器本身可以递增定时器(这通常用作时钟源)。

一些定时器(如定时器0)有比较单位,允许定时器在定时器等于某个值时触发中断。当微控制器需要执行在特定时间过去时执行的事件时,这非常有用。

一个这样的例子涉及在需要每64uS发送一次脉冲同步脉冲时创建视频信号(朋友)。其他示例包括多任务,其中微控制器可以每毫秒切换到不同的任务。一旦匹配发生,也可以使这样的比较单元清除定时器,这样用户就不必自己重置定时器。

定时器0:正常模式

在正常模式下,定时器0将在每个时钟递增,并且一旦计数器超过其最高值值(255,因为它是一个8位定时器),定时器回绕到值0并设置溢出位(TOV0位在寄存器TIFR0中找到)。

设置定时器0运行在正常模式下,WGM02-WGM01位需要设置为0(注意; WGM02位于TCCR0B中,而位WGM01和WGM00位于寄存器TCCR0A中。

寄存器TCCR0A和TCCR0B中的波形位

定时器0:CTC模式

比较匹配模式(CTC)上的清除定时器与普通模式类似,除非定时器达到的值寄存器OCR0A,定时器清零(复位为0x00)。这可用于创建定时事件,包括延迟和中断,而无需使用软件资源(全部在硬件中完成)。

当定时器等于OCR0A的值时,则设置OCF0A,表示匹配在定时器和OCR0A之间发生。要在CTC模式下配置定时器0,需要将WGM02-WMG00位设置为0x02。

定时器0时钟源

定时器0可以通过外部源(通过T0引脚)或内部I/O时钟提供时钟。某些I/O时钟源可以如表所示进行预分频,时钟源选择位可在TCCR0B寄存器中找到。

从显示预分量选项的ATmega数据表中提取

关于中断标志的注意事项

重要的是要注意AVR是为了清除标志,你必须在标志上写一个逻辑的。这意味着,例如,如果要清除溢出标志,则将1写入写入0的寄存器INSTEAD

示例1:正常模式

此模式显示在正常模式下使用定时器0来打开和关闭LED每次计数器翻转(超过255)。

/*

* AVR Timer.c

*

* Created: 08/01/2018 13:16:36

* Author : RobinLaptop

*/

#define setBit(reg, bit) (reg = reg | (1 《《 bit))

#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))

#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))

#define clearFlag(reg, bit) (reg = reg | (1 《《 bit))

#include

int main(void)

{

// Initialize Registers

clearBit(TCCR0A, WGM00); // Configure WGM to be 0x00 for normal mode

clearBit(TCCR0A, WGM01);

clearBit(TCCR0B, WGM02);

setBit(TCCR0B, CS00); // Configure clock source to be clock io at 1024 pre-scale

clearBit(TCCR0B, CS01);

setBit(TCCR0B, CS02);

DDRD = 0xFF; // Make PORT D and output

while (1)

{

// Wait until the TOV0 bit is set

while(!(TIFR0 & (1 《《 TOV0)))

{

}

// Clear the overflow flag by writing a 1 to it. I know, thats dumb but that‘s how it is!

clearFlag(TIFR0, TOV0);

// Toggle the LED (PD0 , Pin 2)

PORTD = PORTD ^ (1 《《 PD0);

}

}

示例2:CTC模式

当定时器0等于OCR0A的值时,该模式将切换LED。一旦匹配发生,定时器将自动复位并设置OCF0A标志。

/*

* Example 2 - CTC.c

*

* Created: 08/01/2018 13:43:06

* Author : RobinLaptop

*/

#define setBit(reg, bit) (reg = reg | (1 《《 bit))

#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))

#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))

#define clearFlag(reg, bit) (reg = reg | (1 《《 bit))

#include

int main(void)

{

// Initialize Registers

clearBit(TCCR0A, WGM00); // Configure WGM to be 0x00 for normal mode

setBit(TCCR0A, WGM01);

clearBit(TCCR0B, WGM02);

setBit(TCCR0B, CS00); // Configure clock source to be clock io at 1024 pre-scale

clearBit(TCCR0B, CS01);

setBit(TCCR0B, CS02);

DDRD = 0xFF; // Make PORT D and output

OCR0A = 0x7F; // Reset the timer once the value of the timer reaches 127

while (1)

{

// Wait until the OCF0A bit is set

while(!(TIFR0 & (1 《《 OCF0A)))

{

}

// Clear the overflow flag by writing a 1 to it. I know, thats dumb but that’s how it is!

clearFlag(TIFR0, OCF0A);

// Toggle the LED (PD0 , Pin 2)

PORTD = PORTD ^ (1 《《 PD0);

}

}

结论

本教程仅涉及计时器能够做更多事情的计时器。例如,这些定时器可以启用它们的中断,这将允许微控制器在设置标志后立即运行时间敏感的代码。或者,我们可以执行其他代码,而不是使用while循环来等待溢出标志触发,这样可以更有效地利用CPU。很明显,定时器非常强大,可以为大多数项目带来巨大的变化!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ATmega168
    +关注

    关注

    0

    文章

    9

    浏览量

    9490
  • TIMER0
    +关注

    关注

    0

    文章

    21

    浏览量

    7693
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    用PLC实现卷径计算的两种算法

    卷径计算,是动态计算如钢卷,纸卷等存料量的一方法,它是实现张力控制和自动充放料、以及甩尾控制的重要前提。卷径计算目前主流的方法有两种,一是根据机列速度(产线速度)和和被测卷的转动角速度求得;另一
    的头像 发表于 11-14 16:54 1354次阅读
    用PLC实现卷径计算的<b class='flag-5'>两种</b>算法

    ADI GMSL技术两种视频数据传输模式的区别

    本文深入介绍GMSL技术,重点说明用于视频数据传输的像素模式和隧道模式之间的差异。文章将阐明这两种模式之间的主要区别,并探讨成功实施需要注意的具体事项。
    的头像 发表于 10-10 13:49 1759次阅读
    ADI GMSL技术<b class='flag-5'>两种</b>视频数据传输<b class='flag-5'>模式</b>的区别

    两种散热路径的工艺与应用解析

    背景:两种常见的散热设计思路 大电流或高功率器件应用中,散热和载流能力是PCB设计中必须解决的难题。常见的两种思路分别是: 厚铜板方案:通过整体增加铜箔厚度(如3oz、6oz甚至更高),增强导热
    的头像 发表于 09-15 14:50 462次阅读

    CMOS 2.0与Chiplet两种创新技术的区别

    摩尔定律正在减速。过去我们靠不断缩小晶体管尺寸提升芯片性能,但如今物理极限越来越近。在这样的背景两种创新技术站上舞台:CMOS 2.0 和 Chiplet(芯粒)。它们都在解决 “如何让芯片更强” 的问题,但思路却大相径庭。
    的头像 发表于 09-09 15:42 710次阅读

    两种驱动方式永磁直线开关磁链电机的研究

    摘要:永磁开关磁链电机数学模型可以等效为永磁无刷电机,普遍采用方波驱动方式。在有限元基础分析6/7极直线式磁链电机反电势波形,采用方波和正弦波驱动方式,比较两种方式的电流、电压、平均推力大小
    发表于 06-09 16:18

    两种感应电机磁链观测器的参数敏感性研究

    模式和发电模式对闭环电压电流模型磁链观测器和滑模磁链观测器参数敏感性进行了研究,通过仿真和实验比较了这两种观测器对定、转子电阻及励磁电感的敏感性。同时还研究了基于这
    发表于 06-09 16:16

    TIMER定时器

    TIMER0TIMER7定时器载波相位有偏差,如何解决
    发表于 06-06 14:41

    两种激光模式介绍

    激光束的输出实际宽频率范围内的许多不同频率的紧密间隔的光谱线组成。离散光谱分量称为激光模式laser modes,覆盖范围是负责激光输出的原子跃迁的线宽。
    的头像 发表于 04-15 10:18 1355次阅读
    <b class='flag-5'>两种</b>激光<b class='flag-5'>模式</b>介绍

    DLPC3478的Display模式和 Light Control模式DMD微镜的控制的本质区别是什么呢?

    我们都知道,Display模式一般用于投影显示,Light Control 模式用来做3D打印或3D扫描。但是为什么会有这两种模式的区分?Display
    发表于 02-20 07:38

    电流输出 vs 电压输出:两种传感器输出模式有什么区别?

    工业自动化和数据采集领域,传感器扮演着至关重要的角色,它们将各种物理量(如温度、压力、流量等)转换为可被测量和分析的电信号。而传感器的输出信号主要分为两种模式:电流输出和电压输出。理解这两种
    的头像 发表于 02-08 18:21 2065次阅读
    电流输出 vs 电压输出:<b class='flag-5'>两种</b>传感器输出<b class='flag-5'>模式</b>有什么区别?

    TLV5616和TLV5636两种工作模式FAST和SLOW分别有什么特点,优势,选择时应该注意什么?

    大家好 我想请教一大家关于TLV5616和TLV5636的工作模式,具体就是两种工作模式FAST和SLOW分别有什么特点,优势,选择时应该注意什么?谢谢!
    发表于 02-07 07:02

    用TLC2551采外部电压,只有0和2096两种值是怎么回事?

    用TLC2551采外部电压,只有0和2096两种值是怎么回事?求解决办法。
    发表于 02-06 07:31

    ADS1259读取模数转换结果的时候是否是两种读取模式

    咨询ADS1259读取模数转换结果的时候是否是两种读取模式,一是读引脚(DIN),一是读寄存器,读寄存器的数据是进行数据校验? 还有
    发表于 01-22 07:18

    求助一关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?

    一次中断,时间似乎对不上??或者有没有大神指点一正确的计算方法?说明书附件奉上*附件:CH552DS1.PDF //Timer0中断 void writeByCZC_Interrupt(void
    发表于 12-20 10:57

    ADS1292R有 \"1 ch ECG + 1 ch呼吸侦测\" 或 \"2 ch ECG\" 两种模式,是否可以在产品实现自行切换两种使用模式?

    请问 ADS1292R 有 \"1 ch ECG + 1 ch 呼吸侦测\" 或 \"2 ch ECG\" 两种模式,是否可以在产品实现让用户自行切换两种使用
    发表于 12-13 14:43