电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 5130|回复: 14

不同型号的PICmicro微控制器处理器体系结构差别

[复制链接]
发表于 2018-3-24 22:19:19 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
    不同型号的PICmicro微控制器处理器体系结构差别:
    4种不同型号的PICmicro微控制器处理器体系结构有很多的相似之处,差异大部分是由于指令字的长度,而不是由于器件本身的特性的添加或减少造成,在这里主要讨论的是中档PICmicro微控制器体系结构,因为它与其他器件体系结构有更多的共同之处,在应用其他体系结构之前应该认识两个方面的差别:
    1、程序计数器电路
    2、寄存器的组织
    接下来几点考察这些差别,执行过程的转向是怎样实现的,数据在不同型号的PICmicro微控制器体系结构中是怎样访问和传递。
一、低档PICmicro微控制器器件
    虽然低档 Picmicro微控制器器件不具有中档 Picmicro微控制器的一些特性,但它和中档Picmicro微控制器有十分相似的体系结构。最明显的差别是低档 Picmicro微控制器器件缺少addlw sublw指令,但还有一些更微妙的差别应该掌握,这些差别之一是与中档 Picmicro微控制器相比在复位向量上有一个变化。在中档 Picmicro控制器中,复位向量总是0,但在低档 Picmicro微控制器件中这个地址总是程序存储器的最后的那个地址。
下表列出了对应不同的低档 Picmicro微控制器件程序存储器容量的复位向量地址
              低档 Picmicro微控制器件程序存储器容量及对应的复位向量地址
                   程序存储器容量              复位向量
                         512                    OxOIFF
                        1024                    0x03FF               
                        2048                    0x97FF
     如在本贴后面讲的;我建议忽略这个复位向量地址而用0地址,它是在程序存储器最后的地址上的指令执行后接下来的一个指令的地址。当程序存储器中的最后一条指令执行后,低档器件的程序计数器指针恢复为0,并从那里继续执行。如果最后的地址是空地址(即没有编程).那么读出的结果是( xorlw 0x0FF),它实际上相当于对w寄存器的初始值作“反”运算,但w寄存器的初始值同所有的文件寄存器一样在上电后是未定的。
     通过忽略最后一个指令,应用程序就可以像中档器件的应用程序那样来写,复位就不会带来任何差别。但一定要记着不要编程最后的地址(也就是说不要在这个地址上放指令),一般总是把程序存储器的容量减一,这样就记住了。接下来的两点讲在程序计数器硬件和寄存器寻址硬件方面低档器件与中档器件的差别。这是两种体系结构的主要差别(同时,中档 PICmicro微控制器可用中断技术)本贴后面讲怎样写应用程序使得在两种体系结构之间转移代码和整个应用程序得相对简单的方法。
     1、访问寄存器
     2、程序计数器
 楼主| 发表于 2018-3-24 22:56:06 | 显示全部楼层
1、访问寄存器
    我认为低档器件的寄存器的组织是它们和中档器件的最大不同之处。使用包含有32个寄存器的堆而不需要堆选择位,这大大地减少了在低档器件中可能的文件寄存器的数量及对相对较大的表格的使用。虽然我对可用的寄存器如此少和访问可用的资源的困难感到失望,但仍然认为低档器件是有用的,应该在确定应用使用哪个器件时予以考虑。 低档器件寄存器映像.jpg
    低档器件的TRIS和 OPTION寄存器只能使用trisoption指令写入,(未完待续)
 楼主| 发表于 2018-3-25 09:03:47 | 显示全部楼层
    低档PICmicro微控制器指令只为一个直接寻址指令提供了5位数作为寄存器地址,它有以下形式:        INSTRTdRRRRRR
这里的 INSTRI是指令的位模式。d是目标寄存器参数(1表示把结果存回源寄存器,0示把结果存在w寄存器).RRRR是寄存器地址。在这些直接寻址指令中,只有在第1个堆中的寄存器可以被访问。访问其他堆中的寄存器需要利用FSR。
    如在下表二可以看到的,各个堆的头16个地址都是相同的。剩余的各个堆不同的16个寄存器都位于堆的最后16个地址中。这样每一次换堆只能寻址16比特的数据限制了序列数据结构和其他比16比特长的数据结构的构建。
    当然你可以设计一个算法改变FSR的高阶位(第5位和第6位)以模拟一个大于16比特数据结构和其他比16比特长的数据结构的构建
