Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATxmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4, 5, 6, 7
Rst7
Цитата
Может он не заморачивался просто.


Да, такой фразой можно оправдать любой прокол. Если уж заявляешь, что для тебя это самое ресурсоемкое место в коде, то фраза "не заморачивался" выглядит как-то не к месту wink.gif
Prov
Цитата(Rst7 @ Oct 2 2009, 21:42) *
..бинарный поиск надо знать как "Отче наш" - неужели 18 сравнений занимают столько времени?

Категоричность суждений, как способ поиска оптимального решения, может иметь место только при знании обсуждаемого предмета и, обычно, говорит только о недостатке практического опыта. Я не детализировал задачу потому, что меня интересует ответ на конкретный вопрос: работа xmeg'и на 32 Мгц (на больше никто не пробовал разгонять?).
А как применить бинарный поиск, если записи (которые не у меня формируются) расположены неупорядочено-последовательно (добавляются в конец списка по мере поступления, при удалении устанавливается соотв.признак и повлиять на это нет возможности) известные мне теории почему-то не излагают. Кстати, у меня не 18 сравнений, а 3-4, а время уходит не на сравнение, а на доступ к записи.
Спасибо SasaVitebsk за косвенную поддержку.
Rst7
Цитата
Я не детализировал задачу


Тогда к чему конкретика из серии "150 тысяч записей", "на LPC - 4...6мс", "устроит 50мс" и т.д.? Каким таким практическим опытом Вы хотите тут блеснуть?
Duhas
кто нибудь освоил Ivent System? хочу вывести на лапку такт/2-4

AVR XMEGA A Manual Preliminary 72 страница.. продолжение таблицы 6-3... в CH0MUX пишу соответственно 1000 (M).. про M кстати тоже не понятно как там в 4 бита запихали диапазон 1-32768...

да и как заставить ногу дергаться по ивенту тоже не вкурил (

пишу на АСМ..

в догонку вопрос по ДМА.. система собыйтий считается системным тригер сурсом для ДМА? т.е. тригер соурс адрес 0х01+смещение? в зависимости от канала ивент систем?
Александр Куличок
С хмегой не работал. Беглым взглядом по даташиту нашел следующее:
На порты PC7, PD7, PE7 можно вывести клок периферии.
Также на порты PC7, PD7, PE7 можно вывести ивент канала 0.
Как это сделать - в описании регистра CLKEVOUT, раздел 13.5.4
На другие пины ивенты не выводятся. Так же, как и ивенты других каналов нельзя вывести на пины.

Цитата
хочу вывести на лапку такт/2-4

Судя по таблице 6.3 при CH0MUX = 0b_1000_xxxx источником ивента как раз служит клок периферии. По поводу диапазона М = 1-32768 - наверное ошиблись. Или должно быть 1-16, или там стоит предделитель на 16 фиксированных значений, который забыли описать.Во всяком случае, перепробовать 16 значений с осциллографом не так уж тяжело. Интересно будет узнать результаты.

Далее...
Ширина импульса ивента, (в том числе того, что выведен на ножки), "will be visible on the port pin as long as the event last. Normally this is one peripheral clock cycle only." То есть, т.е. поделить частоту на 4 наверное можно (если предделитель == 4 ), но скважность выходного сигнала может отличаться от 2. (так как ивент не умеет делать toggle порта). Хотя если учесть, что "some event sources, such as low level on an I/O pin, will generate events continuously" и к таким "some event sources" относится и частота париферии, деленная на М, то можно ожидать и скважность, == 2. Хотя это маловероятно.

Цитата
система собыйтий считается системным тригер сурсом для ДМА? т.е. тригер соурс адрес 0х01+смещение? в зависимости от канала ивент систем?

Все верно. В Table 5-8 в 3-м столбце наверное просто забыли дописать слово "Event", так так в таблице 5.9 оно присутствует: Table 5-9. DMA Trigger sources, offset values for Event System triggers
Duhas
спасибо )

железа пока нет, мучаю симулятор...

Код
    ldi                tmp,                0b10000001
    sts        EVSYS_CH0MUX,    tmp
    ldi                tmp,                0b00000000
    sts        EVSYS_CH0CTRL,    tmp


