|
ADC+DMA AVR ATxmega192 |
|
|
|
Jan 13 2014, 07:12
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884

|
Добрый день! Использую DMA для передачи значений АЦП в буфер (массив из 4652 ячеек). Останов преобразований АЦП происходит в произвольный момент времени. Однако регистр DMA.CH0.TRFCNT всегда считываю равным 4652. Подскажите, пожалуйста, в чем ошибка? Я пишу в буфер по кругу (т.е. когда дохожу до конца массива перепрыгиваю на начало), поэтому мне необходимо знать номер ячейки массива, где записана последняя точка. Инициализацию DMA и считывание регистра DMA.CH0.TRFCNT следующим образом: Код void DMAC_init() { DMA.CTRL=0;//DMA отключен DMA.CH0.CTRLA|=(1<<7)|(1<<2);//посылка из 1 байта //разрешение работы 0 канала DMA //singleshot DMA.CH0.ADDRCTRL|=(1<<3)|(1<<2);//Начальное значение перезагружается // в регистр адреса получателя DMA в конце каждой транзакции DMA.CH0.ADDRCTRL|=(1);//Инкрементное увеличение адреса получателя DMA.CH0.TRIGSRC=0x20;//Запуск оn ADCB DMA.CH0.TRFCNT=4652;//Количество байт в блоке DMA.CH0.SRCADDR0=0x64;//младший байт адреса RESL ADCB.CH0 DMA.CH0.SRCADDR1=0x02;//старший байт адреса RESL ADCB.CH0 DMA.CH0.DESTADDR0=((int)&Ch0)&255; DMA.CH0.DESTADDR1=((int)&Ch0)>>8; }
void main { DMAC_init(); DMA.CTRL|=(1<<7);//Включили DMA ADCB_init(); ADCB.CTRLA|=1;//Включаем АЦП ADCB.CTRLB|=(1<<3); // Старт первого преобразования АЦП
//.... //работа DMA;
ADCB.CTRLA=0;//Отключил АЦП unsigned int ch_i; ch_i=DMA.CH0.TRFCNT; } Заранее спасибо!
|
|
|
|
|
 |
Ответов
|
Jan 13 2014, 09:56
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884

|
Артем, спасибо! Дело в том, что АЦП останавливается в произвольный момент, поэтому меня сильно смущает факт достижения нуля регистром DMA.CH0.TRFCNT именно в тот момент, когда останавливается АЦП. Проверял это несколько раз - всегда одно и тоже.
Регистры DESTADDR2 (и SRCADDR2) не инициализировал, т.к. для моих адресов они равны нулю. По правильному, кончено, надо их записать как нули, однако, думаю, что это не влияет на чтение. При проверке подавал сигнал 300 Гц от цифрового осциллографа. Считанный с МК сигнал совпадал по амплитуде и частоте.
Все таки здесь что-то еще.. может есть еще предположения?
|
|
|
|
|
Jan 13 2014, 10:44
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(KIG @ Jan 13 2014, 11:56)  Дело в том, что АЦП останавливается в произвольный момент, поэтому меня сильно смущает факт достижения нуля регистром DMA.CH0.TRFCNT именно в тот момент, когда останавливается АЦП. В смысле в произвольный момент? простите не понял... Цитата(KIG @ Jan 13 2014, 11:56)  Регистры DESTADDR2 (и SRCADDR2) не инициализировал, т.к. для моих адресов они равны нулю. По правильному, кончено, надо их записать как нули Попробуйте делать правильно...вам что 3 такта на запись в регистр жалко? Может в этом дело? Хотя кто его знает...
|
|
|
|
Сообщений в этой теме
KIG ADC+DMA AVR ATxmega192 Jan 13 2014, 07:12 _Артём_ Цитата(KIG @ Jan 13 2014, 09:12) Однако р... Jan 13 2014, 09:04 KIG АЦП останавливается по прерыванию от часов реально... Jan 13 2014, 17:51 _Артём_ Цитата(KIG @ Jan 13 2014, 19:51) Разобрал... Jan 13 2014, 18:58 KIG Артем, еще раз спасибо.
Скачал новый даташит на ... Jan 14 2014, 10:10 KIG Добрый день!
В продолжении темы...
ЦитатаЧто... Jan 21 2014, 10:44 _Артём_ Цитата(KIG @ Jan 21 2014, 12:44) Однако, ... Jan 21 2014, 11:04 KIG Артем, спасибо за помощь. Попытаюсь объяснить подр... Jan 21 2014, 12:49 _Артём_ Цитата(KIG @ Jan 21 2014, 14:49) DMAС пре... Jan 21 2014, 13:21 KIG Артем, большое спасибо! Идея c ping-ping режим... Jan 21 2014, 14:33 _Артём_ Цитата(KIG @ Jan 21 2014, 16:33) CH0IF пр... Jan 21 2014, 17:19 KIG Спасибо еще раз, буду пробовать! Jan 22 2014, 04:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|