打印

是不是端口的“读-修改-写”问题

[复制链接]
楼主: laibour
手机看帖
扫描二维码
随时随地手机跟帖
21
在PORT的bit,读取进来转换为byte位时, 编译器有可能会有bug,我之前有碰到过.
比如 unsigned char i=RA1,
有可能会判断成RA0,碰到这个bug以后跟microchip的技术支持确认过.
后面改成 if(PORTA & 0x02) i= 1;
如果问题太不可思议,还是建议看一下汇编代码.

使用特权

评论回复
22
NE5532| | 2011-9-3 17:04 | 只看该作者
你先断电,用万用表量下这个端口和地有没有短路呢,没短路就置高以后用死循环打断点,看端口有没有拉高。

使用特权

评论回复
23
laibour|  楼主 | 2011-9-3 20:41 | 只看该作者
17# virtualtryon
我用的MCC18编译器,C语言写的程序。

使用特权

评论回复
24
virtualtryon| | 2011-9-3 21:10 | 只看该作者

如上图,LZ按上面的操作可以找到与C对应的反汇编代码,。

使用特权

评论回复
25
laibour|  楼主 | 2011-9-3 21:25 | 只看该作者
本帖最后由 laibour 于 2011-9-3 21:29 编辑

22# NE5532
已经量了,没有短路;而且用LAT寄存器加断点量两个端口都为高电平,但在Watch窗口看到的RA0和RA1始终为0。这两个端口只是在初始化的时候用用到,程序中就用LAT寄存器的方式写的,现在也没什么问题,只是一直想搞清楚为什么会出现这种情况。实在不行的话,下周一我把那两个5.1K的电阻卸掉,到时候再试一下。(图中的LM2567应该是LM2576,画图的时候标错了的。)

图5.jpg (31.47 KB )

图5.jpg

使用特权

评论回复
26
NE5532| | 2011-9-3 21:51 | 只看该作者
你都已经晕头转向了,别玩仿真了,打断点,拿块万用表实际测下端口电平吧。另外这电路够另类的哈,还有2576可以直接用数字端口控制吧,何必多此一举呢??这又是一个乱设计给自己找麻烦的例子啊!

使用特权

评论回复
27
virtualtryon| | 2011-9-3 22:15 | 只看该作者
我敢保证,如果LZ的电路没有短路之类的情况出现,绝对不会是硬件导致的异常.
电路设计没有明显的错误.
还是强烈建议LZ把汇编发上来看一下.

使用特权

评论回复
28
NE5532| | 2011-9-3 22:20 | 只看该作者
这种乱加不必要器件的习惯必将导致软件上的混乱,出问题是必然的。
习惯对了,软硬件自然不会出错。

使用特权

评论回复
29
virtualtryon| | 2011-9-3 22:26 | 只看该作者
本帖最后由 virtualtryon 于 2011-9-3 22:45 编辑

虽然有些器件可能多余,但是也不要胡乱的猜疑,可以大胆猜想,但是要小心求证.
那个R和C是完全要的.
没有R和C只能说是能工作的电路,不能保证长期稳定可靠的工作.
最近不知道LS的有没有发现,版块上不少帖子在问下拉的R的作用.
在汽车电子里面如果是没有这个下拉电阻和电容根本就是不合格的电路,如果是对外的接口,地有偏移的话,还会涉及到地线偏移的问题.
LS认为乱加也没关系,那最多是性能的问题,不会涉及到LZ所碰到的功能方面的问题吧?
直接用单片机控制电平不同的器件,特别是会涉及到高压的,如果条件允许的话,用三极管隔离是最可靠的.
我觉得LS的可靠性设计概念还比较欠缺.呵呵.
要做一个产品出来,大家都会,但是做到可靠,那能做到的人就少了.

使用特权

评论回复
30
NE5532| | 2011-9-4 07:50 | 只看该作者
呵呵,楼上的话又一次证明了楼主加的三极管是多余的,LM2576的使能段哪里是不同电平的高电压东东呢,我也认为楼上的可靠性理念有问题。软件和硬件一样,一个在硬件上不精益求精的人,软件有漏洞是必然的。我相信我们产品的返修率已经足够说明问题了。

使用特权

评论回复
31
yewuyi| | 2011-9-4 08:26 | 只看该作者
virtualtryon不必担心,对于三极管这种电流型器件,增加电容没有必要性。

