Jump to content

    
Sign in to follow this  
zombi

ATxmega

Recommended Posts

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

Стирать не нужно, NVM сам сотрет только обновляемые ячейки на странице (насколько помню).

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

 

А не в memory mapped - используйте старые алгоритмы и пишите по байту, изменений особых нет.

Новый режим экономичней, если писать более одного байта.

Edited by V_G

Share this post


Link to post
Share on other sites
используйте старые алгоритмы

 

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

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

 

Сейчас проверил через I/O-mapped доступ - действительно это так! Соседние, ранее записанные ячейки, не трет...

Значит все совсем неплохо :)

Edited by MDD

Share this post


Link to post
Share on other sites
Стирать не нужно, NVM сам сотрет только обновляемые ячейки на странице (насколько помню).

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

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

 

Сейчас проверил через I/O-mapped доступ - действительно это так! Соседние, ранее записанные ячейки, не трет...

Значит не все совсем неплохо :)

 

а если переписать ячейку тогда как? например было $00 нужно $FF

---

И так я все таки не вкурил доконца...

требуется записать область маппед с адреса $1020-103f

1. копирую из основной памяти эти 32 байта в маппед область с адреса $1020

2. выставляю команду NVM контроллеру (если не ошибаюсь $35)

3. регистр адреса NVM определяю как 1 страница

4. даю команду на выполнение.

Правильно? (а то проверить смогу тока в понедельник)

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

Share this post


Link to post
Share on other sites
а если переписать ячейку тогда как? например было $00 нужно $FF

Сейчас специально проверил конкретно этот случай - все работает.

Т.е. допустим в первой ячейке страницы был 0.

Дальше очищаем буфер страницы. Казалось бы, что после этой команды во всем буфере должны сидеть $ff (или $00).

В этом и было мое главное заблуждение. Надо считать, что это абстрактно пустой буфер.

Дальше, в первую ячейку буфера пишем $ff(или любое другое число). Остальные ячейки не трогаем.

И даем команду Atomic Write.

После этого будет стерта и записана новым значением только первая ячейка страницы.

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

Т.е. резюме такое - "пустые ячейки" буфера никуда не пишутся (не портят содержимого страницы).

 

PS.На счет memory-mapped режима не подскажу, еще не разбирался.

Share this post


Link to post
Share on other sites

ещё одна небольшая непонятка.

Модуль TWI...

режим ведущий приемник

требуется при приеме последнего байта передать NASK.

И как то он не хочет передаваться

бит Bit 2 - ACKACT: Acknowledge Action установлен в 1, после чего подается команда xx10 (Execute Acknowledge Action succeeded by a byte receive)

но ничего не передается - не принимается...

Ещё прошу обяснить что за режим SMEN: Smart Mode Enable.

может из за него NASK не работает?

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

Share this post


Link to post
Share on other sites
бит Bit 2 - ACKACT: Acknowledge Action установлен в 1, после чего подается команда xx10 (Execute Acknowledge Action succeeded by a byte receive)

но ничего не передается - не принимается...

Юзайте команду 0bxxxxxx11.

Share this post


Link to post
Share on other sites
2. Проверены собственные шумы АЦП в таком режиме для двух вариантов:

- выводы АЦП в диф. включении были замкнуты между собой резистором 2К и никуда не подключались, АЦП крутился в free run режиме и значения считывались асинхронно и передавались по RS485 в PC. Кроме этого в прерываниях от таймера формировалась пила на ЦАПе и моргал тестовый светодиод. Кроме собственно значений АЦП в RS485 передавались значения после фильтрации. Фильтр экспоненциальный(две строчки на С), я его обычно использую во всех задачах измерения постоянных сигналов.

Результаты без коментариев даны на рис.1

 

Выводы, плохой камень или нет, делайте сами.

 

Если вас не затруднит, испытайте пожалуйста, шумы ацп в не дифферециальном включении от хорошего опорника. с rc фильтром.

Я думаю, общественности будет интересно.

 

