PIC16C84单片机介绍
PIC16C84 是 8 位 CMOS EEPROM 微控制器。它有高性能的类似于 RISC 的指令,共有 35 条单字节的指令,所有的指令除程序分支指令需要两个指令周期外,都只需要一个指令周期。当主振频率为 10MHZ 时一个指令周期为 400ns。程序指令的宽度为 14 位,在芯片内有 1K×14 的 EEPROM 程序存储器。数据的宽度为 8 位,在芯片内有 36×8 的静态 RAM 的通用寄存器,64×8 的 EEPROM 的数据存储器。
8 级深度的硬堆栈。具有直接、间接、相对寻址方式。有 4 个中断源;外部 RBO/INT 引脚;TMRO 计时器溢出,PORTB<7: 4>引脚上信号的改变;数据写入 EEPROM 完成。数据存储器的擦/写可达 1000000 次,数据的保持大于 40 年。有 13 位的 I/O 引脚,可以单独直接控制。每一个 I/O 引脚均可承受 25mA 的输入/输出电流,这样就可以直接驱动 LED。有 8 位的计时/计数器(TMRO)并带有 8 位可编程的预分频。
有通电复位(POR);功耗上升(POWER-UP)计时器(PWRT); 振荡器起动计时器(OST);看门狗计时器(WDT),为了能可靠工作,它有自己的 RC 振荡器。有代码保证功能。有 SLEEP(睡眠)方式,以节者功耗。有 4 种可供选择的振荡器:RC(低成本的 RC 振荡器);XT(标准的晶体/谐振器);HS(高速晶体/谐振器);LP(低功耗,低频率的晶体)。工作电压的范围宽 2.0V~
6.0V。PIC16C84 最大的特点是具有 1K×14 位的电可擦除的程序存储器和 64×8 位的电可擦除的数据存储器,这将为系统开发和各种应用提供了更多的方便。时钟和指令周期从 OSCI 来的时钟输入在内部经 4 分频。产生互不叠加的时佛周期,每 4 个时钟周期(θ1,θ2,θ3,θ4)组成一个指令周期。在内部、程序计数内对每一个θ1 加 1,然后从程序存储器取指令,取出的指令在θ4 时放入指令寄存内。
在下一个θ1 利θ4 期间指令被执行。取指令和执行指令采用流水线技术,一个指令周期取指令,下一个指令周期执行已取出的指令,同时又取出下一条指令。所以每条指令执行,CPU 的时间是一个指令周期。当某条指令要改变程序计数器的内容时(如分支指令),则需要两个指令周期才能完成。被取出的指令在执行指令周期的θ1 时放入指令寄存器,在θ2,θ3,θ4 时译码并执行指令。在θ2 期间读操作在θ4 期间写操作数。
存贮器的结构在 PIC16C84 中有两个存储器块。即程序存储器和数据存储器。每一块具有它自己的总线,即可在同一时钟周期访问每一块。数据存储器被进一步分成通用 RAM 和专用功能寄存器(SFRs)。专用功能寄存器用于控制外设模式。数据存储器也包含有数据 EEPROM 存储器。这个存储器并不直接映象到数据存储器,而是间接映象的。即由一个间接寻址的指针指明要读/写的数据 EEPROM 的地址。64 个字节的数据 EEPROM 具有的地址是 0~3FH。
3-1 程序存储器的结构 PIC16C84 具有 13 位程序计数器,寻址能力为 8K×14 位的程序存储器空间。实际上对于 PIC16C84 能供使用的只有 1K×14 位的程序存储器(地址为 0000~ 03FFH)。寻址上述单元,如超过了上述地址范围, 地址将卷绕。例对 20H 单元与地址 420H,820H,C20H,1020H,1420H, 1820H,1C20H 都将访问到它。系统复位时 PC 的值为 0000H,中断向量是 0004H。
PC<12:0>CALL,RETURN 13RETFIE,RETLW 1 级堆栈.8 级堆栈复位地址 0000H 外部中断向量 0004H 用户存贮空间 3FFH1FFFH 图 4-2 程序存储的映象和堆栈 3-2 数据存储器的结构数据存储器被分成两个区域。第一个是专用功能寄存器(SFR)区域,第二是通用寄存器区域(GPR)。SFR 控制着器件的操作。数据存储器被分成 0 块和 1 块。通过程序时状态寄存器 STATUS 中的 RP1: RP0 位的设置来选择 0 块(RP1=0,RP0=0)或 1 块(RP0=1)。
其中带有斜线的部分是实际不存在的单元,带有*号的单元没有物理寄存。指令 MOVWF 和 MOVF 可以把 W 寄存器的值(W 寄存器是器件内部的工作寄存器)传送到寄存器文件(“F”)中的任何单元,反之也可以。整个数据存储器可以直接寻址或通过文件选择寄存器(FSR)进行间接寻址。间接寻址要根据状态寄存器的 RP1:RP0 位的状态决定访问数据存储器的某一块,数据存储器的两块中都被分成通用寄存器和专用寄存器。
其中每块低地址单元留作专用寄存器,专用寄存器以上地址的单元为通用寄存器,它们是静态 RAM。
1.通用寄存器文件寄存器文件可以直接寻址或通过 FSR 间接寻址。所有器件都有一定数量的通用寄存器(GPR),它们的数据宽度是 8 位。PIC16C84 只有 36 个字节的通用寄存器,地址为 0CH~ 2FH,对 1 块对应的 8CH~ AFH 的访问都将实际访问 0CH~ 2FH(地址的高位被忽略)。文件地址 00 间接寻址地址(*) 间接寻址地址(*) 8001 TMRO OPTION 8102 PCL PCL 8 203 STATUS STATUS 8304 FSR FSR 8 405 PORTA TRISA 8506 PORTB TRISB 8607 8708 EEDATA EECON1 8809 EEADR EECON2(*) 890A PCLATH PCLATH 8A0B INTCON INTCON 8B36 个通用寄映象到存器(SRAM) 0 块 2F AF 7F FF 0 块 1 块 2.专用功能寄存器 CPU 和外设使用专用寄存器以控制器件的操作。
专用寄存是静态 RAM。下面介绍几个重要的专用寄存器①状态寄存器状态寄存器包含有 ALU(复术逻辑运算单元)的算术状态,复位状态和对数据存储器的块选择,与任何寄存器一样,状态寄存器可以作为任何指令的目的寄存器。如果状态寄存器作为某指令的目的寄存器,而那条指令要影响 Z、DC,C 位的状态,则禁止写这三位。图 4-4 是状态寄存器及其状态。R/W R/W R/W R R R/W R/W R/WIRP RP1 RP0 TO PD Z DC C bit7 bit0 其中 C 是进位位,对 ADDWF 和 ADDLW 指令,当这一位为 1,表示指令运算的结果的最高有效位产生了进位输出。
减法指令执行的是加第二操作数的新码。对于循环指令(RRF,RLF),这一位即可以来自于源寄存器的高位,也可以来自于低位。如果这一位为 0,表明结果的最高有效位没有产生进位输出。对于减法,这一位的极性取反。DC 是数字进位或数字借位位。当这一位为 1 时,结果的 D3 位向 D4 位有进位,否则无进位。对于减法,这位的极性取反。Z 是结果为 0 标志。当这一位为 1 时,表明算术运算和逻辑运算的结果为 0,否则这一位为 0,表明运算结果不为 0。
PD:低功耗位。当这一位为 1 表明电源加上按正常供电或执行了 C LRWDT 指令以后,这一位为 0 表示执行了 SLEEP 指令(即器件进入了低功耗状态)。TO 超时位。当这一位为 1 时,表明电源加上,进入了正常供电,且执行了 CLRWDT 和 SLEEP 指令,这一位为 0 表明产生了看门狗计时器超时。RP1:RP0,作为直接寻址的数据存储器的块选择位。RP1:RP=00 状态,选择 0 块(地址 00H~7FH)。
RP1:RP0=01 状态,选择 1 块(地址 80H~FFH)。RP1:RP0=10 选择 2 块(地址 100H~17FH)。RP1:RP0=11 选择 3 块(地址 180H~1FFH)。每块 128 个字节,PIC16C84 只使用 RP0 位,RP1 编程时设置为 0。不允许使用 RP1 为通用读/写位,这可能影响与将来产品的兼容性。IRP 寄存器块选择位(作为间接寻址),当这一位设置为 0,选择
0.1 块(地址 00H~FFH),当这一位为 1 时,选择 2.3 块(地址 100H~1FFH)。PIC16C84 不使用 IRP 位,IRP 位在编程时为 0。状态寄存器中的 Z、DC,C 位是根据器件的逻辑来置 1 或清 0。而 TO,PD 位是不可写入的。状态寄存器作为目的寄存器的指令的结果将有不同的内容。例如 CLRF STATUS(清 0 状态寄存器)。结果状态寄存器的内容为 000uuluu。其中 u 表示不改变。
只有 BCF,BSF,SWAPF 和 MOVW F 这些指令可以用来改变 STATUS 寄存器的内容,因为这几条指令不影响任何状态位。②OPTION 寄存器 OPTION 寄存器是可读,可写的寄存器,它包含了各种控制位以配置 TMRO/WDT 的预分频器,外部 INT 中断,TMRO 和在 PORTB 的微弱上拉。图 4-5 是 OPTION 寄存器各位的功能。 R/W R/W R/W R/W R/W R/W R/ W R/WRBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 bit7 bit0 其中 PS2,PS1,PS0 为预分频器的值的选择。
(与 PIC16C6X 的规定相同)。PSA 位是将预分频器分配给 WDT(看门狗计时器,或 TMR0)。TOSE 是为 TMRO 选择跳变信号 INTEDG 是为 INT 中断引脚选择跳变信号。RBPU 用来打开或关闭 PORTB 内部的上拉电阻。OPTION 的所有位的定义同 PIC16C6X 系列。③INTCON 寄存器 INTCON 是可读可写的寄存器,它包含了各中断源允许或禁止中断。图 4-6 是 PIC16C84 的 INTCON 寄存器 R/W R/W R/W R/W R/W R/W R/W R/WGIE EEIE TOIE INTE RBIF TOIF INTIF RB IF bit7 bit0 其中 RBIF 是 RB 端口改变中断标志位。
此位为 1,表明 RB<7:4>输入中至少有一位发生了改变,它必须用软件清 0 这一位。否则为 0,即 RB<7:4>输入中没有改变。 ? ? ? ? ? INTIF 是外部中断标志位。当这一位为 1 时,表明有外部中断发生,它必须用软件将其清 0,否则为 0,表明没有外部中断发生。TOIF 是 TMRO 溢出中断标志。这一位为 1,表明 TMRO 发生了溢出,必须由软件将这一位清 0,否则为 0,表明 TMRO 没有溢出发生 RBIE 是 RB 端口改变中断的允许或禁止位,设置此位为 1,允许中断,为 0 禁止。
INTE 是 INT 中断的允许或禁止位。设置为 1 允许中断方式,为 0 禁止。TOIE 为 TMRO 溢出中断的允许或禁止位。设置为 1 允许 TMRO 溢出中断,否则禁止。EEIE 是 EE(电可擦除)的写完成中断的允许与禁止位。当设置为 1 时,允许 EE 写完成中断,否则禁止。GIE 是所有中断的允许与禁止。设置为 1 时,允许所有不可屏蔽中断,为 0 禁止。四、PCL 和 PCLATH 程序计数器(PC)是 13 位。低字节 PCL 是可读,可写的寄存器。
PC 的高字节(PCH)不是直接可读,可写的。PCLATH(PC latch high) 是作为 PC<12:8>的保持寄存器,这几位的内容被传送到程序计数器的高位。当程序计数器在执行 CALL,GOTO 或写 PCL 等指令时,即向 PC 装入新的值。PC 的高位由 PCLATH 装入。具有 8 个 13 位宽度的硬件堆栈。堆栈空间它既不是程序存储器的一部分,也不是数据存储器的一个部分,堆栈的指针是不可读/写的。
当执行 CALL 指令或中断被响应时,整个 13 位的 PC 被压入堆栈。在执行 RETURN,RETLW,RETFIE 等指令时,堆栈被弹出。PUSH(压入)和 POP(弹出)不影响 PCLATH。堆栈是作为循环缓冲器。当堆栈被压入 38 次后,第 9 次压入将占据第一次压入的位置,第十次压入将占据第二次压入的位置,等等。同样当堆栈弹出第 9 次时,与第一次弹出是一样的。注意,没有状态位来指明堆栈上溢式下溢的条件。
没有 PUSH,POP 指令助记符,但 CALL,R ETURN,RETLW,RETFIE 等指令的执行或中断发生,将实际发生压栈退栈。4-2 程序存储器的页 PIC16C84 具有 1K 的程序存储器,CALL,GOTO 指令只有 11 位的地址范围,这 11 位的地址范围允许分支在 2K 程序存储器页大小的范围。为将来 PIC16C8X 程序存储器的扩展,必须由另外两位来说明程序存储器的页。这些页位来自于 PCLATH<4:3>。
当执行 CALL、GOTO 指令时,用户必须确保这些页位的编程等指向要求的程序存储器的页。如果执行 CALL 指令,整个 13 位被压入堆栈。所以对于返回指令不要求对 PCLATH<4:3>位的管理。因为 PC 的值将会由退栈而获得。注意:PIC16C84 忽略了 PCLATH<4:3>位,这些位用于程序存储页 1,2,3(0800H-1FFFH),不可以把 PIC16C84 的 PCLATH<4:3>位用作通用读/写位,这会影响将来产品的向上兼容。
4-3 间接寻址,INDF 和 FSR 的作用 INDF 寄存器不是物理寄存器,只是被用来与 FSR 寄存器连接以执行间接寻址。使用 INDF 寄存器,就可以实现间接寻址。使用 INDF 寄存器的任何指令,实际寻址数据是由文件选择寄存器(FSR)所决定的。读 INDF 自身(FSR=0),将产生 00H。向 INDF 写,结果无操作(显然可以提供状态位)。8 位 FSR 寄存器同状态寄存器 STATUS<7>(IRP)组合可以得到 9 位地址。
然而 PIC16C84 是不用 IRP 的。使用下面的例程序,通过间接寻址清零。2OH~2FH 单位。MOVLW 20H;初始化 RAM 的指针 MOVF FSR;到 FSRNEXT CLRF INDF;通过间接寻址清 0,由 FSR 的内容所指问的寄存器。INCF FSR;(FSR)+1→FSRBIFSS FSR,4;当 FSR 的第 4 位为 1 跳过下一条指令 GOTO NEXT;否则入。五 I/O 端口 PIC16C84 具有两个 I/O 端口,PORTA,PORTB。
某些端口的引脚用来与另外一些功能复用。5-1 PORTA 和 TRISA 寄存器 PIC16C84 的 PORTH 是 5 位宽度的锁存器。RA4 是施密特触发器输入,一个集电极开路输出。端口 A 的所有其它的引脚为 TTL 电平输入,含 CMOS 输出驱动。所有引脚有数据方向位(TRISA 寄存器),可通过 TRI SA 来配置 PORTA 的引脚是输入式输出。设置 TRISA 的某位为 1,则对应的 PORTA 的位为输入,若设置为 0,对应的 PORTA 的某位为输出。
读 PORTA 寄存器,读入引脚的状态,向 PORTA 写入,则写到 PORTA 的锁存器。所有的写操作都是读--修改--写操作。当向端口写时,它首先读端口引脚,然后修改其位,再写入端口的数据锁存器。下面这段程序是对端口 A 的初始化:CLRF PORTA;初始化端口 ABSF STATUS,RPO;选择 1 块 MovLW CFH;用于初始化数据方向的值 MOVWF TRISA;设置 RA<3:0>为输入;RA<5:4>为输出;< 7:6>总是为 0(无用)RA4 是为 TMRO 的时钟输入复用。
即如果这一位用作 TMRO 的时钟输入,则端口 A 就不能用 RA4。5-2 PROTB 和 TRISB 寄存器 PORTB 是 8 位宽度的双向端口。相应的数据由 TRISB 决定,方法用端口 A。端口 B 的每一个引脚都具有内部弱的上拉电阻。通过一个控制位可以打开所有上拉电阻。这可通过对 OPTION<7>RBPU 位的置 1,清 0 来控制。当端口引脚配置成输出时,内部弱上拉电阻被自动关闭。上位是端口需要的。PORTB 的 4 个引脚 RBT~RB4 具有信号改变中断的功能,只要将这几个引脚配置为输入,就可能引起中断的发生。
在输入方式下,引脚的位与最后一次读 PORTB 的值进行比较,这四个引脚中有任何一个或多个不相同,产生 RBIF 中端(置 INTCON<0>)。这个中断可能将器件由 SLEEP 状态下唤醒。用户在中断服务程序中可以用这样的两个方法之一来清除中断。①通过清 0RBIE(INT CON<3>位)关闭中断,② 读端口 B,则清 0 RBIF 位。不相等的条件将继续配置 1RBIF 位为止。读 PORTB 将结束不相等条件,并允许 RBIF 被清 0。
这一特征为软件可配置上拉一起允许用户非常容易的使用 PORTB 作为键盘输入的接口。也就可以通过按键来唤醒系统。注意:如果正在执行敛僮鳎琁/O 引脚改变了信号,RBIF 中断标志不可能被置成 1。建议用改变信号中断作为按键唤醒操作,PORTB 只不用改变信号中断,建议不要用查询方式。图 4-7 是用端口作键盘接口的原理图其 R1 为 ESD 保护而新选择的电阻。使用此接口时,通过软件选择保持内部上拉,即 RB4~RB7 为高,设置为输入方式。
RB0~RB3 输出。任何键被按下,RB4~RB7 的某一根线将改变从而产生中断。这个中断可以唤醒芯片,用这种方法可以节省计时器资源。16 个键 RB4 100RB5RB6RB7RB0RB1RB2BR3Rf 图 4-7 利用端口 B 的键盘接口图。5-3 I/O 编程的考虑任何对端口的写操作,在内部都是读-修改-写。例如 BCF,BSF 指令,先将寄存器读入 CPU,执行位操作,将结果写回寄存器。例如对 PORTB 执行 BSF 操作,首先将 PORTB 的 8 位读入 CPU,在 Bit5 上进行 BSF 操作,将这一位置 1,将 PORTB 写回输出锁存器,如果这个时候 PORTB 的 bit0 用作输入引脚,则先将 PORTB 读入 CPU,然后进行有关操作,结果写回 PORTB 的锁存器,并复盖了先前的内容,如果 bit0 一直保持在输入方式,这一操作是没有问题,但如果 bit0 在销后又改变成输出方式,数据锁存器的内容是未知的。
实际写 I/O 端口发生在一个指令周期的结束,而读一个 I/O 端口,其有效的数据必须在指令周期的开始就出现。因此,对一个 I/O 通道相断执行读,写操作,要考虑数据的可靠性。为此,应在这两条指令之间加入一条 NOP 指令就可以保证数据的可靠性。六、计时器。(TMRO)模式 TMRO 计时/计数器模式具有如下特点:·8 位计时计数器·可读,可写·8 位软件可编程的预分配器·从 FFH 到 00H 产生溢出中断·具有外部时钟的边沿选择 TMRO 模式的简单框图与 PIC16C6X 系列相同。
它可以经过清 0 TOCs 位(即 TION<5>)来选择计时器方式。在计时器方式,TMRO 模式对每个指令周期加 1(没有预分频器),如果对 TMRO 写操作,则计时器为加 (操作后两个周期被禁止。)量 TOCS 为 1(OPTION<5>)选择 TMRO 为计数器方式。这种方式下 TM?RO 将对 RA4/TOCK1 引脚上出现的上跳变或下跳变加 1。清 0TOSE(OPTION<4>)选择上跳变否则为下跳变。
有关预分频器的使用与 PIC16C6X 系列相同。当 TMRO 在计时/计数器方式下其值由 FFH 到 00H 时产生溢出中断,这个溢出中断将置 TOIF 位为 1。此中断可以 TOIE 位为 0 来屏蔽。要能再次产生中断,必须在中断服务程序中,通过软件使 TOIF 清 0,TMRO 中断不可以用来唤醒芯片。因为在 SLEEP 状态下,计时器是关闭的。如何使用 TMRO 的外部时钟,外部时钟的同步问题,预分频器的使用等,参看 PIC16C6X 系列关于 TMRO 的技术性能。
七、数据 EEPROM 存储器数据 EEPROM 存储器在满电源电压(VDD)时,正常操作期间是可读,可写的,这部分存储器不能直接映象到寄存器文件空间,只有通过专用功能寄存器经间接寻址来访问,有四个 SFR 用于读、写这些存储器,这些寄存器是 EECON1;EECON2;EEDATA;EEDAR。其中 EEDATA 用来保持 8 位的读/写数据。EEADR 用来保持正在访问的 EEPROM 单元的地址。PIC16C84 具有 64 个字节的 EEPROM,其单元的地址范围是 00H-3FH。
EEPROM 允许一次读/写一个字节。一个字节的写入将自动擦除该单元,写入新的内容(在写入之前擦除)。EEPROM 数据存储器是高速率的擦/写周期,写入时间正常为 10ms,由芯片的计时器控制。实际写入时间与所加电压,温度,芯片等有关。严格的时间请参看芯片的 AC 说明。当器件是在代码保护时,只有 CPU 可以完成数据存储器的读 /写。即器件的编程器的不再访问存储器(外部读/写被关闭)。6 连接的考虑因为模拟输入用了 ESD 保护,它们有反偏二极管连到 VDD 和 VSS。
这就要求模拟输入电压应在 VDD 和 VSS 之间。如果模拟输入电压超过了最大值的 0.6V 以上的范围,二极管可能变为正向导通,如果输入电流超过了说明书上的规定,它可能破坏器件。有些时候把外部的 RC 滤波器加在输入信号上。要求选用的电阻 R 要保证总的信号源电阻不超过 10K,任何在模拟信号上的其它的附加元件均应有非常小的漏电流。
7.变换功能理论上 A/D 变换器的变换功能如下。当模拟输入信号电压是 1 位 L sb 的电压时(或是 VREF/256)第一次变换就发生。8 A/D 变换工作的流程图表 2-4 PIC16C74/73 的 A/D 变换所涉及的寄存器地址名称 bit7 bit6 bit5 bit4 bit3 bit 2 bit1 bit00B/8B INTCON GIE PEIE0C PIR1 ADIF8C PIE1 ADIE0D PIR2 CCP2IF8D PIE2 CCP2IE1F ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE ADON9F ADCON1 PCFG2 PCFG1 PCFG0 除上述所例寄存器外,还有 ADRES(地址 1EH)用于存放 A/D 变换的结果。
PORTA(地址 05H)用于输入多路模拟信号,TRISA(地址 85 H)用于设置 PORTA 的 I/O 方式,PORTE(地址 09H)用于输入多路模拟信号,TRISE(地址 89H)用于设置 PORTE 的 I/O 方式。表 2-5 PIC16C71 的 A/D 变换所涉及的寄存器地址名称 bit7 bit6 bit5 bit4 bit3 bit 2 bit1 bit00B/8B INTCON GIE ADIE08 AOCON0 ADCS1 ADCS0 CHS1 CHS0 GO /DONE ADIF ADON88 ADCON1 PCFG1 PCFG0 此外还涉及 ADRES(地址 09H),PORTA,TRISA 等。。U U U U U U U U U R/P R/P R/P R /P R/P- - - - - - - - - CP PWRTE WDTE FOSC 1 FOSC0 bit 13 bit0 图 4-10 PIC16C84 的配置寄存器 7-3 写 EEPROM 数据存储器与写 EEPROM 的数据单元、用户必须首先写地址到 EEADR 寄存器,再送数据到 EEDA?TA,最后用户必须跟着一个专门的序列起动写。
例如:下面这段程序是写 EEPROM 的程序。 ? ? BSF STATUS, RPO;选择 1 块 BCF INTCON,GIE;关闭所有 INT 中断 MOVLW 55H;MOVWF EECON2;写 55HMOVLW AAH;MOVWF EECON2;写 AAHBSF EECON1,WR;置 WR 位为 1,开始写 BSF INTCON,GIE;允许 INT 中断。如果这个程序(即先写 55H 到 EECON2,再写 AAH 到 EECON2,然后置 WK=1)未跟有严格的时间,写将不能启动。
我们建议在执行这几条指令期间关闭中断。此外,EECON1 中的 WREN 位必须选置成 1,允许写。这样的机构防止了因错误指令的执行而写数据 EEPROM。用户在所有的时间应保持 WREN 位为 0,除了当要热修改 EEPROM 以外。写序列开始以后,清 0WREN 位不影响这次写周期。从开始设置,直到 WREN=1 为止 WR 位将被禁止。当完成了写周期以后,WR 位由硬件清 0。写完成中断标志 EEIF 被置 1,EEIF 必须由软件将其清 0。
注意数据 EEPROM 存储器 E/W 周期可能偶然超过 10ms,为确保写周期的完成,用户使用的 EE 中断或查询 WR 位(EECON1<1>)。这两个均可用来判断写周期的完成。除了上述提到的防止错误的写数据 EEPROM 外,在电源刚加电期间的 72ms 内也防止写 EEPROM 数据存储器。八 CPU 专门的特征微控制器为其它处理器的区别是有专门的电路,这些电路涉及实时应用的需要。PIC16C84 具有最大的系统可靠性,最低的价格,最少的外部元件,提供了低功能操作模式和代码保护。
PIC16C84 具有看门狗计时器,此计时器只可经配置位来关闭,为了增加其可靠性,关闭它的 RC 振荡器。有两个计时器提供加电时需要的延时。振荡器起振计时器(OST)保持芯片在复位状态直到石晶稳定为止。另外一个是加电计时器(POWER-UP Timer(PWRT))它提供了固定的 72ms 的延时。这样保证了器件复位以及电源的可靠供电,用了这两个计时器,使多数应用不需要外接复位电路。SLEEP 方式提供了低功耗方式。
用户可经外部复位;看门狗计时器溢出;中断来唤醒芯片。8-1 配置位配置位分为可编程的位,读作 0,不可编程的位,读作 1。通过可编程的位来选拔各种配置。这些位映象到程序存储器的 2007H 单元。注意地址 2007H 不等于用户程序存储器空间。事实上,它属于专门的测试 /配置存储空间(2000H~3FFH),只有在编程时可以访问。图 4-10 是配置寄存器的结构(附后)其中 Fosc<1 或 0>为振荡器选择位。
11:选 RC 振荡器 10:选 HS 振荡器 01:选 XT 振荡器 00:选 CP 振荡器 WDTE 是看门狗允许与禁止的选择位。此位为 1,允许看门狗工作。此位为 0 禁止看门狗工作。PWRTE 是加电计时器允许与禁止的选择。此位为 1,加电计时器允许工作,为 0 则禁止工作。CP 是代码保护的选择,此位为 1 代码保护取消,这一位为 0,所有程序存储器的代码被保护。其余位是不执行的。读作 1。有关振荡器的配置,振荡器的选择与连接电路与 PIC16C6X 系列相同。
8-2 中断 PIC16C84 具有 4 个中断源。即外部中断 RBO/INT 引脚上的中断,TMR0 溢出中断;PORTB 改变中断(RB7:RB4);EEPRDM 写完成中断。中断控制寄存器(INTCON 在其标志位,记录了每一个中断请求。它也包括了每个中断的允许/禁止位。所有中断的允许/禁止位(IN TCON<7>),它就开放所有中断或禁止所有中断。从中断返回指令 RETFLE 返回时,退出中断,并置 GIE=1,重新开放所有中断。
RBO/INT 引脚中断,RB 端口改变中断和 TMRO 溢出中断,这些中断的中断标志在 INTCON 寄存器中。当中断的响应时,GIE 位被清 0,关闭任何新的中断,返回地址被压入堆栈,用 0004H 装入 PC。对于外部中断文件,如 RBO/INT 引脚或 PORTB 改变中断,这类中断需 3 到 4 个指令周期。严格的时间,取决于中断事件的发生。一旦在中断的中断服务程序中可以通过查询中断标志位来确定中断源。
中断的标志位应在重新开发这个中断之前,经软件将其清 0。注意:①每一个中断的标志位被置位,而与它相应的屏蔽位或 GIE 无关。②如果中断发生,而全部中的允许位 GIE 假设本是清 0 的,GIE 可能被用户中断服务程序的 RETFIE 指令无意之间连成 1。这种事情可能发生在 a、在中断被响应时,指令清 0GIE 位。b、程序分支到中断向量并执行中断服务程序。c、中断服务程序执行 RETFIE 指令而完成。这会引起 GIE 位被置 1(允许中断)。
同时程序返回中断关闭后的指令(实际上由于上述原因引起中断未能关闭)。为确保 GIE 清 0,应有如下一段程序。l00p BGF INT CON,GIE:关闭全部中断 BTFSC INTCON,GIE;全部中断允许位被关闭了吗?GOTO l00P;没有返回到 l00p,再清 0GIE,否则程序继续。
1.INT 中断在 RBO/INT 上的外部中断是边沿触发。如果 INT?EDG 位(OPTION <6>)是置 1,则上升沿有效,如果 INTEDG 位被清 0,则下降沿有效。当有效跳变出现在 RBO/INT 引脚上时,INTF 位(INTCON<1>)被置 1。清 0INTE 控制位(INTCON<4>),关闭这个中断。INTF 在重新允许这个中断之前应由中断服务程序中的软件来清 0 这一位。在芯片进入 SLEEP 之前,如果 INTE 位被置 1,则 INT 中断发生后可唤醒芯片。GIE 位的状态决定了处理器被唤醒后是否分支到中断向量。
2.TMRO 中断 TMRO 溢出(由 FFH~00H)将置 1 TOIF 位(INTCON<2>)。这一位的中断可以对 TOIE(INTCON<5>)位置 1 或清 0 而开放/关闭中断。
3.PORTB 中断在端口 B 的 7~4 位的输入改变,就置 1 RBIF(INTCON<0>)位。 这个中断可以对 RBIE(INTCON<3>)位置 1 或清 0 而开放或关闭。注意:当正在对 RB 端口进行读操作时,RB7~RB4 发生改变,RBIF 标志位可能不被置 1。
4.中断时如何保存 W 和 STATUS 寄存器。中断时,硬件自动将 PC 的值压入堆栈,这叫保存断点,用户经常希望保存关键的寄存器的内容,(如 W 和 STATUS 寄存器)。为此,执行如下一段程序。MOVWF W-TEMP;将 W 寄存拷贝到 W-TEMP 寄存器,W-TEMP 寄存器可在 1 块或 0 块 SWAPF STATUS,W;状态寄存器内容送入 WBCF STATUS,RPO;选 0 块 MOVWF STATUS-TEMP;将状态寄存器的内容(现在在 W 中的 STATUS-TEMP 寄存器中断服务程序 SWAPF STATUS-TEMP,W;将 STATUS-TEMP 送入 W(设置块到原来的状态)MOVWF STATUS;W 送入 STA?
TUS(恢复 STATUS)SWAPF W-TEMP,0;W-TEMP 送 W(恢复 W 的内容)在上面这段程序中,W-TEMP 寄存器,必须定义在两个块中,且要在定在同样的块基地址。例如将 W-TEMP 定义在 0 块的 20H,同时它也应定义在 1 块的 A0H。寄存器 STATUS-TEMP 必须定义在 0 块。
5.看门狗计时器(WDT)看门狗计时器实际使用的是在芯片上的 RC 振荡器,这不要求任何外部元件。这个 RC 振荡器与 OSC1/CLKIN 引脚上接的 RC 振荡器(主振时钟)是分开的。这样即使 OSC1/CLKIN 和 OSC2/CLKOUT 引脚停振,(例在执行 SLEEP 指令后)WDT 仍然能够工作。在正常工作时,WDT 计时器的输出产生器件的 RESET 信号。如果器件处于 SLEEP 状态下,WDT 计时器的输出将唤醒器件,使器件继续正常的工作。WDT 也可以通过编程的配置来关闭。其内容的框图与 PIC16C6X 系列相同。九、PIC16C84 的指令系统共有 35 条指令。与 PIC16C6X 系列的指令完全相同。