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

 
 
> 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



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:33
Рейтинг@Mail.ru


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