新闻中心

EEPW首页>嵌入式系统>设计应用> PIC单片机基础知识之一

PIC单片机基础知识之一

作者: 时间:2016-11-24 来源:网络 收藏
PIC16中档单片机的基本架构

PIC16中档系列单片机是精简指令集的单片机,它具有以下特性:
——内部为哈佛结构
——指令流水线操作
——文档寄存器的概念
——单 指令周期
——所有指令为单字指令
——长字指令
——指令数很少
——指令实现的功能基本不重复
接下来分别介绍上面各个特性。
1)哈佛结构-介绍哈佛结构通常要和冯.纽曼结构对比来介绍。我们熟悉的8086就是一种典型的冯.纽曼结构,它的程序和数据是共用同一个存储空间,CPU也是使用同一个 总线来访问它们。那么,取指令和取数据势必分时来进行,这就限制了数据的流量。和它相对应的哈佛结构,则是不同。哈佛结构的典型特点就是程序和数据是分立的空间,CPU对程序和数据的访问也是使用完全独立的两套总线。所以,相对于冯.纽曼结构,它可以同时从两个空间取指令和取数据,这就增加了数据流量。而且,因为两个总线互不相干,所以,程序总线和数据总线可以做得不一样宽。 PIC单片机在设计之初选择了哈佛结构,并基于程序总线的宽度,发展出了12位,14位和16位指令宽度的单片机系列,分别对应的是PIC低档系列,PIC16中档系列,以及PIC18系列单片机。这里要说明的是,数据总线的宽度始终是8位,所以不管它的指令宽度是多少,它仍然还是8位单片机。

2)指令流水线操作-大部分的单片机,取指令和执行的过程是顺序进行的。PIC单片机在设计时引入了指令流水线的设计,使得单片机的取指和执行可以同步进行。我们来看下面的指令取指和执行过程图示。

Tcy0 Tcy1 Tcy2 Tcy3 Tcy4 ……指令周期
1.MOVLW 0x55 取指1 执行1
2.MOVWF PORTB 取指2 执行2
3.CALL SUB_1 取指3 执行3
4.BSF PORTA,3 取指4* 刷掉错误的取指4
取SUB_1标号处指令
从这个图示上,我们可以看到取指和执行是如何同步进行的,也可以理解到,指令可以在一个指令周期内执行。但是,当有程序分支时(如CALL,GOTO或直接修改PC)是例外的,需要多花一个指令周期。图示上标有*号的地方,你可以看到,在执行CALL SUB_1这条指令时,同时预取了第4条指令BSF PORTA,3,程序是要调用SUB_1子程序,那么这条指令显然是错误预取的。但是不用担心,单片机的硬件会自动在下一个指令周期里刷掉被错误预取的指令4,同时在该指令周期内预取SUB_1标号处的指令,那么接下来的Tcy5就是执行子程序的指令了。从这个过程我们就可以理解,为什么程序分支时,需要两个指令周期了。

3)单字指令,长字指令-因为程序和数据是完全独立存储的,所以指令和数据的宽度可以不一样。PIC单片机的指令宽度有12位,14位和16位几种,分别对应低中高三档的系列。以中档PIC16系列单片机为例,它的指令字长是14位的,我们把它叫做长字指令。如何个“长”法,来看一个例子
PIC单片机 指令示例: MOVLW 0x55 (解释,给W工作寄存器赋立即数55H)
指令机器码: 1100XX 0101 0101
操作码 操作数

MC68HC05 指令示例: LDAA #55H (解释,给A累加器赋立即数55H)
指令机器码: 1000 0110 <-操作码
0101 0101 <-操作数
从图示上,你可以清楚的看到PIC16的一条指令是一个14位的长字,这个长字的前面部分是操作码,后半部分是操作数。和其他单片机比较来看,同样功能操作的指令,会被翻译成操作码字节和操作数字节,两个字节。所以,从这里,你可以得到一个概念,就是,PIC的一条长字指令,大约等于其他单片机的两个字节的指令。反映到程序空间上,就是PIC的1K字的程序空间,大约相当于其他单片机的2K字节的程序空间。当然,这个比例不是绝对的,不同的代码会有不一样的比例结果,但是这个1:2的近似结果有助于你在选择PIC单片机型号时作为参考。对于长字指令,还有着另一个好处,就是:程序指针PC指向的任何地方都是一个指令长字,即使PC跑飞,所指向的也是一条合法的长字指令(因为操作码的设计覆盖了所有的二进制组合),这样你就可以方便地用“陷阱”或“填充”等手段来减小PC跑飞带来的误操作。相对应地,操作码和操作数分为两个字节的单片机,一定程序上,存在PC跑飞后把操作数当成操作码来译码的风险。尽管现在的 单片机设计都有一定手段来克服这种PC错位,但是它还是没有PIC单片机这种单字指令来得方便。

