我不确定在专门分配变量时是否会发生这种情况,但是在调试汇编代码时,编译器会RJMP $+0000在挂起程序的地方执行。
编辑:如果相关,我添加了包含的库
#define __DELAY_BACKWARD_COMPATIBLE__
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include <stdint.h>
void ReadTemp(uint8_t address){
ADCSRA = ADCSRA | 0b10000111; //enable ADC, CLK/128 conversion speed
ADMUX = ADMUX | 0b01000000; //Use internal 2.56V Vref and PA0 as input, right-hand justified
ADCSRA |= (1 << ADSC); //start conversion
while(!(ADCSRA & (1 << ADIF))) {} // wait until process is finished;
uint8_t low_value = ADC & 0x00FF;
// or low_value = ADCL;
uint8_t high_value = ADC & 0xFF00; //problem here
...
}
Run Code Online (Sandbox Code Playgroud)
我不知道这些在做什么,但我确实在按位数学中看到了一个错误。
uint8_t low_value = ADC & 0x00FF;
uint8_t high_value = ADC & 0xFF00; //problem here
Run Code Online (Sandbox Code Playgroud)
low_value并且high_value都是 8 位 ( uint8_t)。我要出去玩一下,说ADC是 16 位。对于high_value,您正在使用andADC,0xFF00然后将值截断为 8 位。high_value将永远为零。
应该做的是:
uint8_t high_value = (ADC & 0xFF00) >> 8;
Run Code Online (Sandbox Code Playgroud)
这将获取 ADC 的左字节并将其右移 8 位,然后将其分配给high_value字节存储,为您提供正确的值。
你的做法low_value是正确的。事实上,你可以简单地做:
uint8_t low_value = ADC;
Run Code Online (Sandbox Code Playgroud)