簡體   English   中英

更改中斷方式時,為什么我的輸入信號時序會改變?

[英]Why does my input signal timing change when changing interrupt method?

使用的AVR是ATmega2560。

我有一個產生的脈沖寬度為1秒的輸入信號。

該信號連接到我的AVR(INT0)上的外部中斷引腳。

INT0正在如下初始化:

碼:

DDRD &= ~(1 << PD0);
PORTD |= (1 << PD0);
EIMSK  = 1 << INT0; // enable
EICRA |= (1 << ISC00) | (1 << ISC01); // trigger on rising edge

sei(); //global interrupts

ISR針對此外部中斷的任務是:a)找出哪個邊沿(第一種情況應該上升),以及b)根據哪個邊沿執行操作

ISR看起來像這樣:

碼:

ISR(INT0_vect)
{

if(EICRA == 0x02)
{
    // falling edge detected
    doFallingEdgeFunction_lightLED0();

    // quickly change the trigger to capture opposite edge
    EICRA |= (1 << ISC00) | (1 << ISC01); // trigger on rising edge

}

else if(EICRA == 0x03)
{
    doRisingEdgeFunction_lightLED1();

    // change trigger on falling edge
    EICRA = (1 << ISC01);
    EICRA &= ~(1 << ISC00);
}

}

它能夠檢測邊緣; 正確的LED點亮,但是由於某種原因,更改ISR中的邊沿中斷位會將我的輸入信號減小到0.1秒寬度,而不是整個1秒寬度。

在示波器上,我看到原始信號被鏡像,但寬度減小了10倍! 如果刪除“切換觸發器”項,則信號很好。

從第15.2.2節開始。 114

注:1. n = 3、2、1或0。更改ISCn1 / ISCn0位時,必須通過清除EIMSK寄存器中的中斷允許位來禁止該中斷。 否則,當這些位更改時,可能會發生中斷。

編輯:

EIFR –外部中斷標志寄存器

•位7:0 – INTF7:0:外部中斷標志7-0

當INT7:0引腳上的邊沿或邏輯變化觸發中斷請求時,INTF7:0會被置1(一個)。 如果將SREG中的I位和EIMSK中相應的中斷允許位INT7:0設置為1,MCU將跳轉到中斷向量。 當執行中斷程序時,該標志被清除。 或者,可以通過向其寫入邏輯標志來清除該標志。

嘗試清除中斷中的標志

EIFR = (1 << INT0); 

不要使用

EIFR |= (1<< INT0);  // DO NOT USE

這將清除所有掛起的標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM