我一直在寻找所有这个问题的答案,一直没能找到任何东西。当我的ISR被触发时,它会通过并做所有它应该完全正常的事情,然后在退出并返回到主循环之前,ISR再次执行。一旦它第二次走完,它会返回到主循环。这只发生在我使用115V继电器来操作中断时。中断服务程序执行两次ATmega88
我试图检测何时发生停电或电源何时回复。我正在使用引脚变化中断来检测继电器是闭合还是断开。当电源熄灭时,继电器将打开并触发ISR。如果我把这个设置连接到一个普通的按钮上,或者根据需要切换一切工作,并且没有问题,只有当它连接到继电器时才有问题。
这里是我的代码:(我知道我不需要CLI我刚才一直在尝试一切)
ISR(PCINT2_vect){
cli();
sbi(PORTC,5);
_delay_ms(6000);
cbi(PORTC,5);
for(delay_counter=0;delay_counter<2;delay_counter++)
{
_delay_ms(6000);
}
sbi(PORTC,5);
_delay_ms(6000);
if(bit_is_set(PIND,2))
{
lcd_clrscr();
lcd_puts("Sending SMS");
usart_print("at");
USART_Transmit('\r');
_delay_ms(6000);
for(i=0;i<=1;i++)
{
usart_print("at*smsm2m=");
USART_Transmit('"');
for(j=0;j<11;j++)
{
USART_Transmit(Alert_Numbers[i][j]);
}
usart_print(" Power has been lost");
USART_Transmit('"');
USART_Transmit('\r');
_delay_ms(6000);
}
lcd_clrscr();
lcd_puts("SMS Sent");
_delay_ms(6000);
lcd_clrscr();
lcd_puts("Status:NO POWER");
cbi(PORTC,5);
}
else if(bit_is_clear(PIND,2))
{
lcd_clrscr();
lcd_puts("System Reset");
_delay_ms(6000);
_delay_ms(6000);
usart_print("at");
USART_Transmit('\r');
_delay_ms(6000);
for(i=0;i<=1;i++)
{
usart_print("at*smsm2m=");
USART_Transmit('"');
for(j=0;j<11;j++)
{
USART_Transmit(Alert_Numbers[i][j]);
}
usart_print(" Pump regained power");
USART_Transmit('"');
USART_Transmit('\r');
_delay_ms(6000);
}
lcd_clrscr();
lcd_puts("POWER ON");
_delay_ms(6000);
lcd_clrscr();
lcd_puts("Status: Good");
}
else
{
}
}
int main(void)
{ /*Initializations*/
DDRC = 0x20; // PORTC,5 is now output
sbi(PORTC,5);
USART_Init(51);
lcd_init(LCD_DISP_ON);
lcd_clrscr();
/*Set interrupts*/
DDRD = 0b11111011; // set PD2 to input
PORTD = 0b00000100; // set PD2 to high
PCICR |= (1 << PCIE0);
PCMSK0 |= (1 << PCINT0);
PCICR |= (1<<PCIE2);
PCMSK2 |= (1<<PCINT18);
sei();
lcd_clrscr();
lcd_puts("Status: Good");
/*Main Program Loop: NOP*/
while(1)
{
lcd_clrscr();
lcd_puts("MAIN LOOP");
for(delay_counter=0;delay_counter<3;delay_counter++)
{
_delay_ms(6000);
}
}
}
你有没有实际验证你得到你所期望与输入引脚上的范围是什么?这个中断是由上升沿和下降沿触发的,所以如果你得到某种脉冲,这就解释了你为什么得到两个中断。 –
@MattYoung是的,当继电器闭合并且打开时有一种脉冲,但是我还没有能够想出任何可以消除脉冲的东西。我想知道如果有人有任何想法可以做到这一点,因为我尝试过的一切都没有奏效。 – brian
什么是脉冲周期和占空比?所有这些6秒的延迟都浪费了大量的处理器时间,他们是否尝试了去抖? –