2016-01-10 34 views
-1

我想知道是否有一個AVR內建函數可以幫助您設置一個2字節寄存器,一旦你傳遞一個int值。函數來設置一個2字節的寄存器

例如: 我需要將鬧鐘設置爲15600個時鐘(1MHz微處理器上1秒鐘)。

爲了做到這一點,我需要進行如下設置:

//Alarm clock at 15600 clocks 
OCR0A = 0b11110000; 
OCR0B = 0b00111100; 

由於ATMEGA的AVR庫有一些很酷的內置函數(比如設置了一下)我想知道是否有一個我給一個int,並相應地設置兩個字節。

+1

ATmega沒有任何**內建函數!它是一個CPU架構並執行機器碼。它甚至沒有_functions_的概念。儘管在C中編寫自己的「set_alarm」函數有什麼問題?發佈該問題的速度會更快。 – Olaf

+1

你嘗試'sbr'操作碼(請參閱以下鏈接:http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SBR.html) – Zohar81

+0

@ Zohar81:你混淆了C和彙編。 (很像OP似乎) – Olaf

回答

1

幾乎所有的C編譯器都允許內聯彙編代碼不會被優化。如果你使用avrgcc,你會在這裏找到一個非常詳細的教程:AVR GCC Inline Assembler Cookbook。所以你可以直接看到控制器的彙編代碼。不幸的是,似乎沒有辦法直接從閃存加載一個字到寄存器對。但是您可以預先加載一個不同的寄存器對,並使用MOVW (Move Word)命令將其值移至目標寄存器對。

如果您只想使用avrgcc而不鑽取彙編程序,並且您的目標是在原子訪問中加載寄存器對(以防止中斷),則可以使用ATOMIC_BLOCK附註。此外,avr-libc爲某些16位寄存器定義了單字節訪問。要加載Timer/Counter Output Compare Register您可以使用:

ATOMIC_BLOCK(ATOMIC_RESTORESTATE) 
{ 
    //Alarm clock at 15600 clocks 
    OCR1A = 0x3cf0; 
}