2015-07-11 48 views
0

我有一箇中斷服務程序,其中包含變量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(); 
}  

回答

0

第()在你的ISR沒有影響。當中斷髮生時,I標誌會在ISR結束時自動清除並恢復,因此sei()也是不必要的。然而,當sei()插入ISR服務中間的某個地方讓其他ISR中斷它時,會有理性的情況。雖然建立如此複雜的ISR系統並不是初學者的水平。

第二:如果你設置了一個條件結構,基本條件應該由雙運算符鏈接。 (count> 5)&(狀態< 1)的評估無法預測,正確寫入它是(count> 5)& &(狀態< 1)。很明顯,對於'or'-ing ||用來。

+0

啊是的,那是'&'是一個錯字。我添加了另一個。但我的主要問題是變量'state'保持重置爲零。 ((count> 5)&&(state <1)&&!(PORTB&(1 << PB2))){state = 1; count = 0; } 在這個塊之後,變量'state'再次返回到零,我不明白爲什麼。 – Satchan

0

如果您模仿PWM,則if語句的條件看起來很可疑。

爲什麼端口B的引腳正在測試?只有用正確的頻率按下引腳(按鈕)時,纔會輸入if語句的主體。

您的意思是設置端口B上的引腳嗎?那麼你會想

count = count + 1; 

    if ((count > 5) && (state < 1)) { 
     PORTB &= ~(1 << PB2); // clears PB2 
     state = 1; 
     count = 0; 
    } 
    else if ((count > 10) && (state > 0)) { 
     PORTB |= 1 << PB2; // sets PB2 
     state = 0; 
     count = 0; 
    } 
+0

PortB的引腳意味着像LED一樣的指示器。根本的問題是變量'state'沒有保持其價值。假設'count'等於6,'state'等於零。 if語句的第一種情況是真實的,應該將'state'改爲1。但在if語句結束時,它返回到零。 else語句沒有執行,因此我很困惑爲什麼會發生這種情況。 – Satchan

+0

然後我的答案似乎是你需要的。您想要將該引腳設置爲指示器。相反,你正在檢查引腳的值是多少。如果條件評估爲「真實」,它看起來不是,因爲引腳的狀態不是你所期待的。 – UncleO

+0

我可能會更好地解決我的問題。讓我們完全刪除PORTB。 if語句運行得很好,但我遇到的問題是變量'state'沒有保持其值。 'state'變爲1,但在if語句結尾立即變回零。我希望更清楚。 – Satchan