Следующий код не обновляет начальное значение adcValue. Светодиоды правильно работают с разными программами, и они также работают правильно при заданном начальном значении 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;
ADC
имеет типuint16_t
, превращающийadcValue
вdouble
, в данном случае не нужен и не рекомендуется в любом случае на этой платформе. - person Clifford   schedule 30.01.2021volatile
НЕ гарантирует ATOMIC доступа кadcValue
, так как AVR — это 8-битная платформа. Использование типа данныхdouble
(4 байта на AVR) еще больше усугубляет ситуацию. Использованиеuint16_t
(как предлагалось ранее) было бы достаточным. - person Rev   schedule 01.02.2021