|
| 采购元器件好去处--维库电子市场网推荐 |
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
绝对是pic12f675有问题,我想高手们也会回答错 |
| 来源:21ic 作者:sunzefeng 栏目:单片机 |
| 绝对是PIC12F675.html">PIC12F675有问题,我想高手们也会回答错 我最近编了一个PIC12F675程序,由于没有仿真器,所以只能烧一次试一次,真是被害惨了,绞尽脑汁也想不出问题所在,最后做了一个简单的程序测试了一下,发现应该是芯片的问题(因为我想不出其因理由来解释) 我的简单测试程序如下: org 000h goto main org 0004h retfie main: call 3ff ;取晶振校正值 bsf STATUS,RP0 movwf OSCCAL ;晶振校正 movlw b'11000000' movwf TRISI0 ;设置所有口为输出 clrw movwf ANSEL ;设置所有口为数字口 bcf STATUS,RP0 movlw 0ffh movwf GPIO ;点亮所有灯 bcf GPIO,0 ;关闭为灯1 goto $ end 我把675的5个口全用作数字口(除GP3),在每个引脚上接一个LED,当然有限流电阻,烧写设置,看门狗关闭,GP3设置为复位脚,有上拉电阻,选择内部4M,RC振荡,GP4,GP5,都设为I/O口, 请大家分析一下,最后能亮几个灯,分别是那几个,为什么? 如果大家没有做过实验我想肯定说不出正确答案,等下我公布答案,看有没有人能答对。 经过反复实验,有问题的指令为:bcf GPIO,0 如果改成bcf GPIO,1或者2,3,4,5,又会怎么? * - 本贴最后修改时间:2003-7-2 16:02:26 修改者:sunzefeng |
| 1楼: | >>参与讨论 |
| 作者: martin 于 2003-7-2 15:33:00 发布:
一大堆错误 1) movlw b'11000000' movwf GPIO ;设置所有口为输出 设置IO口方向是用movwf TRISIO这条指令,看过数据手册吗? 2) movwf GPIO ;设置所有口为输出 clrw movwf ANSEL ;设置所有口为数字口 GPIO寄存器在BANK0,ANSEL寄存器不在BANK0,你不知道怎么切换BANK吗? 3)GP0,GP1是内部模拟比较器输入脚,你还需要设置CMCON才可以关掉比较器让IO作为输出的,具体去看数据手册。 4)您难道不知道MPLAB有软件模拟的功能吗?象这样简单的错误分分钟就能查出来的,用的着惨到烧芯片吗? 5)建议不要再犯这种“睡不着觉怨床歪”的通病,多看看数据手册。 |
|
| 2楼: | >>参与讨论 |
| 作者: lingl2 于 2003-7-2 15:35:00 发布:
bcf GPIO,0前加 nop试试 |
|
| 3楼: | >>参与讨论 |
| 作者: sunzefeng 于 2003-7-2 16:36:00 发布:
刚才写错了 斑主说的是,是应该多看看数据手册,不过我英文不好,习惯看翻译过资料刚才是我写错了,不好意思,我刚开始写的程序是:(我开始部分是从MPLAP模板上复制下来的) ORG 0x000 ; processor reset goto main ; go to beginning of ORG 0x004 ; interrupt vector location retfie main: call 0x3ff bsf STATUS,RP0 movwf OSCCAL ; update register with factory c movlw b'11000000' movwf TRISIO ;设置口为输出 clrf ANSEL ;设置为数字口 bcf STATUS,RP0 loop: movlw 0ff movwf GPIO ;所有灯亮 call delay bcf GPIO,2 ;熄灭第3个灯 call delay goto loop ;-------------delay-------------------- delay: movlw 0ff movwf count1 set_delay1: movlw 0ff movwf count2 set_delay11: decfsz count2,f goto set_delay11 decfsz count1,f goto set_delay1 return END ; directive 'end of program' 我的意图是让第3个灯一闪一闪,不过实际上,第1,2,3个灯都在闪,分析结果是:bcf GPIO,2 把第3个息灭同时,又把1,2灯也息灭了,所以我怀凝芯片有问题而且如果把bcf GPIO,2换成其他如bcf GPIO,3,bcf GPIO,4,bcf GPIO,5,第1,2,个灯都会闪 * - 本贴最后修改时间:2003-7-2 16:42:49 修改者:sunzefeng |
|
| 4楼: | >>参与讨论 |
| 作者: martin 于 2003-7-2 17:49:00 发布:
没看到我上面说的第三条吗? 没看到我上面说的第三条吗?如果你不设置CMCON(内部模拟比较器的控制寄存器),上电时默认GP0,GP1是比较器的两个模拟输入口。由于“Read Modify Write”的特性(详见精华区中的《关于“Read Modify Write”》贴 ),bcf一个口线时,从GP0,GP1两个模拟输入脚读到的电平是零(数据手册里说明了),改写回去后就输出零了,也就是你看到的现象,只要执行bcf GPIO的任何一位,GP0,GP1都会清零。 很简单,把CMCON的低三位全部置一就好了。 |
|
| 5楼: | >>参与讨论 |
| 作者: sunzefeng 于 2003-7-3 11:33:00 发布:
太感谢斑主了! 按斑主说的一试,果然没有这种现象了,原来这里涉及的地方这么多,哎,只能说自己是个进底之蛙,想想我们这里的技术保密和斑主的无私奉献真是太感动了 |
|
| 6楼: | >>参与讨论 |
| 作者: eling 于 2003-7-4 13:24:00 发布:
为什么都不好好看资料,真是无奈 |
|
|
|
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |