文档库

最新最全的文档下载
当前位置:文档库 > PIC 系列单片机数据存储器的特点和功能概要

PIC 系列单片机数据存储器的特点和功能概要

PIC系列单片机数据存储器的特点和功能(中)

PIC单片机http://www.wendangku.net/doc/0e9c08a4f524ccbff1218483.html

学习PIC单片机数据存储器时,不仅要了解各寄存器单元的功能,而且还应在编制程序时会调用它们完成编程目的。下面笔者将以编程实例说明它们的用途。

2 间接寻址寄存器INDF和FSR位于PIC单片机数据存储器的最顶端、地址00单元(地址码最小)的间接寻址寄存器INDF是一个空的寄存器。它只有地址码,在物理上不是一个真正的寄存器。它的功能常常与寄存器FSR(又称寄存器选择寄存器)配合工作,实现间接寻址目的。初学专用寄存器INDF和FSR时,记住下述的逻辑关系对编程是有帮助的:使用寄存器INDF的任何指令,在逻辑上都是对寄存器FSR所指向的RAM进行访问,即对INDF(本身)进行间接寻址(访问),读出的应是FSR内容。以下的一个简单程序是用间接寻址方式清除RAM地址20h~2Fh单元寄存器内容的实例。

MOVLW0x20;20h→w,对指向RAM单元的指针

;初始化

MOVWF FSR;20h→FSR,FSR指向RAM

LOOP CLRF INDF;清除INDF,即清除FSR内容所指

;向的单元20h→2Fh

INCF FSR;(指针)FSR内容加1

BTFSS FSR,4;判别(指令)FSR的D3位,若为零

;执行下条循环指令;若为1间跳

;执行。

GOTO LOOP;跳转到LOOP(循环)

CONTINUE…;已完成功能,继续执行程序

由上述指令看出,因寄存器INDF和FSR的配合工作,达到了对RAM地址20h~2Fh 的寄存器清零目的。由于完成上述功能的指令数很少,这就会简化指令系统,使PIC单片机的指令集得以精简。

说明:上述各条指令易于看懂,所以无需再复述,但其中的一条判别指令“BTFSS FSR,4”比较关键。该条指令是保证题设中要选择RAM地址单元上限值2Fh时,其对应的二进制数为00101111B,此时FSR的第4位恰为1。所以上述指令中用了一条判断指令;BTFSS FSR,4,判断FSR的D3位值是否为1,若不为1而为0,则执行下条循环指令GOTO LOOP,使FSR中的地址不断加1,直到寄存器FSR的D3位为1时,这时它的内容代表的RAM地址恰为2Fh。

由此可见,学习PIC单片机数据存储器中的专用寄存器时,不必要对每个产品的专用寄存器进行学习,只需先学习它们的共同点,然后选中一个产品型号的专用寄存进行详细分析,有条件时进行必要的相关指令操作,就能完全掌握单片机技术。

PIC系列单片机数据存储器的特点和功能(下)

PIC单片机http://www.wendangku.net/doc/0e9c08a4f524ccbff1218483.html

3A/D转换寄存器这里摘录一段笔者从网上下载的用PIC16F877单片机芯片(带Flash存储器的)完成有关A/D转换的源程序部分指令,并用它说明有关A/D转换寄存器在指令中的用法。这里先引用部分源程序,源程序中的注释是笔者按照指令在程序中的作用所加的注释(不是某条指令的直接功能),这是初学者读以下指令时应注意的。A/D转换器部分源程序清单如下:

DEMO877 ASM

List P=16F877

org0x00;复位向量

NOP;空操作

Start Banksel PORTC;选择PORTC所在

;数据存储器的存储

;体(实为Bank0)

CLRF PORTC;对RC口清零

MOVLW B′01000001′;A/D转换时钟选

;择FOSC/8,打开

;A/D转换器

MOVWF ADCON0;设定了A/D转换

;操作部分参数

Banksel OPTION_REG;选择OPTION所在

;数据存储器的存储;体(实为Bank1)

MOVLW B′10000111′;设置预分频器TM

;R0,分频率1∶256

MOVWF OPTION;完成上条指令设置

CLRF TRISC;设定RC口(8位)

;为输出

MOVLW B′0001110′;选中模拟量通道1

;(RA1/AN1)

MOVWF ADCON1;模拟基准电压

VREF为芯片电源电压,选择通道1(RA1/AN1)完成

main…

要阅读上述的指令,读者还需了解以下必要的补充知识。

(1)关于用PIC16F877单片机作A/D转换器。PIC16F877单片机是具有多通道模拟量输入的8位A/D转换器。上述的源程序是利用该PIC产品作A/D转换的一种实验程序,其实验目的是用PIC16F877单片机来实现一个通道的8位A/D转换,并将转换结果以二进制形式经RC口输出再由LED显示。实验的电路原理如附图(笔者根据源程序而绘出的PIC16F877A/D转换硬件电路图)所示。