Я делал такие измерения для STM32F103R8 , для анализа линейности оверсемлинга, результатом остался доволен.

Из массива полученных данных я строю диаграмму в экселе- распределение вероятности.

По вертикальной оси сколько раз значение встречается в процентах от всей выборки, по горизонтальной оси- сами значения. При "правильной" работе АЦП должно получаться гауссовское распределение.

 

Я строил такие диаграммы для разных настроек ацп- частоты и времени выборки.

Как ни странно высокая(12Мгц) частота и малое время выборки (3мкс) ацп давала самые малошумящие значения, всего +-1 разряд на выборку из 3000 значений.

Но для увеличения линейности оверсемплинга лучше было уменьшать частоту до 9 Мгц и немного поднимать время выборки- - тогда значения размазывались на +-3, и после фильтрации линейность возрастала.

Шум (dithering) специально не подмешивал.

Share this post


Link to post
Share on other sites

Подскажите, пожалуйста... Область памяти, которая называется таблицей приложения. В даташите написано, что если не хранить в ней данные, то ее можно использовать под приложение. Так вот, как узнать, использую ли я ее для хранения данных? Другими словами, чтоб хранить в ней данные надо это каким-то особенным образом объявить? А если я этого не знаю, то я ее и не использую? И если я правильно понимаю все вышесказанное, то приложение можно расширить до 136КБ? А из бутлоадера эта область доступна?

 

Или эта таблица входит в 128КБ памяти программ?

Share this post


Link to post
Share on other sites

Почитал на досуге еррату на ATxmega32A4 и ужаснулся: использовать ревизию А с такими ошибками и недоработками просто стремно, плюс еще скока вылезет неожиданно... Вроде ревизий позднее А еще нет и не скоро будет...

Share this post


Link to post
Share on other sites
Почитал на досуге еррату на ATxmega32A4 и ужаснулся: использовать ревизию А с такими ошибками и недоработками просто стремно, плюс еще скока вылезет неожиданно... Вроде ревизий позднее А еще нет и не скоро будет...

ЧТо-же там такого страшного?

Можно например?

Share this post


Link to post
Share on other sites
ЧТо-же там такого страшного?

Можно например?

Так там же все написано. Просто вложили крутую периферию и тут же ее "ограничили". Особенно удручают ошибки в ADC, DAC и BOD. Ну как можно было выпускать кристалл, у которого ADC "не умеет" работать выше 2.4V, а дифф входы вообще имеют диапазон обратно пропорциональный усилению??? Это выглядит даже как-то несерьезно, что ли... Лучше бы задержали релиз на пару месяцев, не позорились...

Share this post


Link to post
Share on other sites
ADC "не умеет" работать выше 2.4V, а дифф входы вообще имеют диапазон обратно пропорциональный усилению???

 

А как Вы хотели иначе с диапазоном диффвходов? Там имеется ввиду дифференциальное напряжение. Естественно чем больше усиление, тем меньше допустимый максимальный сигнал на входе. Кстати, здесь в теме кто-то проверял синфазное напряжение, вроде работает до тех же 2.4В.

А вот померить Vсс напрямую похоже уже никогда не удастся. В последней версии даташита появилось максимальное значение для Vref=Vcc-0.6V. Это конечно неудобно.

А вообще, даже с такой ерратой жить можно. Многие обещанные фичи там весьма приятны и сделаны изначально прямо :)

Share this post


Link to post
Share on other sites

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

Попробовал включить "втемную" - намеряет напряжение около 0.6В. Можно было бы предположить, что это обычный диод. Но вот незадача - при изменении температуры с +20 до -10 показания практически не меняются. При этом в калибровочных байтах что-то записано, причем значения разные для разных чипов. Может я что-нибудь упустил...

Share this post


Link to post
Share on other sites
An internal temperature reference is available. Measuring the voltage on this will give an ADC

result representing the current temperature in the microcontroller. The temperature, T, is given

as:

T = TBD ⋅ ADCRESULT + TBD

А вот кто такой TBD я что-то не понял...

Share this post


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