您的位置 首页 观点

单片机与程序设计(上)

在单片机中,不仅频繁地使用ldquo;○月○日○点○分rdquo;这种时刻显示,显示过去的时间和一定的周期这种形式也被频繁地使用。例如,ldquo;该程序从

单片机中,不只频频地运用“○月○日○点○分”这种时刻显现,显现曩昔的时刻和必定的周期这种办法也被频频地运用。例如,“该程序从运转开端曩昔了多少时刻?”、“每秒运送128次信号”等等。其他,还常常被用于“等候指定的时刻”、“经过指定的时刻后将转移到下一个处理”这样的状况。对这些与时刻和时刻有关进行处理的外设功用便是守时器(图1)。

咱们也能够不运用外设功用(硬件)的守时器,而是经过软件来核算时刻。下面经过图2来阐明运用软件来守时的示例,图中假定循环(重复)部分的处理需求费时1μs(微秒:100万分之1秒)。由此能够核算出该循环部分重复1000次需求花费1ms(毫秒:千分之1秒),重复100万次则需费时1秒。即:经过“等候经过循环处理所指定的时刻”来核算时刻。可是,CPU将会会集进行时刻核算的处理而无法进行其他处理。并且,只能核算一个周期的时刻。而实际傍边,单片机需求对应0.1秒和1/1024秒等各种周期的时刻。

其他,CPU的计时器频率(驱动速度)也将对软件产生影响。假如将100MHz驱动的CPU改为50MHz,那么循环1次所需的时刻将变为本来的两倍。因而,需求对核算时刻的软件进行批改。如上所述,因为在管理上既花时刻又简略犯错,所以要竭力防止经过软件来核算时刻。

略微介绍一下中止的内容……

下面,咱们简略介绍一下和守时器不行分割的技能——“中止功用”。单片机中的“中止功用”是指某个程序在履行过程中,因某种原因而宣布“开端进行其他处理”的恳求。因为能够运用中止功用,所以可使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告诉程序呈现了失控。在不允许睡觉的重要体系中,单片机中搭载的“看门狗守时器”DWDT发挥了极其重要的效果。

轻松测验运用守时器

尽管说:“咱们就经过程序来实际运用守时器……”,可是实际上,要想娴熟运用守时器,必须先了解单片机的操作过程。并且,不只需求了解经过软件进行操作的过程,还需了解单片机的硬件(结构)以及所运用的零部件的标准等。

因而,需求协助时请运用“数据库”。关于搭载了RX63N单片机的GR-SAKURA电路板,咱们预备了几个与时刻和时刻有关的数据库。

SAKURA 的sketch参数:樱花程序库时刻(仅英文版)

在这个程序中,要让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型的整数。

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

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

将程序输入Web编译器,再将编译完结后的二进制文件传送给GR-SAKURA。传送完毕后,4个LED灯将暂时平息后再开端履行,LED0(GR-Sakura电路板的D1)开端闪耀。

接咱们讲解了必要的外设功用之一“守时器”。有关时刻和时刻的处理,在各种场合都需求。请咱们借此机会实际操作各种数据库。

可是,文中的“懊128次”和“1/1024秒”这些数字忽然冒出来,是否让你吃了一惊呢?128是2的7次方,1024是2的10次方。RTC中具有每1/128秒产生一次中止的功用……这是在单片机的国际中常常看到的数字。

接下来讲中止功用

进步作业功率的“中止功用”指的是什么?

咱们回忆一下“守时器”中简略介绍过的“中止功用”概念。任何人都有过这样的阅历,便是“将鸡蛋放进欢腾的热水中,直到鸡蛋煮熟的10分钟内要承认好几次时钟”的阅历。在单片机的国际中也相同,在等候某种状况达到时,具有对目标进行定时查看的办法。例如,在等候向GPIO(通用I/O端口)的输入从0变为1时,程序能够必定的距离来查看GPIO的状况。这种处理被称为“轮询”。

轮询尽管是一种了解状况改变的简略办法,可是假如查看的频度低(距离长)就会错失改变,假如频度过高(距离短),即便查也查不到改变“空耗”。因为轮询经过简略的程序便能完结处理,所以在把握目标的改变频度时是有用的。可是,进行屡次查看也会给单片机带来负荷,对功耗晦气。

因而就要用到本期介绍的“中止功用”。产生中止时,CPU会暂时中止正在履行的使命,转而进行其他使命。也便是有其他使命“交叉”进来的意思(图1)。傍边途交叉进来的使命完毕后,CPU再回来处理本来的使命。

想象一下你在作业的一起煮鸡蛋的状况。因为你不想停下手中的作业,所以把鸡蛋放入热水中后就设置守时器并持续作业,10分钟后守时器一响就把鸡蛋从热水中捞起。这时,守时器的鸣叫便是中止,而“把鸡蛋从热水中捞起”便是交叉进来的作业。咱们能够经过这种办法来了解中止功用。

