打印

请教版主yewuyi和各位朋友,PIC16F887 RB0-RB3 端口异常问题

[复制链接]
3838|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MIKEZHONG|  楼主 | 2011-7-22 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位好,

       我现在遇到的问题是RB0~RB4接了5个按键,其中RB0~RB3出现异常,现象是:按下RB0的键,电平也在RB0上变化,但是程序读到的是RB1变为低电平了,RB1的读到的是RB2的电平变为低电平了,也就是说RB0~RB3实际仿真是读到的是往高端移了一位。不知道是什么原因?难道是编译器?RB4的按键正确。

//***************************************************
//读键
//***************************************************
void ReadKey(void)
{
     keyvalue=0xff;
     keyvalue = (PORTB | 0XE0);
}

RB0键按下正确应为0XFE,但实际ICD2仿真和烧录运行的都是0XFD

硬件没有问题,因为按下RB0键,在RB0上有低电平。
沙发
yewuyi| | 2011-7-22 10:29 | 只看该作者
1、PORTB上有内部上拉,请检查是否由此造成的影响?
2、请检查PORTB是否有模拟口造成检测错误
3、请检查是否存在读-修改-写现象。
4、请检查代码是否有其它问题
5、如果是用的电平变化中断,则检测中断代码和中断标志等是否恰当处理。

使用特权

评论回复
板凳
MIKEZHONG|  楼主 | 2011-7-22 10:49 | 只看该作者
谢谢版主

/*********************************************************/
void Port_init(void)
{
    ANSELH=0X00; //选择数字IO功能。
    TRISB=0B11011111;
    PORTB=0B11011111;
    WPUB=0X00;//关闭上拉
    IOCB=0X00;//关闭电平变化中断
    TRISD=0B00000000;     //out v
    PORTD=0B00000000;     //
    TRISC=0B10000111;     //
    PORTC=0B10000111;     //
    TRISE=0B11111000;     //
    PORTE=0B00000000;     //
    TRISA=0B11001111;
    PORTA=0X11001111;
    CM2CON1=0X00;
    CM1CON0=0X00;
    CM2CON0=0X00;
    SRCON=0X00;
}
/*********************************************************/
void T0_init(void)
{
    OPTION=0B10000001; //1:64 for watchdog.
    T0IE=1;
    T0IF=0;
    TMR0=0;
}

1、PORTB上有内部上拉,请检查是否由此造成的影响?--禁止了内部上拉,外部有上拉
2、请检查PORTB是否有模拟口造成检测错误 --关闭了模拟输入功能
3、请检查是否存在读-修改-写现象。--IO输入,其它引脚输出关闭了。
4、请检查代码是否有其它问题 --就上面的代码。其它的都是空的。
5、如果是用的电平变化中断,则检测中断代码和中断标志等是否恰当处理。--电平变化关闭了。

会不会是下载的编译器有问题?

使用特权

评论回复
地板
yewuyi| | 2011-7-22 11:05 | 只看该作者
3、请检查是否存在读-修改-写现象。--IO输入,其它引脚输出关闭了。
你可在网络上搜索一下什么叫:读-修改-写,你的理解不对,俺本来是重点怀疑这点造成。
4、代码还没有细看,
编译器问题就不好了,这个俺判断不了,不过你可以自己下载别的版本的编译器看看结果如何,从道理上讲,不太可能是编译器问题,因为编译器不可能自动插入一段这样的移位代码。

使用特权

评论回复
5
MIKEZHONG|  楼主 | 2011-7-22 11:14 | 只看该作者
我下载了最新版的9.82的编译器试了,也是一样,编译器问题可以排除。

3,读修改写的问题,我现在把RB口全部设为了输入功能,不存在读修改写吧。

我关闭中断试下。

使用特权

评论回复
6
MIKEZHONG|  楼主 | 2011-7-22 11:21 | 只看该作者
好惨!

是PCB的问题,设计时看错了,是按QFN的脚位为设计的TQFP,脚位错位了。

使用特权

评论回复
7
yewuyi| | 2011-7-22 11:38 | 只看该作者
我下载了最新版的9.82的编译器试了,也是一样,编译器问题可以排除。

3,读修改写的问题,我现在把RB口全部设为了输入功能,不存在读修改写吧。

我关闭中断试下。 ...
MIKEZHONG 发表于 2011-7-22 11:14



虽然问题解决了,但你依然没有理解什么叫读-修改-写,你可以在网络上去查查,在最新出的PIC16F1XXX系列上基本没有这个麻烦了,新芯片增加了一个输出缓冲寄存器LATx寄存器。

使用特权

评论回复
8
MIKEZHONG|  楼主 | 2011-7-22 12:06 | 只看该作者
谢谢yewuyi:

读-修改-写的动作,我是这样想的,当我IO要输出一个状态时,MCU首先会读IO的状态,然后执行指令时会就当前的状态进行运算,运算后再输出到IO口。如果输出为1的,然而读回的是0,如果是取反就会有问题了。

如果这个端口全部都是输入,那么就只有读的过程,就不需要关注这个读-修改-写的过程。

如果这个IO口,有输入也有输出,但是我只要读入某个IO的输入状态,后续不会输出的动作,那么也没有这个读-修改-写的过程。

使用特权

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

本版积分规则

51

主题

250

帖子

1

粉丝