Код: Выделить всё
DIDR0 |= ADC_PIN;
// REFS0 - внутрений источник опорного напряжения
// ADLAR - выравнение по старшему байту
// ADC_CHANNEL - ADC1
ADMUX = (1 << REFS0) | (1 << ADLAR) | ADC_CHANNEL;
// ADPS2 - Делитель на 16, при частоте 1.2 МГц (т.к. CKDIV8 фьюз) выйдет 75 кГц (как раз в рекомендованном диапазоне)
// ADEN - АЦП включен
// ADIE - Разрешить прерывание
ADCSRA = (1 << ADPS2) | (1 << ADEN) | (1 << ADIE);
Ну так вот проблема - АЦП запускается сам по себе при каждом переходе в сон (SLEEP_MODE_IDLE) и наглым образом пробуждает.
Какой вообще смысл автоматически запускаться при переходе в сон если ADSC сброшен или это ошибка в микроконтроллере?
Получается что есть только 2 выхода:
1) делать замер без прерывания - не очень подходит т.к. хочется всё же в SLEEP_MODE_ADC чтобы это происходило
2) каждый раз включать АЦП (со снятым битом ADSC) и сразу уходить в SLEEP_MODE_ADC сон. - но тут есть сомнения - пишут что первое преобразование после включения обычно не очень точное. А получается что каждый раз будет "первое" преобразование.
Как лучше поступить?
P.S. просто так будить МК нельзя т.к. логика завязана на том, что он будет пробуждаться через определенные интервалы.


