このコードを理解しようとしています
しかし、コードのこの部分を理解するのに苦労しています。
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= -_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
sbi
cbi
後でコード内で次のように使用されます。
void system_sleep()
{
sbi(MCUCR,PUD); //Disables All Internal Pullup Resistors
sbi(GIMSK,PCIE); //Enable Pin Change Interrupts Interrups
sbi(PCMSK,PCINT0); //Changes Interrupt to PIN1 (PCINT1)
cbi(ADCSRA,ADEN); //switch Analog to Digital Converter OFF
cbi(MCUCR,SM0); //Power Down Mode
sbi(MCUCR,SM1); //Power Down Mode
sbi(MCUCR,SE); //sleep Mode Power down enable (Sleep_enable(); should set this-- not tested yet)
sleep_enable(); //Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
sleep_mode(); //sleep begins here
sleep_disable(); //Coming out of sleep
sbi(ADCSRA,ADEN); //switch Analog to Digital Converter ON
cbi(MCUCR,PUD); //Enables Pullup Resistors Again
}
コードは forATtiny85
で、データシートを読んだところ、これらのようなものはすべてレジスタであることがわかりMCCUR
ましADCSRA
た。SBI
また、命令にはとの 2 種類があると記載されていますCBI
。
また、C を使用したマイクロ コントローラーのプログラミングに関するチュートリアルをいくつか読み、各レジスタに8
ビットがあることを理解しました。これらの各ビットは、さまざまな機能のプログラミングを使用して設定できます。またPUD
、PCIE
これらのレジスタの異なるビットであり、これらはsystem_sleep
関数で設定されています。だから私はどのsystem_sleep
機能が何をしているのかを理解しています。それはレジスタのビットを設定しています。
私が理解できない唯一の部分は
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= -_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
_SFR_BYTE
またはのようなデータシートには何もありません_BV
。_BV
私は AVR/libc ヘッダーを調べましたが、それが何をしているのかわかりませんでした。