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

[复制链接]
 楼主| 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 | 显示全部楼层
没拿个示波器看下端口有没有输出??
sjy1979 发表于 2011-5-19 08:28 | 显示全部楼层
同意3楼观点。
 楼主| milktang 发表于 2011-5-19 10:41 | 显示全部楼层
本帖最后由 milktang 于 2011-5-19 10:52 编辑

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

查看全部评分

我的傻云云 发表于 2011-5-19 11:48 | 显示全部楼层
看下中断里的等于改成大于等于行不行
pz229264118 发表于 2011-5-19 12:08 | 显示全部楼层
学习中
liang7143 发表于 2011-5-19 14:16 | 显示全部楼层
程序写的很差,所以有一些问题可能也就在所难免。

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

学习了
lixiaoxu2meng 发表于 2011-5-19 15:12 | 显示全部楼层
7# yewuyi

为什么“看到void delay(uint x),就看到了极为危险的信号”我也是新人,希望高手指点
lixiaoxu2meng 发表于 2011-5-19 15:31 | 显示全部楼层
本帖最后由 lixiaoxu2meng 于 2011-5-19 15:41 编辑

楼主 你将LCDCON的LCDEN位置零 禁止 lcd驱动模块试试
即在main函数里加上 LCDCON=0x00;试试
兰天白云 发表于 2011-5-19 17:15 | 显示全部楼层
void interrupt time1()
明显有漏洞
micropower 发表于 2011-5-19 17:33 | 显示全部楼层
你用的是PIC10/12/16系列的么?如果是那么中断里没加判断。
另外,看你描述的好像是IO口直接接电磁阀啊,这杨很容易干扰单片机运行的。
 楼主| milktang 发表于 2011-5-19 22:35 | 显示全部楼层
看了大家的回复,收获很多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

267

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部