[英]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.