序列数据结构,但我建议在这种情况下还是选择其他的 Picmicro微控制器体系结构来
    在低档 Picmicro微控制器中有多达4个堆。如果在每一个堆的后半部分有16个文件寄存器字节可用,而在前半部分有8个或9个(这要依赖于端口C是否可用)文件寄存器可用,那么不同的文件寄存器的最大数量就是72或73。但是低档 PICmicro微控制器的FSR从不等于0。 Microchip公司的设计人员不是忽略未使用的高阶FSR位,而是选择使它们进行设置。即使在所有4个堆的寄存器都被使用的情况下(总共128个FSR可访问的寄存器),FSR也不等于0;将设置FSR的第7位。表一列出了在具有不同数量的堆寄存器的低档 Picmicro微控制器件中将设置FSR的哪些位。
                            表一、低档器件堆的不同数量以及对应的FSR的最小值
               堆的数量                    被按位设置的FSR位                 FSR的最小值
                 1                              7、6、5                          0x0E0
                 2                              7、6、                           0x0C0
                 4                              7                                0x080
    记住低档器件的FSR从不等于0可能很困难,我们可以用下面的指令序列检验一下FSR的内容,发现了它的结果从不被零化,可能就记住了:

                  movlw  0
                  xorwf FSR,W

2、程序计数器
                        表二、低档器件程序计数器图表
           (未完待续)
 楼主| 发表于 2018-3-25 09:48:13 | 显示全部楼层
表二、低档器件程序计数器图表.jpg

    低档器件的程序计数器与中档器件的程序计数器颇有点不同。如果看一看低档器件的标准的寄存器集,将会看到没有 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位作标识位。这些位不正确的更新(它在下一个表操作前不恢复到正确值)将使应用程序的gotocall转向指令无效。而这样的错误几乎是不可能通过调试发现的,所以要避免任何潜在的问题就不要修改这些位,除非想要把地址位置转换到其他页。
 楼主| 发表于 2018-3-25 22:15:26 | 显示全部楼层
  二、PIC17Cxx型体系结构
    当把PIC17Cxx 型器件的特性与低档和中档器件作比较时,你很可能感到好像为它单独构建了一个完全不同的体系结构。与其他器件比较,PIC17Cxx 的独特特性包括:
   1.访问外部并行存储器的能力
   2.多达7个I/O 端口
   3.一个内置的8x8乘法器
   4.在多达16个寄存器堆中的902个寄存器
   5.多达64K的地址空间
   6.读写程序存储器的能力
   7.多中断向量地址
   除了这些增强的特性,PIC17Cxx的方框图(见图一)也给你不同的感觉,没有太多其他器件体系结构的影子。
          微信图片_20180325195440.jpg          
         图一、PIC17Cxx处理器体系结构
   尽管PIC17Cxx明显是一个不同的体系结构,但仍然能够认为它的处理器是象图二那样构建起来的,而图二的结构与低档和中档的器件相比并不是差异很大,用于算术运算的数据仍通过寄存器的数据总线上传递,临时值仍保存在w寄存器上(在PIC17Cxx和PIC18Cxx中被称为WREG)。指令可把算术结果存放在WREG,也可以存放在源寄存器中,在这个基础上我们可以理解为PIC17Cxx类似于低档和中档器件。
          微信图片_201803252112290.jpg
         图二、PIC17Cxx处理器体系结构
     在PIC17Cxx体系结构中,主要的不同点如下:
   1、累加器,WREG能够在寄存器空间中被寻址
   2、状态寄存器和选项寄存器的功能扩展到了其他寄存器中
   3、程序计数器的工作方式与其他体系结构稍微不同
   4、寄存器的访问不同,访问过程可绕过WREG
   5、内置了一个8x8乘法器
 楼主| 发表于 2018-3-26 22:43:17 | 显示全部楼层
声明:本贴主是PIC单片机爱好者,相关PIC资料载自或参考《PICmicro微控制器编程与自主开发(第二版)》
本书是本贴主购买正版书籍和配套光盘,分享相关内容是为了帮助广大爱好者及初学者更好学习掌握PIC单片机的相关知识点,如有不当和错误请大家纠正,谢谢大家!
 楼主| 发表于 2018-3-27 22:21:34 | 显示全部楼层
本帖最后由 cyc20180228 于 2018-3-28 00:46 编辑

