历史上的今天
返回首页

历史上的今天

今天是:2025年02月25日(星期二)

正在发生

2020年02月25日 | pic单片机教程之13位程序计数器存储器的组成

2020-02-25 来源:elecfans

  单片机的两种存储器模块:程序存储器与数据存储器。每个存储模块都有自己的数据总线,能在同一时间戳内对模块同时进行数据存储与指令操作。


  程序存储器构成


  中档系列单片机有一个13位的程序计数器,可以寻址8K&TImes;14位的程序存储空间。程序存储器总线宽度(指令字)为14位。由于所有的指令均为单字指令,所以一个具有8K&TImes;14位程序存储器的器件可以存储8K条指令。很易于确定是否有充足的程序存储空间来实现应用程序。


  中档系列单片机把程序存储器分成4页,每页2K字(0h - 7FFh,、800h - FFFh、1000h - 17FFh和1800h - 1FFFh)。图6-1所示为程序存储器映射和一个8级深度硬件堆栈。实际上单片机可能只实现了图中所示存储器的一部分,这与器件型号有关。关于单片机所提供的存储器,请查阅单片机的数据手册。


  为了能在程序存储器页之间跳转,必须修改程序计数器(PC)的高位。这是通过在PCLATH(程序计数器高位锁存器)中写入需要的值来完成的。如果指令连续运行,无需任何用户的干预,程序计数器即可以跨越程序页面跨页。对于那些程序存储器不足8K字的器件,访问超过物理地址空间的存储单元时,会回到有效的程序存储空间。也就是说,在一个有4K字存储空间的单片机中,寻址17FFh实际就是寻址7FFh。2K字或更少程序存储空间的器件不需要分页。

  复位向量

  对于任何单片机,复位都将使程序计数器指向地址0h,我们称这个地址为“复位向量地址”,也就是单片机发生复位时,程序执行的入口地址。


  任何复位操作都会将PCLATH寄存器的内容清零。这表明,复位向量地址(0h)处的任何转移指令都将跳转到程序存储器的第0页(PAGE0)。


  中断向量

  当响应中断时,PC指向地址0004h,我们称这个地址为“中断向量地址”。当PC指向中断向量时,PCLATH寄存器的值并不会被修改。这意味着,在中断服务程序中,在改写PC实现程序跳转前,应按目的地址所处的实际程序页面先设定PCLATH寄存器。在中断服务程序修改PCLATH寄存器前,应将原PCLATH的内容保存起来,以便从中断服务程序返回时恢复PCLATH。


  标定信息

  某些器件在程序存储器中存储标定信息。在器件最终测试时,Microchip将标定信息写入程序存储器。应用程序利用这些值可以获得更好的运行结果。标定信息通常放在程序存储器的末尾,并以RETLW指令形式实现,该指令所带的立即数就是标定信息。


  *注:对于窗口型器件,在擦除器件内容前(同时会擦除标定信息),务必先记下所有的标定值。这样在重新烧写器件时能恢复标定值。建议将标定值写在封装上。


  程序计数器(PC)

  程序计数器指定要取出执行的指令的地址,其宽度为13位,其中低8位来自PCL寄存器,该寄存器可读写的,而高5位(PC<12:8>)来自PCH寄存器(不可直接读写)。PCH寄存器的值只能通过PCLATH寄存器来更新。


  图6-2所示为装载PC值的四种情况。情况1为写PCL时,如何装载PC(PCLATH<4:0>→PCH);情况2为执行GOTO指令时,如何装载PC(PCLATH<4:3> → PCH);情况3为执行CALL指令时,如何装载PC(PCLATH<4:3> → PCH)以及PC值如何压入栈顶;情况4为执行返回指令时,如何装载PC,此时PC值从栈顶装载(弹出)。

  相对跳转指令

  程序的相对跳转指令是通过向程序计数器加一个偏移量来实现的(ADDWF PCL),当使用相对跳转指令方法对表进行读操作时,要注意表地址是否超过了PCL寄存器的寻址范围(每块256个字节)。


  *注:对程序计数器(PCL)的任何写操作,都会使PCLATH的低五位装载到PCH中。

  堆栈

  堆栈允许8级深度的子程序嵌套调用和中断。堆栈包含了程序执行分支的返回地址。


  中档系列单片机有一个8级深度、13位宽的硬件堆栈。堆栈既不占用程序存储空间也不占用数据存储空间,栈指针不能读写。当执行CALL指令或响应中断发生跳转时,PC值被压入堆栈(PUSH)。而执行RETURN、RETLW或RETFIE指令时,PC值从堆栈弹出(POP)。执行压栈或出栈操作时,不会修改PCLATH寄存器。 压栈(PUSH)8次之后,进行第9次压栈时,进栈的数据将覆盖第1次压栈存储的数据,而第10次压栈时进栈的数据将覆盖第2次压栈存储的数据,依此类推。一个堆栈被覆盖的例子如图6-3所示。

  *注1:没有用于表示堆栈溢出或堆栈下溢条件的状态位。

  *注2:没有称为PUSH或POP的指令或助记符。而实现类似效果的操作是执行CALL、RETURN、RETLW和RETFIE指令,或转到中断向量地址。


  程序存储器分页

  某些器件的程序存储器空间大于2K字,但是CALL和GOTO指令只有11位地址范围,这11位地址只允许在2K存储空间范围内跳转。为了使CALL和GOTO指令可以访问整个8K的程序存储地址范围,必须有另外两位来指定程序存储器页。将PCLATH<4:3>位作为页面选择位(图6-2)。在执行CALL或GOTO指令前,用户必须确保正确设置页面选择位PCLATH<4:3>,以便指向需要的程序存储页面(图6-2)。当执行一条返回指令时,整个13位PC地址值都从堆栈弹出,不需要再对PCLATH<4:3>位进行设置。


  *注:当器件的程序存储器空间小于或等于2K字时,可忽略用来存取有多个页面的程序存 储器的页面选择位(PCLATH<4:3>)。但不推荐将PCLATH<4:3>位作为一般读写位使用,因为这样做可能影响与将来产品的向上兼容性。 对于程序存储器空间在2K到4K字之间的器件,可忽略页面选择位PCLATH<4>,因为它是用来寻址2、3页(1000h~1FFFh)的。通常也不推荐将PCLATH<4>作为一般读写位使用,因为这样做可能影响与将来产品的向上兼容性。


  例6-1是调用在程序存储器第1页上子程序的例子。本例假使PCLATH寄存器由中断服务程序保存和恢复(如果使用了中断)。

