Jump to content

    
Sign in to follow this  
zombi

ATxmega

Recommended Posts

У меня вопрос. 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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Edited by Склихасовский

Share this post


Link to post
Share on other sites
Ребят вот пытаюсь разобраться с контроллером DMA

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

ещё вопрос

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

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

Edited by Склихасовский

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
ещё вопрос

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

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

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

Share this post


Link to post
Share on other sites
Через DMA нереально

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

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

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

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

Edited by MDD

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Здравствуйте. Извините, что вмешался :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:

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

адрес по memory map?

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

Edited by Склихасовский

Share this post


Link to post
Share on other sites
что нужно вводить в регистр адреса NVM?

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

адрес по memory map?

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

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

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

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

Share this post


Link to post
Share on other sites
Вообще все это очень напоминает DATAFLASH

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

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

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

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this