attiny输出问题,输出几次高低电平才稳定,为什么

[复制链接]
1560|3
手机看帖
扫描二维码
随时随地手机跟帖
popdes|  楼主 | 2012-4-28 11:06 | 显示全部楼层 |阅读模式
附上代码:pb4作为模拟电压输入口,用于ad转换pb3作为+5v输入检测口pb0作为输出问题是,通电后本应该直接输出高电平的,但是pb0口却是输出了几次高电平和低电平后才稳定再高电平,为什么,是初始化问题吗?#include "iot13v.h"
#include "macros.h"
#define uchar unsigned char
#define uint  unsigned int
#define OUT0_0  (PORTB=PORTB&0xfe)
#define OUT0_1  (PORTB=PORTB|0x01)
uchar i,flag,sflag,fflag;
uint value,dis_val;
/****************************************/
void port_init(void)
{      
  
PORTB = 0xE0;//定义pb 11100000
DDRB  = 0x01;//pb0为输出,其余输入
   
}
/****************************************************/
void adc_init(void)
{
ADCMUX = 0x03;
  
ADCSRA = 0xE9;
}
/****************************************************/
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
//conversion complete, read value (int) using...
  value=ADCL;            
  value|=(int)ADCH << 8;
  flag=1;
}
/***************************************/
void init_devices(void)
{
port_init();
adc_init();
TIMSK = 0x05;
SREG=0x80;
}
/***************************************/
void delay(uint k)
{
uint i,j;
  for(i=0;i<k;i++)
  {  
  for(j=0;j<140;j++);
  }
}
/******************************************/
uint conv(uint i)
{
long x;  
uint y;
x=(5000*(long)i)/1023;
y=(uint)x;  
return y;  
}
/******************************************/
void main(void)  
{      
init_devices();
fflag=1;
  while(1)  
  {
  if((PINB&0x10)==0x10){OUT0_0;fflag=1;} //检测pb4口有无电压,真就pb0口输出低,电压标志1
  else {
     if(flag==1)//判断ad转换完成标志
  {
  dis_val=conv(value); //对ad值进行转换
  if((dis_val>=2260)&&(fflag==1)){OUT0_1;sflag=1;}//大于2260并且电压标志1为真,pb0输出高,sflag标志为1
   else if((dis_val>=2060)&&(sflag==1)&&(dis_val<2260)){OUT0_1;} //电压在2060与2260之间,且sflag标志为真,pb0输出高
      else {OUT0_0;sflag=0;fflag=0;} //小于2060,pb0输出低,电压标志1清零
  flag=0;  //ad标志清零
  }
   
  }
  }
}

相关帖子

yewuyi| | 2012-4-28 12:00 | 显示全部楼层
1、电源不稳定造成反复多次复位,在软件中上电做一个100ms的延时进入执行程序的延时
2、IO口本身处于上电状态时不稳定输出,这个是由MCU自身数字电路特性决定的,但这个一般无所谓。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
popdes + 1
airwill| | 2012-4-28 12:54 | 显示全部楼层
呵呵, 系统上电问题. 系统上电未稳定就干活了, 是会有这样的问题的

使用特权

评论回复
popdes|  楼主 | 2012-5-3 15:53 | 显示全部楼层
已经解决了。确实是系统刚通电时候不稳定造成的。在while前面加delay(100);延迟1s,然后在else后面也加个delay即可解决。
希望这个回答能给迷茫的人帮助。
软件仿真一直是没问题的,问题出在实际操作中电压。

使用特权

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

本版积分规则

4

主题

21

帖子

0

粉丝