Вот АНТОХА и написал Вам, как это делается.
Подробнее так:
1. инициализируете АЦП на 1 цикл измерения последовательности каналов (или 1 канала). Примерно так у меня для MSP430F1611
Код
#define adc_cnt 8 // оцифровываются 8 каналов
#define Start_conversion() { ADC12CTL0 |= ADC12SC; }
/* --- adc_ini() ------------------------------------------------------------------------------------------ **
* Инициализация каналов АЦП
* -------------------------------------------------------------------------------------------------------- */
static void adc_ini( void )
{
P1SEL = BINARY( 00001100 );
P1DIR = BINARY( 00001111 );
P1OUT = BINARY( 00000000 );
P6SEL = BINARY( 11111111 ); // весь порт используется, как входы АЦП
P6DIR = BINARY( 00000000 );
ADC12CTL0 = ADC12ON // АЦП включено
| SHT0_2 // время установленияния для ADC12MEM0…ADC12MEM7, tsample >= 2 us, сделаем 16/4us
| SHT1_3 // время установленияния для ADC12MEM8…ADC12MEM15 сделаем 32/4us (tsample > 5us)
| MSC // обрабатываем последовательность каналов
| REFON + REF2_5V // опорное напряжение 2.5В включено
;
ADC12CTL1 = CSTARTADD_0 // данные будем помещать начиная с ADC12MEM0
| SHP // Сигнал SAMPCON берется с таймера защёлки. Передний фронт сигнала Sample-input запускает таймер.
| ADC12SSEL_3 // тактовая частота для ядра АЦП (ADC12CLK) - SMCLK
| ADC12DIV_1 // деленая на 2 - итого 4 МГц, время преобразования (13 * 1/4 + tsample)us
| CONSEQ_1 // один цикл измерения последовательности каналов
;
// Порядок каналов в ADC12MEMх выстроим в соответствии с "enum gase_num" (будем оцифровывать Vref+ .. AVSS)
ADC12MCTL0 = INCH_2 + SREF_1; // канал = A2, Vr+=Vref+, Vr-=AVSS
ADC12MCTL1 = INCH_0 + SREF_1; // канал = A0, Vr+=Vref+, Vr-=AVSS
ADC12MCTL2 = INCH_3 + SREF_1; // канал = A3, Vr+=Vref+, Vr-=AVSS
ADC12MCTL3 = INCH_1 + SREF_1; // канал = A1, Vr+=Vref+, Vr-=AVSS
ADC12MCTL4 = INCH_4 + SREF_1; // канал = A4, Vr+=Vref+, Vr-=AVSS
ADC12MCTL5 = INCH_6 + SREF_1; // канал = A6, Vr+=Vref+, Vr-=AVSS
ADC12MCTL6 = INCH_5 + SREF_1; // канал = A5, Vr+=Vref+, Vr-=AVSS
ADC12MCTL7 = INCH_7 + SREF_1 + EOS; // канал = A7, Vr+=Vref+, Vr-=AVSS + EOS (последний обрабатываемый канал)
// -----------------------------------------------------------------------------------------------------------------
ADC12IE = 1 << ( adc_cnt - 1 ); // Enable ADC12IFG.x - разрешим прерывание от последнего оцифровываемого канала
Enable_conversions();
}
2. в таймерном прерывании запускаете преобразование, как АНТОХА написал. Подробнее:
Код
/* --- Timer_A_isr() -------------------------------------------------------------------------------------- **
*
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A_isr( void )
{
........
Start_conversion();
........
}
3. Ну и обработчик прерывания от АЦП, важно, чтоб он успел отработать до следуюшего запуска преобразования...
Код
unsigned short x_adc_t[adc_cnt];
/* --- ADC12_isr() ---------------------------------------------------------------------------------------- **
* Конец преобразования АЦП, вызывается по таймеру А с частотой 1000 Гц
* Накапливаем сигнал за ADC_SUM преобразований
* -------------------------------------------------------------------------------------------------------- */
#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++; // сохраним результаты АЦП во временный массив
}
В глобальный массивеx_adc_t[] у Вас будут помещатся результаты преобразования после вызова прерывания ADC12_isr(). В этом-же прерывании можете поставить флажок или ещё как-то сообщить в программу что данные готовы.