PIC单片机16F84的内部硬件资料 (2)
6. 定时器/计数器 TMRO PIC 单片机 16F84 中有一个定时器,此定时器也可用于计数,因此称为定时器/计数器,符号为 TMRO。TMRO 可用于定时控制、延时、对外部事件计数和检测等场合。TMRO 是一个 8 位增量(加 1)计数器。它在数据存贮器中的地址为 01。定时器所用的时钟源可以是内部系统时钟(OSC/4,即四倍振荡周期),也可以是外部时钟。若 TMRO 对内部系统时钟的标准脉冲系列进行计数时,就成为定时器;对外部脉冲进行计数时 TMRO 就成为计数器。
不管是定时还是计数方式,TMRO 在对内部时钟或对外部事件计数时,都不占用 CPU 时间,除非 TMRO 溢出,才可能中断 CPU 的当前操作。可见,定时器是单片机 16F84 中效率高且工作灵活的部件。 为了扩大定时或计数的范围,配合 TMRO 的使用,还有一个可编程预定标器。此定标器实际上是一个可编程分频器。 TMRO 的内部结构示意图如附图所示。其工作方式由数据存储器中的项选寄存器 OPTION 控制。
OPTION 是一个可读/写的寄存器,如附表所示。它含有配置 TMRO/WDT 预定标器、外部 INT 中断、TMRO 等的各种控制位。 TMRO 的定时、计数方式是由 OPTION 寄存器中的 D5(即 TOCS 位)确定。当 TOCS=0 时,工作于定时器方式;当 TOCS=1 时,工作于计数器方式。作定时器时,每个指令周期加 1(无预分频时);而作计数器时,则在每个 RA4/TOCKI 引脚上电平变化时加 1。OPTION 寄存器的位 4(TOCS 位)决定外部脉冲的触发方式,当 TOSE=1,下降沿触发;TOSE=0,上升沿触发。
当 TMRO 内部计数器发生计数溢出(从 FFh→00h)时,溢出位送入中断控制寄存器 INTCON。 由附图可知,预分频器也是一个 8 位计数器。其分频数是由 OPTION 寄存器中的 PS2~PS0 三位值来改变。分频数可以是以下 8 种之一:1∶1、1∶2、1∶4、1∶8、1∶16、1∶32、1∶64 和 1∶128。 当分频器用于 TMRO 时,所有写入 TMRO 的指令,如 CLRF1、MOVWF1、BSF
1、?等都将对预分频器清零。需要注意的是,预分频器是不能读写的。此分频器可用于 TMRO,也可用于 WDT,其切换由软件控制。为了避免意外的芯片复位,当需要切换时,必须执行相应的一段程序,以下是从 WDT 切换到 TMRO 时所需执行的程序: CLRWDT; 对 WDT 和预定标器清零 BSF STATUS,RP0;选中存储体 1 MOVLW B′xxxx0xxx′;PSA=0,选中 TMRO MOVWF OPTION;送入 OPTION 寄存器 BCF STATUS,RP0;复位存储体 0 ?
成都卫东 7 延时和定时在设计单片机应用系统时,经常会遇到需要使某一过程(如加温、加压等)持续一段时间的情况,如连续加压 1 分钟,通电 2 分钟等。单片机如何正确确定这段时间呢?这里可通过两种方式,即延时和定时来实现。试看下例。 在应用系统中要求 PIC16F84 的 RAO 端控制一个发光二极管按一定频率闪亮,可通过右图的电路来实现。同时还必须为 16F84 编制一个程序。由电路图可知,要使发光二极管 LED 按一定的频率闪亮,只要使 RAO 端输出一个变化的高→低→高……电平即可。
由此设计出如下的源程序(清单 1): list P=16F84,F=INHX8M;…… ORG 0 MOVLW 0;主程序开始 TRIS 5;置 RA 口为输出 BCF 5,0;RA 口 0 位清零 LOOP:CALL DELAY;闪动延时 COMF 5;RA 口求反,亮—灭交替 GOTO LOOP;循环;…… DELAY;以下为延时子程序 MOVLW D′50 MOVWF 8 LOOP1:MOVWF 9 LOOP2:DECFSZ 9,F GOTO LOOP2 DECFSZ 8,F GOTO LOOP1 RETLW 0 由清单 1 可知,当主程序开始时,首先将工作寄存器 W 清零,然后将 W 寄存器的内容送 TRISA 寄存器,使其清零,以设置 RA 口为输出。
接着又将 RA 口的第 5 位清零,使 LED 开始时处于熄灭状态。随之持续一段时间,即执行延时子程序,再将 RA 口取反,变为高电平输出,LED 发光,再延时,又使 RA 口取反,LED 熄灭……。这样,LED 就一暗一亮,持续交替进行。 在这里,使 LED 亮、暗持续一段时间是通过单片机执行延时子程序 DELAY 来实现的。此延时程序的核心就是让单片机的 CPU 反复执行使寄存器内容减 1 的指令 DECFSZ。即将十进制数 50 分别装入通用寄存器 F8、F9,以进行 50×50=2500 次的减 1 操作。
如果执行一次 DECFSZ 指令需 1 个指令周期(跳转时需 2 个周期),若设振荡频率为 100kHz,即指令周期为 40μs,则延时时间为 2500×40=100000μs=100ms,即 0?1 秒。实际上还略为大些。此延时时间已超过人眼的视觉保留时间。因而能看清 LED 的明、暗交替变化。 如果我们需要更长的延时时间,可仿照上例,装入更大的数或引入多重循环。因此,在原则上,延时时间可根据需要任意延长。
不过,采用延时程序来持续某一过程的方式有缺陷。延时就是使 CPU 在某几条指令上“转圈”,延时越长,“转圈”数越多,这时,CPU 不能再去执行其它操作,如监视温度、湿度等。这在某些实时控制系统中,不允许这样做。为此,在单片机 16F84 中,专门设置了一个“闹钟”——定时器 TMR0。需要某过程延续多长时间,可将其“拨入”TMR0,到时它会发生“中断”,告诉 CPU 定时时间到。要 CPU 暂停其它工作,转过来执行“中断子程序”,完成输出开、关信号之类的任务后,再回去执行其中断的工作。
这样,就使 CPU 的工作效率提高。因而,延时的使用有局限性,采用定时器 TMR0 则可用于各种场合中。 8 中断 PIC 单片机 16F84 具有实时处理功能,能对外界异常发生的事件由中断技术作及时处理。 当单片机的 CPU 正在处理某事件时,若外部发生了某一事件(如定时器溢出、引脚上电平变化),请求 CPU 迅速去处理,于是 CPU 就暂时中止当前的工作,转去处理所发生的事件。中断处理完该事件后,再回到原来被中止的地方,继续执行原来的工作,如图 1 所示。
实现这种功能的部件称为中断系统。产生中断的请求源称为中断源。中断源向 CPU 提出的处理请求,称为中断请求或中断申请。CPU 暂时中断自身的事务,转去处理事件的过程,称为 CPU 的中断响应过程。对事件的整个处理过程,称为中断服务(或中断处理)。处理完毕,再回到原来被中止的地方,称为中断返回。 PIC16F84 芯片有 4 种中断源,其逻辑电路如图 2 所示。
9. 中断控制中断主要由中断控制寄存器 INTCON(图 3)来控制。INTCON 是一个可读/写寄存器,含有定时器 TMRO 溢出、RB 口的变化和外部 INT 引脚中断等各种允许控制和标志位。 全局中断允许位 GIE(D7)置 1,将开放所有未被屏蔽的中断,如将该位清零,将禁止所有的中断。在响应中断时,GIE 位将被清零,以禁止其它中断,返回的断点地址被压栈保护,接着把中断入口地址 0004h 装入程序计数器 PC。在中断服务程序中,通过对中断标志位进行查询,确定中断标志位必须在重新开放中断之前用软件清零,以避免不断地中断申请而反复进入中断。
(1)INT 中断。RBO/INT 引脚上的外部中断由边沿触发,当 INTEDG 位(OPTION 寄存器第 6 位)被置 1 时,选用上升沿触发,如该位被清零,则由下降沿触发。当检测到引脚上有规定的有效边沿时,便把 INTE 位(INTCON 的 D4 位)置 1。在重新开放这个中断之前,必须在中断服务程序中对 INTE 位清零。
(2)TMRO 中断。当定时器 TMRO 的计数器计满溢出(即由 FFH 变成 00H)时,硬件自动把 TOIF(INTCON 的 D2 位)置 1。其中断可以通过对 TOIE(INTCOND 的 D5 位)置 1 或清零来控制该中断是否开放。
(3)PORTB 口引脚电平变化中断。在 PORTB 口的 D7~D0 引脚上一旦有电平变化,就会把 RBIF(INTCON 的 D0 位)置 1。这个中断可以通过对 RBIE(INTCON 的 D3 位)置 1 或清零来控制该中断是否开放。
(4)中断的现场保护。在发生中断时,只有返回断点的地址被压栈保护。若用户还希望保护关键的寄存器(如 W 寄存器和 STATUS 寄存器)。这需要由软件来实现。有关中断的现场保护,请参看本报第 15 期有关 PIC 单片机指令识读中的实例。