使用特权

评论回复
32
laibour|  楼主 | 2011-9-5 21:09 | 只看该作者
27# virtualtryon
测试中的一段程序:
这是采用LAT寄存器的反汇编(两个端口正常拉高):
10:                 INTCONbits.GIE = 0;    // 关闭全局中断和外设中断
  00B6    9EF2     BCF 0xff2, 0x7, ACCESS
11:                 INTCONbits.PEIE = 0;
  00B8    9CF2     BCF 0xff2, 0x6, ACCESS
12:                 
13:                 LATAbits.LATA0 = 1;    // 电源控制端口
  00BA    8089     BSF 0xf89, 0, ACCESS
14:                 TRISAbits.TRISA0 = 0;   
  00BC    9092     BCF 0xf92, 0, ACCESS
15:                 
16:                 Delay1KTCYx(100);    // 25ms延时
  00BE    0E64     MOVLW 0x64
  00C0    6EE6     MOVWF 0xfe6, ACCESS
  00C2    EC6C     CALL 0xd8, 0
  00C4    F000     NOP
  00C6    52E5     MOVF 0xfe5, F, ACCESS
17:                 
18:                 LATAbits.LATA1 = 1;    // IGT控制端口
  00C8    8289     BSF 0xf89, 0x1, ACCESS
19:                 TRISAbits.TRISA1 = 0;
  00CA    9292     BCF 0xf92, 0x1, ACCESS
20:                 
21:                 while(1);

这是RA1端口采用PORT寄存器的反汇编(RA1置为高电平,但RA0为低电平):
10:                 INTCONbits.GIE = 0;    // 关闭全局中断和外设中断
  00B6    9EF2     BCF 0xff2, 0x7, ACCESS
11:                 INTCONbits.PEIE = 0;
  00B8    9CF2     BCF 0xff2, 0x6, ACCESS
12:                 
13:                 LATAbits.LATA0 = 1;    // 电源控制端口
  00BA    8089     BSF 0xf89, 0, ACCESS
14:                 TRISAbits.TRISA0 = 0;   
  00BC    9092     BCF 0xf92, 0, ACCESS
15:                 
16:                 Delay1KTCYx(100);    // 25ms延时
  00BE    0E64     MOVLW 0x64
  00C0    6EE6     MOVWF 0xfe6, ACCESS
  00C2    EC6C     CALL 0xd8, 0
  00C4    F000     NOP
  00C6    52E5     MOVF 0xfe5, F, ACCESS
17:                 
18:                 PORTAbits.RA1 = 1;    // IGT控制端口
  00C8    8280     BSF 0xf80, 0x1, ACCESS
19:                 TRISAbits.TRISA1 = 0;
  00CA    9292     BCF 0xf92, 0x1, ACCESS
20:                 
21:                 while(1);

两种情况都是在端口悬空的状态下测得的。

使用特权

评论回复
33
laibour|  楼主 | 2011-9-5 21:20 | 只看该作者
本帖最后由 laibour 于 2011-9-5 22:36 编辑

26# NE5532
没有短路,电平确实是用万用表实际测量得出的,至于仿真的结果只是作为一种参考。把那两个5.1K的电阻去掉让引脚悬空测量出来的结果和接上电阻的结果一样。至于硬件电路的设计,确实也存在一些问题。但是因为是小公司我们这里只有一个人在做硬件设计,所以……经过这件事后我也下定决心要好好补一下硬件知识。

使用特权

评论回复
34
virtualtryon| | 2011-9-5 22:20 | 只看该作者
本帖最后由 virtualtryon 于 2011-9-5 22:27 编辑

