Перейти к содержанию
    

У меня вопрос. AVR ISP Поддерживает ATXmega32А4 ? По документации она подерживает из 32 только ATXmega32D4.

ISP MKII через последние студии поддерживает - см скриншот. Хотя в документации действительно указан только ATXmega32D4.

Но документация не только в этом отстает. Например, в ней не указано как шить Хмеги через командную строку. Хотя умеет.

Строка должна выглядеть примерно так:

stk500.exe -cUSB -dATxmega32A4 -md -e -iffile.hex -pf -vf

Магический ключ для нас md(интерфейс PDI), остальное по документации.

post-16862-1260075923_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребят вот пытаюсь разобраться с контроллером DMA

задача перекачать 80байт данных по USART (режим передатчика)

Как сие можно реализовать через DMA?

Читаю ДШ - что то ясно, чтото нет!!

прерываться через каждый переданный байт нехочется когда есть такая штука как дма...

Изменено пользователем Склихасовский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребят вот пытаюсь разобраться с контроллером DMA

задача перекачать 80байт данных по USART (режим передатчика)

Как сие можно реализовать через DMA?

Читаю ДШ - что то ясно, чтото нет!!

прерываться через каждый переданный байт нехочется когда есть такая штука как дма...

А в чем проблема-то? Все работает!

Пишете адресом источника ваш адрес передающего буфера (TransBuffer), режим с автоинкрементированием и перезагрузкой адреса по окончании сеанса,

Пишете адресом приемника регистр данных нужного UARTа, режим фиксированного адреса,

В TRFCNT пишете число байт для передачи

И запускаете DMA на побайтную передачу из TransBuffer в USARTпо флагу DREIF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дык , я никогда дела с дма не имел

вот и пытаюь разобраться что куда записывать и как это работает...

спасибо за ответ!

Одного канала для этой задачи, я так понял, хватит?

ещё вопрос

реально ли такая задача

по сигналу из таймера автоматически инкрементировать Nое колво ячеек озу? тоесть независимо друг от друга увеличивать на 1?

Изменено пользователем Склихасовский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я брал АппНоут с сайта атмела про ДМА. И делал следующее:

    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 не сложнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ещё вопрос

реально ли такая задача

по сигналу из таймера автоматически инкрементировать Nое колво ячеек озу? тоесть независимо друг от друга увеличивать на 1?

Через DMA нереально, DMA предназначен для пересылки данных без участия процессора, а не для арифметических операций. А программно по прерыванию от таймера можно все что угодно объинкрементировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Через DMA нереально

Ну, строго говоря, извратиться можно - за счет автоинкремента адреса.

Т.е. берем область памяти и предварительно заполняем ее возрастающими данными. Для байтового счетчика потребуется 256 байт, для большего - страшно подумать.

Затем настраиваем ДМА по каждому событию от таймера менять адрес источника при неизменном адресе приемника...

Только это слишком накладный по расходу памяти способ. В Хмеге ресурсов вполне достаточно, чтобы такую задачу решить "по человечески" - через те же прерывания, как уже посоветовали. Или, если есть свободные таймеры, то для нескольких "ячеек" можно инкрементировать показания прямо на них минуя процессор.

Изменено пользователем MDD

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ, подскажите плиз. Можно ли у ATXMega128A1 в режиме EBI LCP3 ALE1 использовать ножку PH3 как General IO?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Извините, что вмешался :biggrin:

Я тоже делаю ДМА для УАРТа, сделал по примеру из 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался. Почему-то такая штука была при локально объявленном буфере. Объявил глобально и все прошло :twak:

А ну это и логично. можешь объявить его локально но static. Эффект будет тоже положительный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно вопрос: как делает схему RESETа, именно для XMEG?

 

Атмел разродился апликухой на эту тему:

http://www.atmel.com/dyn/resources/prod_do...nts/doc8278.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

разбираюсь с EEPROM...

Адресация через MEMORY MAPPED

Такой вопрос.

нужно записать данные по коссвенному адресу $1020...$103F

получается, что номер страницы =1

и вот тут че то не понятка

что нужно вводить в регистр адреса NVM?

адрес страницы?

адрес по memory map?

какой кайф от этой проекции еепрома на адреса с $1000, если при записи приходится все равно пересчитывать на страницы?

Изменено пользователем Склихасовский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что нужно вводить в регистр адреса NVM?

адрес страницы?

адрес по memory map?

какой кайф от этой проекции еепрома на адреса с $1000, если при записи приходится все равно пересчитывать на страницы?

Судя по примеру в AVR1315 действительно адрес страницы.

Сейчас тоже изучаю EEPROM и что-то эти страницы в Хмегах меня напрягают. Получается что в общем случае просто тупо записать один байт в EEPROM не переписывая страницы вообще нельзя?

Надо будет попробовать в ИАРе объявить переменные __eeprom и поманипулировать ими. И посмотреть листинг...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да получается, что предварительно стереть нужно

Вообще все это очень напоминает DATAFLASH

Изменено пользователем Склихасовский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще все это очень напоминает DATAFLASH

Судя по всему так и есть. Используется один и тот же NVM контроллер, времена записи и хранения по даташиту подозрительно близки.

Уменьшили только размер страницы и добавили режим Split Write, который позволяет дописывать соседние ячейки не стирая страницы...

В общем-то такой EEPROM покатит для большинства применений, но страничная организация выглядит как шаг назад. Наверное у Атмела для такой организации были веские причины.

Кстати, иаровская билиотека для работы с EEPROM написана на ассемблере, исходники в файле eeprom_xmega.s90

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...