除了状态寄存器, PIC17Cxx还提供了与它有同样功能的ALUSTA和CPUSTA寄存器,如表三和表四:
                            表三、  PIC17Cxx的ALUSTA寄存器的位定义
********************************************************************************************
       位                              功能
——————————————————————————————————————————————
      7-6                      FS3:FS2-FSR1方式选择
                                  1x-FSR1 在访问后不改变
                                  01-FSR1 在访问后递增  
                                  00-FSR1 在访问后递减   
      5-4                      FS1:FS0-FSR0方式选择
                                  1x-FSR0 在访问后不改变
                                  01-FSR0 在访问后递增  
                                  00-FSR0 在访问后递减   
      3                       0V-溢出位指示在一个7位二进制补码数中发生了溢出
      2                        Z-当运算结果为0时按位设置
      1                       DC-当最低4位位值的加法运算或减法运算影响到高位比特4位时按位设置
      0                        C-当加法运算或减法运算影响到高位比特时按位设置
*********************************************************************************************


 楼主| 发表于 2018-3-27 22:45:58 | 显示全部楼层
本帖最后由 cyc20180228 于 2018-3-27 22:53 编辑

                           表四   PIC17Cxx的CPUSTA寄存器的位定义
********************************************************************************************
       位                              功能
——————————————————————————————————————————————
      7-6                             未用
      5                         STKAV-当按位设置时,程序计数器堆栈有空间可用
      4                        GLINDT-当按位设置时,所有中断请求都被禁止  
      3                           _TO-在一个监视计数器恢复后复位   
      2                           _PD-在一个休眠指令后复位
      1                          _POR-如果有一个上电复位,那么它被PICmicro微控制器复位
      0                          _POR-如果有一个掉电复位,那么它被PICmicro微控制器复位
*********************************************************************************************
 楼主| 发表于 2018-3-27 23:08:47 | 显示全部楼层
本帖最后由 cyc20180228 于 2018-3-28 00:59 编辑

      中断操作在PIC17Cxx中与中档器件相似,它有一个启用中断请求标识位(F位)的E位以请求处理器执行适当的中断处理程序。PIC17Cxx没有一个启用中断的GIE位,但有一个GLINTD位,为了使中断请求传送到处理器它必须复位。优先级如表五:
                      表五   PIC17Cxx的中断向量地址和不同中断源的优先级
********************************************************************************************
      优先级             中断向量地址                   中断源
——————————————————————————————————————————————
      高                   0x0008                       RAO/INT管脚中断
                           0x00010                      TMR0   溢出中断
                           0x00018                      TOCK1  管脚中断
      低                   0x0020                          外围器件中断
*********************************************************************************************
 楼主| 发表于 2018-3-28 22:05:49 | 显示全部楼层
    8x8乘法器是一块十分简单的硬件,它绕过了PICmicro微控制器的ALU和ALUSTA寄存器,把WREG的内容与另一个值相乘,16位的结果被放在PRODL和PRODH寄存器中:
    用8位乘法把两个16位数乘起来,两个二元表达式乘起来,先把它们的“头两个值”乘起来,然后依次是“外面的两个值”、“里面的的两个值”和“最后的两个值”,即:
     (A+B)*(C+D)=AC+AD+BC+BD
    把一个16位数分成两个字节,并注意到高位比特字节应乘以 0x0100 , A 和 B 可以写成:

      A = ( AH * 0x0100 ) + AL
      B = ( BH * 0x0100 ) + BL
   
   要计算 A * B ,只需按照上面的乘法:

   A * B = ( AH * 0x0100 + AL ) * ( BH * 0x0100 + BL )
         = ( AH * 0x0100 * BH * 0x0100 ) + ( AH * 0x0100 * BL ) + ( AL * AH * 0x0100 ) + ( AL * BL )

    我们知道把一个数乘以 0x0100 相当于把它左移一个字节(或者说8位),所以两个16位的变量可以用下面的代码乘在一起得到一个32位的积:

      Product = MUL ( AL ,BL ) ;
     Tproduct = MUL ( AL ,BH ) << 8 ;
      Product =  Product  + Tproduct  ;
     Tproduct = MUL ( AH ,BL ) << 8 ;
      Product =  Product  + Tproduct  ;
     Tproduct = ( MUL ( AH ,BH ) << 8 ) << 8 ;
      Product =  Product  + Tproduct  ;
    这个程序可以很容易地转换成汇编语言。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2024-5-16 08:56 , Processed in 0.078290 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

快速回复 返回顶部 返回列表