英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流
标题:
PIC16C84单片机介绍
[打印本页]
作者:
winnie
时间:
2009-5-5 16:55
标题:
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 13
RETFIE
,
RETLW 1
级堆栈
.
8
级堆栈
复位地址
0000H
外部中断向量
0004H
用户存贮空间
3FFH
1FFFH
图
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
间接寻址地址(*)
间接寻址地址(*)
80
01 TMRO OPTION 81
02 PCL PCL 8 2
03 STATUS STATUS 83
04 FSR FSR 8 4
05 PORTA TRISA 85
06 PORTB TRISB 86
07 87
08 EEDATA EECON1 88
09 EEADR EECON2
(*)
89
0A PCLATH PCLATH 8A
0B INTCON INTCON 8B
36
个通用寄
映象到
存器(
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
/
W
IRP 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
/
W
RBPU 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
/
W
GIE 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
;到
FSR
NEXT CLRF INDF
;通过间接寻址清
0
,由
FSR
的内容所指问的寄存器。
INCF FSR
;(
FSR
)+
1
→
FSR
BIFSS 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
;初始化端口
A
BSF 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 100
RB5
RB6
RB7
RB0
RB1
RB2
BR3
Rf
图
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 bit0
0B
/
8B INTCON GIE PEIE
0C PIR1 ADIF
8C PIE1 ADIE
0D PIR2 CCP2IF
8D PIE2 CCP2IE
1F ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO
/
DONE ADON
9F 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 bit0
0B
/
8B INTCON GIE ADIE
08 AOCON0 ADCS1 ADCS0 CHS1 CHS0 GO
/
DONE ADIF ADON
88 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
;写
55H
MOVLW AAH
;
MOVWF EECON2
;写
AAH
BSF 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
;状态寄存器内容送入
W
BCF 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
系列的指令完全相同。
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2