一键式紧急求助系统,PIC无法判断I/O口电平状态

&&& 所有I/O端皆可置成输入或输出态。输入无锁存,所以外部输入信号应保持到让CPU读入为止。输出锁存。&&& I/O端的输入/输出状态由对应的I/O控制寄存器"TRIS f"控制,当"TRIS f"将"1"置入I/O控制器时Q1和Q2都处于截止态,所以I/O端即呈高阻态(输入态)。当执行 I/O读指令(如MOVF 6,W),把当前I/O端的状态读入数据总线。当"TRIS f"将"0"置入I/O控制器时,Q1和Q2的导通情况将要由数据锁存器Q端的状态来决定。当写入数据为"1"时,Q端为低0,则Q1导通,I/O输出为高电平。反之,当写入数据为"0"时,Q端为"1",则Q2导通,I/O端输出为低电平。I/O读写时序如图1.11所示:&&& 注:本图显示了PORTB口的一个写入→读出的连续动作。I/O脚电平的建立时间=0.25TCY-TPD,其中TCY为指令,所以对于高速振荡来说,连续的写入→读出可能会有问题,两者中间应有延迟。&I/O口使用注意事项:a、I/O方向转置的问题&&& 某时候可能需要一个I/O口一会做输入,一会又做输出。这就是I/O方向的转置。&&& 在编写这种I/O转置程序时必须注意,有些指令如位设置指令(BSF、BCF)写I/O口时是先从I/O读入其状态,执行位操作后再将结果写回去覆盖原来的内容(输出的结果放在I/O口的数据锁存器)。举个例说:"BSF 6,5"这条指令的目的是要把B口的第6位置为高电平"1"。执行这条指令时,先把整个B口当前的状态内容读入到CPU,把第6位置成"1"后再把结果(8个位)重新输出到B口。如果B口中的有一个I/O端是需要方向转置的(比如说bit1),而这时是处于输入态,那么B口的状态值重新写入后,B口的数据锁存器1(见图1.9相对于B口bit1的锁存器)的锁存值就是当前B口Bit1的状态。这可能和先前Bit1作为输出时所锁存的值不同,所以当Bit1再转置成输出态时,出现在bit1端的状态就可能和先前的输出态不同了。b、I/O的"线或"和"线与"&&& 从图1.10看出:PIC I/O端输出为互补推挽输出电路。 因此与其他这类电路一样,当某个PIC I/O端设置为输出状态时,不能与其他电路的输出端接成"线或"或"线与"的形式。否则可能引起输出过载,烧坏PIC。&&& 如需要与其他电路接成"线或"电路时,PIC I/O端必须置于"0"状态或输入状态并外接上拉。如需要接成"线与"电路时,则PIC I/O端必须置于"1"状态或输入状态,并外接下拉电阻。电阻的阻值根据实际电路和PIC I/O端最大电流来选定。c、I/O口的连续操作&&& 一条写I/O的指令,对I/O真正写操作是发生在指令的后半周期(参照图1.11)。而读I/O的指令却是在指令的周期开始就读取I/O端状态。所以当你连续对一个I/O 端写入再读出时,必须要让I/O端上的写入电平有一个稳定的时间,否则读入的可能是前一个状态,而不是最新的状态值。一般推荐在两条连续的写,读I/O口指令间至少加一条NOP指令。 例: MOVWF 6 ; 写I/O    NOP ; 稳定I/O电平    MOVF 6,W ; 读I/O d、环境下的I/O操作&&&在噪声环境下(如静电火花),I/O控制寄存器可能因受干扰而变化。比如I/O口可能会从输入态自己变成输出态,对于这种情形,WDT也是无法检测出来的。因此如果你的应用环境是较恶劣的,建议你每隔一定的间隔,都重新定义一下I/O控制寄存器。
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)21ic官方微信-->
后使用快捷导航没有帐号?
查看: 2725|回复: 24
求助PIC-I/O口问题
&&已结帖(20)
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
本帖最后由 21ID 于
10:44 编辑
& & LED1 = 1;&&//RA5
& & LED2 = 1;&&//RA4
& &&&asm(&clrwdt&);
RA5和RA4分别接LED灯,为什么同一时间只能一个灯亮。如下图。
A口的初始化如下:
ANSEL=0x01;
TRISA = 0x0f;
PORTA = 0x00;
上面程序只是一部分,程序中用到了TMR1和TMR0,内部4M。
非常的不明白为什么现象是RA4和RA5交替输出高电平,把LED1和LED2接到C口上就能同时亮了。忘各位老师指点一下。。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
主题帖子积分
专家等级:结帖率:59%
主题帖子积分
RA4没有高电平输出,请看手册中有关RA4的描述
一:我的回帖多数只是猜测/估计/想象,建立在我现有知识结构的理解和分析上,多数都没有动手实际检验过,请斟酌采纳.
二:若对我的技术类主帖或回帖有异议,欢迎讨论,拒绝过激攻击或辱骂,否则全站追杀屏蔽发帖,后果自负.
三:对本人的其它意见,请直接向站长投诉,勿使用站内短信骚扰/挑衅/辱骂,否则将全站追杀屏蔽发帖,后果自负.
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
RA4没有高电平输出,请看手册中有关RA4的描述
yewuyi 发表于
10:39 不是RA4没有高电平输出,是RA4和RA5交替输出高电平。图中时刻刚好是RA5高电平
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
仿真软件有时候也不一定对吗?可能我设置的不对。。。。。
主题帖子积分
主题帖子积分
专家等级:结帖率:59%
主题帖子积分
请以数据手册为准,具体请查对应型号的手册确认。
一:我的回帖多数只是猜测/估计/想象,建立在我现有知识结构的理解和分析上,多数都没有动手实际检验过,请斟酌采纳.
二:若对我的技术类主帖或回帖有异议,欢迎讨论,拒绝过激攻击或辱骂,否则全站追杀屏蔽发帖,后果自负.
三:对本人的其它意见,请直接向站长投诉,勿使用站内短信骚扰/挑衅/辱骂,否则将全站追杀屏蔽发帖,后果自负.
主题帖子积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
加大限流电阻.
主题帖子积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
端口的“读-修改-写”问题
主题帖子积分
中级工程师, 积分 4852, 距离下一级还需 148 积分
中级工程师, 积分 4852, 距离下一级还需 148 积分
主题帖子积分
专家等级:结帖率:81%
主题帖子积分
中级工程师, 积分 4852, 距离下一级还需 148 积分
中级工程师, 积分 4852, 距离下一级还需 148 积分
RA4可能是开漏结构,即不会输出电流。。。
记得PIC有一个口是这样子的。。
主题帖子积分
高级技术员, 积分 642, 距离下一级还需 358 积分
高级技术员, 积分 642, 距离下一级还需 358 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 642, 距离下一级还需 358 积分
高级技术员, 积分 642, 距离下一级还需 358 积分
楼主在哪里啊?可否QQ聊?
10年Microchip单片机专业代理,竭诚为您服务。 M:(罗)Q:
主题帖子积分
中级工程师, 积分 3950, 距离下一级还需 1050 积分
中级工程师, 积分 3950, 距离下一级还需 1050 积分
主题帖子积分
专家等级:结帖率:2%
主题帖子积分
中级工程师, 积分 3950, 距离下一级还需 1050 积分
中级工程师, 积分 3950, 距离下一级还需 1050 积分
RA4&&输出是集电极开路
在通往牛X的道路上,我们一路狂奔!
本人所有发言均为个人观点。由此帖带来的后果,本人一般不予负责。论坛是论坛!
主题帖子积分
高级技术员, 积分 560, 距离下一级还需 440 积分
高级技术员, 积分 560, 距离下一级还需 440 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 560, 距离下一级还需 440 积分
高级技术员, 积分 560, 距离下一级还需 440 积分
proteus仿真?
pic16的片子大都RA4为开漏结构,查查数据手册,输出要接上拉
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
本帖最后由 21ID 于
12:21 编辑
谢谢楼上的各位,我之前也考虑过上拉,也接过上拉。还是RA4和RA5轮流输出高电平。这个是proteus仿真的结果。
实际接上电路,烧进程序后RA4和RA5能同时输出高电平,而且没有接上拉。。。
至于什么原因还不知道,望各位能帮忙分析一下,大家讨论讨论。。
Each of the PORTA pins, except RA3, has an individually
configurable weak internal pull-up. Control bits
WPUAx enable or disable each pull-up. Refer to
Register 3-3. Each weak pull-up is automatically turned
off when the port pin is configured as an output. The
pull-ups are disabled on a Power-on Reset by the
RAPU bit (OPTION&7&).
上面是16F676介绍I/O口里的一段,配置成输出时确实没有上拉了,那么下图中我看不出来是OD门。。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
主题帖子积分
专家等级:结帖率:59%
主题帖子积分
一切以手册为准。
一:我的回帖多数只是猜测/估计/想象,建立在我现有知识结构的理解和分析上,多数都没有动手实际检验过,请斟酌采纳.
二:若对我的技术类主帖或回帖有异议,欢迎讨论,拒绝过激攻击或辱骂,否则全站追杀屏蔽发帖,后果自负.
三:对本人的其它意见,请直接向站长投诉,勿使用站内短信骚扰/挑衅/辱骂,否则将全站追杀屏蔽发帖,后果自负.
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
一切以手册为准。
yewuyi 发表于
13:40 yewuyi老师,不用重复回答的,我明白你的意思了
主题帖子积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
中级工程师, 积分 3344, 距离下一级还需 1656 积分
限流电阻限值太小了,LED的工作电压大约1.7V,按2V算,也已经超出了25mA的端口电流,加上它的&读修改写&问题,结果就是这样...
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
限流电阻限值太小了,LED的工作电压大约1.7V,按2V算,也已经超出了25mA的端口电流,加上它的&读修改写&问题,结果就是这样...
xymxym 发表于
10:05 但实际电路是可以的。。。
主题帖子积分
高级技术员, 积分 560, 距离下一级还需 440 积分
高级技术员, 积分 560, 距离下一级还需 440 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 560, 距离下一级还需 440 积分
高级技术员, 积分 560, 距离下一级还需 440 积分
watch窗口看到的RA4,RA5是多少呢?如果都为高,那就是protues的不是啦
主题帖子积分
实习生, 积分 44, 距离下一级还需 6 积分
实习生, 积分 44, 距离下一级还需 6 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
实习生, 积分 44, 距离下一级还需 6 积分
实习生, 积分 44, 距离下一级还需 6 积分
关比较器,cmcon不用设置吗?
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
watch窗口看到的RA4,RA5是多少呢?如果都为高,那就是protues的不是啦
skygrow 发表于
12:32 debug和实际电路都是高,就是proteus里面不能同时为高。但在proteus里把RA4和RA5换成RC4和RC5是可以同时为高。看来proteus的可能性比较大。。。
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
初级工程师, 积分 2572, 距离下一级还需 428 积分
限流电阻限值太小了,LED的工作电压大约1.7V,按2V算,也已经超出了25mA的端口电流,加上它的&读修改写&问题,结果就是这样...
xymxym 发表于
10:05 LED工作电流大影响的是它的寿命,读修改写问题,我这里没有涉及到状态变化。2方面都是不原因吧,愿听高解。
精华达人奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
终身成就奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
突出贡献奖章
等级类勋章
核心会员奖章
等级类勋章
沉静之湖泊
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
时间类勋章
时间类勋章
涓涓之细流
发帖类勋章
热门推荐 /2单片机集成方案全方位解决服务商-优质智能电子产品“芯”方案提供商
最新公告:
热门下载:
产品型号、 开发工具选型
单片机入门与开发
单片机应用技巧及问题集锦
经典方案实例代码
电子工程师经验汇总
常见相关问题解答案例
培训资料、各种入门资料
合作常用文档表格下载
单片机入门知识
您现在的位置: >
PIC12C5XX功能原理
第一章& PIC12C5XX功能原理
PIC12C5XX是美国Microchip公司推出的8位单片机,也是世界上第一个8脚封装的8位单片机系列。
&1.1& 功能特点
一、高性能RISC结构CPU
&&&&&&&&精简指令集,仅33条单字节指令,易学易用
&&&&&&&&除地址分支跳转指令为双周期指令外,其余所有指令皆为单周期指令
&&&&&&&&执行速度: DC~1&s
&&&&&&&&二级硬件堆栈
&&&&&&&&直接、间接、相对三种寻址方式
二、功能部件特性
&&&&&&&&8位定时器/计数器TIMER0,带8位预分频器
&&&&&&&&大驱动电流,I/O脚可直接驱动数码管(LED)显示
&&&&&&&&&&- 每个I/O引脚最大控电流25mA
&&&&&&&&&&- 每个I/O引脚最大灌电流20mA
&&&&&&&&内置上电复位电路(POR)
&&&&&&&&复位定时器,保障复位正常
&&&&&&&&内部MCLR复位端加上拉电路,无需外接上拉
&&&&&&&&内置自振式看门狗,防程序死锁
&&&&&&&&程序保密位,可防止程序代码的非法拷贝
&&&&&&&&低功耗睡眠功能
&&&&&&&&I/O引脚可唤醒睡眠
&&&&&&&&内置4MHz RC型振荡源,可省外接振荡
&&&&&&&&可选外接振荡
&&&&&&&&&&- RC:& 低成本阻容振荡&&&&
&&&&&&&&&&- XT:& 标准晶体/陶瓷振荡&
&&&&&&&&&&- LP:& 低速晶体,低功耗振荡
三、CMOS工艺特性
&&&&&&&&低功耗
&&&&&&&&&&<2mA&& @5V,4MHz
&&&&&&&&&&-15&A& @3V,32KHz
&&&&&&&&&&-<1&A& 低功耗睡眠(Sleep)模式下
&&&&&&&&全静态设计
&&&&&&&&宽工作电压范围:2.5V~5.5V
&&&&&&&&宽工作温度范围:
&&&&&&&&&&商用级:&& 0℃~+70℃
&&&&&&&&&&&&&&&&&&&-工业级:-40℃~+85℃
&&&&&&&&&&&&&&&&&&&-汽车级:-40℃~+125℃
&1.2& 型号及引脚介绍
PIC12C5XX目前有二种型号,见下表:
封装(DIP/SOIC)
表1.1& PIC12C5XX型号功能表
各型号管脚图如下:
PDIP,SOIC,Windowed CERDIP
GP5/OSC1/CLKIN&&&&
GP4/OSC2&&&&
GP3/MCLR/VPP&&&
&&&&GP2/T0CK1
图1.1& 12C508/509引脚
下表描述了各引脚的功能。
双向I/O口线,带可编程弱上拉,并具电平变化唤醒睡眠功能
双向I/O口线,带可编程弱上拉,并具电平变化唤醒睡眠功能
双向I/O口线,并可设置为计数器TIMER0的外部信号输入端
单向输入口线,也可设置为芯片复位端。当设为复位端MCLR时,低电平有效。
当作为输入口线时,带可编程弱上拉及电平变化唤醒睡眠功能
双向I/O口线,(使用片内RC振荡源时,也可作为晶振输出端)
GP5/OSC1/CLKIN
双向I/O口线,(使用片内RC振荡源时,也可作为晶振输入端或外部振荡输入端)
注:ST ─ 斯密特触发器
表1.2& PIC12C5XX引脚功能
&&&&从上表可看出,PIC12C5XX最多可以有5根I/O口线和1根输入口线(GP3)。
&1.3& PIC12C5XX内部结构
&&&&PIC12C5XX 的总线结构采用的是数据总线(8位)和指令总线(12位)独立分开的&哈佛结构&,所以它具有精简指令集(RISC)的特点,速度快,效率高,并且功耗很低。
&&&&PIC12C5XX在一个芯片上集成了8位的算术逻辑运算单元(ALU),0.5K~1K的12位程序存储器,25~41个8位数据寄存器以及8位的计数器,上电复位电路,复位定时器,看门狗等等。
图1.2& PIC12C5XX内部结构
&1.4& 指令周期和流水作业
&&&&PIC12C5XX的指令周期被分频成4个不重叠的节拍Q1~Q4,程序计数器PC在Q1节拍增1, 而指令是在Q4节拍从程序存储器中取出并置入指令译码器,并在下一个指令周期被执行, 如下图所示:
图1.3& 指令周期
&&&&指令的执行贯穿Q1~Q4节拍。
&&&&如上所述,当CPU在执行一条指令的同时, 下一条指令的代码也同时被取出置入指令译码器,准备在下一指令周期执行,这就是PIC的流水作业方式,也是RISC结构单片机的特点,这种特点使单片机的运行速度可以达到很高。
除了地址分支跳转指令的执行周期是2个指令周期外,其余所有指令都是单周期指令, 见下图:
图1.4& 流水作业
&1.5& 程序存储器和堆栈
PIC12C5XX的程序存储器为12位长,其中PIC12C508为512字节,而PIC12C509为1024字节。复位向量为地址0,因为最后一个字节(PIC12C508为地址1FFH,PIC12C509为地址3FFH)存放有片内RC实际振荡的校正系数,其形式为指令MOVLW XX,用户不要使用这个字节,所以用户的程序应从地址000H开始存放,注意这点和PIC16C5X有所不同。
图1.5& 程序存储器和堆栈
PIC12C5XX把程序存储器以512字节为单位进行分页管理,这样PIC12C508有一个页面程序区,而PIC12C509有2个页面程序区,由状态寄存器STATUS中的PA0位(STATUS&5&) 确定程序区的页面。这是因为PIC是RISC结构,所有指令都是单字节,在PIC12C5XX中, 一条指令中所包含的地址信息只有9位,只能直接寻址一个页面(512字节);对于12C509,则还要由PA0位来辅助寻址2个页面(1024字节)的程序空间,即程序当需从一个页面跳转到另一个页面时(CALL、GOTO指令),应事先根据要跳转去的页面,把PA0位置为相应的值,请参阅状态寄存器的描述。
PIC12C5XX的堆栈有2层,有自己独立的空间,不占用程序存储器。注意它只能容纳二层子程序嵌套调用。堆栈的长度是12位,和PC长度一致,可以存放子程序调用时的PC值。
对堆栈的压入操作由子程序调用指令CALL完成,出栈操作则由子程序返回指令RETLW完成,请参阅第二章中这二条指令的详介。
&1.6& 数据存储器
PIC12C5XX的数据存储器(RAM)由一些寄存器组成,分为特殊寄存器和通用寄存器二种。在PIC单片机中,对任何部件的操作都表现为对某一寄存器的操作,所以编程非常简单明了。
&&& * : 非实际存在的寄存器,参见&1.6.1中详介。
图1.6& 寄存器结构
从上图可看到,00h~06h为特殊寄存器,其余为通用寄存器。PIC12C508有25个通用寄存器,而PIC12C509则有41个通用寄存器,其中25个在Bank0,另16个在Bank1,关于寄存器的Bank方式,请参阅&1.6.1的FSR寄存器描述。
&1.6.1& 特殊寄存器&&&&&
一、INDF(地址:00h) ── 间址寄存器
INDF是一个物理上不存在的寄存器,只是一个逻辑寄存器,用来进行间接寻址,实际的寻址地址为FSR&4:0&的值。
例:&&&&& MOVLW&&&&&& 10h
&&&&&&&&& MOVWF&&&&&& FSR&&&&&&&&&&&&&&& ;实际地址10h(F10寄存器)&FSR
&&&&&&&&& MOVLW&&&& 55h
&&&&&&&&& MOVWF&&&& INDF&&&&&&&&&& ;数据55h&F10
&&&&&&&&& INCF&&&&&&& FSR&&&&&&&&&&&&& ;FSR增1(FSR=11h)
&&&&&&&&& MOVWF&&&& INDF&&&&&&&&&&& ;数据55h&F11
&&&& 参阅后面FSR寄存器的描述。
二、TMR0(地址:01h) ── 定时器/计数器寄存器
二、TMR0(地址:01h) ── 定时器/计数器寄存器
TMR0对应于TIMER0,它是一个8位的定时器/计数器(在PIC16C5X中称其为RTCC),请参阅&1.8详介。
三、PCL(地址:02h) ── 程序计数器PC&7:0&
PIC12C5XX程序计数器PC最多可寻址1K(1024)程序区:
型&&&&& 号
单片机一复位,PC值被置为全&1&指向程序区的最后一个字节。前面我们提过,这个地址存放的是芯片出厂时已放入的MOVLW XX指令(其中XX是片内振荡校正系数),所以单片机复位后会执行这条指令,然后PC马上翻转到000h,开始执行用户的程序代码。注意,页面选择位PA0 复位时也被清零,所以这时页面处于0页,请参阅有关状态寄存器STATUS的描述。
对于&GOTO&指令,它的指令码中含有跳转地址的低9位,即PC&8:0&,对于PIC12C509来说,状态寄存器的第5位(STATUS&5&)还会被置入PC&9&,以选择程序页面,从而寻址1K的程序空间。 &
&&&&&&&&&&&&&&&&&&&&&&&&&
图1.7& GOTO指令寻址方式
对于&CALL&指令或其他涉及会修改PCL的指令,它们的指令码中仅包含目的地址的低8位,即PC&7:0&,而PC&8&总是会被硬件自动清零,状态寄存器第5位(STATUS&5&)也会被置入PC&9&以选择程序页面(对于PIC12C509而言)。见下图:
&&&&&&&&&&&&&&&&&&&&&
图1.8& CALL指令或修改PCL的指令寻址方式
从上图可看出,由于执行这些指令硬件总会清PC&8&=0,所以它们的起始地址都必须限于放在每个程序页面的上半区,即头上的256个字节空间内(0h~FFh或200h~2FFh)。
四、STATUS(地址:03h) ── 状态寄存器
STATUS寄存器包含了ALU的算术状态、芯片复位状态、程序页面位等信息。STATUS 可以被读/写,但是其中的复位状态位TO、PD不能由软件设置,它们的状态如何决定&1.12.7 会有详细描述。
图1.9& 状态寄存器
在加法运算时,C是进位位;在减法运算时,C是借位的反。
&&&&&&&&& CLRF&&&&&&&& F10&&&&&&&&& ;F10=0
&&&&&&&&& MOVLW&&&&&& 1&&&&&&&&&&&& ;W=1
&&&&&&&&& SUBWF&&&&&&& F10&&&&&&&&&&&&& ;F10-W=-1(FFH),C=0(运算结果为负)
&&&&&&&&& MOVLW&&&&&& 1&&&&&&&&&&&&&&& ;W=1
&&&&&&&&& MOVWF&&&&&& F10&&&&&&&&&&&&& ;F10=1
&&&&&&&&& CLRW&&&&&&&&&&&&&&&&&&&& ;W=0
&&&&&&&&& SUBWF&&&&&&& F10&&&&&&&&&&&& ;F10-W=1,C=1(运算结果为正)
PD和TO两位可用来判断芯片复位的原因,GPWUF位也是用来判断芯片复位类型,请参阅&1.12.7描述。
五、FSR(地址:04h) ── 选择寄存器
FSR和INDF寄存器(地址:00h)配合完成间接寻址,请参阅前面有关INDF寄存器的描述。FSR寄存器宽度为5位,FSR&4:0&用来间接寻址32个寄存器,FSR&5& 则用来选择寄存器体(Bank),见下图:
图1.10& 直接/间接寻址方式
&&&&&&&&& a、PIC12C508: 不存在寄存器体选,FSR&5&恒为&1&。
&&&&&&&&& b、PIC12C509: FSR&5&=1& Bank1,
&&&&&&&&& FSR&5&=0& Bank0。
六、OSCCAL(地址:05h) ── 内部振荡校正系数寄存器
PIC12C5XX内部集成有RC振荡供用户选择使用,OSCCAL&7:4& 包含了该振荡电路的校正系数,其上电初始值为&0111&,请参阅&1.11.4有关内部RC振荡的描述。
七、GPIO(地址:06h) ── I/O寄存器
PIC12C5XX有一个6位的I/O口,它在寄存器中的映像就是GPIO寄存器,GPIO&5:0&对应于 I/O口线GP5:GP0,GPIO&7:6&未用,恒为&0&。
八、TRIS ── I/O方向控制寄存器
TRIS是GP口线方向控制寄存器,用户不能直接寻址,必须通过执行&TRIS& 6&指令来设置它。当执行&TRIS&&&& 6&指令后,W寄存器的内容即会被置入TRIS中。&1&将相应的I/O口线设为输入态(高阻态),&0&则被设为输出态。但是有二点例外,即GP3永远是输入态而GP2有可能由OPTION寄存器设置为输入态(T0CKI),而不理会TRIS中的设置内容。请参阅&1.2关于I/O口的描述。
&&&&&&&&& MOVLW&&&&& 0Fh&&&&&&&&& ;W=&&
&&&&&&&&& TRIS&&&&&&&&&&&& 6&&&&&&&&&&&& ;TRIS=&001111&,GP0:GP3为输入态
&&&&&&&&& GP4:GP5为输出态
各种复位都会置TRIS为全&1&。
九、OPTION ── 参数定义寄存器
OPTION用来定义一些芯片工作参数,见下图所示:
图1.11& OPTION寄存器
OPTION也是不能由用户直接寻址的,必须由执行&OPTION&指令来把W寄存器中的内容置入OPTION寄存器,如下例:
&&&&&&&&& MOVLW&&&&&& 7&&&&&&&&&&&&&&& ;W=&&
&&&&&&&&& OPTION&&&&&&&&&&&&&&&&&&&&& ;W&OPTION
各种复位都会置OPTION为全&1&。
注意即使TRIS中相应的GP2方向位是&0&,如果将TOCS置为&1&,则GP2也会被强置为输入态,即为T0CKI输入线。
有关OPTION各位的定义,请参阅各自相应的章节。
十、W ── 工作寄存器
W寄存器用来存放指令中的第二个操作数,或用来进行内部数据传送,或存放运算结果,是最常用的寄存器。
&1.6.2& 通用寄存器
&&&&&&&&& PIC12C508: 07h ─ 1Fh&&&&&&& ;Bank0
&&&&&&&&& PIC12C509: 07h ─ 1Fh&&&&&&& ;Bank0
&&&&&&&&& 30h ─ 3Fh&&&&&&&&&&&&&&& ;Bank1
通用寄存器在上电后的值是随机的,所以它属RAM性质。
&1.7& I/O 口
PIC12C5XX只有一个I/O口,对应的映像寄存器为GPIO(地址:06h),其中GPIO& 5:0& 对应GP5:GP0,GPIO&7:6&未用,永为&0&。注意,GP3仅可作为输入,是单向I/O口线。另外,GP5、GP4、GP3及GP2还可以由用户定义成各种特殊功能口线,一旦它们被用作特殊用途,则永远读为&0&。GP0、GP1和GP3还带有可编程的弱上拉和&电平变化唤醒功能&(即唤醒正处于睡眠状态下的芯片),关于这点请参阅OPTION寄存器的描述。如果GP3被用户定义为复位输入端(MCLR),则它的弱上拉自动有效,但&电平变化唤醒&特性被自动关闭。
GPIO口线的方向由TRIS寄存器控制,详情参见&1.6.1中有关TRIS寄存器的描述。
&1.7.1& I/O 口结构
一根I/O口线的结构如下图所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
图1.12 &I/O口结构
除了GP3只能单向作为输入口外,其余的GPIO口皆可由用户定义为输入/输出态。作为输入口时没有锁存,外部信号必须保持到让CPU读入为止(例如:MOVF&& GPIO,W)。作为输出则有锁存,可以保持直到被新的值取代为止。
I/O端的输入/输出态由TRIS寄存器的值控制,当TRIS将&1&置入I/O控制器时Q1和Q2 都处于截止态,所以I/O端即呈高阻态(输入态)。当执行I/O读指令(如MOVF&&&&&&&&& 6,W),把当前I/O端的状态读入数据总线。当TRIS将&0&置入I/O控制器时,Q1和Q2的导通情况将要由数据锁存器Q端的状态来决定。当写入数据为&1&时,Q端为低电平0,则Q1导通,I/O输出为高电平。反之,当写入数据为&0&时,Q端为&1&,则Q2导通,I/O端输出为低电平。I/O读写时序如图1.13所示。
&1.7.2& I/O口使用注意事项
1、I/O方向转置的问题
某时候可能需要一个I/O口一会做输入,一会又做输出。这就是I/O方向的转置。在编写这种I/O转置程序时必须注意,有些指令如位设置指令(BSF、BCF)写I/O口时是先从I/O读入其状态,执行位操作后再将结果写回去覆盖原来的内容(输出的结果放在I/O口的数据锁存器)。
举个例子来说:&BSF&& 6,5& 这条指令的目的是要把B口的第6位置为高电平&1&。执行这条指令时,先把整个B口当前的状态内容读入到CPU,把第6位置成&1&后再把结果(8个位)重新输出到B口。如果B口中的有一个I/O端是需要方向转置的(比如说bit1),而这时是处于输入态,那么B口的状态值重新写入后,B口的数据锁存器1的锁存值就是当前B口Bit1的状态。 这可能和先前Bit1作为输出时所锁存的值不同,所以当Bit1 再转置成输出态时,出现在Bit1 端的状态就可能和先前的输出态不同了。
2、I/O的&线或&和&线与&
从图1.12看出PIC I/O端输出电路为CMOS互补推挽输出电路。因此与其他这类电路一样,当某个PIC I/O端设置为输出状态时,不能与其他电路的输出端接成&线或&或&线与&的形式,否则可能引起输出电流过载,烧坏PIC。如需要与其他电路接成&线或&电路时,PIC I/O 端必须置于&1&状态或输入状态,并外接下拉电阻。电阻的阻值根据实际电路和PIC I/O 端最大电流来决定。
3、I/O口的连续操作
一条写I/O的指令,对I/O真正写操作是发生在指令的后半周期(参照图1.13)。而读I/O的指令却是在指令的周期开始就读取I/O端状态。所以当你连续对一个I/O端写入再读出时,必须要让I/O端上的写入电平有一个稳定的时间,否则读入的可能是前一个状态,而不是最新的状态值。一般推荐在两条连续的写,读I/O口指令间至少加一条NOP指令。
例:&&&&&&&&&&&
&&&&&&&&& MOVWF&&&&&& 6&&&&&&&&&&&&&&&&& ;写I/O
&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;稳定I/O电平
&&&&&&&&& MOVF&&&&&&& 6,W&&&&&&&& ;读I/O
4、噪声环境下的I/O操作
在噪声环境下(如静电火花),I/O控制寄存器可能因受干扰而变化。比如I/O口可能会从输入态自己变成输出态,对于这种情形,WDT也是无法检测出来的。因此如果你的应用环境是较恶劣的,建议你每隔一定的间隔,都重新定义一下I/O控制寄存器。最保险的方法当然是对I/O读写前都定义一下I/O控制寄存器(但是实践证明对于大多数的应用都不必做到这样,只是提请你注意噪声干扰)。
图1.13& I/O口连续读/写时序
&1.8& 定时器/计数器TIMER0
TIMER0是一个8位的定时器/计数器,其对应的映像寄存器是TMR0(地址:01h),可由用户程序直接读写,并且可带有8位的预分频器。它用于对外加在GP2/T0CKI引脚上的外部信号进行计数(计数器)或对内部指令时钟进行计时(定时器),在PIC16C5X中它被称为RTCC。
TIMER0及其相关电路如图1.14所示。从图中可看出TIMER0工作状态由OPTION寄存器控制,其中OPTION寄存器的T0SC位用来选择TIMER0的计数信号源,当T0SC为&1&时,信号源为内部时钟,T0SC为&0&时,信号源为来自T0CKI引脚的外部信号。OPTION寄存器的PSA位控制预分频器(Prescaler)分配对象,当PSA位为&1&, 分配给TIMER0,即外部或内部信号经过预分频器分频后再输出给TIMER0。 预分频器的分频比率由OPTION内的PS0~PS2决定。这时涉及写TMR0寄存器的指令均同时将预分频器清零,OPTION 寄存器内容保持不变,即分配对象、分频比率等均不变。OPTION的T0SE 位用于选择外部计数脉冲触发沿。当T0SE为&1&时为下降沿触发,为&0&时则上升沿触发。
&&&&&&&&&&&&&&&&&&&&&&&&& 图1.14& TIMER0 方块图
TIMER0计数器采用递增方式计数,当计数至FFH时,在下一个计数发生后,将自动复零,重新开始计数,从此一直循环下去。TIMER0对其输入脉冲信号的响应延迟时间为2个机器周期,不论输入脉冲是内部时钟、外部信号或是预分频器的输出。响应时序见图1.15。
TIMER0对外部信号的采样周期为2个振荡周期,因此当不用预分频器时,外加在T0CKI 引脚上的脉冲宽度不得小于2个振荡周期即1/2指令周期。同时,当使用预分频器时,预分频器的输出脉冲周期不得小于指令周期,因此预分频器最大输入频率可达N,fosc/4,N 为预分频器的分频比,但不得大于50MHz。
图1.15a.& TIMER0时序图:内部时钟/无预分频器
图1.15b.& TIMER0时序图:内部时钟/预分频比1:2
应注意的是尽管PIC对外部加于T0CKI信号端上的信号宽度没有很严格的要求,但是如果高电平或低电平的维持时间太短,也有可能使TIMER0检测不到这个信号。一般要求信号宽度要大于10ns。
&1.9& 预分频器
预分频器是一个分频倍数可编程的8位计数器。其结构如图1.14 所示上节对预分频参数已有描述,这里不再赘述。
预分预器的分配对象完全由程序控制,可以在程序中改变Prescaler分配对象。
1、从TIMER0到WDT的改变
&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&& MOVLW&&& B'XX0X0XXX'&& ;选择内部时钟和新的预分频值
&&&&&&&&& OPTION&&&&&&&&&&&&&&&&&&&&&&&&& ;如果新的预分频值='000'或者
&&&&&&&&& CLRF&&&&&&&&& 1&&&&&&&&&&&&&&&& ;='001',则暂时先选一个另外的值
&&&&&&&&& MOVLW&&& B'XXXX1XXX'&&&& ;清零TMR0和预分频器
&&&&&&&&& OPTION&&&&&& &&&&&&&&&&&&&&&&& ;选择WDT为对象,但不要改变预分频值
&&&&&&&&& CLRWDT&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;清WDT和预分频器
&&&&&&&&& MOVLW&&&&& B'XXXX1XXX'&&&& ;选择新的预分频器
&&&&&&&&& OPTION
2、从WDT到TIMER0的改变
&&&&&&&&& CLRWDT&&&&&&&&&&&&&&&&&&&&&&&& ;清WDT 及Prescaler
&&&&&&&&& MOVLW&&& B'XXXX0XXX'&&&& ;选择TIMER0
&&&&&&&&& OPTION
图1.16& 预分频器方块图
注意,预分频器只能分配给TIMER0或WDT其中之一使用,而不能同时分配给二者。
&1.10& 看门狗WDT
看门狗计时器(Watch Dog Timer)是一个片内自振式的RC振荡计时器,无需任何的外接元件。这意味着即使芯片振荡停止了(例如执行指令SLEEP后),WDT照样保持计时。WDT计时溢出将产生RESET。在PIC12C5XX芯片内有一个特殊的谓之&系统定义字&(Configuration EPROM)的单元,其中的一个位是用于定义WDT的,可以将其置&0&来抑制WDT使之永远不起作用。这将在第六章的烧写器介绍部分详细说明。
1、WDT周期
WDT有一个基本的溢出周期18ms(无预设倍数),如果需要更长的WDT周期,可以把预分频器分配给WDT,最大分频比可达1:128,这时的WDT溢出周期约为2.5S。WDT溢出周期和环境温度、VDD等参数有关系,请参阅附录的图表。
&CLRWDT&和&SLEEP&指令将清除WDT计时器以及预分频器(当预分频器分配给WDT时)。WDT一般用来防止系统失控或者说防止单片机程序&失控&。在正常情况下,WDT应在计时溢出前被CLRWDT指令清零,以防止产生RESET。如果程序由于某种干扰而失控,那么不能在WDT溢出前执行一条CLRWDT指令,就会使WDT溢出而产生RESET,使系统重新启动运行而不至失去控制。若WDT溢出产生RESET,则状态寄存器F3的&TO&位会被清零,用户可藉此判断复位是否由WDT溢时所造成。
2、WDT编程注意事项
如果使用WDT,一定要仔细在程序中的某些地方放一条&CLRWDT&指令,以保证在WDT在溢出前能被清零,否则会造成芯片不停地产生RESET,使系统无法正常工作。
在噪声工作环境下,OPTION寄存器可能会因受干扰而改变,所以最好每隔一段时间就将其重新设置一下。
&1.11& 振荡
PIC12C5XX可以运行在以下四种振荡方式下:
&&&&&&& a、LP&&&&&&&&&&&&&&&&&&& 低功耗低速晶体振荡
&&&&&&& b、XT&&&&&&&&&&& 标准晶体/陶瓷振荡
&&&&&&& c、INTRC&&&&&&& 内部4MHz RC振荡
&&&&&&& d、EXTRC&&&&&&& 外部RC振荡
以上四种振荡方式可由&系统定义字&中的Fosc1:Fosc2 两位来选择,请读者参阅后面&1.12.9的详述。
&1.11.1& 晶体/陶瓷振荡
这种振荡包括XT和LP,其电路连接是在GP5/OSC1/CLKIN和GP4/OSC2两端加一晶体/陶瓷振荡,如下图所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
图1.17& 晶体/陶瓷振荡电路
下表是使用各种频率的晶体和陶瓷振荡所需的C1、C2电容值。
&&&&&&&&&&&&&& a. 陶瓷振荡&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& b.晶体振荡
表1.3& 各种振荡下的C1和C2值
&1.11.2& 外部RC振荡
这种振荡类型成本最低,但频率的精确性较差,适用于时间精确度要求不高的应用场合。RC振荡的频率是VDD、RC值以及环境温度的函数。请参阅附录的RC频率函数图。RC 振荡的连接如图1.18所示。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
图1.18& RC振荡电路
RC振荡是在OSC1端连接一个串联的电阻电容。这个电阻如果低于2.2K,振荡不稳定,甚至不能振荡,但是电阻高于1M时,则振荡又易受干扰。所以电阻值最好取5K~100K之间。尽管电容C为0时,电路也能振荡,但也易受干扰且不稳定,所以电容值应取20P以上。RC值和频率关系如表1.4所示。RC振荡时OSC2端输出一OSC1的4分频脉冲(f=1/4OSC1)。
表1.4& RC与频率的关系
&1.11.3& 外部振荡
PIC12C5XX也可以接受外部振荡源(仅适合于XT和LP类型振荡),连接时将外部振荡接入GP5/OSC1/CLKIN端,见下图:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
图1.19& 外部振荡源输入电路
&1.11.4& 内部RC振荡
PIC12C5XX内部提供有4MHz的RC振荡源供用户选择使用,选择振荡方式和振荡源的方法见&1.12.9详介。
在PIC12C5XX的程序区最顶端(12C508:1FFh,12C509:3FFh)放了一条MOVLW XX的指令, XX是内部RC振荡的校正系数。芯片上电后,PC指针指向程序区最顶端,执行完这条指令后PC 值加1变为000h。这时W寄存器中存放即是内部RC振荡的校正系数,用户可以把这个系数置入OSCCAL寄存器(05h)以便使其起校正作用,也可以忽略不管它。
&&&& 例:&&&&&&&&&&&&&&&&
&&&&&&&&& 0&&&&&&&&&&&&&&&&&& ;定义存储区地址0
&&&&&&&&& MOVWF&&&&& OSCCAL&&&&&&&&&&&& ;把W中的校正系数置入OSCCAL。
&1.12& 复 位(RESET)
PIC12C5XX有各种各样原因造成的芯片复位:
&&&&&&&& 1、芯片上电
&&&&&&&& 2.、MCLR端加低电平
&&&&&&&& 3、看门狗WDT超时溢出
&&&&&&&& 4、睡眠中某些I/O口线电平发生变化
当芯片处于复位状态时,所有I/O口线都处于输入状态(高阻态),看门狗WDT和预分频器都被清零。
图1.20& 片内复位电路(暂缺)
&1.12.1& 复位定时器(DRT)
复位定时器DRT(在PIC16C5X 中我们称其为OST)是为了使芯片的复位可靠安全而设计。在PIC12C5XX中,对于XT和LP振荡方式,上电后它们还需要一定的时间来建立稳定的振荡。有鉴于此,PIC12C5XX内部设计了一个复位定时器DRT。DRT在MCLR端到达高电平(VIHMC)后,即启动计时18ms,这样可以使芯片保持在复位状态约18ms以便让振荡电路起振及稳定下来,然后芯片即脱离复位状态进入正常运行状态。DRT的振荡源是芯片内专有的RC振荡电路,所以外围电路并不能改变其18ms的计时时间。
当WDT计时溢出后,DRT也是启动18ms使芯片保持在复位状态,然后再重新开始运行程序。
注意,在振荡方式是外部RC或内部RC时,DRT都关闭不起作用。
&1.12.2& 芯片上电复位(POR)
PIC12C5XX在芯片内集成有上电复位电路,见图1.20所示。当芯片电源电压VDD上升到一定值时(1.5V-2.1V),检测电路即会发出复位脉冲使芯片复位。
&1.12.3& MCLR复位
PIC12C5XX的GP3/MCLR端可以由用户定义为普通输入口GP3或复位端MCLR,如下图:
图1.21& GP3/MCLR端电路(暂缺)
具体方法参见&1.12.9有关描述。
一旦用户选择MCLR功能,则该端输入低电平会使芯片进入复位状态。
&1.12.4& 外部复位电路
在某种情况下,DRT计时18ms后,芯片的振荡电路还不能稳定或供电电压(VDD)还不能达到标准值,这时如果芯片脱离复位状态进入运行,则芯片就有可能失控或运行不正常。为了使芯片脱离复位状态时各部分都处于正常,可以在MCLR端上加外部RC复位电路来延长复位时间,如下图:
图1.22& 外部复位电路 &&
这个电路可以使VDD上升到标准值一段时间后,MCLR才会上升到高电平,从而启动DRT计时18ms后才进入运行。这样可以延长整个复位过程,保障芯片复位后进入正常运行。
&1.12.5& 掉电复位锁定
当单片机的供电电压掉到最小标准值以下后,可能会使芯片的运行出现异常,从而扰乱整个控制系统,所以在某些应用中,我们希望一旦VDD掉到某个值时使芯片自动进入复位状态(所有I/O口都变成高阻态)以免扰乱系统,下面是一个PIC12C5XX掉电复位锁定的电路:
图1.23& 掉电复位锁定
&当VDD电压恢复上升到标准值以上后,MCLR端恢复为高,从而使芯片恢复正常运行。
&1.12.6& 复位对寄存器的影响
对于通用寄存器来说,上电复位后它们的值是随机不定的,其他类型的复位后则保持原值不变。
对于特殊寄存器,各种复位后它们都会等于一个固定的复位值,见以下二表:
上电复位值
引脚变化唤起复位
qqqq &xxxx(注1)
qqqq& uuuu(注1)
xxxx& xxxx
uuuu& uuuu
xxxx& xxxx
uuuu& uuuu
0001& 1xxx
?00?& ?uuu(注2)
FSR(12C508)
111x& xxxx
111u& uuuu
FSR(12C509)
110x& xxxx
11uu& uuuu
0111& ----
Uuuu& ----
--xx& xxxx
--uu& -----
--11& 1111
--11& 1111
u: 未变;&&&&&& x: 随机值;&&&&&&& -: 未用;&&&&&&&& ?: 其值取决于复位方式
注1:由于在复位向量处存放着MOVLW&&& XX指令,其中XX为内部RC振荡校正系数,所以复位后W&7:4&即会等于这个值。
注2:参见表1.6。
a.& 各特殊寄存器复位后的值
&&&& 复& 位& 类& 型&&&
状态寄存器STATUS
程序计数器PC
芯片上电复位
&&&& 0000& 1xxx
运行时MCLR端加低电平复位
&&&& 000u& uuuu
睡眠时MCLR端加低电平复位
&&&& 0001& 0uuuu
睡眠时看门狗WDT超时复位
&&&& 0000& 0uuu
运行时看门狗WDT超时复位&&
&&&& 0000& 1uuu&
睡眠时I/O脚电平变化唤醒复位
&&&& 1001& 0uuuu&&&
&&&& u:未变;&&&&& x:随机.
b.&&&&&&& 复位对STATUS和PC的影响
表1.5& 各种复位对特殊寄存器的影响
&1.12.7& 复位的鉴别
PIC12C5XX有多种原因都可引起芯片复位。在程序中判断芯片复位的原因有时是非常必要的,例如上电复位后程序一般都要做一些寄存器初始化工作,而别的复位后则可以不做初始化而直接进入控制运行。
在状态寄存器STATUS有三个位(GRWUF、TO、PD)可用来标识各种复位状态,见下表:&&&&&
复 位 原 因
睡眠中WDT超时溢出
运行时WDT超时溢出
睡眠中MCLR拉低
运行时MCLR拉低
睡眠中GP0,GP1或GP3电平变化
a.&&&&&&&&&& 复位后TO、PD及GPWUF的状态
WDT超时溢出&&&
不影响PD位
执行Sleep指令(进入睡眠)
执行CLRWDT指令(清看门狗)&&
睡眠中GP0,GP1或GP3电平发生变化
&&& u:未变
b.&& 影响TO、PD及GPWUF位状态的事件
表1.6& 复位对STATUS的影响
&&&& 例:要判断是否芯片上电。
&&&&&&&&& BTFSS&&&&&&& STATUS,TO&&&&&&&&& ;TO=1 ?
&&&&&&&&& GOTO&&&&&&&&&& NO_POWERUP
&&&&&&&&& BTFSS&&&&&&&&&&&&&& STATUS,PD&&&&&&&& ;PD=1 ?
&&&&&&&&& GOTO&&&&&&&& NO_POWERUP
&&&&&&&& INIT&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;TO=1,PD=1。芯片上电,做初始化。
&1.12.8& 睡眠模式(Sleep)
1、进入SLEEP
执行一条&SLEEP&指令即可进入低功耗睡眠模式。当进入SLEEP后,WDT被清零,然后重新开始计数。状态寄存器STATUS中的PD位被置成&0&,TO位置成&1&,同时振荡停止(指OSC1端的振荡电路)。所有的I/O口保持原来的状态。这种工作模式功耗最低。为使耗电流最小,进入SLEEP前,应使所有的I/O口处于高电平VDD或低电平VSS,而不应使其处于高阻态,以免产生开关电流损耗。可以在I/O口加上拉或下拉电阻,或者把I/O口都置成输出态来避免其处于高阻态(浮态)。
RTCC端亦应置为VDD或VSS(通过上拉或下拉)。
MCLR必须处于高电平状态。
2、唤醒SLEEP
SLEEP可被WDT溢出唤醒,或在MCLR端加低电平唤醒SLEEP或GP0、GP1、GP3电平发生变化。第二种唤醒方法经常用在以下应用场合:在系统主电源掉电,并由后备电源(电池)供电后,执行&SLEEP&指令进入低功耗模式,这样电池就可长时间保持系统数据。当主电源恢复供电时,让其在MCLR产生一低电平唤醒SLEEP,并重新复位。这样需在MCLR端加一外部复位电路。第三种方法则在需要使用系统时唤醒睡眠中的单片机,它常通过按键输入来实现。系统上电时,STATUS的PD被置为&1&,而执行&SLEEP&指令后,PD位被置成&0&。所以通过PD位可以判断系统是从SLEEP模式唤醒而复位,还是上电后的复位。STATUS中的TO位则可判断当处于SLEEP状态的系统是由WDT溢时唤醒或是由外界给MCLR端一个低电平唤醒。这些区别有时是很重要的,特别是对系统的一些初始化工作来说。
&1.12.9& 系统定义字(Configuration)
在PIC12C5XX中有一个12位长的系统定义字单元,其中只用了前5位(bit0~bit4),用来定义单片机的一些系统性能选择,如下图:& &&&
图1.24 系统定义字
系统定义字属特殊的空间,不占用芯片的程序存储器,不能由程序指针(用户程序)访问,用户可以用烧写器对其进行编程,参见烧写器章节中的描述。
程序保密位被置为&0&后,程序存储区中的程序代码(12位)中的高8位将被遮没。具体地说,就是加密后再用烧写器读该芯片的程序区时,每一个程序代码都呈现00X的形式,这样别人就无法恢复这些被加密的代码,因此也就无法进行复制拷贝。加密后的单片机的功能不会受任何影响,加密后的程序代码并不影响其在芯片内的运行,而只是不能再被还原读出来。
&1.12.10 ID码
PIC12C5XX芯片中有一个16位的标识码(称为ID码),用来作芯片标识。ID码仅起芯片识别作用,用户可在烧写器上将其烧入和读出作芯片识别(如烧入日期等),但不会对芯片功能产生任何影响,即不使用它也没有关系。
深圳市英锐恩科技有限公司
(C) 2009 版权所有 粤ICP备号
英锐恩科技全国服务热线:
总部地址:中国·深圳市龙岗区坂田环城南路坂田国际中心C2栋815。 香港地址:香港荃湾青山公路388号中国染厂大厦17楼A室。
电话(tel):86-755-11 57155,传真(fax):86-755- E-mail: QQ:

我要回帖

更多关于 紧急求助 的文章

 

随机推荐