打印

PIC24F单片机I/O口输出低电平受所接电路影响不?

[复制链接]
2809|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fuc|  楼主 | 2013-6-2 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
端口设置为输出低电平,不外接电路时输出接近0V,但是通过10K电阻接到3.3V电平后,引脚输出变为2.5V。
请问有人知道这是什么原因么,是不是设置的问题?
沙发
yklstudent| | 2013-6-3 06:47 | 只看该作者
端口复用了吧

使用特权

评论回复
板凳
yewuyi| | 2013-6-3 08:57 | 只看该作者
检查该IO口上的复用功能是否都关闭,而是否仅作为IO使用了?

使用特权

评论回复
地板
llqjmy| | 2013-6-3 13:22 | 只看该作者
应该是端口设置不对,最有可能的是模拟数字选择不对。另外,需要注意的是PIC24F有引脚重定义功能。注意匹配你的引脚定义。

使用特权

评论回复
5
NE5532| | 2013-6-3 15:39 | 只看该作者
外部连接元件当然要影响端口输出电平,不过楼主的情况多半是硬件设计有问题,或者软件配置有误。

使用特权

评论回复
6
fuc|  楼主 | 2013-6-4 09:22 | 只看该作者
yewuyi 发表于 2013-6-3 08:57
检查该IO口上的复用功能是否都关闭,而是否仅作为IO使用了?

我写了几行简单的代码,逐步调试的时候功能没有问题,B9口输出正常,(B9口外接led小灯至3.3V电平),但是我直接烧录程序,B9口输出就有问题,输出低压不为0.
int main(void)
{
  _TRISB9=0;
  _LATB9=0;
  _LATB9=1;
}

使用特权

评论回复
7
yewuyi| | 2013-6-4 09:40 | 只看该作者
fuc 发表于 2013-6-4 09:22
我写了几行简单的代码,逐步调试的时候功能没有问题,B9口输出正常,(B9口外接led小灯至3.3V电平),但是 ...

你使用的哪个C编译器能容许你写成类如"_TRISB9=0;" 这样的代码?

使用特权

评论回复
8
fuc|  楼主 | 2013-6-4 09:44 | 只看该作者
yewuyi 发表于 2013-6-4 09:40
你使用的哪个C编译器能容许你写成类如"_TRISB9=0;" 这样的代码?

C30编译器。。。在PIC24F32KA304的头文件里,TRISB寄存器被define成了_TRISB9..

使用特权

评论回复
9
yewuyi| | 2013-6-4 10:28 | 只看该作者
int main(void)
{
  _TRISB9=0;
  _LATB9=0;
  _LATB9=1;
}


如果你确定编译器头文件这么定义,并且可以正确引用的话,那么有几种可能:
1、查查你用的PIC24这个型号有无IO引脚重定位功能?
2、检查编译后的汇编代码, _LATB9=0;这一句很可能被编译器当成无意义代码优化掉了,也许你改成 _LATB9=1;
_LATB9=0;就会发现LATB9不能输出高电平了。。。

使用特权

评论回复
10
llqjmy| | 2013-6-4 12:06 | 只看该作者
fuc 发表于 2013-6-4 09:22
我写了几行简单的代码,逐步调试的时候功能没有问题,B9口输出正常,(B9口外接led小灯至3.3V电平),但是 ...

分析一下:
逐步调试,执行_LATB9=0后,输出低电平OK,再执行_LATB9=1后,输出高电平;那么再接下来执行什么程序???如果你烧写完后,之后的代码应该就是FFFFF了,没有对_LATB9的再次操作,他将一直维持高电平状态,直到MCU复位。这样看来,_LATB9=0就执行了一个指令周期。如果你这样写的话,用示波器就可以测量到了:

int main(void)
{
  _TRISB9=0;
while(1)
{
ClrWdt();
_LATB9=0;
Delay(1MS);
_LATB9=1;
Delay(1MS);
}

}

Delay(1MS)代表延时函数。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fuc + 1 很给力!
11
fuc|  楼主 | 2013-6-4 14:55 | 只看该作者
llqjmy 发表于 2013-6-4 12:06
分析一下:
逐步调试,执行_LATB9=0后,输出低电平OK,再执行_LATB9=1后,输出高电平;那么再接下来执行 ...

你说的很对,我今天发现,单独写好端口输出的这段程序,逐步调试,测量没问题,但是,烧录之后就有问题。我在后边加了while(1){nop();}可以用了。。3Q你的回答!!!

使用特权

评论回复
12
kvdong| | 2013-6-4 16:56 | 只看该作者
哪本书或者哪个老师教的时候单片机程序没有死循环啊

使用特权

评论回复
13
fuc|  楼主 | 2013-6-4 20:08 | 只看该作者
kvdong 发表于 2013-6-4 16:56
哪本书或者哪个老师教的时候单片机程序没有死循环啊!

我是菜鸟。。敢问这个while语句作用具体是?为什么加上它输出低电平才正常?I/O输出低电平不是硬件上使三极管导通实现的么?

使用特权

评论回复
14
NE5532| | 2013-6-4 20:28 | 只看该作者
那你想一下,单片机执行完这几行程序以后去干什么了,就明白while的用处了。

使用特权

评论回复
15
jlass| | 2013-6-5 09:33 | 只看该作者
一开始以为遇到什么高深的问题了,看到后面那个汗啊

使用特权

评论回复
16
fuc|  楼主 | 2013-6-5 11:28 | 只看该作者
jlass 发表于 2013-6-5 09:33
一开始以为遇到什么高深的问题了,看到后面那个汗啊

我是菜鸟。。都是初级问题,但是自己想不懂:(

使用特权

评论回复
17
kvdong| | 2013-6-5 14:45 | 只看该作者
fuc 发表于 2013-6-5 11:28
我是菜鸟。。都是初级问题,但是自己想不懂

好吧,你可以原谅。平且应该打你老师PP。

单片机的程序是按照流程来执行的,如果你的程序没有死循环,那当程序执行完最后一条指令之后,改执行什么呢?你可以简单的认为后边没有指令了,单片机休息了。换句话说,你的程序只执行了一遍,单片机就不走了。为了解决这种问题,所以单片机程序需要至少一个死循环,来保证你的单片机一直处于有效的运行状态。
一般可以用下边这种模式来做程序:
void main(void)
{
       初始化
    while(1)  //程序主体死循环
    {
                 需要反复执行的过程
    }
}

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
fuc + 2 很给力!
18
fuc|  楼主 | 2013-6-5 16:02 | 只看该作者
kvdong 发表于 2013-6-5 14:45
好吧,你可以原谅。平且应该打你老师PP。

单片机的程序是按照流程来执行的,如果你的程序没有死循环,那 ...

谢谢您的指点了。请问你使用刚过TJA1020做LIN的收发器么。我发了个帖子请教了一个这个收发器的问题。您可以给看看不?

使用特权

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

本版积分规则

fuc

6

主题

23

帖子

2

粉丝