Я обычно запускаю АЦП от сигнала таймера, но и для внешнего прерывания должно быть аналогично.
1. Настраиваю АЦП, там мои макросы, но надеюсь будет понятно
Код
adc_enable ();
adc_mode_trigger ();
adc_set_source (ADC_SOURCE_TC0_CMPA);
adc_set_prescaler (ADC_PRESCALE_DIV64); // or 128 ??
adc_set_reference (ADC_REFERENCE_AVCC);
adc_left_adjusted (); // ADLAR = 1
// adc_right_adjusted(); // ADLAR = 0
adc_int_enable ();
adc_set_channel (0x00); // начальный канал
2. настраиваю таймер
Код
timer0_init (TIMER0_MODE_CTC, T0_TICK *TIME_1MS); // for ADC
3. пишу обрабртчик таймера, если не нужен - то делаем его пустой
Код
ISR(TIMER0_COMPA_vect)
{ timer0_tick += T0_TICK;
}
4. пишу обработчик АЦП, например так
Код
ISR(ADC_vect)
{ rms.val = ADCH;
adc_flag = 1;
}
Соответственно с внешним прерыванием аналогично:
1. прерывание ExtINT0 должно быть настроено и включено, иначе откуда будет подаваться сигнал на АЦП?
2. для избежания косяков, необходимо написать обработчик ExtINT0, пусть даже и пустой
3. в этом обработчике НЕ НАДО напускать АЦП, иначе это будет ПЕРЕЗАПУСК, запуск АЦП делает логика МК, которая подключает старт АЦП от внешнего прерывания. А вот само прерывание должно обрабатывать аппаратная логика этого прерывания
4. что за, извиняюсь, гуанокод?
Код
ADMUX |= (1 << REFS0) | (1 << MUX0) | (1 << MUX2); // ADC5, AVCC
ADCSRA |= (1 << ADEN) | (1 << ADATE) | (1 << ADIE);
ADCSRB |= (1 << ADTS1);
Вы же однократно и один раз в начале програмы инициализируете АЦП, зачем там "|=" ? уберите их
Код
ADMUX = (1 << REFS0) | (1 << MUX0) | (1 << MUX2); // ADC5, AVCC
ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE);
ADCSRB = (1 << ADTS1);