例6-1:从第0页调用第1页的子程序

推荐阅读

史海拾趣

德旭电子(DEXU)公司的发展小趣事

随着公司规模的不断扩大和业务范围的不断拓展,德旭电子开始注重履行社会责任和推动可持续发展。公司积极参与公益事业和社会活动回馈社会。

在环保方面德旭电子坚持绿色生产和低碳发展理念积极推广环保技术和设备降低生产过程中的能耗和排放。同时公司还注重产品的环保性能研发和生产符合环保标准的产品满足客户的环保需求。

在社会责任方面德旭电子关注员工福利和职业发展为员工提供良好的工作环境和培训机会促进员工的成长和发展。此外公司还积极参与社会公益事业和慈善活动为社会做出积极贡献。

通过这些举措德旭电子在履行社会责任和推动可持续发展方面取得了显著成效赢得了社会的广泛认可和赞誉。

CIRCUITCO公司的发展小趣事

面对日益增长的市场需求,CIRCUITCO公司意识到必须提升产能以满足客户需求。于是,公司投入巨资对生产线进行升级改造,引进先进的生产设备和技术。经过一系列的努力,公司的生产效率大幅提升,产品质量也得到了进一步保障。这一举措不仅提高了公司的盈利能力,也为公司在未来的市场竞争中奠定了坚实基础。

Aearo Technologies公司的发展小趣事

在发展过程中,Aearo Technologies经历了一次重要的收购事件。3M公司看中了Aearo在能量控制领域的领先地位和技术实力,于XXXX年将其收购。收购后,Aearo Technologies成为了3M旗下的一家子公司,继续保留其品牌和技术优势。通过业务整合和资源共享,Aearo Technologies在3M的支持下实现了更快速的发展。

Collins Electronics Corp公司的发展小趣事

Collins Electronics Corp的创始人在电子领域拥有深厚的背景和丰富的经验。在公司创立初期,他们发现市场上的电子设备在性能和稳定性上存在巨大的提升空间。于是,他们决定创立一家公司,专注于研发和生产高品质的电子设备。经过多次试验和改进,Collins Electronics Corp推出了他们的首款产品,一款高性能的信号放大器。这款产品凭借其卓越的性能和稳定性,在市场上获得了极大的成功,也为公司的后续发展奠定了坚实的基础。

