我用Atmega8与一个声波测距离模块相连接,通讯时序图如下:
程序如下:
void main(void)
{
int i;
int data;
init_devices(); //器件初始化
uart_init(); //串口初始化
send(0x55);
GICR &= ~0x40;
time.int0_flag = 0;
time.time_count = 0;
while(1)
{
WDR();
///*//这段是测试外部中断的程序
TRIG_RESET;//一个10US以上的触发脉冲
delay_us(20);
TRIG_SET;
//等待Echo引脚变高电平
while(PIND&0X04 != 0x04)
//打开定时器
time.int0_flag = 0;
//GIFR &= ~0x40;
GICR |= 0x40;
TCNT1 = 0;
TCCR1B = 5;//打开定时器1,1024分频
WDR();
printf("start1\n");
//sendstr("u\n");
for(i=0;i<200;i++)//延时等待外部中断
{
WDR();
delay_us(100);
}
printf("int0 %d\n",time.time_count);//打印计时器的计数值
//调试时的延时
for(i=0;i<10000;i++)
{
WDR();
delay_us(200);
}
}
}
外部中断函数:
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
time.time_count = TCNT1;
TCCR1B = 0;//关闭定时器,这里直接不给定时器1时钟,这种方法不知道是否可行
TCNT1 = 0;
time.int0_flag = 1;
GICR &= ~0x40;//关闭外部终端
}
初始化程序如下:
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
//端口初始化
DDRD = 0x02;
//PORTD = 0xFB;
PORTD = 0xFF;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0x30;
//串口初始化
UBRRL=(F_CPU/BAUD_RATE/16 - 1)%256;
UBRRH=(F_CPU/BAUD_RATE/16 - 1)/256;
UCSRB =(1<<RXCIE)| (1<<RXEN) | (1<<TXEN);
//定时器初始化
TCNT1 = 0;
//开定时器T1溢出中断
TIMSK |= (1 << TOIE1);
//开总中断
SEI();
//T1定时器普通模式、8分频,并开启定时器 256
TCCR1B |= (1 << CS11);
MCUCR = 0x02;
GICR &= ~0x40;
GIFR |= 0x40;
//GICR = 0x40;
// GIFR = 0x40;
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
}
现在出现的问题是打开外部中断后就立刻进入外部中断响应程序中,这是怎么回事啊,我试图打开定时器后延时一小段时间再打开外部终端的GICR |= 0x40:还是会立刻今天外部中断函数程序,这是怎么回事啊,在单个调试外部中断的时候是可以的,配置为下降沿触发是可以的,不知道为什么这样就不行了,还有就是红字的地方有时可以有时候不行,郁闷!!!请各位大神给看下!小弟十分感谢!!!!!
|