(2)编制与A/D转换器有关的专用寄存器指令。要读懂上述的源程序,应根据以下的线索:1)把握源程序的编写惯例;2)选择RC口和对它清零;3)给A/D控制寄存器ADCON0的各位置数,达到A/D转换时选择A/D位的采样时间,即注释中的A/D时钟选择;4)选择专用寄存器Option并给它各位置数,达到选择预分频器TMR0和确定其分频率(1∶256);5)设定RC口为输出,以保证LED显示;6)给A/D控制器ADCON1的各位置数,以确定PIC16F877单片机的RA1口为模拟量的输入通道。并选中芯片电源作基准电压。读者若需深入了解A/D控制寄存器ADCON0和ADCON1的各位详细功能,请参看有关PIC单片机书籍的详细介绍。

A/D转换的主程序(main)约有13条,将在本版PIC系列专题的后期结合实验板的编程器介绍。PIC系列单片机的其它专用寄存器,如TRISA、STATUS Bank等,本报在前几期有关PIC单片机的文中均已介绍过。

PIC 系列单片机数据存储器的特点和功能概要

PIC8位单片机16F8X系列简介

PIC单片机http://www.wendangku.net/doc/0e9c08a4f524ccbff1218483.html

Microchip公司生产的PIC8位单片机16F8X系列产品是PIC单片机中级型产品之一。该系列产品的主要型号是16F83单片机和16F84单片机。其引脚功能如附图所示。该系列产品的最大特点是有8k×14的Flash(闪速E2PROM)程序存储器和带8位的Flash(闪速E2PROM)数据存储器,其擦写次数上万次,数据保存时间大于40年。所以该系列产品极适合那些可能会经常改动程序编程的应用,例如用户可以随时改动出厂产品中的单片机程序以增加或调整产品的功能。此外,对那些学习、开发PIC单片机的个人或单位,都是一种很好的可重复多次的实验芯片。还有它内部的Flash数据存储器不仅具有掉电保护数据的功能,加之它是由单片机内部进行控制操作的,自然外部电路无法对其进行读写,所以它有极高的数据保密性,使得PIC16F8X单片机在智能IC卡、密码锁、电子防盗系统等方面得到广泛的应用。

主要功能

高性能RISC结构CPU;精简指令集35条单字节指令;执行速度DC~400ns;Flash程序和数据存储器;多种硬件中断和直接/间接/相对三种寻址方式。其余性能参见附表。

微控制特性

上电复位;自振式看门狗;程序保密位;微功耗睡眠功能和四种可选的振荡方式。

电源和温度特性

宽工作电压:2V~6V(PIC16LF84单片机工作电压为2V)

宽工作温度范围:商用级0℃~+70℃;工作级-40℃~+85℃;汽车级-40℃~+125℃。

这里的宽工作温度范围,特别是汽车级产品已大量用于汽车电子,甚至已用于航空仪表

上。

PIC 系列单片机数据存储器的特点和功能概要

PIC16C84单片机介绍

PIC单片机http://www.wendangku.net/doc/0e9c08a4f524ccbff1218483.html

1、概述

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,RETURN13

RETFIE,RETLW1级堆栈

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

01TMRO OPTION81

02PCL PCL82

03STATUS STATUS83

04FSR FSR84

05PORTA TRISA85

06PORTB TRISB86

0787

08EEDATA EECON188

09EEADR EECON2(*)89

0A PCLATH PCLATH8A

0B INTCON INTCON8B

36个通用寄映象到存器(SRAM)0块2F AF7F FF0块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 RP1RP0TO PD Z DC C bit7bit0

其中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 PS2PS1PS0bit7bit0

其中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 bit7bit0

其中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单位。

MOVLW20H;初始化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-1PORTA和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-2PROTB和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,则清0RBIF位。

不相等的条件将继续配置1RBIF位为止。读PORTB将结束不相等条件,并允许RBIF被清0。这一特征为软件可配置上拉一起允许用户非常容易的使用PORTB作为键盘输入的接口。也就可以通过按键来唤醒系统。

注意:如果正在执行敛僮鳎琁/O引脚改变了信号,RBIF中断标志不可能被置成1。

建议用改变信号中断作为按键唤醒操作,PORTB只不用改变信号中断,建议不要用查询方式。图4-7是用端口作键盘接口的原理图其R1为ESD保护而新选择的电阻。使用此接口时,通过软件选择保持内部上拉,即RB4~RB7为高,设置为输入方式。RB0~RB3输出。任何键被按下,RB4~RB7的某一根线将改变从而产生中断。这个中断可以唤醒芯片,用这种方法可以节省计时器资源。

16个键

RB4100

RB5

RB6

RB7

RB0

RB1

RB2

BR3

Rf

图4-7利用端口B的键盘接口图。

5-3I/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系列相同。它可以经过清0TOCs位(即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)第一次变换就发生。

8A/D变换工作的流程图

表2-4PIC16C74/73的A/D变换所涉及的寄存器

地址名称bit7bit6bit5bit4bit3bit2bit1bit0

