joshua_cui 发表于 2009-7-22 09:14:23

请教马老师和各位高手定时器0,1,2的问题,

atmega16,三个定时器同时工作,有问题!

//////一旦加入定时器1,数码管就不正常,屏蔽定时器1后,就正常,忘高手帮忙看下,
////定时器0负责延时一定的时间,定时器0负责延时一定的时候,并且延时时间变化(key变化),
////定时器2负责led显示。

void init_devices(void)
{
CLI();

MCUCR=0x02; //int0中断下降沿使能!
GICR=0xc0;


//timer0_init(); ///////////timer0_ovf初始化
//TIMSK=0X41; /////timer0_ovf and timer2_ovf
TIMSK=0X45;   /////timer0_ovf and timer2_ovf and timer1_ovf

TCCR0=0X00;
TCNT0=0X64;   ////溢出设置10ms,16M分频1024
TCCR0=0X05;

TCCR1B=0X00;
TCNT1H=0XC2;
TCNT1L=0XF7;   /////设置初始值C2F7
OCR1AH=0X00;
OCR1AL=0X00;
OCR1BH=0X00;
OCR1BL=0X00;
TCCR1A=0X00;
TCCR1B=0X05;   ////timer1_ovf溢出设置1s,16M分频1024

//TIMSK=0x40;
TCNT2=0x00;
TCCR2=0x05;

SEI();
}



#pragma interrupt_handler timer0_ovf:10
                  //tiemer0_ovf溢出中断
void timer0_ovf(void)
{
TCNT0=0X64;
//interrupt_count=100*abon;   /////
interrupt_count--;
if(interrupt_count<2)
{
interrupt_count=0; ///interrupt_count置0
TCCR0=0X00;   ////定时器0停止
}
}


#pragma interrupt_handler timer1_ovf:9
                  //tiemer1_ovf溢出中断
void timer1_ovf(void)
{
TCNT1H=0XC2;
TCNT1L=0XF7;      
//interrupt_count=100*abon;   /////
key--;
if(key==0)         ////////当key=0时,定时器1停止
{on=0;
TCCR1B=0X00;   ////定时器1停止
}
}


#pragma interrupt_handler timer2_ovf:5
                  //tiemer2_ovf溢出中断
void timer2_ovf()
{
int sreg_temp;
sreg_temp=SREG;

display();//显示led
   
SREG=sreg_temp;
}




main()
{first=0;
for(;;)
{
...........

if((1.2*ie<large<4*ie)&&(!first)) /////见电压的最大值对应的时间给key,只执行一次。
{
    if(large<1.31*ie)
    {key=10;//延时10秒
       first=1;
      }
    else if(large<1.38*ie)
      {key=10;//延时10秒
       first=1;
      }
    else if(large<1.44*ie)
      {key=10;//延时10秒
       first=1;
      }
    else if(large<1.50*ie)
      {key=10;//延时10秒
       first=1;
      }
    else if(large<2*ie)
      {key=5;//延时5秒
       first=1;
      }
    else if(large<3*ie)
      {key=5;//延时5秒
       first=1;
      }
    else
      {key=5;//延时5秒
                  first=1;
      }
         
      TCCR1B=0X00;
      TCNT1H=0XC2;
      TCNT1L=0XF7;   /////设置timer1_ovf初始值C2F7
      OCR1AH=0X00;
      OCR1AL=0X00;
      OCR1BH=0X00;
      OCR1BL=0X00;
      TCCR1A=0X00;
      TCCR1B=0X05; //////timer1_ovf 启动开始工作
         
}
   
    if(on==0)
      {
      gengxin();
      pai();
      if(1.2*ie<large<4*ie)
      sd=0b01000000; signal=0x7f;temp=111;
      baojing(); //PC6亮,故障显示8111
      }
}

}

machao 发表于 2009-7-24 00:28:03

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1116671&bbs_page_no=1&bbs_id=1003

下载基本的东西先仔细学习参考一下。
页: [1]
查看完整版本: 请教马老师和各位高手定时器0,1,2的问题,