вот так инициализирую первый канал.. в симуляторе реакции 0 ( ну собственно нада бы для начала в железо все это засунуть...
Duhas
поковырял чуток ДМА.. и тут вопрос..
DMA_CH0_TRFCNT
16-ти битный... ДШ говорит что сначала пишем DMA_CH0_TRFCNTL потом DMA_CH0_TRFCNTH, но таких регистров нет ) на запись в DMA_CH0_TRFCNT сначала младшего а следом старшего байтов студия не ругается, но и не реагирует....
V_G
Цитата(Duhas @ Oct 9 2009, 21:20) *
на запись в DMA_CH0_TRFCNT сначала младшего а следом старшего байтов студия не ругается, но и не реагирует....

Как это не реагирует?
Вот кусок моего кода настройки DMA на выдачу буфера в компорт:

CLI
STS DMA_CH1_TRFCNT,TxLen
CLR r16
STS DMA_CH1_TRFCNT+1,r16
SEI

Все арбайтен! Прерывания запретил, чтобы запись в 16-разрядный регистр случайно не прервалась. Так и атмеловцы рекомендуют. Может, у вас прерывания разрешены?
Да, и проц xmega32a4 вполне работает, из него 2 компорта и один SPI настроил на DMA.

Аааа, понял! Все 16-разрядные регистры у них по 2 адреса занимают, а вы писали в один, наверное! Ну, и 24-битные - соответственно - по 3 адреса, это на будущее!
Duhas
да я писал в один... в том де ДМА регистры адреса источника и приемника разбиты на 3 отдельных регистра... куда спокойно все пишется..
попробую ваш вариант...

железа пока нет.. как будет - смогу проверить все )
Leonmezon
К вопросу об макетах для Xmega:
Atmel с ноября выпустил в открытую продажу Evaluation Kit для AVR XMEGA - Xplain (вобщем не очень дорого кому самому лень делать макету) - самое главное сейчас полностью исправили документацию и ПО - так что можно взять за основу для своих проектов на Xmege (особенно интересна реализация смены прошивки через USB c помощью второго МК - может кому и пригодиться).
К вопросу по питанию:
Вышел даташит (с кодом) AVR1010 - как достигнуть мин. потребления на Xmege - кто нибудь проверял?
ZVA
All, доброго времени суток!
Небольшой вопрос. Не нашел в доках на Хмегу какое синфазное напряжение можно подавать на вход АЦП
работающего в диф. режиме. В еррате говорится о не превышении входного напряжения 2.4В. Хочу использовать
внутренний источник опорного 1 В, понятно что входной диф сигнал тоже будет не больше 1 В. А какое можно подавать синфазное, если питание 3,3В? Кто то с этим сталкивался? Например в АТiny45, которая тоже имеет диф. режим оговорено VIN Input Voltage должно лежать в диапазоне GND ... VREF.
ZVA
All, доброго времени суток!
Это снова я. По молчанию форума я понял, что реально с АЦП еще не работали. Буду разбираться сам.
После того как вчера спаял макетку с XMEGA128A3 настроил на 32МГц и поморгал светодиодом появился новый вопрос. Вывод RESET он же PDI_DATA я подтянул к +3В резистором 10К, а конденсатор ставить не стал дабы не мешать программированию. В доках на XMEGу есть: "The reset pin includes an internal pull-up resistor, and a spike filter to suppress noise." Но работая с AVR я привык ставить подтягивающий резистор и конденсатор на этот вывод.
Собственно вопрос: как делает схему RESETа, именно для XMEG, уважаемый All и какой у него практический опыт?
V_G
Никаких конденсаторов на ресет! Я даже в меге этого не делал. Там есть (и раньше была) схема POR (power-on reset), вырабатывающая сброс калиброванной длительности, которая программируется программатором. И с АЦП работали, просто мне дифф режим пока не нужен. Но судя по всему, по-прежнему нельзя превышать опорного
Огурцов
В меге работает и конденсатор и подтяжка. Последнее время в мегах перестал ставить подтяжку - конденсатор справляется. В иксмеге конденсатор ставить нельзя, поэтому буду ставить подтяжку - ибо нельзя, чтобы сбрасывалось от руки.
V_G
2 Огурцов
А зачем раньше (в мегах) конденсатор на ресет ставили, стесняюсь спросить? Чем-то POR не устраивал?
Огурцов
Слишком большое сопротивление у оригинальной подтяжки, а на все, что выше 10к прекрасно наводится от руки.
ZVA
Я начинал работать с AVR еще с AT90S1200 и там были проблемы со сбросом, потом когда появились меги
специально их гонял и тестировал при разных скоростях нарастания напряжения проблем небыло. Но по инерции подтяжка + конденсатор ставил во все проекты. Кроме того документ AVR042: AVR Hardware Design Considerations в главе 3 прямо говорит что схема ресета должна быть как показана на рис.3-1
Нажмите для просмотра прикрепленного файла
хотя там же дальше на рис.6-1 уже остался только подтягивающий резистор!?
V_G
Контроллеры совершенствуются, документы стареют. У меня тоже и в xmege осталась внешняя подтяжка ресета через 15-27 кОм. А конденсатор-диод - это еще со времен интеловских семейств 48 и 51, где не было внутренней схемы POR, а без диода при кратковременных пропаданиях питания (когда кондер разряжаться не успевал) система надежно зависала (или безнадежно, как кому нравится). У picoв вообще внешний ресет можно отключать, а дефицитную ножку использовать для работы, все вполне решается POR'oм
ZVA
Цитата(V_G @ Nov 12 2009, 16:41) *
Никаких конденсаторов на ресет! Я даже в меге этого не делал. Там есть (и раньше была) схема POR (power-on reset), вырабатывающая сброс калиброванной длительности, которая программируется программатором. И с АЦП работали, просто мне дифф режим пока не нужен. Но судя по всему, по-прежнему нельзя превышать опорного

