Ada*_*lis 5 c avr atmel attiny
我有一个函数,它在64位变量(RFID标签号)中搜索九个"1"系列,如果找到,则将它们移动到MSB.理解为什么它不能正常工作我有一个很大的问题.
这是我的变量
uint64_t volatile RFID_data2= 0b1111111110000000000000000000000000000000000000000000000000000000;
Run Code Online (Sandbox Code Playgroud)
我发送它作为功能的指针
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;
}
Run Code Online (Sandbox Code Playgroud)
这种情况永远不会实现,但如果我改变了这个条件:
if((*data==bit_mask){
PORTA ^= (1<<PORTA2);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
它似乎运作良好.
更有甚者,我写了另一个条件 - 这是有效的.
if((*data&bit_mask)>(bit_mask-1) && (*data&bit_mask)<(bit_mask+1 )){
PORTA ^= (1<<PORTA2);
return 1
Run Code Online (Sandbox Code Playgroud)
我可以看到它与AND'&'操作有关.另外,当我将RFID_data更改为32位变量时没有任何问题.我正在使用Attiny441和GCC编译器,Atmel Studio有没有办法让它在64位上工作?
我改变了函数来取uint64t(非指针),但问题仍然存在.我也尝试创建全局变量,并删除volatile变换器,但它仍然无法正常工作.使用宏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;
}
Run Code Online (Sandbox Code Playgroud)
我还尝试通过全局变量检查if-condtion:
if((RFID_data&bit_mask)==bit_mask){
PORTA ^= (1<<PORTA2);///nothink
return 1;
}
Run Code Online (Sandbox Code Playgroud)
在两种方式中它都不会返回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;
}}
Run Code Online (Sandbox Code Playgroud)
它是通过全局变量还是通过函数调用来实现的?
将常量转换为uint64_t并不是生成uint64_t文字的正确方法。你应该使用UINT64_C宏来代替:
uint64_t bit_mask = UINT64_C(0b1111111110000000000000000000000000000000000000000000000000000000);
Run Code Online (Sandbox Code Playgroud)
或者如果您更喜欢十六进制
uint64_t bit_mask = UINT64_C(0xFF80000000000000);
Run Code Online (Sandbox Code Playgroud)