реклама на сайте
подробности

 
 
> ADC+DMA AVR ATxmega192
KIG
сообщение Jan 13 2014, 07:12
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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;
}


Заранее спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KIG
сообщение Jan 13 2014, 09:56
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884



Артем, спасибо!
Дело в том, что АЦП останавливается в произвольный момент, поэтому меня сильно смущает факт достижения нуля регистром DMA.CH0.TRFCNT именно в тот момент, когда останавливается АЦП. Проверял это несколько раз - всегда одно и тоже.

Регистры DESTADDR2 (и SRCADDR2) не инициализировал, т.к. для моих адресов они равны нулю. По правильному, кончено, надо их записать как нули, однако, думаю, что это не влияет на чтение. При проверке подавал сигнал 300 Гц от цифрового осциллографа. Считанный с МК сигнал совпадал по амплитуде и частоте.

Все таки здесь что-то еще.. может есть еще предположения?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 13 2014, 10:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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 такта на запись в регистр жалко? Может в этом дело?
Хотя кто его знает...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 06:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016