定时器

不了解这些就无法使用单片机!学习使用“外设功能”: 2 of 6

本连载主要介绍为了应用单片机而无法避开的必需的外设功能。本连载中,将以搭载了瑞萨电子的单片机--RX63N的电路板“GR-SAKURA”为例进行说明,请你也实际操作试试看!

一手包办有关时间和时刻的处理!

在单片机中,不仅频繁地使用“○月○日○点○分”这种时刻显示,显示过去的时间和一定的周期这种形式也被频繁地使用。例如,“该程序从运行开始过去了多少时间?”、“每秒输送128次信号”等等。另外,还经常被用于“等待指定的时间”、“经过指定的时间后将转移到下一个处理”这样的情况。对这些与时间和时刻有关进行处理的外设功能就是定时器(图1)。

图1:定时器就是进行与时间、时刻有关的处理

图1:定时器就是进行与时间、时刻有关的处理

我们也可以不使用外设功能(硬件)的定时器,而是通过软件来计算时间。下面通过图2来说明使用软件来定时的示例,图中假设循环(重复)部分的处理需要费时1μs(微秒:100万分之1秒)。由此可以计算出该循环部分重复1000次需要花费1ms(毫秒:千分之1秒),重复100万次则需费时1秒。即:通过“等待经过循环处理所指定的时间”来计算时间。但是,CPU将会集中进行时间计算的处理而无法进行其他处理。而且,只能计算一个周期的时间。而现实当中,单片机需要对应0.1秒和1/1024秒等各种周期的时间。

另外,CPU的计时器频率(驱动速度)也将对软件产生影响。如果将100MHz驱动的CPU改为50MHz,那么循环1次所需的时间将变为原来的两倍。因此,需要对计算时间的软件进行修正。如上所述,由于在管理上既花时间又容易出错,所以要极力避免通过软件来计算时间。

图2:通过软件定时的定时器示例

图2:通过软件定时的定时器示例

稍微介绍一下中断的内容……

下面,我们简单介绍一下和定时器不可分割的技术——“中断功能”。单片机中的“中断功能”是指某个程序在执行过程中,因某种原因而发出“开始进行其他处理”的请求。由于可以使用中断功能,所以可使CPU不集中进行一个处理。

让我们想象一下日常生活中用到“中断功能”的情景,当我们把热水倒入方便面盒中后,如果我们在3分钟内一直盯着时钟看,那么这段时间内我们就不能做其它事情。但如果用厨房定时器设定3分钟的时间,在厨房定时器的警报响起之前我们便可以去做其它事情。在这个例子中,“一直盯着时钟看”就相当于前一节中所介绍的“等待经过循环处理所指定的时间”,所以在处理结束之前不能去做其它事情。同时,厨房定时器的警报就相当于中断功能。在中断发生前还可以去做其它事情。

单片机的外设功能中有各种各样的定时器,这些定时器在经过指定的时间或处理结束时向CPU发送中断信号。不仅是定时器,很多外设功能都会在“产生变化”、“处理开始/结束”时将中断信息传送给CPU。所以,CPU在中断功能发生前还可以继续做其它工作,因此可提高作业效率。关于中断功能的详细内容,将在本系列第4期的《外部中断功能IRQ》中做详细介绍。本期中,我们先事先了解一下“从外设功能以中断的形式向CPU传送信息”的内容。

各式各样的定时器中,还有“看门狗定时器”!

在单片机的外设功能中,最贴心的定时器是计算到指定时间的定时器和每隔一段时间便发生中断的定时器。另外,在瑞萨电子的RX63N单片机中,搭载了为控制伺服电动机而产生脉宽调制解调(PWM)信号的定时器、计算输入信号间隔的定时器、显示现在时刻的RTC(实时时钟)等各种各样的定时器。

在定时器中,最具特色的是WDT(看门狗定时器)。其名字Watch Dog Time中的Watch dog意思为“看门狗”,它的工作就是监视程序是否出现失控。由WDT监视的程序通过事先将设定的值写入WDT后启动。WDT每隔一定时间便减掉写入的值,当程序正常运行时,处理结束前会对WDT清零再结束。但是,如果程序失控(进入意料之外的重复状态且无法停止)时,写入WDT的值将小于0(称为下溢),因此向CPU通知程序出现了失控。在不允许睡眠的重要系统中,单片机中搭载的“看门狗定时器”―WDT发挥了极其重要的作用。

轻松尝试使用定时器

虽然说:“我们就通过程序来实际使用定时器……”,但是实际上,要想熟练运用定时器,必须先理解单片机的操作步骤。而且,不仅需要了解通过软件进行操作的步骤,还需理解单片机的硬件(结构)以及所使用的零部件的规格等。

因此,需要帮助时请使用“数据库”。对于搭载了RX63N单片机的GR-SAKURA电路板,我们准备了几个与时间和时刻有关的数据库(参照以下链接)。

在这个程序中,要让GR-SAKURA上的LED在一定周期内发光。虽然仅是很简单的操作,但是要想让LED在正确的周期内发光就需要使用定时器。在上述樱花程序库的“时间”选项内,有计算经过时间的数据库,所以我们就使用它。

程序如图3所示。第14行的millis函数以从程序开始时经过的时间ms(毫秒:千分之一秒)为单位送回,没有参数。使用该函数,通过获取和最初的测定(第14行)之间的差距来取得1秒后、2秒后的结果。用while语言生成循环,从a的值等待1秒或2秒(第15行、第19行)。于是,1秒后LED0(GR-Sakura电路板的D1)亮灯,2秒后灭灯。灭灯后结束loop函数,但是该操作会再次反复继续执行。另外,millis函数没有符号,将返回long型的整数。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
#include <rxduino.h>

#define WAIT_TIME   1000UL

void setup()
{
    pinMode( PIN_LED0, OUTPUT);
}

void loop() 
{
    unsigned long  a;

    a = millis();     //Get time since program start
    while( ( millis() - a) < WAIT_TIME) { }     //Wait 1 second

    digitalWrite( PIN_LED0, 1);     //Turn LED on
    
    while( (millis() - a) < WAIT_TIME + WAIT_TIME) { }     //Wait another second

    digitalWrite( PIN_LED0, 0);     //Turn LED off

}
 

图3:使用定时器功能使LED亮灯的程序。此例中,以1秒钟为周期闪烁。

※//~是用于进行评价,对程序的执行不产生影响

将程序输入Web编译器,再将编译完成后的二进制文件传送给GR-SAKURA。传送结束后,4个LED灯将暂时熄灭后再开始执行,LED0(GR-Sakura电路板的D1)开始闪烁。

本期我们讲解了必要的外设功能之一“定时器”。有关时间和时刻的处理,在各种场合都需要。请大家借此机会实际操作各种数据库。

但是,文中的“毎秒128次”和“1/1024秒”这些数字突然冒出来,是否让你吃了一惊呢?128是2的7次方,1024是2的10次方。RTC中具有每1/128秒产生一次中断的功能……这是在单片机的世界中经常看到的数字。  

下期我们将介绍串行通信的UART(通用异步收发传输器)。敬请期待!

不了解这些就无法使用单片机!学习使用“外设功能”

  1. GPIO
  2. 定时器
  3. 串行通信
  4. 中断功能
  5. 程序设计(上)
  6. 程序设计(下)