И снова Всем привет! Ситуация следующая нужно использовать АЦП вместе с ДМА... Есть Буфер в который надо положить 256 значений.
Код инициализации:
CODE
void ADC_init()
{
// нужную ногу настраиваем на вход
PORTA.DIRCLR = 1 << /*ADC_config.*/AdcPin;
// CTRLA - ADC Control Register A (см. в даташите на странице 302)
// здесь просто включаем АЦП выставляя нулeвой бит
ADCA.CTRLA = ADC_ENABLE_bm /*| (1 << 7) | (1 << 6)*/;
// CTRLB - ADC Control Register B
// здесь в зависимосте от настроек выставляем знак, режим, разрядность
ADCA.CTRLB = ((/*ADC_config.*/AdcConvertionMode << ADC_CONMODE_bp) | (/*ADC_config.*/Resolution << 1)) | 0x08;
// REFCTRL - ADC Reference Control register
// выставляем опорное напряжение
ADCA.REFCTRL = (/*ADC_config.*/Reference << 4) | 2;
// делитель частоты АЦП, по даташиту максимальная частота 2 МГц
ADCA.PRESCALER = /*ADC_config.*/Prescaler;
// Настраиваем мультиплексор
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
ADCA.CH0.MUXCTRL = /*ADC_config.*/AdcPin << 3;
//ADCA.CH0.INTCTRL = 3;
/*ADC_config.*/CurVal = 0;
/*ADC_config.*/Flags = ADC_STOPED;
DMA
DMA.CTRL = DMA_ENABLE_bm;
DMA.CH0.CTRLA = /*DMA_CH_SINGLE_bm |*/ DMA_CH_REPEAT_bm;
DMA.CH0.CTRLB = 3;
DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_gm | DMA_CH_SRCDIR0_bm | DMA_CH_DESTRELOAD_gm/* | DMA_CH_DESTDIR0_bm*/;
DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc;
DMA.CH0.TRFCNT = 10;
DMA.CH0.SRCADDR0 = /*(uint16_t)&inval;*/(uint16_t)&ADCA.CH0.RES;
DMA.CH0.SRCADDR1 = /*(uint16_t)&inval>>8;*/(uint16_t)&ADCA.CH0.RES>>8;
DMA.CH0.SRCADDR2 = 0;
DMA.CH0.DESTADDR0 = /*(uint16_t)&outval;*/(uint16_t)&Values;
DMA.CH0.DESTADDR1 = /*(uint16_t)&outval>>8;*/(uint16_t)&Values>>8;
DMA.CH0.DESTADDR2 = 0;
DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm;
}
Есть ещё функция которая начинает цикл измерений:
CODE
void ADC_start()
{
// начать преобразование
ADCA.CH0.CTRL |= 128;
ADCA.CTRLA |= 4; // start channel 0
}
И прерывание ДМА:
CODE
ISR(DMA_CH0_vect)
{
_DebugMes(USARTE0, "DMA interrupt\r\n", 19);
ADCA.CTRLA = 0;
Flags = ADC_CONVERSION_COMPLETE;
DMA.CH0.CTRLB |= (1 << 4) | (1 << 5);
}
В итоге получается что измерения не происходит...в прерывание не когда не входим...и...если вывожу значения из буфера, то там нули. В чём моя ошибка?
+Вопрос: ставлю на АЦП частоту в 250кГЦ, знаковый режим, 8 бит... по даташиту получаю задержку распространения в 20мкс что соответствует реально 50000 выборок в секунду, так же в даташите сказано при 8 разрядах минимальная задержка распространения 2,5 мкс что чоответствует 400000 выборок... и там же говорят что максимальная частота преобразований 2 мегавыборки...Врут?...противоречат сами себе? Или используя ДМА эта задержка убирается?
И в добавок: какую максимальную частоту можно подавать на АЦП? Например, когда я подавал 500КГц и мерил синусоиду к 63,5КГц, всё было ок... крачивая такая синусойда на графике))), а вот когда увеличивал частоту до 1МГц, то получал полную белиберду!!!!