读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!
顶一下,各位早上好。请关注。谢谢! 大家有遇到过这样的问题吗?再来顶个帖 在线debug看看,RD8并无特殊功能啊 应该设置为数字端口吧 要把相应口上的模拟量输入功能关了就好了 检查外围电路,和端口设置 找到原因了吗?我用的PIC24FJ64GA004 RA引脚读取数据都是0,我用万用表测过了是高电平。RA引脚我查了一下,没有特殊功能。RB引脚是带AD功能的关闭AD功能就好了。还在纠结中。 yangxuezhi 发表于 2013-12-12 20:35
找到原因了吗?我用的PIC24FJ64GA004 RA引脚读取数据都是0,我用万用表测过了是高电平。RA引脚我查了一下, ...
这个bug我至今还未找到。
我使用的是RD8口,单片机是dspic30f6014A
一共设计到两个板子,一个做AI,并口采集数据,其中RD8是数据线中的一个bit。
再就是做DI,直接端口采集输入信号电平。
同样的bug,ADPCFG我也关掉了,还是不行,外部给变化信号,万用表也测到,但是就是读不上变化。
我试过debug,单步观察RD8的值,发现上电运行前几步,RD8能读正确,一跑起来就bug了。 yangxuezhi 发表于 2013-12-12 20:35
找到原因了吗?我用的PIC24FJ64GA004 RA引脚读取数据都是0,我用万用表测过了是高电平。RA引脚我查了一下, ...
我已经做了第二版的电路板,跳开了RD8,改用别的组的端口,同样的代码,一切正常。 kevin_me 发表于 2013-12-13 20:49
我已经做了第二版的电路板,跳开了RD8,改用别的组的端口,同样的代码,一切正常。 ...
我是_config里面把JTAGEN_ON 打开了,那几个引脚正好是JTAG的。关掉就ok了。 yangxuezhi 发表于 2013-12-16 20:21
我是_config里面把JTAGEN_ON 打开了,那几个引脚正好是JTAG的。关掉就ok了。
你PIC24的片子还有jtag的功能码?
我看了看我的30f系列,没有你说的这个选项。
页:
[1]