小弟正在用ATmega16做一个检测,目的是在外部中断1下降沿后检测外部中断0的脉冲数,中断0只可能是1个或两个脉冲,若是1则继电器动,否则不动,目前的状态是中断1每一个下降沿继电器都会动,不知道为什么?
后来自己测试 单独开外部0计数也并不准确,请各位指教
// Target : M16
#include <iom16v.h>
#include <macros.h>
//#include "lesson5.c"
unsigned char i=0,flag=0;
unsigned char j;
void delayms(unsigned int ms) //ms延时程序
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x01;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x0C; //使INT0,INT1对应口上拉电阻有效
DDRD = 0x00; //必须设置INT0,INT1对应口为输入
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
i++;//在中断里进行操作
if(i==2)
{
j=1;
i=0;
}
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
//在中断里进行操作
flag=1;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x0a; //INT1 的下降沿产生异步中断请求,INT0上升沿
GICR = 0xC0; //INT0和INT1使能
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
while(1)
{
if(flag==1)
{
if(j)
{
delayms(10);
i=0;
}
else
{
DDRD|=BIT(6); //控制继电器
PORTD&=~BIT(6);
delayms(100);
DDRD|=BIT(6);
PORTD|=BIT(6);
}
flag=0;
}
}
} |