搜索
bottom↓
回复: 20

micchip产品出厂测试就是这样做的的么?

[复制链接]

出0入0汤圆

发表于 2009-8-9 04:47:48 | 显示全部楼层 |阅读模式
初次使用PIC单片机就发现一个大大的bug:
pic的型号是16F616,如果对RC4进行写操作,则不管RC1端口锁存器之前写入的是1或者是0,此时RC1管脚都会变成输出低电平。程序如下
////////////////////////////////////////////////////////////////////////////////////
# include        <pic.h>
void main()
{       
        //将端口设为输出
        TRISC1=0;
        TRISC5=0;
                       
        RC1=1;                                // turn off the output
        RC5=1;
        while(1)
                  {
                NOP();
                }
               

}
/////////////////////////////////////////////////////////////////////////////////
我弄了一个晚上,电路没发现有任何问题,但是这对一个端口的操作会影响另一个端口的输出现象实在是荒唐,单片机出厂前难道没有做过完整测试么?这样的低级bug未免有损micchip作为单片机大厂的声誉。
哪位兄弟有用过这款16F616的,给我指点一下,是否有办法克服这个问题呢?

出0入0汤圆

 楼主| 发表于 2009-8-9 04:57:01 | 显示全部楼层
本人并不是单片机初学者,上面这个简单程序是为了验证这个bug而特地写的,也不会是电路的问题,因为我是在单片机最小系统上做的这个测试,用的内部RC振荡,看门狗关闭。

出0入0汤圆

发表于 2009-8-9 07:33:49 | 显示全部楼层
看一下编译后的汇编指令,你会发现问题所在!!!!

出10入10汤圆

发表于 2009-8-9 09:42:37 | 显示全部楼层
何谓读-修改-写,导致的问题及其解决之道:
只要PICmicro的命令,所处理的FILE (暂存器,内存,和I/O的统称),其最终的值,和命令处理前的值有关,那么,这种命令便是所谓的读-修改-写命令。因为这类命令的操作,可以再细分为三个小步骤,即是读(READ),修改(MODIFY),接著才是写(WRITE)。

如:ADDWF,DECF,IORWF,XORWF,BSF,BCF,‥‥等等皆是。

在使用这类命令的时候,如果所处理的FILE是I/O, 就必须要特别小心。因为,假设任务电压为5V;而您在PORTB的8支脚,没有串接电阻,分别接了8颗二极管(也许是LED)到地。如果,您在先前下了"BSF PORTB,0"这条命令,使得PORTB第0脚上的LED亮了。当您再运行了”BSF PORTB,1"这条命令后,虽然PORTB第1脚上的LED亮了,但是,PORTB第0脚上的LED却会熄掉。原因是因为,运行”BSF PORTB,1”时,会先将整个PORTB的值往回读,而它读到的PORTB第0脚,却是相当於低电位(被二极管拉为0.7V)。当它再把整个PORTB 的值写出去的时候,PORTB第0脚就被写成低电位,自然灯就熄了。

解决之道是:串电阻,或者不要直接对I/O作读-修改-写命令。

另外还有一类要注意的状况是:如当您将”BSF PORTB,0”和”BSF PORTB,1”两条命令连在一起,没有空运行时,纵使您没有上一段所述线路设计不良之状况,有时候您也会发现PORTB, 0的高电位也会不见了。导致这个现象的原因是:因为也许您这两支脚的外面接了长导线,有相当大的电容、电感性会阻止电位的变化;而且,PIC命令运行是在最后1/4周期时”写出”,而在第一个1/4周期时”读入”,PORTB,0还来不及升至高电位,便被下一个命令读回去了。

解决之道是:通常在两道命令间插入个NOP命令就可以了。

出0入0汤圆

发表于 2009-8-9 10:35:07 | 显示全部楼层
不用MCP的8位单片机,不过PIC的单片机一般都会有专门的读寄存器和写寄存器吧?可以这样直接RC赋值吗?

