MDD 0 6 декабря, 2009 Опубликовано 6 декабря, 2009 · Жалоба У меня вопрос. AVR ISP Поддерживает ATXmega32А4 ? По документации она подерживает из 32 только ATXmega32D4. ISP MKII через последние студии поддерживает - см скриншот. Хотя в документации действительно указан только ATXmega32D4. Но документация не только в этом отстает. Например, в ней не указано как шить Хмеги через командную строку. Хотя умеет. Строка должна выглядеть примерно так: stk500.exe -cUSB -dATxmega32A4 -md -e -iffile.hex -pf -vf Магический ключ для нас md(интерфейс PDI), остальное по документации. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Склихасовский 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 (изменено) · Жалоба Ребят вот пытаюсь разобраться с контроллером DMA задача перекачать 80байт данных по USART (режим передатчика) Как сие можно реализовать через DMA? Читаю ДШ - что то ясно, чтото нет!! прерываться через каждый переданный байт нехочется когда есть такая штука как дма... Изменено 7 декабря, 2009 пользователем Склихасовский Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 8 8 декабря, 2009 Опубликовано 8 декабря, 2009 · Жалоба Ребят вот пытаюсь разобраться с контроллером DMA задача перекачать 80байт данных по USART (режим передатчика) Как сие можно реализовать через DMA? Читаю ДШ - что то ясно, чтото нет!! прерываться через каждый переданный байт нехочется когда есть такая штука как дма... А в чем проблема-то? Все работает! Пишете адресом источника ваш адрес передающего буфера (TransBuffer), режим с автоинкрементированием и перезагрузкой адреса по окончании сеанса, Пишете адресом приемника регистр данных нужного UARTа, режим фиксированного адреса, В TRFCNT пишете число байт для передачи И запускаете DMA на побайтную передачу из TransBuffer в USARTпо флагу DREIF Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Склихасовский 0 8 декабря, 2009 Опубликовано 8 декабря, 2009 (изменено) · Жалоба дык , я никогда дела с дма не имел вот и пытаюь разобраться что куда записывать и как это работает... спасибо за ответ! Одного канала для этой задачи, я так понял, хватит? ещё вопрос реально ли такая задача по сигналу из таймера автоматически инкрементировать Nое колво ячеек озу? тоесть независимо друг от друга увеличивать на 1? Изменено 8 декабря, 2009 пользователем Склихасовский Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 8 декабря, 2009 Опубликовано 8 декабря, 2009 · Жалоба Я брал АппНоут с сайта атмела про ДМА. И делал следующее: 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 не сложнее. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 8 8 декабря, 2009 Опубликовано 8 декабря, 2009 · Жалоба ещё вопрос реально ли такая задача по сигналу из таймера автоматически инкрементировать Nое колво ячеек озу? тоесть независимо друг от друга увеличивать на 1? Через DMA нереально, DMA предназначен для пересылки данных без участия процессора, а не для арифметических операций. А программно по прерыванию от таймера можно все что угодно объинкрементировать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MDD 0 8 декабря, 2009 Опубликовано 8 декабря, 2009 (изменено) · Жалоба Через DMA нереально Ну, строго говоря, извратиться можно - за счет автоинкремента адреса. Т.е. берем область памяти и предварительно заполняем ее возрастающими данными. Для байтового счетчика потребуется 256 байт, для большего - страшно подумать. Затем настраиваем ДМА по каждому событию от таймера менять адрес источника при неизменном адресе приемника... Только это слишком накладный по расходу памяти способ. В Хмеге ресурсов вполне достаточно, чтобы такую задачу решить "по человечески" - через те же прерывания, как уже посоветовали. Или, если есть свободные таймеры, то для нескольких "ячеек" можно инкрементировать показания прямо на них минуя процессор. Изменено 8 декабря, 2009 пользователем MDD Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Народ, подскажите плиз. Можно ли у ATXMega128A1 в режиме EBI LCP3 ALE1 использовать ножку PH3 как General IO? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitek101 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Здравствуйте. Извините, что вмешался Я тоже делаю ДМА для УАРТа, сделал по примеру из 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 - длина массива Проблема в том, что правильно передаются только три байта, дальше всякий мусор. Пробовал изменять все параметры (перезагрузка адреса, декремент, длина блока, даблбуффер, ...) - то же самое. В чем может быть дело? :05: Разобрался. Почему-то такая штука была при локально объявленном буфере. Объявил глобально и все прошло :twak: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Разобрался. Почему-то такая штука была при локально объявленном буфере. Объявил глобально и все прошло :twak: А ну это и логично. можешь объявить его локально но static. Эффект будет тоже положительный. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MDD 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Собственно вопрос: как делает схему RESETа, именно для XMEG? Атмел разродился апликухой на эту тему: http://www.atmel.com/dyn/resources/prod_do...nts/doc8278.pdf Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Склихасовский 0 11 декабря, 2009 Опубликовано 11 декабря, 2009 (изменено) · Жалоба разбираюсь с EEPROM... Адресация через MEMORY MAPPED Такой вопрос. нужно записать данные по коссвенному адресу $1020...$103F получается, что номер страницы =1 и вот тут че то не понятка что нужно вводить в регистр адреса NVM? адрес страницы? адрес по memory map? какой кайф от этой проекции еепрома на адреса с $1000, если при записи приходится все равно пересчитывать на страницы? Изменено 11 декабря, 2009 пользователем Склихасовский Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MDD 0 11 декабря, 2009 Опубликовано 11 декабря, 2009 · Жалоба что нужно вводить в регистр адреса NVM? адрес страницы? адрес по memory map? какой кайф от этой проекции еепрома на адреса с $1000, если при записи приходится все равно пересчитывать на страницы? Судя по примеру в AVR1315 действительно адрес страницы. Сейчас тоже изучаю EEPROM и что-то эти страницы в Хмегах меня напрягают. Получается что в общем случае просто тупо записать один байт в EEPROM не переписывая страницы вообще нельзя? Надо будет попробовать в ИАРе объявить переменные __eeprom и поманипулировать ими. И посмотреть листинг... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Склихасовский 0 12 декабря, 2009 Опубликовано 12 декабря, 2009 (изменено) · Жалоба да получается, что предварительно стереть нужно Вообще все это очень напоминает DATAFLASH Изменено 12 декабря, 2009 пользователем Склихасовский Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MDD 0 12 декабря, 2009 Опубликовано 12 декабря, 2009 · Жалоба Вообще все это очень напоминает DATAFLASH Судя по всему так и есть. Используется один и тот же NVM контроллер, времена записи и хранения по даташиту подозрительно близки. Уменьшили только размер страницы и добавили режим Split Write, который позволяет дописывать соседние ячейки не стирая страницы... В общем-то такой EEPROM покатит для большинства применений, но страничная организация выглядит как шаг назад. Наверное у Атмела для такой организации были веские причины. Кстати, иаровская билиотека для работы с EEPROM написана на ассемблере, исходники в файле eeprom_xmega.s90 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться