А что, если Вам в прерывании прочитать ADC12MEM-ы и скопировать из в какой-либо массивчик?
Я делаю так:
Код
#pragma vector=ADC_VECTOR
__interrupt void ADC12_isr( void )
{
unsigned short *adc_mem_ptr;
int a;
adc_mem_ptr = (unsigned short *)&ADC12MEM0;
for ( a = 0; a < adc_cnt; a++ )
x_adc_t[a] += *adc_mem_ptr++; // сохраним результаты АЦП во временный массив
}
Я OS не использую, но инициализирую почти так-же:
Код
/* --- adc_ini() ------------------------------------------------------------------------------------------ **
* Инициализация каналов АЦП
* -------------------------------------------------------------------------------------------------------- */
static void adc_ini( void )
{
P6SEL = BINARY( 11111111 );
P6DIR = BINARY( 00000000 );
ADC12CTL0 = ADC12ON // АЦП включено
| SHT0_2 // время установленияния для ADC12MEM0…ADC12MEM7
| SHT1_3 // время установленияния для ADC12MEM8…ADC12MEM15
| MSC // обрабатываем последовательность каналов
| REFON + REF2_5V // опорное напряжение 2.5В включено
;
ADC12CTL1 = CSTARTADD_0
| SHP // Сигнал SAMPCON берется с таймера защёлки.
| ADC12SSEL_3
| ADC12DIV_1
| CONSEQ_1 // один цикл измерения последовательности каналов
;
ADC12MCTL0 = INCH_2 + SREF_1;
ADC12MCTL1 = INCH_0 + SREF_1;
ADC12MCTL2 = INCH_3 + SREF_1;
ADC12MCTL3 = INCH_1 + SREF_1;
ADC12MCTL4 = INCH_4 + SREF_1;
ADC12MCTL5 = INCH_6 + SREF_1;
ADC12MCTL6 = INCH_5 + SREF_1;
ADC12MCTL7 = INCH_7 + SREF_1 + EOS;
// -----------------------------------------------------------------------------------------------------------------
ADC12IE = 1 << ( adc_cnt - 1 ); // Enable ADC12IFG.x - разрешим прерывание от последнего канала
Enable_conversions(); // { ADC12CTL0 |= ENC; }
}
А запуск преобразования делаю по прерыванию от таймера.
Никаких проблем нет, прерывание от АЦП вызывается однократно после каждго запуска преобразования