我有一箇中斷服務程序,其中包含變量count
和變量state
,當count
達到某個值時會變化。AVR:重置爲零的易失性變量
我希望自己的代碼是在ISR中的if語句中更改並保持state
一段時間,其值由count
確定。
例如我希望變量state
爲10計數等於1; 我想要state
等於0 5次。 有點類似於改變PWM的佔空比。
我遇到的問題是變量state
在ISR結束或if語句結束時重置爲零,我不確定。
在搜索答案後,我發現它可能與gcc編譯器的優化有關,但除了聲明volatile
變量之外,我還找不到解決此問題的方法,這已經完成了。
任何幫助表示讚賞謝謝。
我的代碼:您所有的CLI的
#include <avr/io.h>
#include <avr/interrupt.h>
volatile int count = 0;
volatile int state = 0;
int main(void)
{
cli();
DDRB |= (1 << PB2);
TCCR0B |= (1 << CS02)|(0 << CS01)|(1 << CS00);
TIMSK |= (1 << TOIE0);
sei();
while(1) {
...
}
}
ISR(TIM0_OVF_vect)
{
cli();
// user code here
count = count + 1;
if ((count > 5) && (state < 1) && !(PORTB & (1 << PB2))) {
state = 1;
count = 0;
}
else if ((count > 10) && (state > 0) && (PORTB & (1 << PB2))) {
state = 0;
count = 0;
}
sei();
}
啊是的,那是'&'是一個錯字。我添加了另一個。但我的主要問題是變量'state'保持重置爲零。 ((count> 5)&&(state <1)&&!(PORTB&(1 << PB2))){state = 1; count = 0; } 在這個塊之後,變量'state'再次返回到零,我不明白爲什麼。 – Satchan