C程序在分配变量时停止执行

Seg*_*ter 0 c avr atmega

我不确定在专门分配变量时是否会发生这种情况,但是在调试汇编代码时,编译器会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)

在此处输入图片说明

And*_*ndy 6

我不知道这些在做什么,但我确实在按位数学中看到了一个错误。

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)