16+
Понедельник
22 октября
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры AVR

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
Apтём  (01.05.2017 00:49 - 01.05.2017 00:58) , в ответ на Спасибо за труды! У меня получилось вот что (кое-где отступила от рекомендаций): автор: Ксения
Вроде всё верно. Сойдет вообщем. 
DMA.CH0.CTRLB |= DMA_CH_TRNINTLVL_LO_gc;
Или там по умолчанию лежит что-то полезное?
Правильнее использовать = (если из main, то есть при запуске очередной транзакции), потому как ничего полезного там не лежит. Разве что флаги сработавших прерываний зодно сбросить (но они в прерывании сбрасываются).
3. Достаточно ли этого для разрешения прерывания или надо еще где-то заглушки снимать?
Ещё нужно
	PMIC.CTRL=0
		| (0<<PMIC_RREN_bp)
		| (0<<PMIC_IVSEL_bp)
		| (1<<PMIC_HILVLEN_bp)
		| (1<<PMIC_MEDLVLEN_bp)
		| (1<<PMIC_LOLVLEN_bp)
		;
Больше ничего не надо. Хотя это и так понятно. Эту строку
DMA.CH0.CTRLA = DMA_CH_ENABLE_bm | DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_2BYTE_gc; // reload source after every burst, reload dest after every block
можно самой последней делать - если DMA_CH_ENABLE равно 1, то транзакция уже разрешена, а ещё ничего не настроено (мало ли что не так пойдёт). Это вообще лишнее, но мешать не будет:
DMA.CH0.REPCNT = 1;
Блок всё равно 1 на всю транзакцию.
#pragma vector=DMA_CH0_vect __interrupt void isrDMA0() {
 Flag |= Flag_DMA; // моя маска события 
DMA.INTFLAGS |= DMA_CH0TRNIF_bm;
}
Лучше так, но тоже не принципиально:
DMA.INTFLAGS = DMA_CH0TRNIF_bm;
В DMA.INTFLAGS точно ничего полезного нет.
"АЦП даже на макс. скорости выдает данные раз в ~160 тактов, ..." - не согласна. Если в даташите указана макс.частота 1 МГц, то ее периолд уже равен 32 такта, поскольку тактовая частота этого МК у меня 32 МГц.
Как бы правильно, но по факту АЦП у xmega на редкость мерзкая штука. Цифровая часть конечно может 1MS/s выдать, но при этом нелинейные искажения такие, что просто ужас (может нужно как-то входные цепи правильнее делать или ещё что...). Про конвейерный режим и не говорю - ад и израиль. Или у вас как-то по-другому?
5. В каком регистре можно удостовериться, что канал DMA свое задание выполнил и остановился, если не использовать для этой цели прерывание?
DMA.INTFLAGS:
When a transaction on channel n has been completed, the CHnTRFIF flag will be set. If unlimited repeat count is enabled, this flag is read as one after each block transfer. Writing a one to this bit location will clear the flag.
или DMA.CHx.CTRLA бит ENABLE (для многоблочной транзакции):
Bit 7 – ENABLE: Channel Enable Setting this bit enables the DMA channel. This bit is automatically cleared when the transaction is completed.
6. Можно ли во время выполнения DMA своего задания выяснить, насколько далеко оно продвинулось?
Есть регистр DMA.CHx.TRFCNT. По его содержимому можно узнать как далеко транзакция продвинулась. P.S. Тут был недавно пост про DMA канал как аппаратный FIFO.
которых от 12-разрядного АЦП никогда не бывает, а потом просматривать от конца к началу, но как-то это не элегантно.
Можно и так, но зачем? В ДМА всё что надо есть.
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7527 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVIII