打印

菜鸟请教为何I/O输出不稳定

[复制链接]
2307|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
milktang|  楼主 | 2011-5-18 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大虾,我用PIC单片机编了个简单的测试程序,通过I/O口的电平变化控制电磁阀吸合断开,上电时间约1秒,断开时间约9秒,但测试时电磁阀吸断几次后就不动作了,隔很长一段时间又吸断几次,然后又没反应,请问是程序问题吗(后来用555电路控制了)
#include "pic.h"
#define uchar unsigned char
#define uint unsigned int
uint n;
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
  for(b=110;b>0;b--);
}
void initTMR1()
{
  GIE=1;
  PEIE=1;
  TMR1IE=1;
  TMR1L=(65536-20000)%256;
  TMR1H=(65536-20000)/256;
  T1CON=0x01;
  
}
void main()
{   
initTMR1();
TRISC=0x00;
RC5=0;
while(1)
{
  
}
}
void interrupt time1()
{
  TMR1IF=0;
  TMR1L=(65536-20000)%256;
  TMR1H=(65536-20000)/256;
  n++;
  if(n==100)
  {
   RC5=0;
   
  }
  if(n==700)
  {
   RC5=1;
   n=0;
  }
}

相关帖子

沙发
linbei1988| | 2011-5-18 17:17 | 只看该作者
本帖最后由 linbei1988 于 2011-5-18 17:20 编辑

不知PIC用C时,是不是自动转换RP0和RP1呢?
TMR1L=(65536-20000)%256;
TMR1H=(65536-20000)/256;
会不会是这个计算结果不是整型导致赋值错误?猜的...程序其他地方没什么问题
不然就是硬件方面原因了

使用特权

评论回复
板凳
gx_huang| | 2011-5-18 20:11 | 只看该作者
不像产品的程序,WDT都没有用。
也许布线太差,MCU程序跑飞了。
先用一个LED代替负载看看效果。

使用特权

评论回复
地板
NE5532| | 2011-5-18 22:39 | 只看该作者
没拿个示波器看下端口有没有输出??

使用特权

评论回复
5
sjy1979| | 2011-5-19 08:28 | 只看该作者
同意3楼观点。

使用特权

评论回复
6
milktang|  楼主 | 2011-5-19 10:41 | 只看该作者
本帖最后由 milktang 于 2011-5-19 10:52 编辑

这个不是产品的程序,只是想对电磁阀进行通断老化测试临时写的一个测试程序。现在用555搭了个电路代替单片机控制,但想弄明白为什么单片机的控制会不稳定呢

使用特权

评论回复
7
yewuyi| | 2011-5-19 11:30 | 只看该作者
程序写的很差,所以有一些问题可能也就在所难免。

1、看到void delay(uint x),就看到了极为危险的信号。
2、不清楚你的是哪个型号,如果是PIC16的话,那么中断函数中需要带中断容许和中断标志位一起判断TIMER1中断是否发生?
3、在initTMR1()函数中应该养成良好的习惯,应先赋值,然后启动定时器,然后再打开中断容许位,然后再打开外设中断容许位,然后再打开GIE容许位,请不要乱搞,否则MCU会采用报复的方式乱搞你一通!!!
4、在中断函数,请不要轻易使用直接赋值的方式对定时器赋初值,因为定时器在进入中断后是不会停止进位的,这可能会造成一种临界条件,另,请尽量不要再中断中做各种条件的判断,将他们放到MAIN中去执行,定时器只给系统提供一个时钟基准。
5、最后需要告诉你:不是IO输出不稳定,而是你的设计不稳定。

NOTE: LZ需要认真闭关修炼3年。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
liang7143 + 1
8
我的傻云云| | 2011-5-19 11:48 | 只看该作者
看下中断里的等于改成大于等于行不行

使用特权

评论回复
9
pz229264118| | 2011-5-19 12:08 | 只看该作者
学习中

使用特权

评论回复
10
liang7143| | 2011-5-19 14:16 | 只看该作者
程序写的很差,所以有一些问题可能也就在所难免。

1、看到void delay(uint x),就看到了极为危险的信号。
2、不清楚你的是哪个型号,如果是PIC16的话,那么中断函数中需要带中断容许和中断标志位一起判断TIMER1中断 ...
yewuyi 发表于 2011-5-19 11:30

学习了

使用特权

评论回复
11
lixiaoxu2meng| | 2011-5-19 15:12 | 只看该作者
7# yewuyi

为什么“看到void delay(uint x),就看到了极为危险的信号”我也是新人,希望高手指点

使用特权

评论回复
12
lixiaoxu2meng| | 2011-5-19 15:31 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-5-19 15:41 编辑

楼主 你将LCDCON的LCDEN位置零 禁止 lcd驱动模块试试
即在main函数里加上 LCDCON=0x00;试试

使用特权

评论回复
13
兰天白云| | 2011-5-19 17:15 | 只看该作者
void interrupt time1()
明显有漏洞

使用特权

评论回复
14
micropower| | 2011-5-19 17:33 | 只看该作者
你用的是PIC10/12/16系列的么?如果是那么中断里没加判断。
另外,看你描述的好像是IO口直接接电磁阀啊,这杨很容易干扰单片机运行的。

使用特权

评论回复
15
milktang|  楼主 | 2011-5-19 22:35 | 只看该作者
看了大家的回复,收获很多

使用特权

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

本版积分规则

10

主题

267

帖子

4

粉丝