LATAbits.LATA1 = 1; // IGT控制端口
BSF 0xf89, 0x1, ACCESS 这是RA1端口采用PORT寄存器的反汇编(RA1置为高电平,但RA0为低电平):
PORTAbits.RA1 = 1; // IGT控制端口
BSF 0xf80, 0x1, ACCESS 差别如下: LATAbits.LATA1 地址为0xf89的寄存器bit1位, 而PORTAbits.RA1址址为0xf80的寄存器bit1位问题出现在这里, 我们看一下BSF汇编指令,
总共有4个时钟周期,4个时钟周期共做了4件事情,
第一个时钟周期,解析指令,第二个时钟周期读寄存器,第三个时钟周期改写数据,第四个时钟周期写寄存器.
LATAbits.LATA1 = 1;
步骤是这样的,
Q1解析指令
Q2读LATA的值,之前LATA0有输出,读为0b00000001,存入PIC暂存器.
Q3改写暂存器的值为0b00000011.
Q4写入LATA,LATA为0b00000011,LATA0,LATA1都为1成功.
LATAbits.RA1 = 1;
步骤是这样的,
Q1解析指令
Q2读PORA的值,虽然之前LATA0有输出,但是只是LATA寄存器的值为0b00000001,读PORTA的值是读取端口的电平,通过缓存器及数字/模拟选择才会进入总线。
问题就出在这里,因为没有配置为数字口,此时读出来为0b00000000,并存入暂存器。
Q3改写暂存器的值为0b00000010.
Q4写入LATA(为什么不写入PORTA,是因为写PORTA和写LATA是一样的都是写入LATA),LATA为0b00000010,LATA0被改为0,LATA1为1不成功.
正如LZ自已传上来的图所示,模拟数字口配置不会影响输出,只会影响输入。因此RA1输出正常,但是RA0在读进来的时候错误了,因此不正常了。
请LZ通过ANCON0配置一下,把RA0及RA1配置成数字口再试一下。

使用特权

评论回复
35
laibour|  楼主 | 2011-9-6 09:13 | 只看该作者
34# virtualtryon
已经验证确实是数字模拟端口设置的问题,但是在PIC18F26K系列中没有ADCON1没有用来作为数字模拟端口的配置寄存器。而是采用ANSEL和ANSELH两个寄存器对各个端口进行分别配置。也证明了版主yewuyi所以说的用LAT寄存器作输出可以避免读-修改-写的问题。至于版主NE5532提到的很多硬件方面的问题,自己还有很多东西要学。谢谢你这么耐心的分析。

使用特权

评论回复
36
laibour|  楼主 | 2011-9-6 09:18 | 只看该作者
2# yewuyi
版主,不好意思,能不能问一个问题,为什么我每次结贴的时候都只有2楼的上面有评分栏,其它楼的都没有呢?

使用特权

评论回复
37
yewuyi| | 2011-9-7 09:50 | 只看该作者
2# yewuyi
版主,不好意思,能不能问一个问题,为什么我每次结贴的时候都只有2楼的上面有评分栏,其它楼的都没有呢?
laibour 发表于 2011-9-6 09:18


你自己的任何帖子是不能评分的。

总不能自己给自己评分,是不是!!!

使用特权

评论回复
38
NE5532| | 2011-9-11 16:32 | 只看该作者
呵呵,恭喜楼主找到问题!

使用特权

评论回复
39
Ryanhsiung| | 2011-9-19 16:42 | 只看该作者
这个是MICROCHIP的官方文档,PORT寄存的意外出错的详细说明 通过PORTx寄存器访问I/O引脚上的数据。读PORTx寄存器是读取I/O引脚上的值,而写PORTx寄存器是将值写入端口数据锁存器。很多指令,如BSET和 BCLR 指令,都是读- 修改-写操作指令。因此,写一个端口就意味着读该端口引脚的电平,修改读到的值,然后再将改好的值写入端口数据锁存器。当与端口相关的 I/O引脚被配置为输入,并且在PORTx寄存器上使用读 -修改 -写命令时,应当特别小心。如果某个配置为输入的I/O引脚在过了一段时间后变为输出引脚, 则该I/O引脚上可能会输出一个意外值。产生这种情况的原因是读 - 修改 - 写指令读取了输入引脚上的瞬时值,并将该值装入了端口数据锁存器。此外,如果在I/O引脚被配置为输出时在PORTx寄存器上使用了读-修改-写指令,根据器件速度和I/O容性负载的情况可能出现意外的I/O行为。图10-2所示为当用户应用程序试图对PORTA寄存器使用两条连续的读-修改-写指令将PORTA上I/O的bit 0和bit 1置1时, 所出现的意外情况。当CPU速度很快并且I/O引脚上的容性负载很大时, 示例代码的意外结果是只有I/O的bit 1被置1。

PORT.png (42.31 KB )

PORT.png

使用特权

评论回复
40
qisewai| | 2011-10-2 13:05 | 只看该作者
MARK

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则