本帖最后由 99welcome 于 2016-4-13 09:53 编辑
可以进入WDT中断,在中断中改变I/O口电平,程序如下:
#pragma interrupt_handler WDT_isr:7
void WDT_isr(void)
{
wdt_flag=0x01;
PORTC|=SEN_V;
DelayMs(10);
PORTC&=~SEN_V;
}
void main(void)
{
MCUCR = 0x00; //JTD XX PUD XX IVSEL IVCE;PUD为0,禁止上拉电阻
EICRA = 0x00; //XXXX ISC11 ISC10 ISC01 ISC00,低电平时产生中断
EIMSK = 0x00; //XXXXXX INT1 INT0
PCICR = 0x00; //XXXXX PCIE2 PCIE1 PCIE0
PCMSK2 = 0x00;
PCMSK1 = 0x00;
PCMSK0 = 0x00;
TIMSK0 =0x00;
TIMSK1 =0x00;
TIMSK2 =0x00;
SEI(); //re-enable interrupts
DDRC = 0b0010111; //
PORTC = 0b0010001; //
ACSR=0X80;
MCUSR = 0x00;
/* 置位WDCE 与WDE */
WDTCSR = (1<<WDCE) | (1<<WDE);
/* 关闭WDT */
WDTCSR = 0x00;
//可以关闭WDT,下面开启WDT就不行,是固定的频率!!!!!
WDTCSR=0X18;//(1<<WDCE)|(1<<WDE);/* 启动时序 */ WDIF WDIE WDP3 WDCE WDE WDP2 WDP1 WDP0
WDTCSR=0X00;
WDTCSR=0X71;//(BIT(WDCE))|(BIT(WDTIE))|(BIT(WDP3))|(BIT(WDP0));//8S,interreput中断模式,8秒溢出
//上面程序可以开启WDT,但是频率不能改变,无论怎么改变WDP3 WDP2 WDP1 WDP0,频率输出固定,
start:
while(wdt_flag==0)
{
NOP();
}
if(wdt_flag==1)
{
wdt_flag=0;
goto start;
}
}
|