kevin_me 发表于 2013-9-2 23:59:35

读IO口电平状态,无论IO口是什么电平,读上来的总位1,为何

很简单的电路,很简单的程序。
就是读取IO口引脚上输入的电平状态,高电平读出来是1,低电平读出来是0.

使用的是dspic30f6014A的片子,用的PORTD这一组,一共16个IO口,从RD0到RD15。

先初始化IO口为输入方向。

TRISD=0XFFFF;

然后在主程序中while(1)死循环中读取PORTD的状态,因为PORTD是16位,因此用串口分两次发上来看,先发高8位,再发低8位。

while(U1STAbits.TRMT==0){}   //串口发数据
U1TXREG=PORTD>>8;            //发送高8位的电平状态值

while(U1STAbits.TRMT==0){}   //串口发数据
U1TXREG=PORTD&0x00ff;          //发送低8位的电平状态值

但是我连续焊了两块板子,都出现同样的问题,我甚至更好了新的单片机,问题依旧。问题表现是RD8,即高8位的最低位,读上来的总是0,不论该IO口实际输入的电平是高还是低,从串口看总是0。而其余15个IO口的电平从串口发上来均是正确的。

反复确认了硬件,应该没问题,然后看了芯片手册,读IO口的状态就是这样嘛。

不知道到底哪出了问题,怀疑过我使用串口发送数据的程序有问题,这样改过:

先定义:int DI_Status; //开关量输入,整型,16位,正好对应PORTD的16个IO口

然后在主程序中先这样读:

DI_Status=PORTD;

然后:

while(U1STAbits.TRMT==0){}   //串口发数据
U1TXREG=(unsigned char)(DI_Status>>8); //高8位

while(U1STAbits.TRMT==0){}   //串口发数据
U1TXREG=(unsigned char)(DI_Status&0x00ff); //低8位

问题依旧。

然后这样试过,直接读取有问题的RD8的电平状态:

while(U1STAbits.TRMT==0){}   //串口发数据
U1TXREG=PORTDbits.RD8;

问题依旧。

求指导,我通过万用表测量过,当接入RD8的电平发生变化时,RD8引脚上的电平也变化,高对应5V~4.99V,低电平对应0.12V左右。

可是通过串口读上来总为0。 fuck!

kevin_me 发表于 2013-9-3 08:21:48

顶一下,各位早上好。请关注。谢谢!

kevin_me 发表于 2013-9-3 20:16:58

大家有遇到过这样的问题吗?再来顶个帖

leolong03 发表于 2013-9-4 10:58:07

在线debug看看,RD8并无特殊功能啊

cooleryou 发表于 2013-9-4 20:40:22

应该设置为数字端口吧

xinbihui 发表于 2013-9-4 21:06:41

要把相应口上的模拟量输入功能关了就好了

tlsmf 发表于 2013-9-7 13:10:13

检查外围电路,和端口设置

yangxuezhi 发表于 2013-12-12 20:35:35

找到原因了吗?我用的PIC24FJ64GA004 RA引脚读取数据都是0,我用万用表测过了是高电平。RA引脚我查了一下,没有特殊功能。RB引脚是带AD功能的关闭AD功能就好了。还在纠结中。

kevin_me 发表于 2013-12-13 20:48:35

yangxuezhi 发表于 2013-12-12 20:35
找到原因了吗?我用的PIC24FJ64GA004 RA引脚读取数据都是0,我用万用表测过了是高电平。RA引脚我查了一下, ...

这个bug我至今还未找到。

我使用的是RD8口,单片机是dspic30f6014A

一共设计到两个板子,一个做AI,并口采集数据,其中RD8是数据线中的一个bit。

再就是做DI,直接端口采集输入信号电平。

同样的bug,ADPCFG我也关掉了,还是不行,外部给变化信号,万用表也测到,但是就是读不上变化。

我试过debug,单步观察RD8的值,发现上电运行前几步,RD8能读正确,一跑起来就bug了。

kevin_me 发表于 2013-12-13 20:49:33

yangxuezhi 发表于 2013-12-12 20:35
找到原因了吗?我用的PIC24FJ64GA004 RA引脚读取数据都是0,我用万用表测过了是高电平。RA引脚我查了一下, ...

我已经做了第二版的电路板,跳开了RD8,改用别的组的端口,同样的代码,一切正常。

yangxuezhi 发表于 2013-12-16 20:21:22

kevin_me 发表于 2013-12-13 20:49
我已经做了第二版的电路板,跳开了RD8,改用别的组的端口,同样的代码,一切正常。 ...

我是_config里面把JTAGEN_ON 打开了,那几个引脚正好是JTAG的。关掉就ok了。

kevin_me 发表于 2013-12-17 23:07:56

yangxuezhi 发表于 2013-12-16 20:21
我是_config里面把JTAGEN_ON 打开了,那几个引脚正好是JTAG的。关掉就ok了。

你PIC24的片子还有jtag的功能码?

我看了看我的30f系列,没有你说的这个选项。

页: [1]
查看完整版本: 读IO口电平状态,无论IO口是什么电平,读上来的总位1,为何