|
|
  |
ATxmega |
|
|
|
Dec 6 2009, 05:08
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 7-05-06
Пользователь №: 16 862

|
Цитата(talex85 @ Dec 4 2009, 23:27)  У меня вопрос. AVR ISP Поддерживает ATXmega32А4 ? По документации она подерживает из 32 только ATXmega32D4. ISP MKII через последние студии поддерживает - см скриншот. Хотя в документации действительно указан только ATXmega32D4. Но документация не только в этом отстает. Например, в ней не указано как шить Хмеги через командную строку. Хотя умеет. Строка должна выглядеть примерно так: stk500.exe -cUSB -dATxmega32A4 -md -e -iffile.hex -pf -vf Магический ключ для нас md(интерфейс PDI), остальное по документации.
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 8 2009, 01:13
|

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Цитата(Склихасовский @ Dec 8 2009, 04:59)  Ребят вот пытаюсь разобраться с контроллером DMA задача перекачать 80байт данных по USART (режим передатчика) Как сие можно реализовать через DMA? Читаю ДШ - что то ясно, чтото нет!! прерываться через каждый переданный байт нехочется когда есть такая штука как дма... А в чем проблема-то? Все работает! Пишете адресом источника ваш адрес передающего буфера (TransBuffer), режим с автоинкрементированием и перезагрузкой адреса по окончании сеанса, Пишете адресом приемника регистр данных нужного UARTа, режим фиксированного адреса, В TRFCNT пишете число байт для передачи И запускаете DMA на побайтную передачу из TransBuffer в USARTпо флагу DREIF
|
|
|
|
|
Dec 8 2009, 06:21
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Я брал АппНоут с сайта атмела про ДМА. И делал следующее: Код DMA_ConfigDoubleBuffering(DMA_DBUFMODE_DISABLED_gc); DMA_SetPriority(DMA_PRIMODE_RR0123_gc); DMA_SetupBlock(&DMA.CH0, //Канал ДМА &ADCA.CH0RES, //Сюда тебе нужно будет указать начальный адрес буфера в памяти DMA_CH_SRCRELOAD_NONE_gc, //тут условие сброса адреса например DMA_CH_SRCRELOAD_BLOCK_gc DMA_CH_SRCDIR_FIXED_gc, // условие изменения адреса буфера например DMA_CH_SRCDIR_INC_gc, input, //Адрес от куда брать значение на подобие &ADCA.CH0RES тока адрес UDR DMA_CH_DESTRELOAD_BLOCK_gc, //всё так де как и с источником, только ничего инкрементировать не надо, и перезагружать тоже. DMA_CH_DESTDIR_INC_gc, //т.е. замени это всё на NONE, FIXED, MAX_FRAMESIZE*sizeof(Word16), //Размер буфера назаначения DMA_CH_BURSTLEN_2BYTE_gc, //по сколько байт за "раз" перемещать 0, // сколько раз повторять действите 0 - бесконечно false); //разрешено ли повторение DMA_SetTriggerSource(&DMA.CH0,DMA_CH_TRIGSRC_ADCA_CH0_gc); //Триггер запуска DMA тут тебе надо будет установить UART см. даташит DMA_EnableSingleShot(&DMA.CH0); //выполнять по 1 перемещению за раз DMA_SetIntLevel(&DMA.CH0, DMA_CH_TRNINTLVL_HI_gc, DMA_CH_ERRINTLVL_OFF_gc); //вызывать прерывание DMA_Enable(); DMA_EnableChannel(&DMA.CH0); Это пример про ADC но с UART не сложнее.
|
|
|
|
|
Dec 8 2009, 10:26
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 7-05-06
Пользователь №: 16 862

|
Цитата(V_G @ Dec 8 2009, 08:49)  Через DMA нереально Ну, строго говоря, извратиться можно - за счет автоинкремента адреса. Т.е. берем область памяти и предварительно заполняем ее возрастающими данными. Для байтового счетчика потребуется 256 байт, для большего - страшно подумать. Затем настраиваем ДМА по каждому событию от таймера менять адрес источника при неизменном адресе приемника... Только это слишком накладный по расходу памяти способ. В Хмеге ресурсов вполне достаточно, чтобы такую задачу решить "по человечески" - через те же прерывания, как уже посоветовали. Или, если есть свободные таймеры, то для нескольких "ячеек" можно инкрементировать показания прямо на них минуя процессор.
Сообщение отредактировал MDD - Dec 8 2009, 10:29
|
|
|
|
|
Dec 9 2009, 06:58
|

Участник

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013

|
Здравствуйте. Извините, что вмешался Я тоже делаю ДМА для УАРТа, сделал по примеру из 185 поста. Настроил так: Код DMA_ConfigDoubleBuffering(DMA_DBUFMODE_DISABLED_gc); DMA_SetPriority(DMA_PRIMODE_RR0123_gc); DMA_SetupBlock(&DMA.CH0, &bbb, DMA_CH_SRCRELOAD_NONE_gc, DMA_CH_SRCDIR_INC_gc, &USARTF0.DATA, DMA_CH_DESTRELOAD_NONE_gc, DMA_CH_DESTDIR_FIXED_gc, len, DMA_CH_BURSTLEN_1BYTE_gc, 0, false); DMA_SetTriggerSource(&DMA.CH0,DMA_CH_TRIGSRC_USARTF0_DRE_gc); DMA_EnableSingleShot(&DMA.CH0); DMA_SetIntLevel(&DMA.CH0, DMA_CH_TRNINTLVL_HI_gc, DMA_CH_ERRINTLVL_HI_gc); DMA_Enable(); DMA_EnableChannel(&DMA.CH0); bbb - обычный массив len - длина массива Проблема в том, что правильно передаются только три байта, дальше всякий мусор. Пробовал изменять все параметры (перезагрузка адреса, декремент, длина блока, даблбуффер, ...) - то же самое. В чем может быть дело?  Разобрался. Почему-то такая штука была при локально объявленном буфере. Объявил глобально и все прошло
|
|
|
|
|
Dec 11 2009, 21:16
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 7-05-06
Пользователь №: 16 862

|
Цитата(Склихасовский @ Dec 11 2009, 20:11)  что нужно вводить в регистр адреса NVM? адрес страницы? адрес по memory map? какой кайф от этой проекции еепрома на адреса с $1000, если при записи приходится все равно пересчитывать на страницы? Судя по примеру в AVR1315 действительно адрес страницы. Сейчас тоже изучаю EEPROM и что-то эти страницы в Хмегах меня напрягают. Получается что в общем случае просто тупо записать один байт в EEPROM не переписывая страницы вообще нельзя? Надо будет попробовать в ИАРе объявить переменные __eeprom и поманипулировать ими. И посмотреть листинг...
|
|
|
|
|
Dec 12 2009, 09:21
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 7-05-06
Пользователь №: 16 862

|
Цитата(Склихасовский @ Dec 12 2009, 09:34)  Вообще все это очень напоминает DATAFLASH Судя по всему так и есть. Используется один и тот же NVM контроллер, времена записи и хранения по даташиту подозрительно близки. Уменьшили только размер страницы и добавили режим Split Write, который позволяет дописывать соседние ячейки не стирая страницы... В общем-то такой EEPROM покатит для большинства применений, но страничная организация выглядит как шаг назад. Наверное у Атмела для такой организации были веские причины. Кстати, иаровская билиотека для работы с EEPROM написана на ассемблере, исходники в файле eeprom_xmega.s90
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|