单片机中的中止处理

中止产生于单片机内部和外部的各种设备。于开关和感应器等单片机外部的中止称为外部引脚中止,来自这些机器的中止信号由名为“IRQ”的引脚接纳,再向中止操控器(在RX63N中称被称为“ICUb”)宣布告诉。IRQ为“Interrupt ReQuest”的略称,意思为“中止恳求”。其他,来自单片机内部的守时器和GPIO、串行通讯设备UART等外设机器的中止被称为外部设备中止,中止信号直接从各外部设备告诉中止操控器。

在中止操控器中,各种设备的中止信号依照先来后到的次序,以恰当的次序被传送到CPU。并且,中止被设为无效的设备的中止信号将不会被传送到CPU,也就意味着能够忽视(屏蔽)这些信号。CPU依照从中止操控器接纳到的指示来履行对应的程序(中止处理)。

CPU一旦接纳到中止操控器的中止信号,首先将停止履行中的程序。可是,会主动保存“从何处重启”的出栈(POP)信息,这被称为“进栈(PUSH)”。进栈完毕后,将开端由中止履行的程序。该程序完毕时,进栈信息将回送到CPU,这种现象被称为“出栈”(图2)。因为进栈和出栈都由CPU主动履行,因而程序设计者不必因次序问题而操心。

例如,经过UART履行串行通讯时,常常监督字节是否被接纳了而导致功率欠安。所以,大都状况下都对程序进行如下编程,即在信息送达时就会产生中止并进行恰当的处理,其他,使守时器产生中止的状况也不在少数。进行“经过了必守时刻后该做什么”这类处理时,应进行如下编程,即经过来自守时器的信号开端进行处理。如上所述,在有用运用单片机方面,中止功用发挥了很大的效果。

还可运用数据库测验编写杂乱的中止程序!

为了编写与中止相关的程序,就需求了解单片机的运转。因为需求深化了解,所以不能仅是进行简略的测验。幸亏还有本系列中介绍过的GR-SAKURA数据库,可在GR-SAKURA数据库中进行与外部引脚中止相关的处理,所以请测验运用GR-SAKURA数据库来进行编程。

SAKURA sketch参数:樱花程序库–中止(仅限英文版)

为了向GR-SAKURA供给外部引脚中止,还需求做些作业。在GR-SAKURA中,从IO30引脚到IO35引脚接纳来自外部的中止信号。这次是将守时器输出引导到IO0引脚,再将它传送到IO31引脚作为中止信号。因而,要从IO30引脚到GND的部分设置引脚接口,由底板用的电线将IO0和IO31衔接起来(图3)。

在示例程序(图4)中预先预备了如下功用,即当GR-SAKURA的外部中止信号引脚(从IO30到IO35中的一个)的输入从L电平变为H电平常,LED灯将发动。并且是在检测到相当于上述所阐明的“外部引脚中止”的中止信号后才会改变。从IO0引脚进行守时器输出,并将之与中止输入引脚即IO31引脚衔接,经过这样的办法便能够与必定的时刻距离产生中止。

※即便已对该程序进行了汇编,在没有将上述的IO0和IO31引脚进行衔接的GR-SAKURA中也无法运转。

以下为图4的程序

※图4程序完毕

※图4:用于外部引脚中止的示例程序

在此数据库中,可对别离与前述中止信号输入引脚对应的处理。本次所示的是依据向IO31引脚输入的改变(从L电平变为H电平)来产生中止的状况。第48行的attachInterrupt()界说了在某个输入引脚呈现某种改变时该调用什么函数。因而,设定为依据输入IO31引脚的中止信号来发动irq3()。这样的设定只需在setup()中界说一次便能在整个程序中有用。除此以外,在setup()中还记叙了守时器的界说、守时器输出引脚的设定、LED输出的设定等初始条件。

没有经过loop()函数进行的处理。取而代之的是由irq3()这个函数进行处理。从这个函数来看是看不出它是从程序中调用的。可是,正是因为这个函数,才能使中止信号进入IO31引脚时使LED的光产生改变。在函数irq3()中,四盏LED中只要一盏亮灯,这个函数一旦被调用,亮灯的LED就产生一次改变。为了让人看得到这个“改变”,在case标签的部分,经过来自GPIO的输出来灭灯且使周围的LED亮灯(边际的LED灯亮灯时,相反侧的边际的LED亮灯或灭灯)。

为了应对不知何时会产生的意外,中止便是十分有用的应对办法。并且,中止还能够削减程序的不必要运转,然后可下降功耗。也能够说,为了真实有用地运用单片机,这是一项不行短少的技能。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/145397.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部