Необходимо брать отсчет по двум каналам АЦП без джиттера. Возникла идея использовать механизм запуска измерения от таймера. Сделано примерно так:
Код
SetPwrDn(true); // включить АЦП
InputOnMask(0xFF); // вкючить все каналы
SetIntMask(1<<1); // прерывание после завершения измерения по второму из них
SetSampleClock(4500000L); // частота тактироания АЦП
SetResBitNum(10); // разрешение в 10 бит
SetFiq(); // установить указатель на обработчик FIQ
StartType(CAdcDeviceBase::ENoStart); // выставить бит BURST
SetBurst(true);
StartType(CAdcDeviceBase::EOnMatSecSec); // запуск по каналу MAT1.1
// настраиваем таймер
Reset();
SetPreDiv(0);
// настраиваем перезагрузку счетчика и действие
// (канал, прерывание, перезагрузка, остановка, значение, действие)
SetMatchAction(1, false, true, false, 180000L, CTimerDeviceBase::ESetHi);
ClrExtMatchOut(1); // сбросить выход в 0
Start();
InputOnMask(0xFF); // вкючить все каналы
SetIntMask(1<<1); // прерывание после завершения измерения по второму из них
SetSampleClock(4500000L); // частота тактироания АЦП
SetResBitNum(10); // разрешение в 10 бит
SetFiq(); // установить указатель на обработчик FIQ
StartType(CAdcDeviceBase::ENoStart); // выставить бит BURST
SetBurst(true);
StartType(CAdcDeviceBase::EOnMatSecSec); // запуск по каналу MAT1.1
// настраиваем таймер
Reset();
SetPreDiv(0);
// настраиваем перезагрузку счетчика и действие
// (канал, прерывание, перезагрузка, остановка, значение, действие)
SetMatchAction(1, false, true, false, 180000L, CTimerDeviceBase::ESetHi);
ClrExtMatchOut(1); // сбросить выход в 0
Start();
далее в обработчике FIQ:
Код
unsigned i = 0; // считать все результаты
for(i=0; i<8; ++i){ // этим, также, сбрасывается прерывание
AdcData_t Dat = ReadCurVal(i);
}
StartType(CAdcDeviceBase::ENoStart); // Прерываем оцифровку по BURST
SetBurst(false);
SetBurst(true); // подготовились к следующему циклу
StartType(CAdcDeviceBase::EOnMatSecSec);
ClrExtMatchOut(1); // сбросить выход MAT1.1
for(i=0; i<8; ++i){ // этим, также, сбрасывается прерывание
AdcData_t Dat = ReadCurVal(i);
}
StartType(CAdcDeviceBase::ENoStart); // Прерываем оцифровку по BURST
SetBurst(false);
SetBurst(true); // подготовились к следующему циклу
StartType(CAdcDeviceBase::EOnMatSecSec);
ClrExtMatchOut(1); // сбросить выход MAT1.1
Проблема заключается в том, что когда этот механизм применяется к одному каналу, без использования сканирования по BURST, то все прекрасно работает. Если использовать просто BURST, без таймера, то тоже все хорошо. А вот так не хочет.
Все ли правильно запущено и проинициализированно?
Возможен ли подобный режим вообще?
Best regards, Sergei