2014-02-28 55 views
0

當前我正在玩avr微處理器atmega644p並嘗試將其置於睡眠模式(mode:idle)。檢查avr中的睡眠模式

要做到這一點:我設置SE位= 1和其他3位SM0 SM1和SM2爲0,那麼當我調用功能sleep_cpu()時,CPU將處於空閒模式。

我使用中斷來執行我的代碼中定義的任務,所以如果我想執行它,我必須禁用睡眠模式。這意味着函數sleep_disable()必須放在ISR(vector_name)函數的第一行。

我的邏輯正確嗎?

如何檢查CPU是否處於睡眠模式?我試圖如下事情:

if (SM0 == 0 && SM1 == 0 && SM2 == 0){ 

    printf("Sleep mode begin"); 
} 

因爲我使用的中斷使oviously if語句是在循環中main()功能,但沒有打印膩子終端上。

爲什麼會發生這種情況?我想這是因爲永遠不會執行if語句由於錯誤的條件

編輯

if語句的位置是上面sleep_cpu()內環路在main()功能使該行「睡眠模式開始」應該在CPU進入休眠模式之前打印出來,但在putty終端上仍然沒有打印輸出

+0

就像「嘿,你睡着了嗎?」是無法(確切地)回答「是」的問題,你的處理器不能告訴你它當前正在睡覺,因爲如果它不能執行代碼來告訴你這個問題。通常(取決於處理器和詳細配置),中斷會將其從睡眠模式喚醒。 –

+0

Ahhaha乾杯,發現一個錯誤!我這樣做是因爲由於數據表中的信息,當CPU空閒時,SPI,USART,ADC,定時器/計數器...仍在工作!那麼無論如何檢查一個CPU是否在睡覺?否則沒有辦法檢查輸出是否正確或不... –

+0

我已經更新了循環體中if語句的位置!請看看它! –

回答

1

this document的第41頁底部,描述了中斷如何將處理器從睡眠模式中喚醒。

如果在MCU處於休眠模式時發生使能中斷,MCU將喚醒。除了啓動時間之外,MCU 然後暫停四個週期,執行中斷程序,並且從睡眠之後的指令恢復執行。

所以,你不需要在你的中斷程序中喚醒處理器。然而,如果你想讓處理器重新進入睡眠狀態,你必須在ISR返回之後採取額外的步驟,比如把sleep()函數放在一個循環中。