V_G, какие впечатления от работы АЦП? А то тут пугали прыганием младших 4 разрядов. Хотя на выходные попробую уже сам.smile.gif По поводу опорного и синфазного сигнала вопрос возник из за того что я не нашел у ATXMEGи вывода внутреннего VREF, как было впросто MEGax. А к нему удобно было привязываться (используя для получения половины опорного или как виртуальный 0).
V_G
Честно говоря, я пока игнорирую 2 младших разряда АЦП - нынешняя прога для совместимости со старой версией на меге32 использует 10 разрядов. Но 2 младших не прыгают, все вполне корректно. Особенно нравится, что АЦП не надо запускать каждый раз - настроил его на циклическое измерение 4 каналов, и просто считываешь нужные ячейки, когда потребуется, безо всяких прерываний-ожиданий. Удобно, когда не важна точная привязка отсчета ко времени.
niXto
У всех тиней-мег-хмег Ресет тоже отключается и превращается в порт...

В моих проектах на Ресете вообще ничего нет, эксплуатация в комнатных условиях, все отлично работает...
V_G
Цитата(niXto @ Nov 13 2009, 17:54) *
У всех тиней-мег-хмег Ресет тоже отключается и превращается в порт...

В моих проектах на Ресете вообще ничего нет, эксплуатация в комнатных условиях, все отлично работает...


Чего-то в даташитах про меги 32,128 такого не нашел. На xmega32A4 единственная альтернативная функция ресета - тактирование отладочного интерфейса.
Про тайни могу поверить, плотно не работал.

Вы с клоками ресет не путаете часом? В клоках - да, есть альтернативные функции

Ну, и комнатные условия - не промышленные условия, и зачем-то я резистор на ресете оставил. Зачем - не помню, но было какое-то здравое соображение (помимо "наводки рукой")
Ronin
Цитата(niXto @ Nov 13 2009, 10:54) *
У всех тиней-мег-хмег Ресет тоже отключается и превращается в порт...


не у всех smile.gif
а у тех что отключается есть соображение что ISP отвалится которым большинство для прошивки пользуются smile.gif
MDD
Цитата(ZVA)
В еррате говорится о не превышении входного напряжения 2.4В. Хочу использовать
внутренний источник опорного 1 В

Кстати, у Хмеги не все гладко с опорными источниками.
По результатам измерений оказывается, что при использовании AREFA, AREFB в качестве опоры (у меня подключено к AVcc) из этого напряжения вначале вычитается около 0.6В. В ранних версиях даташита у них была подобная явно оговоренная опора Vcc-0.6В, но позже они заменили ее на Vcc/1.6В.
Похоже это как-то связано с Ерратой - не дают задирать опору. При питании устройства 3.3В это реально неудобно, хотелось бы иметь полный динамический диапазон.
V_G
Цитата(MDD @ Nov 14 2009, 06:49) *
Кстати, у Хмеги не все гладко с опорными источниками.
По результатам измерений оказывается, что при использовании AREFA, AREFB в качестве опоры (у меня подключено к AVcc) из этого напряжения вначале вычитается около 0.6В. В ранних версиях даташита у них была подобная явно оговоренная опора Vcc-0.6В, но позже они заменили ее на Vcc/1.6В.
Похоже это как-то связано с Ерратой - не дают задирать опору. При питании устройства 3.3В это реально неудобно, хотелось бы иметь полный динамический диапазон.

