Приветствую.
Два дня парюсь уже с непонятной мне проблеммой. Хочу, чтобы АЦП срабатывал периодически и период бы этот определялся по таймеру А. Настраиваю таймер на работу и проверяю по частоте миганий светодиода правильно ли установлена периодичность прерывания от таймера. Оказывается правильно. Теперь хочу, чтобы ровно с этим же периодом у меня запускался АЦП на измерение и вызывалось его прерывание, но это происходит почему то в 4 раза реже, чем прерывания от таймера. Код следующий.
Код
TACCTL1 = OUTMOD_3;
TACTL = TASSEL_1; // ACLK = 32768kHz
TACCR1 = 0x4000; // 0x4000/32768 = 0.5
TACCR0 = 0x4000;
Это настройка таймера, который тактируется от часового кварца. Режим Up (ниже выбор этого режима) и в этом случае если разрешить прерывание от CCR1 или CCR2 то оно будет происходить с частотй пол секунды. Так и есть. Первой строчкой я выбрал режим Set/Reset. Таким образом таймер досчитав до 0х4000 сигнал out сделает единицей, а на следующем такте при обнулении таймера сделает его 0. Следующий код настраивает АЦП
Код
ADC12CTL1 = SHS_1 + SHP + ADC12SSEL_3 + CONSEQ_3 + CSTARTADD_0;
/* 16 us sampling time is enough for correct sampling
SMCLK is chosen for ADC12 oscillator. For 250 kHz = 4 us
SHT1=SHT2=0 (4 clocks) -> 4us * 4 = 16 us for sampling */
ADC12CTL0 = SHT0_2 + SHT1_0;
/* Setup channels for conversation */
ADC12MCTL0 = SREF_0 + INCH_0;
ADC12MCTL1 = SREF_0 + INCH_1;
ADC12MCTL2 = SREF_0 + INCH_2;
/* Last channel is for reference, to estimate the bias of measurements*/
ADC12MCTL3 = SREF_3 + INCH_15 + EOS;
4 канала, тактируется от относительно быстрого SMCLK.
Код
void StartMeasuring()
{
ADC12IE = BIT(4);
ADC12IE = BIT(2);
ADC12IFG = 0;
TACTL |= TACLR + MC_1;
ADC12CTL0 |= ADC12ON + ENC;
}
Эта функция запускает таймер и включает АЦП.
Так вот, если сделать обработчик прерывания на таймер, то он активируется с нужным периодом, но обработчик прерывания для АЦП (он вызывается по rising edge сигнала out, по идее с тем же периодом, что и прерывание таймера) вызывается в 4 раза реже
Что это?
Спасибо.