【发布时间】:2021-05-03 13:38:36
【问题描述】:
以下代码不会更新初始 adcValue。 LED 在不同的程序中正常工作,并且在给定初始 adcValue 的情况下它们也可以正常工作。他们不响应电位器调整。延迟只是为了让它变慢,没有它也行不通。
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
double adcValue = 700;
void startConversion()
{
ADCSRA |= (1 << ADSC);
}
void setupADC()
{
// AVcc with external capacitor as reference, ADC5 as input
ADMUX = (1 << REFS0) | (1 << MUX0) | (1 << MUX2);
// Enabling ADC, acticating interrupts, setting prescaler to 8
ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS0) | (1 << ADPS1) ;
//disabling digital input buffer
DIDR0 = (1 << ADC5D);
startConversion();
}
ISR(ADC_vect)
{
adcValue = ADC;
}
int main(void)
{
DDRB = 0b00111111;
setupADC();
sei();
while(1)
{
_delay_ms(500);
if( adcValue < 400)
{
PORTB = 0b00000000;
}
else if ( adcValue < 800)
{
PORTB = 0b00000011;
}
else
{
PORTB = 0b00000111;
}
startConversion();
}
}
解决方案:
现在可以了
volatile double adcValue = 700;
【问题讨论】:
-
adcValue 需要是可变的。它正在 ISR 中更新。
-
它也需要是整数,因为 AVR 没有 FPU。这不是个人电脑。
-
@yhyrcanus 是的,它有效
-
ADC具有uint16_t类型,因此在这种情况下,adcValue和double是不必要的,并且无论如何在此平台上都是不明智的。 -
如果您想回答自己的问题,请添加答案而不是编辑问题。然而,一个好的答案可以解释为什么该解决方案有效。错误修复不是 SO 的职责。 embedded.com/introduction-to-the-volatile-keyword