川土(Chipanalog)公司的发展小趣事

为了进一步提升品牌影响力和市场竞争力,川土微电子开始积极寻求国际合作。公司与多家国际知名企业建立了合作关系,共同开发新产品、拓展新市场。同时,川土微电子还通过参加国际展会、发布新品等方式不断提升品牌知名度。这些努力不仅为公司带来了更多的商业机会,也为其在全球模拟芯片市场中树立了良好的形象。

Eagle-Picher公司的发展小趣事

1958年,Eagle-Picher公司的电池技术得到了重大的突破。在美国宇航局的探索者1号卫星上,Eagle-Picher的电池成功发射到太空,为卫星的运行提供了稳定的电源。这一里程碑式的事件标志着Eagle-Picher的电池技术在太空探索领域的应用达到了新的高度,也为公司赢得了更多的科研和商业机会。

问答坊 | AI 解惑

【秘密消息】【09国家电子设计大赛预测】

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 首先, 09年题目应该与往年差异不大。无非是仪器类、电源类、放大器类、控制类等几大块。所以现在老师用以前的训练模式给学生打基础应该没什么问题。但有一下几点要注意: 因为推荐全国都有笔试 ...…

查看全部问答>

devfs的作用是什么?

从字面上,devfs应该是设备文件, arm  linux嵌入式系统中,内核是否必须支持devfs,启动时是否必须自动挂载/dev为devfs文件系统?…

查看全部问答>

nk.bin或者nk.bin0能直接烧写到SDRAM的起始地址运行吗?

    友善开发板。因为每次都下载镜像到NAND,然后启动运行。感觉很耗时间。采用down&run 直接下载镜像到SDRAM,但是运行不成功。      由于对bootloader 没有深入分析过,不太清楚系统启动的过程。所以请问,这NK.b ...…

查看全部问答>

如何在winCE设备上用USB游戏手柄

请教各位: 我现在想开发的一款产品是要能在winCE设备上用USB游戏手柄玩游戏.都是USB2.0的协议,我的理解是手柄在PC上可以用,那么在winCE上应当也是可以用的.但实际上在winCE上却操作不了.我很凝惑,是不是在winCE上还要写驱动程序呢?或者是有其它什 ...…

查看全部问答>

步进电机的问题

我想用单片机来控制两个步进电机,使他们能够独立工作,两个都是三相六拍,每个都有A,B,C三相,所以只要用一个口中的三位就能控制一个,问题是能不能不只用一个口(假如P0)就能控制两个,而不相互影响。 还有一个问题就是超声波发射出去的是方 ...…

查看全部问答>

【飞凌】platform_device + miscdevice 模式的LED驱动程序

本文转引自 飞凌嵌入式 Linux技术交流区 www.witech.com.cn 感谢作者朋友的分享精神! 这是我最近学习Linux驱动模型的成果,发出来大家共同学习一下,该程序还有很多缺陷,希望高手能不吝赐教#include <linux/types.h>#include <linux/cde ...…

查看全部问答>

7805的电容问题。

不知道大家平时有没有注意到7805前后的电容问题?前面和后面的电解电容应该怎样取值呢?如果只有一个,应该装在前面还是后面呢? [ 本帖最后由 zhaojun_xf 于 2010-9-2 11:22 编辑 ]…

查看全部问答>

cycloneIII EP3C5E144C8N 中时钟的问题

这个芯片有8个时钟引脚clk[7..0],我想输入一个时钟到pll,然后引出一个输出的时钟引脚到到DAC,时钟的输入引脚打算选clk[0],输出打算选clk[4] 行吗???还有不用的其他的时钟引脚是悬空,还是接地,接地的话要通过电阻吗,要的话电阻是多大了,还有 ...…

查看全部问答>

全新工厂库存TFT2.8带触摸屏无山寨标15元一片

全新工厂库存TFT2.8带触摸屏无山寨标15元一片,10片以内,50片以下广东省内包邮,外省根据地区和重量加补运费 提供转接板原理图,PCB,和屏的规格书datasheet [ 本帖最后由 ylyfxzsx 于 2012-11-11 12:03 编辑 ]…

查看全部问答>