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

 
 
> 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, 17:51
Сообщение #2


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

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



АЦП останавливается по прерыванию от часов реального времени..

Разобрался почему регистр читается как 4652. Дело в том, что после того DMA.CH0.TRFCNT доходит до нуля, он (регистр) снова становится равным предыдущему значению (т.е. 4652), но при этом происходит сброс бита разрешения канала DMA и DMA далее не работает. Что это глюк МК или где-то есть ошибка?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 13 2014, 18:58
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(KIG @ Jan 13 2014, 19:51) *
Разобрался почему регистр читается как 4652. Дело в том, что после того DMA.CH0.TRFCNT доходит до нуля, он (регистр) снова становится равным предыдущему значению (т.е. 4652)

В мануале так и написано...

Цитата(KIG @ Jan 13 2014, 19:51) *
но при этом происходит сброс бита разрешения канала DMA и DMA далее не работает. Что это глюк МК или где-то есть ошибка?

Так и должно быть - смотрите в мануале описание регистра CTRLA. Там будет таблица (Table 5-4. Summary of triggers, transaction complete flag and channel disable according to DMA channel configuration.), где расписано когда dma останавливается и тп.
Чтобы dma работал без остановки нужно настроить регистрs канала так: REPEAT=1, SINGLE=1, REPCNT=0. По другому никак. Подойдёт ли вам такая настройка смотрите сами...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 19:58
Рейтинг@Mail.ru


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