В суппорт (http://support.atmel.no/bin/customer) писали? Я как-то переписывался, вроде в новой партии что-то подправлено.
MDD
Я думаю, они и сами прекрасно знают о наличии этой проблемы, раз в Еррате пишут о потолке в 2.4В. Пока буду расчитывать на то, что есть. А со временем, если в новых ревизиях вычистят Еррату, параметры устройства только улучшатся...
ZVA
ALL, добрый день!
Пришла суббота biggrin.gif и удалось как планировал испытать XMEGу. Чем хочется поделиться с общественностью.
Сначала исходные данные:
ATXmega128A3, стабилизатор 317L, микросхемка ADM3485 и тестовый светодиод на односторонней печатной плате сделаной ЛУТ, напряжение питания 3,28В, тактирование от внутреннего RC генератора 32МГц, АЦП работал от внутреннего опорного 1В, использовался только один канал работающий в диф. включении.
Результаты:
1. В ответ на мой собственный вопрос о величине синфазного напряжения: при размахе входного диф сигнала +-1В оно может лежать в диапазоне 0...1,7В, то есть на положительном входе диф. каскада максимальное напряжение составило 2,7В, чтозначительно превышает опорное и позволяет смело использовать XMEGу в таком режиме совместно с мостовыми датчиками питающимися прямо от 3,3В. При повышении синфазного до 2В начинаются искажения входного сигнала.
2. Проверены собственные шумы АЦП в таком режиме для двух вариантов:
- выводы АЦП в диф. включении были замкнуты между собой резистором 2К и никуда не подключались, АЦП крутился в free run режиме и значения считывались асинхронно и передавались по RS485 в PC. Кроме этого в прерываниях от таймера формировалась пила на ЦАПе и моргал тестовый светодиод. Кроме собственно значений АЦП в RS485 передавались значения после фильтрации. Фильтр экспоненциальный(две строчки на С), я его обычно использую во всех задачах измерения постоянных сигналов.
Результаты без коментариев даны на рис.1
Нажмите для просмотра прикрепленного файла
- все тоже, но на замкнутые входы подано синфазное напряжение 1,5В в качестве которого использовался элемент АА.
результаты на рис.2
Нажмите для просмотра прикрепленного файла
Подчеркиваю плата односторонняя слоев земли и питания нет, правда преобразователь RS485/RS323 с гальванической развязкой.
Выводы, плохой камень или нет, делайте сами.
talex85
У меня вопрос. AVR ISP Поддерживает ATXmega32А4 ? По документации она подерживает из 32 только ATXmega32D4.

Хотелось бы узнать. А то собрал отладочную плату, а программатор не шьет. Возможно причина в конденсаторе на RESETE. Хотелось бы узнать ответ в эти выходные, чтобы в понедельник подправить плату.
V_G
1. Про AVR ISP не скажу, а JTAG ICE MkII шьет
2. Конденсатор на ресет ставить нельзя, если используется программирование по PDI
3. У меня первые (инженерные) 32А4 не шились при SUT != 0. А мне нужно 64 мс. Приходилось ставить SUT=0, потом прошивать, потом восстанавливать SUT=64. Писал в техподдержку, в серийных поправили.
talex85
Цитата(V_G @ Dec 5 2009, 05:10) *
1. Про AVR ISP не скажу, а JTAG ICE MkII шьет
2. Конденсатор на ресет ставить нельзя, если используется программирование по PDI
3. У меня первые (инженерные) 32А4 не шились при SUT != 0. А мне нужно 64 мс. Приходилось ставить SUT=0, потом прошивать, потом восстанавливать SUT=64. Писал в техподдержку, в серийных поправили.

СПС, заценим. JTAG нет. Ели не получится попрубую 128а1, но просто лень паять столько ног.
MDD
Цитата(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), остальное по документации.
Склихасовский
Ребят вот пытаюсь разобраться с контроллером DMA
задача перекачать 80байт данных по USART (режим передатчика)
Как сие можно реализовать через DMA?
Читаю ДШ - что то ясно, чтото нет!!
прерываться через каждый переданный байт нехочется когда есть такая штука как дма...
V_G
Цитата(Склихасовский @ Dec 8 2009, 04:59) *
Ребят вот пытаюсь разобраться с контроллером DMA
задача перекачать 80байт данных по USART (режим передатчика)
Как сие можно реализовать через DMA?
Читаю ДШ - что то ясно, чтото нет!!
прерываться через каждый переданный байт нехочется когда есть такая штука как дма...

А в чем проблема-то? Все работает!
Пишете адресом источника ваш адрес передающего буфера (TransBuffer), режим с автоинкрементированием и перезагрузкой адреса по окончании сеанса,
Пишете адресом приемника регистр данных нужного UARTа, режим фиксированного адреса,
В TRFCNT пишете число байт для передачи
И запускаете DMA на побайтную передачу из TransBuffer в USARTпо флагу DREIF
Склихасовский
дык , я никогда дела с дма не имел
вот и пытаюь разобраться что куда записывать и как это работает...
спасибо за ответ!
Одного канала для этой задачи, я так понял, хватит?
ещё вопрос
реально ли такая задача
по сигналу из таймера автоматически инкрементировать Nое колво ячеек озу? тоесть независимо друг от друга увеличивать на 1?
Spider
Я брал АппНоут с сайта атмела про ДМА. И делал следующее:
Код
    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
Цитата(Склихасовский @ Dec 8 2009, 14:59) *
ещё вопрос
реально ли такая задача
по сигналу из таймера автоматически инкрементировать Nое колво ячеек озу? тоесть независимо друг от друга увеличивать на 1?

Через DMA нереально, DMA предназначен для пересылки данных без участия процессора, а не для арифметических операций. А программно по прерыванию от таймера можно все что угодно объинкрементировать.
MDD
Цитата(V_G @ Dec 8 2009, 08:49) *
Через DMA нереально

Ну, строго говоря, извратиться можно - за счет автоинкремента адреса.
Т.е. берем область памяти и предварительно заполняем ее возрастающими данными. Для байтового счетчика потребуется 256 байт, для большего - страшно подумать.
Затем настраиваем ДМА по каждому событию от таймера менять адрес источника при неизменном адресе приемника...
Только это слишком накладный по расходу памяти способ. В Хмеге ресурсов вполне достаточно, чтобы такую задачу решить "по человечески" - через те же прерывания, как уже посоветовали. Или, если есть свободные таймеры, то для нескольких "ячеек" можно инкрементировать показания прямо на них минуя процессор.
Spider
Народ, подскажите плиз. Можно ли у ATXMega128A1 в режиме EBI LCP3 ALE1 использовать ножку PH3 как General IO?
vitek101
Здравствуйте. Извините, что вмешался biggrin.gif
Я тоже делаю ДМА для УАРТа, сделал по примеру из 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.gif

Разобрался. Почему-то такая штука была при локально объявленном буфере. Объявил глобально и все прошло twak.gif
Spider
Цитата(vitek101 @ Dec 9 2009, 12:58) *
Разобрался. Почему-то такая штука была при локально объявленном буфере. Объявил глобально и все прошло twak.gif

А ну это и логично. можешь объявить его локально но static. Эффект будет тоже положительный.
MDD
Цитата(ZVA @ Nov 12 2009, 10:22) *
Собственно вопрос: как делает схему RESETа, именно для XMEG?


Атмел разродился апликухой на эту тему:
http://www.atmel.com/dyn/resources/prod_do...nts/doc8278.pdf
Склихасовский
разбираюсь с EEPROM...
Адресация через MEMORY MAPPED
Такой вопрос.
нужно записать данные по коссвенному адресу $1020...$103F
получается, что номер страницы =1
и вот тут че то не понятка
что нужно вводить в регистр адреса NVM?
адрес страницы?
адрес по memory map?
какой кайф от этой проекции еепрома на адреса с $1000, если при записи приходится все равно пересчитывать на страницы?
MDD
Цитата(Склихасовский @ Dec 11 2009, 20:11) *
что нужно вводить в регистр адреса NVM?
адрес страницы?
адрес по memory map?
какой кайф от этой проекции еепрома на адреса с $1000, если при записи приходится все равно пересчитывать на страницы?

Судя по примеру в AVR1315 действительно адрес страницы.
Сейчас тоже изучаю EEPROM и что-то эти страницы в Хмегах меня напрягают. Получается что в общем случае просто тупо записать один байт в EEPROM не переписывая страницы вообще нельзя?
Надо будет попробовать в ИАРе объявить переменные __eeprom и поманипулировать ими. И посмотреть листинг...
Склихасовский
да получается, что предварительно стереть нужно
Вообще все это очень напоминает DATAFLASH
MDD
Цитата(Склихасовский @ Dec 12 2009, 09:34) *
Вообще все это очень напоминает DATAFLASH

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

Стирать не нужно, NVM сам сотрет только обновляемые ячейки на странице (насколько помню).
Вообще есть соотв AppNote, там все подробно объяснено, я сделал по нему, и все работает без проблем. На ассемблере, правда. Использовал заполнения страничного буфера как обычное копирование данных (с контролем перехода за границы страницы) и Atomic Write.

А не в memory mapped - используйте старые алгоритмы и пишите по байту, изменений особых нет.
Новый режим экономичней, если писать более одного байта.
MDD
Цитата
используйте старые алгоритмы


"Старые алгоритмы" недоступны, теперь в любом случае пишется только через буфер страницы. Только в первом случае (I/O-mapped) доступ к нему через NVM контроллер, во втором он мапится в память.
Запутал Атмел невнятным описанием этого своего страничного доступа. Значит получается, что во время Atomic Write на странице трутся только "потревоженные" в буфере ячейки, а не тупо вся страница. Типа, хочешь - пиши одной командой один байт, хочешь сразу всю страницу. А ведь первое впечатление было такое - раз очистил перед записью буфер, значит будет чиститься и страница...

Сейчас проверил через I/O-mapped доступ - действительно это так! Соседние, ранее записанные ячейки, не трет...
Значит все совсем неплохо smile.gif
Склихасовский
Цитата(V_G @ Dec 12 2009, 14:41) *
Стирать не нужно, NVM сам сотрет только обновляемые ячейки на странице (насколько помню).
Вообще есть соотв AppNote, там все подробно объяснено, я сделал по нему, и все работает без проблем. На ассемблере, правда. Использовал заполнения страничного буфера как обычное копирование данных (с контролем перехода за границы страницы) и Atomic Write.

если не сложно можно взглянуть на исходники ASM?

Цитата(MDD @ Dec 12 2009, 19:26) *
Сейчас проверил через I/O-mapped доступ - действительно это так! Соседние, ранее записанные ячейки, не трет...
Значит не все совсем неплохо smile.gif


а если переписать ячейку тогда как? например было $00 нужно $FF
---
И так я все таки не вкурил доконца...
требуется записать область маппед с адреса $1020-103f
1. копирую из основной памяти эти 32 байта в маппед область с адреса $1020
2. выставляю команду NVM контроллеру (если не ошибаюсь $35)
3. регистр адреса NVM определяю как 1 страница
4. даю команду на выполнение.
Правильно? (а то проверить смогу тока в понедельник)
MDD
Цитата(Склихасовский @ Dec 12 2009, 18:32) *
а если переписать ячейку тогда как? например было $00 нужно $FF

Сейчас специально проверил конкретно этот случай - все работает.
Т.е. допустим в первой ячейке страницы был 0.
Дальше очищаем буфер страницы. Казалось бы, что после этой команды во всем буфере должны сидеть $ff (или $00).
В этом и было мое главное заблуждение. Надо считать, что это абстрактно пустой буфер.
Дальше, в первую ячейку буфера пишем $ff(или любое другое число). Остальные ячейки не трогаем.
И даем команду Atomic Write.
После этого будет стерта и записана новым значением только первая ячейка страницы.
Если бы загрузили сразу несколько любых ячеек буфера, они бы тоже были переписаны в соответствующее ячейки страницы во время действия этой команды.
Т.е. резюме такое - "пустые ячейки" буфера никуда не пишутся (не портят содержимого страницы).

PS.На счет memory-mapped режима не подскажу, еще не разбирался.
Склихасовский
ещё одна небольшая непонятка.
Модуль TWI...
режим ведущий приемник
требуется при приеме последнего байта передать NASK.
И как то он не хочет передаваться
бит Bit 2 - ACKACT: Acknowledge Action установлен в 1, после чего подается команда xx10 (Execute Acknowledge Action succeeded by a byte receive)
но ничего не передается - не принимается...
Ещё прошу обяснить что за режим SMEN: Smart Mode Enable.
может из за него NASK не работает?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.