出0入0汤圆

 楼主| 发表于 2009-8-9 11:35:20 | 显示全部楼层
回2楼: 我正在学习pic的汇编,

回3楼: 我的程序中没有直接对I/O口用“读-修改-写”这一类命令,电路中也没有长导线、或者直接接发光二极管的错误,

回4楼: pic的8位单片机是直接对RC赋值的,没有专门的读寄存器和写寄存器


我现在发现,picc 9.50编译器针对8位机的bug真多,我对RA0写入1时,RA!没有输出高电平,反而是RC1变成了高电平

出0入0汤圆

 楼主| 发表于 2009-8-9 11:36:27 | 显示全部楼层
打错字了,应该是我对RA0写入1时,RA0没有输出高电平,反而是RC1变成了高电平

出0入0汤圆

发表于 2009-8-9 13:08:10 | 显示全部楼层
用汇编语言试试呢

出0入0汤圆

发表于 2009-8-9 13:13:18 | 显示全部楼层
RC1=1; // turn off the output  和 RC5=1; 之间放一句Nop()呢?
-- 另外,是microchip。

出0入42汤圆

发表于 2009-8-9 14:18:30 | 显示全部楼层
初次使用就有这么大的发现, microchip能撑到今天也算是个奇迹.

其实LZ你并没有仔细阅读过PIC的文档, 你的端口操作就是读修改写的 . 上面都给了答案了,唉

出0入0汤圆

发表于 2009-8-9 15:07:20 | 显示全部楼层
对端口送1和清0的都属于读修改写指令。另外A口是模拟口,无论如何,端口要设置成数字口。否则虽然输出是最大的设置,就很容易出现读修改写会出现的问题。RC口也是AD口,同样要设置。

出0入4汤圆

发表于 2009-8-9 15:20:58 | 显示全部楼层
呵呵

如果不是pic的初学者,不知道有没有看过张明峰的大作。

出0入4汤圆

发表于 2009-8-9 15:23:10 | 显示全部楼层
PIC对涉及到对单个引脚操作的指令,都是由读改写完成的,
所以对IO操作这一点,AVR的结构还是很不错的,输入输出都有单独的寄存进行操作,无论如何不会出现类似的情况。

出0入0汤圆

发表于 2009-8-9 15:31:16 | 显示全部楼层
3楼正解

出0入0汤圆

发表于 2009-8-9 16:31:09 | 显示全部楼层
相信楼主经过此贴会更加了解读改写

出0入0汤圆

发表于 2009-8-10 23:46:03 | 显示全部楼层
LZ还拼命强调自已不是初学者,唉!以LZ看来PIC能活到现在完全是运气中的运气!

出0入0汤圆

发表于 2009-8-11 02:43:32 | 显示全部楼层
ANSEL没设定

出0入0汤圆

发表于 2009-8-11 09:21:13 | 显示全部楼层
把.lst文件贴出来,同时加上RC0=1;RC1=1;对比一下就知道到底是不是编译器的问题了。

出0入0汤圆

发表于 2009-8-11 09:42:43 | 显示全部楼层
LZ就是初学者,鉴定完毕...

出0入0汤圆

发表于 2009-8-13 19:12:56 | 显示全部楼层
这个问题很简单,你用的是PICC编译器吧,在命令语句中加入延迟  修改如下
# include <pic.h>
void main()
{
//将端口设为输出
DELAY1MS();
TRISC1=0;
TRISC5=0;
DELAY1MS();
RC1=1; // turn off the output
DELAY1MS();
RC5=1;
DELAY1MS();
while(1)
                  {
NOP();
}

出0入0汤圆

 楼主| 发表于 2009-8-27 17:30:40 | 显示全部楼层
问题解决了,在二极管加了ANSEL设置、在两个输出语句之间加入nop(),后问题就解决了
谢谢大家的帮助~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 06:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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