4)精简指令集,指令功能不重复
字节操作指令
NOP - 空操作
MOVWF f 把W内容送f
CLRW - 清除W
CLRF f 清除f
SUBWF f,d f减去W
DECF f,d f递减1
IORWF f,d W和f逻辑或
ANDWF f,d W和f逻辑与
XORWF f,d W和f逻辑 异或
ADDWF f,d W和f相加
MOVF f,d 传送f
COMF f,d f取反
INCF f,d f递增1
DECFSZ f,d f递减1, 结果为0则跳
RRF f,d 带进位循环右移
RLF f,d 带进位循环左移
SWAPF f,d f高低4位内容交换
INCFSZ f,d f递增1, 结果为0则跳
位操作指令
BCF f,b f位清0
BSF f,b f位置1
BTFSC f,b f位测试, 为0则跳
BTFSS f,b f位测试, 为1则跳
立即数和控制操作指令
SLEEP - 进入 低功耗 休眠模式
CLRWDT - 清看门狗
RETLW k W带立即数返回
RETFIE - 中断返回
RETURN - 子程序返回
CALL k 调用子程序
GOTO k 强行跳转(k为9位地址描述)
MOVLW k W置立即数
IORLW k W和立即数逻辑或
ADDLW k W和立即数相加
SUBLW k 立即数减去W
ANDLW k W和立即数逻辑与
XORLW k W和立即数逻辑异或
注:f = 寄存器, k = 立即数 (8位), b = 位地址 <0,7>, d = 目的地 (1=f, 0=W)
上面就是PIC中档单片机的全部35条指令,这些指令可能对于初学者,显得很陌生,但是当你去看英文数据手册时,就会理解,这些指令,基本都是一句英文的首字母缩写,比如BTFSC,就是Bit Test File register Skip if Clear(位测试某f寄存器,如果为0则跳过一条指令)。一共就这35条指令,就算你一开始不习惯,要不断看指令表,但我想如果你开始写程序,一天下来应该就能记住所有的指令。想想别的单片机一百多条指令,某些日系的8位单片机竟有四百多条指令,不是那么容易背下来吧。

5)文档寄存器 - 英文的原文是file Register。在PIC单片机中只有两类寄存器,一类是W,Working Register工作寄存器,只有一个,相当于51的A累加器,其他的所有寄存器都是F寄存器,也就是文档寄存器。这里的“文档”,是一个形象的描述,你可以理解除了W之外的所有通用RAM和特殊功能寄存器都是一个个的文档,当需要操作的时候,取出某个文档,和W经过ALU中央运算单元运算后,结果既可以放到W里,也可以放到该文档寄存器里。这里要强调的是,所有的通用RAM和特殊功能寄存器(如端口,控制寄存器等)都是文档寄存器,所以对他们操作的指令都是一样的。象有些单片机,对端口访问,对普通RAM,对特殊功能寄存器的操作都要用不同的指令,相比起来,PIC单片机要方便得多。


PIC单片机的内部结构 框图

下图是PIC单片机内部结构框图。当然在学习单片机时,不是必须要了解芯片内部究竟时如何工作的。但是,大略地看看这个图,可以对PIC的某些特点有个初步的印象。从图上你可以看到程序总线和数据总线是相互独立的,在图的左下角你可以看到片内已经做好了上电复位,掉电复位,看门狗,振荡器起振延时器等为了增强单片机运行可靠性的模块,在程序指针(Program Counter)下面,你会看到一个和其他单片机不一样的地方,堆栈(Stack)。PIC单片机的堆栈是硬件堆栈,它和PC的宽度是一样的。当发生中断或者程序调用时,当前指令的PC+1(要清楚,前面讲过流水线,执行某条指令时,同时在预取PC+1处的指令)整个压入堆栈,返回时整个退栈。硬件堆栈和某些单片机在RAM空间里开辟的堆栈相比,有一个好处,就是不用担心因为堆栈的错误溢出而影响RAM区域,而且,你可以选择压栈后并不退栈,直接GOTO到其他处理。但是它也有自己的局限性,因为它是硬件的,所以堆栈的级数是有限的。对于PIC中档单片机,硬件堆栈只有8级,所以CALL的嵌套不要超过7级;对于PIC18系列,硬件中断则有31级。或许,你会担心堆栈不够用,但是,实际上,一个程序CALL嵌套超过7级的实在很少,而且,完全可以通过改变程序流程来保证堆栈不会溢出的。




关键词:PIC单片机基础知

评论


技术专区

关闭