Каюсь - слаб в матчасти. Идеология такова - каждые 50млс хочу сэмплами набивать буфер и вычислять скользящее среднее ну и сравнивать с нужным значением. Сконфигурировал на тактирование от мцлк, 10 канал - где сидит встроенный датчик, данные забираю с ADC12MEM0. Готовность контролирую по флагу прерывания 0. Почему-то хер когда этот флаг выставляется.
<code>
#define ADC_Start_Conversion() {ADC12CTL0 |= ADC12SC;}
#define ADC_Enable_Conversion() {ADC12CTL0 |= ENC;}
#define ADC_Disable_Conversion() {ADC12CTL0 &= ~ENC;}
#define ADC_Check_End_Conversion() ((ADC12IFG & (1<<0)) != 0)
#define ADC_Check_Ready() ((ADC12CTL1 & ADC12BUSY) == 0)
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Инициализация
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void ADC_Init(void)
{
ADC12CTL0 = ADC12ON | SHT0_8 | REFON | REF2_5V;
ADC12CTL1 = CSTARTADD_0 | ADC12SSEL_2 | ADC12DIV_1 | CONSEQ_0;
ADC12MCTL0 = INCH_10 + SREF_1;
ADC_Enable_Conversion();
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Проверка питания
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void ADC_Calc_Power(void)
{
u8_t tmptail, i;
tmptail = (adc.tail + 1) & ADC_BUF_MASK;
adc.buf[tmptail] = (u8_t)ADC12MEM0;
adc.tail = tmptail;
adc.main_pow = 0;
i = 0;
do
{
adc.main_pow += adc.buf[i];
i++;
}while(i<ADC_BUF_SIZE);
adc.main_pow /= 8;
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Процессор
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void ADC_Processor(void)
{
switch(adc.state)
{
case ADC_STATE_READY:
if(adc.timer == 0)
{
if(ADC_Check_Ready() != 0)
{
ADC_Start_Conversion();
adc.timer = ADC_SAPMLING_PERIOD;
adc.state = ADC_STATE_CONVERSION;
}
}
break;
case ADC_STATE_CONVERSION:
if(ADC_Check_End_Conversion() != 0)
{
ADC_Calc_Power();
adc.state = ADC_STATE_READY;
}
break;
}
}
</code>