- UID
- 1036470
- 阅读权限
- 20
- 推广
-
- 幽默
-
- 注册时间
- 2018-2-27
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2018-3-25 09:48:13
|
显示全部楼层
低档器件的程序计数器与中档器件的程序计数器颇有点不同。如果看一看低档器件的标准的寄存器集,将会看到没有 PCLATH寄存器;页选择位包含在状态寄存器中(而堆选择位在低档器件中是没有的)同时,由于低档器件体系结构的限制,在表格和子程序的存放及使用上有一些问题也是我们应该知道的。
低档和中档器件在程序计数器上的差别部分是由于低档器件的页容量是512条指令(而中档微控制器的页容量是2048条指令)在低档器件中,指令执行限于这512条指令中,除非执行一个在页间转换的jump指令或执行过程直接从较低页转到较高页。
状态寄存器的PA0位和PA1位(第5位和第6位)实现与中档的器件的 PCLATH寄存器同样的功能。PA0位用来提供在goto或call指令执行时或PCL写入时要跳到的目标地址的第9位位值。PA1位是地址位的第10位。在一些低档器件中,将会看到状态寄存器的第7位被称为PA2。现在的 PICmicro微控制器都不再用这个位。在中档器件中,通过改变PCL实现执行过程转向,用了下面的代码:
PCLATH = HIGH new_address;
PCL = Low new_addres;
在低档器件中,实现这个操作颇有点复杂,因为虽然更新PA0-PA2位,但状态寄存器其他的位都没改变。与程序寄存器的 PCLATH/PCL更新等价的低档 器件的操作是:
STATUS = (STATUS & 0x01F)+(( HIGH new_address & 0x0FE)<< 4);
PCL = Low new_address;
在低档器件的代码中,状态寄存器的内容与0x01F作“和”运算从而将PA0位复位到PA2位。注意:在这个改变状态寄存器的位值的算式中,清除了new_ address高位比特字节的最末位。如在下一段中讲的那样,目标地址的第8位在状态寄存器中从没有给出过。PA0位和PA1位值被正确计算出来后就加到了状态寄存器的其他位上。对于call指令,新地址的第8位总是0、因为指令字只提供8位地址而PAO位变成了新地址的第9位。这对goto指令并不是一个问题,因为9位位值可以涵盖低档器件的一整页512条指令地址并能够在goto指令本身中确定。对于call指令,它本身只能确定8位地址位作为目标地址,不能访问一个低档器件页的后256条指令。
表转换(直接写到PCL寄存器)的限制与call指令地址一样;它们也都必须限制在一个指令页的前256条指令中。比包含256条指令大的表是能够构建出来的,但为了使表看起来是连接的,就需要软件计算跨页边界的转换。
在状态寄存器中一定不要用PA位作标识位。这些位不正确的更新(它在下一个表操作前不恢复到正确值)将使应用程序的goto或call转向指令无效。而这样的错误几乎是不可能通过调试发现的,所以要避免任何潜在的问题就不要修改这些位,除非想要把地址位置转换到其他页。
|
|