64 ビット変数 (RFID タグ番号) で一連の 9 つの「1」を検索し、見つかった場合はそれらを MSB に移動する関数があります。なぜそれが適切に機能しないのかを理解するのに大きな問題があります。
これは私の変数です
uint64_t volatile RFID_data2= 0b1111111110000000000000000000000000000000000000000000000000000000;
関数へのポインタとして送信します
test_flag= header_align(&RFID_data2);
uint8_t header_align(uint64_t *data){
uint64_t bit_mask=(uint64_t)
0b1111111110000000000000000000000000000000000000000000000000000000;
if((*data&bit_mask)==bit_mask){
PORTA ^= (1<<PORTA2);
return 1;
}
この条件が満たされることはありませんが、条件を次のように変更した場合:
if((*data==bit_mask){
PORTA ^= (1<<PORTA2);
return 1;
}
それはうまくいくようです。
さらに、別の条件を書きます-これは機能しています。
if((*data&bit_mask)>(bit_mask-1) && (*data&bit_mask)<(bit_mask+1 )){
PORTA ^= (1<<PORTA2);
return 1
ご覧のとおり、AND '&' 操作に問題があります。さらに、RFID_data を 32 ビット変数に変更しても問題はありません。Attiny441 と GCC コンパイラ、Atmel Studio を使用しています。64 ビットで動作させる方法はありますか?
関数を uint64t (非ポインター) に変更しましたが、問題は解決しません。また、グローバル変数を作成し、揮発性修飾子を削除しようとしましたが、それでも正しく機能しません。マクロ UINT64_C を使用しても役に立ちません。次のようになります。
uint64_t RFID_data;// global var
int main(void)
{
RFID_data=(0xFF80000000000000);// write into global var
uint64_t RFID_data2=(0xFF80000000000000);
while(1)
{
test_flag=header_align(RFID_data2);// send local variable
}
}
uint8_t header_align(uint64_t data){
uint64_t bit_mask = UINT64_C(0xFF80000000000000);
if((data&bit_mask)==bit_mask){
PORTA ^= (1<<PORTA2);//nothink
return 1;
}
また、グローバル変数で if-condtion をチェックしようとしました:
if((RFID_data&bit_mask)==bit_mask){
PORTA ^= (1<<PORTA2);///nothink
return 1;
}
どちらの方法でも、1 を返さず、PORTA2 の状態も変更しません。
次のように、header_allgin に新しいローカル変数を作成した場合にのみ機能します。
uint8_t header_align(uint64_t data){
uint64_t RFID_data3 = UINT64_C(0xFF80000000000000);
uint64_t bit_mask = UINT64_C(0xFF80000000000000);
if((RFID_data3&bit_mask)==bit_mask){
PORTA ^= (1<<PORTA2);// here i can see signal
return 1;
}}
グローバル変数または関数の引数で動作させる方法はありますか?