0B/8B INTCON GIE PEIE

0C PIR1ADIF

8C PIE1ADIE

0D PIR2CCP2IF

8D PIE2CCP2IE

1F ADCON0ADCS1ADCS0CHS2CHS1CHS0GO/DONE ADON

9F ADCON1PCFG2PCFG1PCFG0

除上述所例寄存器外,还有ADRES(地址1EH)用于存放A/D变换的结果。PORTA(地址05H)用于输入多路模拟信号,TRISA(地址85H)用于设置PORTA的I/O方式,PORTE (地址09H)用于输入多路模拟信号,TRISE(地址89H)用于设置PORTE的I/O方式。

表2-5PIC16C71的A/D变换所涉及的寄存器

地址名称bit7bit6bit5bit4bit3bit2bit1bit0

0B/8B INTCON GIE ADIE

08AOCON0ADCS1ADCS0CHS1CHS0GO/DONE ADIF ADON

88ADCON1PCFG1PCFG0

此外还涉及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 FOSC1FOSC0bit13bit0

图4-10PIC16C84的配置寄存器

7-3写EEPROM数据存储器

与写EEPROM的数据单元、用户必须首先写地址到EEADR寄存器,再送数据到EEDA TA,最后用户必须跟着一个专门的序列起动写。例如:下面这段程序是写EEPROM的程序。??BSF STATUS,RPO;选择1块

BCF INTCON,GIE;关闭所有INT中断

MOVLW55H;

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)将置1TOIF位(INTCON<2>)。这一位的中断可以对TOIE (INTCON<5>)位置1或清0而开放/关闭中断。

3.PORTB中断

在端口B的7~4位的输入改变,就置1RBIF(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系列的指令完全相同。

PIC 系列单片机数据存储器的特点和功能概要

PIC单片机16F84的内部硬件资源(一)

PIC单片机http://www.wendangku.net/doc/0e9c08a4f524ccbff1218483.html

上期笔者介绍的PIC16F84单片机点亮一只发光二极管的源程序实例是为了说明PIC单片机16F84具体应用时的基本格式。

现在我们已经知道要单片机工作,就需用汇编语言编制程序。而对某个PIC单片机编程时,还需对选用的PIC单片机内部硬件资源有所了解。这里介绍PIC16F84单片机的内部结构,如图1所示的框图。由图1看出,其基本组成可分为四个主要部分,即运算器ALU 和工作寄存器W;程序存储器;数据存储器和输入/输出(I/O)口;堆栈存储器和定时器等。现分别介绍如下。

1 运算器ALU及工作寄存器W

运算器ALU是一个通用算术、逻辑运算单元,用它可以对工作寄存器W和任何通用寄存器中的两个数进行算术(如加、减、乘、除等)和逻辑运算(如与、或、异或等)。16F84是八位单片机,ALU的字长是八位。在有两个操作数的指令中,典型的情况是一个操作数在工作寄存器W中,而另一个操作数是在通用寄存器中,或者是一个立即数。在只有一个操作数的情况下,该数要么是在工作寄存器W中,要么是在通用寄存器中。W寄存器是一个专用于ALU操作的寄存器,它是不可寻址的。

根据所执行的指令,ALU还可能会影响框图中状态寄存器STATUS的进位标志C、全零标志Z等。

2 程序存储器

单片机内存放程序指令的存储器称为程序存储器。PIC16F84的所有指令字长为14位。所以程序存储器的各存储单元是14位宽。一个存储单元存放一条指令。16F84的程序存贮器有1024(28)个存储单元(存储容量为1k)。这些程序存储器都是由FPEROM构成的。

程序存储器是由程序计数器PC寻址的。16F84的程序计数器为13位宽,可寻址8K(8×1024)的程序存储器空间,但16F84实际上只使用了1k的空间(单元地址为0~3FFH)。当访问超过这些地址空间的存储单元时,将导致循环回到有效的存储空间。

对于用过其它单片机的用户,可能会感到16F84的片内存储器容量太少了。实际上并非如此,因为16F84的指令系统都是由单字指令构成的,相应于其它由二字节、三字节甚至四字节指令的单片机而言,PIC单片机的程序存储器有效容量要比标称值扩大2 5倍到3倍。

PIC单片机16F84的内部硬件资源(二)

PIC单片机http://www.wendangku.net/doc/0e9c08a4f524ccbff1218483.html

3数据存储器

在单片机PIC16F84中,除了有存放程序的程序存储器外,还有数据存储器。单片机在执行程序过程中,往往需要随时向单片机输入一些数据,而且有些数据还可能随时改变。在这种情况下就需用数据存储器。由于数据存储器不但要能随时读取存放在其各个单元内的数据,而且还需随时写进新的数据,或改写原来的数据。因此,数据存储器需由随机存储器RAM构成。RAM存储器在断电时,所存数据随即丢失,这在实际应用中有时会带来不便。但是,在16F84单片机中有64×8位E2PROM数据存储器。存放在E2PROM中的数据在断电时不会丢失。