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


У Атмела эта надпись частенько исчезает только тогда, когда в очередную ревизию даташита вставляют "Not recommended for new design".
Duhas
ну я на АСМ-е их бы поковырял... так что изменения хидеров мне побоку)

в основном на каждый камень лежат 2 документа, обзорный - summary и полный...
Rst7
Цитата
в основном на каждый камень лежат 2 документа, обзорный - summary и полный...


А теперь лежит Manual - подробное описание модулей и т.д., но без конкретики аля адреса портов (но с полным описанием работы узлов) и собственно Datasheet, в котором распиновка чипов, адреса периферии и т.д. - то, что внутри семейства от камня к камню меняется.
Leonmezon
Те изменения что вносят - в основном более полно описание функций связанных DMA и шифрованием, что же касаться портов, АЦП, ЦАП и таймеров - за последние полгода - изменений визуально не видно, в любом случае - изучения Xmega придеться начинать с простых вещей (очень много нюансов), так что когда дойдете до DMA ... может уже все и отладят, в том числе и описание.
manul78
Вот тоже решил Xmega попытать... Кризис, работы мало - зато времени много...

Вопрос у меня такой: Заказал 2 шт. ATxmega128A1-AU по 250 рупий, это нормально, но вот с
TQFP100 возится проблематично. Интересно, есть уже что-либо подобное
для XMega ?
Leonmezon
Цитата(manul78 @ Jul 9 2009, 22:44) *
Вот тоже решил Xmega попытать... Кризис, работы мало - зато времени много...

Вопрос у меня такой: Заказал 2 шт. ATxmega128A1-AU по 250 рупий, это нормально, но вот с
TQFP100 возится проблематично. Интересно, есть уже что-либо подобное
для XMega ?

Можно взять мезонниную плату к STK600 - только дорого около 130 дол. (за эти деньги можно заказать 2-4 платы под себя как макетки (я так и поступил: сделал макетку с АЦП, ЖКИ, кнопки, светодиоды, внешний кварц, часы реального времени, преобразоваетль RS232, усилители, ИОН и ОУ для ЦАП - 2 платы 100дм. кв. вышли 2400 руб (без компликтации) ). Есть еще у Atmel плата с Xmega -но она не продается, в интернете можете найти описание китайской макетки - но в продоже ее нет (и цена в районе 3000 руб обещают) - Zif под TQFP 100 хороший тоже не дешево - лучше сразу макетку делать: по крайне мере поставите то что Вам надо.
Spider
А я лутом что надо то и вытравил. Заняло пол дня.
Hope!
Доброго времени суток!

В этой теме уже шла речь о потреблении Xmega.
У меня возникла та же проблема: использую XMega256A3, необходимо добиться потребления заявленного в даташитах. Реально получается при внутренней частоте 1 Мгц, 3В - 2мА (должно быть 697 мкА).

При этом в программе я уже отключила синхронизацию отдельных УВВ (в регистрах PR), отключила прерывания, JTAG.
SasaVitebsk
Цитата(Hope! @ Jul 22 2009, 12:34) *
Доброго времени суток!

В этой теме уже шла речь о потреблении Xmega.
У меня возникла та же проблема: использую XMega256A3, необходимо добиться потребления заявленного в даташитах. Реально получается при внутренней частоте 1 Мгц, 3В - 2мА (должно быть 697 мкА).

При этом в программе я уже отключила синхронизацию отдельных УВВ (в регистрах PR), отключила прерывания, JTAG.

В своё время я испытывал atmega48 в плане работы в качестве резервных часов, от батарейки CR2032. Очень много времени потратил и пришёл к выводу о нецелесообразности применения. Там был целый ряд причин. Не буду их касаться.

Когда просматривал плакаты по picopower и по atxmega, то видел что многое они там уже подправили. В частности BOD. Он как раз около 1ма потреблял. Я не смотрел пока xmega, но не ту ли там выбора варианта BOD? Типа "непрерывный"/"спящий"?

Ну и совсем простой вопрос. Все ноги на вывод и об землю - так???
defunct
Цитата(SasaVitebsk @ Jul 22 2009, 17:42) *
Очень много времени потратил и пришёл к выводу о нецелесообразности применения. Там был целый ряд причин. Не буду их касаться.

Вы уже второй раз вспоминаете об этом ряде причин.
Может все же поделитесь - какие именно причины? утечки? А то ведь интересно... ;>

Помню только что Ваша ветка о потреблении закончилась на том, что после отключения dW потребление вроде бы приблизилось к ожидаемому, а дальше то что было? smile.gif
muravei
Цитата(SasaVitebsk @ Jul 22 2009, 18:42) *
Он как раз около 1ма потреблял. Я не смотрел пока xmega, но не ту ли там выбора варианта BOD? Типа "непрерывный"/"спящий"?

В мега164Р БОД засыпает.
Слегка, не в тему.. smile.gif
Rst7
Цитата
В частности BOD. Он как раз около 1ма потреблял.


Гм... При питании 3.3 вольта со включенным WDT и BOD при н.у. у меня в крупносерийном устройстве спящая ATTiny26 жрет не более 30мкА. Примерно так же жрет ATMega128 (там именно часики ходят при выключении питания, недолго правда, потому как запитано от ионистора). Аналогичные цифры у остальных камней. В том числе и ATMega48/88/168. Цифры вполне соответствуют заявленным в даташите.

С XMega надо разбираться, видимо, какая-то периферия продолжает работать - например, что-то аналогичное автоматически включающемуся после сброса аналоговому компаратору в классических семействах.
SasaVitebsk
Цитата(defunct @ Jul 23 2009, 02:54) *
Вы уже второй раз вспоминаете об этом ряде причин.
Может все же поделитесь - какие именно причины? утечки? А то ведь интересно... ;>
Помню только что Ваша ветка о потреблении закончилась на том, что после отключения dW потребление вроде бы приблизилось к ожидаемому, а дальше то что было? smile.gif

Всё действительно работает согласно даташиту. Только именно без BOD. Сейчас уже не помню точно, но единицы мка. При включении BOD серьёзно подскакивает потребление. Именно поэтому они в piko применили "спящий" BOD.

Применение внешнего BOD + обвеска м48 получается хуже, чем ds1307. Так зачем огород городить? Кроме того CR2032 имеет 3V питания. Отнимем 0,6 на диод, добавим 0,2 падения после какого то периода и получим.... неработоспособное изделие (что и было на самом деле), Поэтому я применил КМОП ключ. Но там была задержка на сработку и в это время микруха слегка откушивала от батарейки .... Ну и так далее...

Изделие можно применять тогда, когда к этому всё готово. Я никого не убеждаю в обратном, но сам я больше не буду применять м48 в батарейном включении. Вроде намечается один проект, где я планирую m48pa, но тоже стрёмно... что-то пока их не завалено. Примени - потом плюйся.
Hope!
Цитата(SasaVitebsk @ Jul 22 2009, 20:42) *
В своё время я испытывал atmega48 в плане работы в качестве резервных часов, от батарейки CR2032. Очень много времени потратил и пришёл к выводу о нецелесообразности применения. Там был целый ряд причин. Не буду их касаться.

Когда просматривал плакаты по picopower и по atxmega, то видел что многое они там уже подправили. В частности BOD. Он как раз около 1ма потреблял. Я не смотрел пока xmega, но не ту ли там выбора варианта BOD? Типа "непрерывный"/"спящий"?

Ну и совсем простой вопрос. Все ноги на вывод и об землю - так???



Насколько я поняла BOD в xmega по умолчанию отключен, включается он во FUSE битах. Поэтому потреблять не должен. Да, все ноги назначены на выход и на землю. JTAG также отключен, но он не сильно влияет
xelax
Цитата(Hope! @ Jul 30 2009, 11:05) *
Насколько я поняла BOD в xmega по умолчанию отключен, включается он во FUSE битах. П

Читайте документацию внимательней и наступит счастье и взаимопонимание
BOD will be enabled after any reset
If any reset source goes active, the BOD will be enabled and keep the device in reset if the
VCC voltage is below the programmed BOD level. During Power-On Reset, reset will not be
released until VCC is above the programmed BOD level even if the BOD is disabled.
Problem fix/Workaround
Do not set the BOD level higher than VCC even if the BOD is not used.
Zlumd
Существует ли хотя бы одна микросхема SDRAM c температурным диапазоном от -40 градусов, которую можно было бы подключить к ATXMega128A1 ?
В даташите на Xmegу написано, что можно подключать только 4-разрядную SDRAM.
У микрона все 4-х разрядные SDRAM от 0 градусов.
У самсунга нет 4-х разрядных SDRAM меньше 256 мбит, а ХМеге можно максимум 128 мбит подключать.
Hynix похоже вообще не делает SDRAM.

Очень хочется пару МБ внешней памяти к ХМеге прикрутить, и чтоб недорого было.
Kovrov
Ребят, а в каких моделях хмеги есть "Battery Backup System"
Перерыл шит на А1 и А3 пина Vbat не нашел...
Leonmezon
Цитата(Kovrov @ Aug 1 2009, 13:33) *
Ребят, а в каких моделях хмеги есть "Battery Backup System"
Перерыл шит на А1 и А3 пина Vbat не нашел...


Этого пока нет (вроде будет реализовано позже: должны выйти МК с расширением A3B, 3D... и в них и будет).
Можно посмотреть следующие документы:
www.atmel.com/dyn/resources/prod_documents/doc8116.pdf;
и есть еще один - описание какие планируют выпускать AVR иAVR32 (ссылку правда потерял).
Leonmezon
Вот ссылка на документ где есть описание новых AVR и сроков выхода МК.
http://www.atmel.com/dyn/resources/prod_do...nts/doc4064.pdf
Kovrov
Ребят, как то писал про проблему- но решил поднять ещё раз.
Очень напрягает пошаговая отладка Xmega128a1 на один шаг приходится до 5 секунд времени. Жесть!!!
Хотел узнать у всех так?
Интрефейс Jtag. Студия самая последняя 666.
пробывался и другой комп, и другой MKII, без разницы.
в противном случае получается что чтото с чипом?
xelax
Цитата(Kovrov @ Aug 6 2009, 15:19) *
Очень напрягает пошаговая отладка Xmega128a1 на один шаг приходится до 5 секунд времени. Жесть!!!
Хотел узнать у всех так?


Отключите disasm.
MDD
Попался сборник статей сотрудников ЭФО:
ftp://ftp.efo.ru/pub/efo/Efo_publish-2008-IIsogl.pdf
Среди прочих там есть три статьи по XMEGA. В общем-то они представляют собой перекомпилированные атмеловские даташиты.
Но написаны на нормальном техническом русском языке. Я думаю многим будут полезны для начального ознакомления.
Piter_Korn
Так на ЭФФО прямо раздел есть и про Х-мега 3 (тры) полезных статьи
http://www.efo.ru/cgi-bin/pdf/pdf.pl?login...e=he19o0y5eF7QA
MDD
Цитата(Piter_Korn @ Aug 10 2009, 17:40) *
Так на ЭФФО прямо раздел есть и про Х-мега 3 (тры) полезных статьи


Да, это те же самые статьи. Но для их скачивания нужна регистрация. Я такие скачивания недолюбливаю.
Одна из причин в том, что запрашивающий не всегда следит за конфедициальностью предоставленных данных.
Ваша ссылка тому яркая иллюстрация - по ней под Вашим логином можно скачать любую статью, при этом на странице видны Ваши регистрационные данные, в частности e-mail как подарок для спамеров sad.gif . Впрочем здесь есть и Ваш недосмотр...
Kovrov
Цитата(xelax @ Aug 6 2009, 17:35) *
Отключите disasm.

что значит отключите дизасм?
пыс: исходники на асм.
ведущий_специалист
Народ привет. Может не в тему, но меня мучит вот что. Значит девайс хмега128а1.
Значит первый вопрос: при определении вот таким кодом
Код
void adc_init(void)
{
    // ADC_CalibrationValues_Set(&ADCA);  /* откалибруем ADC A. */
     offset = ADC_Offset_Get(&ADCA); /* Получим смещение для ADC A. */
         ADC_ConvMode_and_Resolution_Config(&ADCA, false, ADC_RESOLUTION_8BIT_gc); /* Сконфигурим ADC A для беззнакового преобразования 8 бит*/
     ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV128_gc);/* Частота преобразования CPUFREQ/128. */
     ADC_Referance_Config(&ADCA, ADC_REFSEL_INT1V_gc);/* установим опорное напряжение ADC A to be VCC 1 V.*/
        /* Настроим каналы 0, 1, 2 and 3 на  single ended input. */
    
    // ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,ADC_CH_INPUTMODE_SINGLEENDED_gc,ADC_CH_GAINFAC_1X_gc);
        // ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1,ADC_CH_INPUTMODE_SINGLEENDED_gc,ADC_CH_GAINFAC_1X_gc);
         //ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH2,ADC_CH_INPUTMODE_SINGLEENDED_gc,ADC_CH_GAINFAC_1X_gc);
         ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH3,ADC_CH_INPUTMODE_SINGLEENDED_gc,ADC_CH_GAINFAC_1X_gc);

    /* Настроим входы на ADC A ножки   4, 5, 6 and 7. */
    //ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN4_gc, ADC_CH_MUXNEG_PIN0_gc);
    //ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_CH_MUXPOS_PIN5_gc, ADC_CH_MUXNEG_PIN0_gc);
    //ADC_Ch_InputMux_Config(&ADCA.CH2, ADC_CH_MUXPOS_PIN6_gc, ADC_CH_MUXNEG_PIN0_gc);
    ADC_Ch_InputMux_Config(&ADCA.CH3, ADC_CH_MUXPOS_PIN7_gc, ADC_CH_MUXNEG_PIN0_gc);

    /* настроим sweep всех 4х каналов. */
    ADC_SweepChannels_Config(&ADCA, ADC_SWEEP_0123_gc);
    ADC_Enable(&ADCA);
    ADC_Wait_32MHz(&ADCA);
    ADC_FreeRunning_Enable(&ADCA);

}

Собственно при настройке канала на ногу ADC_CH_MUXPOS_PIN7_gc почему то опрашивается нога рядом, так и не понял почему.
Если кто нибудь работал с ацп, объясните, как заставить работать заремаренную верхнюю строчку. Компилер кроет матом, говорит не найти подпрограммы, хотя в оригинале(апноуте) все компилится нормально.
Второй вопрос, подскажите как настраивать каналы, не врубаюсь.
третий вопрос, как заставить работать одиночное преобразование.
Но главное не пойму почему канал опрашивается не тот.
Leonmezon
Ответ на второй вопрос по АЦП: я вот такой код написал (на основе даташита):
Код
//Инициализация АЦП - канал CH0
void init_ADC (void)
{
  // Конфигурируем канал CH0 на работу в несимметричном включении
  ADCA.CH0.MUXCTRL|=ADC_CH_INPUTMODE_SINGLEENDED_gc;
  // В несимметричном режиме подключением к положительному входу АЦП линию 1 порта PORTA
  ADCA.CH0.MUXCTRL|=ADC_CH_MUXPOS_PIN1_gc;
  // Подключаем внешний источник опорного напряжения
  ADCA.REFCTRL|=0x20;
  // Устанавливаем частоту тактирования АЦП: тактовая частота делиться на число N
  // при N=32, F=29,491200 МГц -  частота тактирования - 921,6 кГц
  ADCA.PRESCALER|=ADC_PRESCALER_DIV32_gc;
  // Разрешаем работу АЦП
  ADCA.CTRLA|=ADC_ENABLE_bm;
}

// Измерение на АЦП канал CH0;
unsigned int adc_rez (void)
{
  unsigned int ADC_result;
  ADCA.CTRLA|=ADC_CH0START_bm; // запускаем одиночное преобразование
  do{}while((ADCA.INTFLAGS&ADC_CH0IF_bm)==0x00); // Ждет флага CH0IF об окончании преобразования
  ADCA.INTFLAGS=ADC_CH0IF_bm; // сбрасываем флаг CH0IF записью в него "1"
  ADC_result=ADCA.CH0RES.i; // считываем результат преобразования в канале CH0
  return ADC_result; // Возвращение результата преобразования
}

// Функция измерения напряжения - 30 измерений  
unsigned int usmer (void)
{
     unsigned int j,F;
     double value=0, temp;
     init_ADC();
     for (j=1; j<31; j++)
      {
       F=adc_rez();
       value=value+F;
      }
      temp=(value/30);
      F=(unsigned int)(temp);
      return F;
}

Как видно - работает в единичном преобразовании, функции легко переделать по любой вывод (добавляем переменную в вызов функции). А вот насчет - калибровки - пока не знаю (нашел по даташитам что калибровка АЦП происходит при производстве и дальше можно зашивать значения при программировании (и они не изменяются пока программатором не сотрешь) - так что пока разбираюсь что и как калибровать и надо ли на 12 -бит это делать?? (тем более внутренний ИОН всего 1 %).[/quote]
ведущий_специалист
Вроде как разобрался, спасибо..

Что самое обидное нет толкового описания. Смотрел на гаве описалово на русском, но оно противоречит по регистрам даташита, иар тоже разницу в названиях регистров имеет, вот и спрашиваю.
У меня ацп врет в районе 10ти значений, что вполне приемлимо при 12ти битном преобразовании при своем внутреннем опорном. А вот 8ми битное не понравилось совсем. Очень шумно.
По схеме все расключено в порядке, осциллом смотрел AVCC, более менее в поряде.
Leonmezon
Цитата(ведущий_специалист @ Aug 21 2009, 23:05) *
Интересно, с какой ноги сигнал снимать? Я совсем запутался.
К примеру CH0, его ведь нужно определить на какую либо ножку ацп физически, или по умолчанию как то разводится внутри проца?
Что самое обидное нет толкового описания. Смотрел на гаве описалово на русском, но оно противоречит по регистрам даташита, иар тоже разницу в названиях регистров имеет, вот и спрашиваю.
У меня ацп врет в районе 10ти значений, что вполне приемлимо при 12ти битном преобразовании при своем внутреннем опорном. А вот 8ми битное не понравилось совсем. Очень шумно.
По схеме все расключено в порядке, осциллом смотрел AVCC, более менее в поряде.


Вот этой командой ADCA.CH0.MUXCTRL|=ADC_CH_MUXPOS_PIN1_gc; - т.е. получаем измерение напряженя на 1 ножке порта А.
Вот *.h файл с ICC AVR 7.22B (они очень близко написали к Atmel) - вобщем все понятно - каждое ADC_CH_MUXPOS_PIN*_gc соотвествует своей ножке * порта А или B (задаеться в начале).
(причем если надо использовать разные ножки- то лучше передовать число (понятнее вроде будет). -
Код
#define ADC_MUXPOS_PIN0_gc (0x00<<4) /* Input pin 0 */
#define ADC_MUXPOS_PIN1_gc (0x01<<4) /* Input pin 1 */
#define ADC_MUXPOS_PIN2_gc (0x02<<4) /* Input pin 2 */
#define ADC_MUXPOS_PIN3_gc (0x03<<4) /* Input pin 3 */
#define ADC_MUXPOS_PIN4_gc (0x04<<4) /* Input pin 4 */
#define ADC_MUXPOS_PIN5_gc (0x05<<4) /* Input pin 5 */
#define ADC_MUXPOS_PIN6_gc (0x06<<4) /* Input pin 6 */
#define ADC_MUXPOS_PIN7_gc (0x07<<4) /* Input pin 7 */


Если кто знает, вот с чем помочь: написал код и как его прогнать (так чтоб не часы ждать) в AVR Studio, т.е. надо убедиться что работает (пока макетки нет)? причем Tmax от 100 до 10000
Код
// Прерывание по окончанию счета
#pragma interrupt_handler iv_TCE0_OVF_isr:48
void iv_TCE0_OVF_isr(void)
{
TCE0.CTRLA=0x00; // stop Timer 1 порта Е
TCE0.CNT.i=0xFF8C;   // установка значения для счета 115 значений - 0x73
T=T+1;
TCE0.CTRLA|=0x06; //start Timer 1 порта Е
}

//TIMER0 initialize - prescale: 256, actual value: 1.001739130435 мс
// Тактовая частота таймера 29491200 Гц
void timerE0_init(void)
{
TCE0.CTRLA=0x00; // stop Timer 1 порта Е
TCE0.CNT.i=0xFF8C;   // установка значения для счета 115  значений - 0x73
TCE0.INTCTRLA = 0x01; // Разрешение прерывания по переполнению - уровень низкий.
TCE0.CTRLA|=0x06; //start Timer 1 порта Е
}

//Функция задежки управляемая от таймера-счетчика
void delayT (unsigned int Tmax)
{
  T=0;
  timerE0_init();
  while (T<Tmax)
  {
   NOP();
  }
  TCE0.CTRLA=0x00; // stop Timer 1 порта Е
}
Александр Куличок
Цитата
как его прогнать (так чтоб не часы ждать) в AVR Studio, т.е. надо убедиться что работает (пока макетки нет)? причем Tmax от 100 до 10000

А чего тут отлаживать? работу nop()? Если в прерывание заходит - значит работает.
Только вот не пойму, зачем столько мороки с таймером в прерывании. Во-первых останавливать таймер при смене CNT не обязательно. А во-вторых в данном случае логичнее было бы использовать Period Register
Тогда
Код
void iv_TCE0_OVF_isr(void)
{
TCE0.CTRLA=0x00; // stop Timer 1 порта Е
TCE0.CNT.i=0xFF8C;   // установка значения для счета 115 значений - 0x73
T=T+1;
TCE0.CTRLA|=0x06; //start Timer 1 порта Е
}

Превращается в
Код
T++;
Leonmezon
Запустил АЦП - есть смещение на 100 мВ+ шумы, рещил запустить калибровку. Просьба помочь разобраться:
Файлы для калибровки по даташитам Atmel:
Код
// Из файла adc_driver.с от Atmel
void ADC_CalibrationValues_Load(ADC_t * adc)
{
    if(&ADCA == adc){
         /* Get ADCACAL0 from production signature . */
        adc->CALL = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCACAL0_offset );
        adc->CALH = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCACAL1_offset );
    }else {
        /* Get ADCBCAL0 from production signature  */
        adc->CALL = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCBCAL0_offset );
        adc->CALH = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCACAL1_offset );
    }
}

uint8_t SP_ReadCalibrationByte( uint8_t index )
{
    uint8_t result;
    /* Load the NVM Command register to read the calibration row. */
    NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
    result = pgm_read_byte(index);
    /* Clean up NVM Command register. */
    NVM_CMD = NVM_CMD_NO_OPERATION_gc;
    return result;
}

#define PROD_SIGNATURES_START 0x0000  
#define pgm_read_byte(x) *(x)

Написал собственную для ICCAVR:
Код
// Функция калибровки АЦП порта А
void ADC_CalibrationValues_Load(void)
{
      unsigned char ADCACAL0_offset, ADCACAL1_offset;
      unsigned int value;
    /* Load the NVM Command register to read the calibration row. */
    NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc;
     ADCACAL0_offset = (*(volatile unsigned char *)0x20); // младший калибровочный байт
    /* Clean up NVM Command register. */
    NVM.CMD = NVM_CMD_NO_OPERATION_gc;
    /* Load the NVM Command register to read the calibration row. */
    NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc;
     ADCACAL1_offset = (*(volatile unsigned char *)0x21); // старший калибровочный байт
    /* Clean up NVM Command register. */
    NVM.CMD = NVM_CMD_NO_OPERATION_gc;
     value= (ADCACAL1_offset<<8)+ADCACAL0_offset;
     ADCA.CAL.i = value; // установка данных в регистр калибровка АЦП
}


1. Зачем надо писать (*(volatile unsigned char *)0x20)?? (только просьба просто объяснить).
2. Надо ли после считывания младшего калибровочного байта писать в NVM Command register или можно подрят считать оба байта?
3. Просьба - может кто уже разобрался с структурой из файла xmstructs.h мы можем сразу получить доступ ко всем калибровочным данным? Если да - то как это сделать (примеров с этой структорой нет).
Код
#ifndef ___xmstructs_h
#define ___xmstructs_h
*
*
*
/* NVM signature row registers */
typedef struct NVM_SIG_struct
    { unsigned char RCOSC2MCAL;
      unsigned char reserved_0x01;
      unsigned char RCOSC32KCAL;
      unsigned char RCOSC32MCAL;
      unsigned char reserved_0x04;
      unsigned char reserved_0x05;
      unsigned char reserved_0x06;
      unsigned char reserved_0x07;
      unsigned char LOTNUMBYTE0;
      unsigned char LOTNUMBYTE1;
      unsigned char LOTNUMBYTE2;
      unsigned char LOTNUMBYTE3;
      unsigned char LOTNUMBYTE4;
      unsigned char LOTNUMBYTE5;
      unsigned char reserved_0x0E;
      unsigned char reserved_0x0F;
      unsigned char WAFERNUM;
      unsigned char reserved_0x11;
      unsigned char WAFERX0; // jph
      unsigned char WAFERX1; // jph
      unsigned char WAFERY0; // jph
      unsigned char WAFERY1; // jph
      unsigned char reserved_0x16;
      unsigned char reserved_0x17;
      unsigned char reserved_0x18;
      unsigned char reserved_0x19;
      unsigned char reserved_0x1A;
      unsigned char reserved_0x1B;
      unsigned char reserved_0x1C;
      unsigned char reserved_0x1D;
      unsigned char reserved_0x1E;
      unsigned char reserved_0x1F;
      unsigned char ADCACAL0;
      unsigned char ADCACAL1;
      unsigned char ADCACAL2;
      unsigned char ADCACAL3;
      unsigned char ADCBCAL0;
      unsigned char ADCBCAL1;
      unsigned char ADCBCAL2;
      unsigned char ADCBCAL3;
      unsigned char reserved_0x28;
      unsigned char reserved_0x29;
      unsigned char reserved_0x2A;
      unsigned char reserved_0x2B;
      unsigned char reserved_0x2C;
      unsigned char reserved_0x2D;
      unsigned char TEMPSENSE0;
      unsigned char TEMPSENSE1;
      unsigned char DACACAL0;
      unsigned char DACACAL1;
      unsigned char DACBCAL0;
      unsigned char DACBCAL1;
    } NVM_SIG_t;
Duhas
решил наваять макетку для Хмеги128А1 и что-то терюсь где искать распиновку периферии.. уарты там и прочее как по портам раскидано? иль я туплю ?)
Александр Куличок
Цитата(Duhas @ Sep 2 2009, 14:28) *
решил наваять макетку для Хмеги128А1 и что-то терюсь где искать распиновку периферии.. уарты там и прочее как по портам раскидано? иль я туплю ?)

См. раздел 29.2 Alternate Pin Functions в ATxmega64A1/128A1/192A1/256A1/384A1 Preliminary (rev.I). Там в виде таблицы все сведено
Duhas
спасибо.. помню что где-то встречал а где - совсем вылетело (
Hope!
Всем привет! Тут поднимали тему про АЦП Xmega. Может кто-то тоже сталкивался с подобной проблемой:
Я пыталась добиться точного измерения на 12-битном разрешении. Все настроила, сделала калибровку (переписала калибровочные значения в регистры CAL).В бесконечном цикле запускаю функцию:

void ADC__read(ADC_t * adc, int countOfMeasure, countOfMeasure)
{
ADC_Enable(adc);
ADC_Wait_8MHz(adc);

// запуск преобразования на канале CH3
ADC_Ch_Conversion_Start(&adc->CH3);

// ожидание завершения преобразования
do{} while(!ADC_Ch_Conversion_Complete(&adc->CH3));

adc->INTFLAGS=ADC_CH3IF_bm;

// считываем результат преобразования с канала CH3
ADC_result[countOfMeasure]=ADC_ResultCh_GetWord(&adc->CH3, 0);

ADC_Disable(adc);
}

Полученные значения в массиве ADC_result[countOfMeasure] сильно нестабильны, разница между соседними отсчетами достигает 40 единиц. Даже не понятно какое из значений использовать.

Может это нормально для XMEga, но все-таки хотелось большей точности от 12-разрядного АЦП
Prov
Цитата(Hope! @ Sep 24 2009, 13:07) *
Всем привет! Тут поднимали тему про АЦП Xmega. Может кто-то тоже сталкивался с подобной проблемой:
Я пыталась добиться точного измерения на 12-битном разрешении. Все настроила, сделала калибровку (переписала калибровочные значения в регистры CAL).В бесконечном цикле запускаю функцию:

void ADC__read(ADC_t * adc, int countOfMeasure, countOfMeasure)...
...
Может это нормально для XMEga, но все-таки хотелось большей точности от 12-разрядного АЦП

Полагаю, что это AVR-специфика. Нечто аналогичное у меня работало на mega32. Постоянный циклический опрос 8 каналов. Начало преобразования (измерения) последующего канала после сохранения результата предыдущего (в прерывании). Использовал только 8 бит (сдвинутый влево 10-ти битный результат). Два младших бита постоянно "фонили". К счастью, мне было достаточно 6-ти бит, но тогда я стал понимать тех, кто ставил к mege специализированный ADC на SPI, например.
Ваши 40 единиц - это, очевидно, младших 5 бит (с хвостиком), т.е. выше 7 битной (относительной) точности xmega не поднялась, хотя это почти на 1 бит выше, чем у просто-meg'и.
Artem_Petrik
Цитата(Prov @ Sep 24 2009, 21:52) *
Полагаю, что это AVR-специфика. Нечто аналогичное у меня работало на mega32. Постоянный циклический опрос 8 каналов. Начало преобразования (измерения) последующего канала после сохранения результата предыдущего (в прерывании). Использовал только 8 бит (сдвинутый влево 10-ти битный результат). Два младших бита постоянно "фонили". К счастью, мне было достаточно 6-ти бит, но тогда я стал понимать тех, кто ставил к mege специализированный ADC на SPI, например.
Ваши 40 единиц - это, очевидно, младших 5 бит (с хвостиком), т.е. выше 7 битной (относительной) точности xmega не поднялась, хотя это почти на 1 бит выше, чем у просто-meg'и.

Это специфика разработчика. Даже не особо заморачиваясь с разводкой земли и фильтрацией питания, можно получить точность 8бит. Больше мне просто как-то не требовалось. Конечно при опросе нескольких каналов есть свои ньюансы, но и это не повод "обижать" процессор. Впрочем, на мой взгляд, рассмотрение особенностей АЦП AVR-ок лучше обсуждать не в этой ветке. 
SasaVitebsk
Цитата(Artem_Petrik @ Sep 24 2009, 22:17) *
Это специфика разработчика. ...не повод "обижать" процессор.


Тем не менее Процессор здесь тоже "при делах". Например, смею утверждать, что если на том же порте, что и АЦП у вас находится сильноточные цепи с импульсной нагрузкой ~ 20ма, то вы не получите точность выше 6 бит. При всех ухищрениях. Разработчики кристалла рекомендуют на время измерения вообще "засыпать". А это значит, что добится нормальной точности только схемотехническими методами не удаётся. Но процессор - есть процессор. Что если я не могу спать и отключать нагрузку? Значит я не получу объявленную точность? Тогда надо откровенно писать - точность 8бит если процессор используется как АЦП.

Короче качество АЦП AVR мне очень не нравится. Думаю, что можно было разработать получше. Видимо сэкономили. (Я про стандартные меги).
Hope!
Цитата
Тем не менее Процессор здесь тоже "при делах". Например, смею утверждать, что если на том же порте, что и АЦП у вас находится сильноточные цепи с импульсной нагрузкой ~ 20ма, то вы не получите точность выше 6 бит. При всех ухищрениях. Разработчики кристалла рекомендуют на время измерения вообще "засыпать". А это значит, что добится нормальной точности только схемотехническими методами не удаётся. Но процессор - есть процессор. Что если я не могу спать и отключать нагрузку? Значит я не получу объявленную точность? Тогда надо откровенно писать - точность 8бит если процессор используется как АЦП.


SasaVitebsk, переводить процессор xmega в режим сна я тоже пробовала, но это вообще не помогло. В Atmega бЫл режим сна специальный "Снижение шумов АЦП" и при преобразовании АЦП контроллер в него переводили, что если верить документации существенно повышало точность. Также в Atmega и в режиме холостого хода тоже написано что шумы снижаются. В XMEGA же ничего подобного не написано и режима "Снижения шумов АЦП" нет, есть только холостой ход.
Prov
Цитата(Artem_Petrik @ Sep 24 2009, 21:17) *
Это специфика разработчика...
и это не повод "обижать" процессор...
рассмотрение особенностей АЦП AVR-ок лучше обсуждать не в этой ветке. 

Это специфика разрабатываемого устройства.
Факты не "обижают" процессор, а уточняют сферу его применения и подтверждают необходимость внешних специализированных ADC при повышенных требованиях к точности измерения. Для AVR - это реально 7-8 бит. Опыт Hope! дополнительно подтверждает это и, если кто-то знает как получить более высокую точность, пусть прокомментирует.
Полагаю, многим это будет интересно.
Duhas
неизвестно что там творится у Надежды на опоре.. и на аналоговом питании.. или я что-то пропустил ?
manul78
Цитата(Hope! @ Sep 24 2009, 15:07) *
Может это нормально для XMEga, но все-таки хотелось большей точности от 12-разрядного АЦП


Errata для камня ATXMEGA серии А1 и последней ревизии G.
Цитата
5. The ADC has up to ±2 LSB inaccuracy

The ADC will have up to ±2 LSB inaccuracy, visible as a saw-tooth pattern on the input voltage/
output value transfer function of the ADC. The inaccuracy increases with increasing
voltage reference reaching ±2 LSB with 3V reference.

Problem fix/Workaround

None, the actual ADC resolution will be reduced with up to ±2 LSB.


Может это ? rolleyes.gif
Artem_Petrik
Цитата(Prov @ Sep 25 2009, 13:07) *
Это специфика разрабатываемого устройства.
Факты не "обижают" процессор, а уточняют сферу его применения и подтверждают необходимость внешних специализированных ADC при повышенных требованиях к точности измерения. Для AVR - это реально 7-8 бит. Опыт Hope! дополнительно подтверждает это и, если кто-то знает как получить более высокую точность, пусть прокомментирует.
Полагаю, многим это будет интересно.

Чтож, у меня тоже в одном проете были проблемы с точностью АЦП. Тоже получалось чтото около 5-6разрядов. Однако ранее я уже работал с АЦП AVR, и знал, что уж 8 бит он точно может выдать, поэтому, вместо того, чтоб грешить на процессор, стал искать проблему "у себя". Там АВР-ка, помимо всего прочего, рулила преобразователем напряжения, и питалась с его выхода. Выяснилось, что на выходе преобразователя были довольно большие пульсации, около 100mVp-p. Для той нагрузки, для которой формировалось данное напряжение, пульсации были не особо важны, поэтому я решил фильтровать толко питание AVR-ки. Больших токов она у меня через себя не пропускала, поэтому я поставил ей на питание 10 Ом + 10мкф, а потом еще что-то подобное (точно уже не помню, может дроссель был) для фильтрации AVCC. Этого было достаточно для того, чтоб нужные мне 8 бит стояли железно. Такой вот нехитрый опыт.
Prov
Цитата(Artem_Petrik @ Sep 25 2009, 21:16) *
...у меня тоже в одном проете были проблемы с точностью АЦП.

В проекте, о котором я писал выше, и AVCC, и AREF были достаточно хорошо стабилизированы, разводка соответствовала DS. Возможно, нужно было дать задержку на запуск следующего преобразования (не очень похоже) или поюзить предметнее и выйти на 8 бит, но меня устраивало 6 и я просто не стал тратить время понимая, что универсальных устройств нет и AVR не предназначено для относительно прецизионных (10-12 бит, что-бы "они там" не рекламировали) измерений. Учитывая, что в xmege AREF почти в два раза ниже чем у meg'и, действительно, нужно уделить внимание качеству питания.
777777
Цитата(Prov @ Sep 25 2009, 14:07) *
если кто-то знает как получить более высокую точность, пусть прокомментирует.
Полагаю, многим это будет интересно.

Как ее получить - знают все, об этом написано во всех учебниках, но почему-то большинство с завидным упрямством этого не делают. Для этого надо в непосредственной близости от процессора ставить хотя бы по два электролита и две керамики по 0.1 мкф, земли от сильноточных потребителей вести к источнику питания отдельным проводом, питание к процессору подводить широкими проводниками по одному слою, если же требуется переход, то делать переходные отверстия большого диаметра и т.д. Наконец, выполнять преобразование в те моменты, когда нет помех (переключение чего-л.) или хотя бы синхронизировать время преобразования с этими моментами. Уж 10 разрядов от АВРки добиться можно легко, и я не понимаю что нужно делать, чтобы у нее стали дрожали два разряда.
SasaVitebsk
Вот именно, что рекомендации знают все. И, естественно, их стараются исполнять. При этом, при применении внешнего АЦП получаешь 16 разрядов и претензий к точности никаких, а на AVR вылизываешь всё и с трудом получаешь 7.
Понятно, что если написано в даташите, то получить объявленную точность - реально. Но цена за её получение слишком высока. По моим оценкам лучше всего освободить порт АЦП от цифровых нагрузок. Регистр DIDR, введенный в новых однокристалках мало помогает. Синхронное измерение-переключение - делал, тоже влияет незначительно. Внешняя опора не повышает точность существенно. Значительно влияет - снижение частоты преобразования и повторные измерения. Получается что если хочется точности, то область использования - значительно уже чем область использования МК. Тут нет ничего плохого, просто надо это знать. Одно дело если вы можете измерять а потом обрабатывать - тут всё Ok, другое - если обрабатываете "на лету" и при этом машете ногами.

Читал, что АЦП встроенные в МК от AD имеют сопоставимую точность с внешними.
Petka
Цитата(SasaVitebsk @ Sep 30 2009, 12:27) *
Вот именно, что рекомендации знают все. И, естественно, их стараются исполнять. При этом, при применении внешнего АЦП получаешь 16 разрядов и претензий к точности никаких, а на AVR вылизываешь всё и с трудом получаешь 7.
Понятно, что если написано в даташите, то получить объявленную точность - реально. Но цена за её получение слишком высока. По моим оценкам лучше всего освободить порт АЦП от цифровых нагрузок. Регистр DIDR, введенный в новых однокристалках мало помогает. Синхронное измерение-переключение - делал, тоже влияет незначительно. Внешняя опора не повышает точность существенно. Значительно влияет - снижение частоты преобразования и повторные измерения. Получается что если хочется точности, то область использования - значительно уже чем область использования МК. Тут нет ничего плохого, просто надо это знать. Одно дело если вы можете измерять а потом обрабатывать - тут всё Ok, другое - если обрабатываете "на лету" и при этом машете ногами.

Читал, что АЦП встроенные в МК от AD имеют сопоставимую точность с внешними.

Полностью разделяю точку зрения.
Могу добавить что у меня получалось получить все 10 разрядов стоящими, только используя цифровую обработку: медианный фильтр минимум на 5 отсчётов, только после этого ФНЧ. Понятно, что от этого встроенный АЦП лучше не работает, но в задачах где не требуется большая точность, а требуется большое разрешение такой подход очень даже применим. Само собой ценой уменьшения фактической частоты АЦП на несколько порядков.
Prov
Цитата(Petka @ Sep 30 2009, 11:18) *
Полностью разделяю точку зрения.
...у меня получалось получить все 10 разрядов стоящими, только используя цифровую обработку: медианный фильтр минимум на 5 отсчётов...

Согласен на 100%. Не хотелось вспоминать, но был прецедент... Срочно (!) сделать цифровой вольтметр. Была плата с mega8: кварц 4,194304 МГц (время считать), три семисегментных индикатора с ключами на РС0..2 (именно на ADC), кнопки и реле. Измеряемое напряжение подключил на PC5 (ADC5). Буфер на 64 отсчета и достаточно "хитрый" анализ. Напряжение индицировалось в двух форматах: XX.X и X.XX (т.е. самым неприятным был переход 9.99-10.0, пришлось "притормаживать" в этом месте). Точность измерения была не хуже 1%, естественно, путем программной подгонки.
Поэтому если не заниматься ничем более (про разводку, конденсаторы и проч. не говорю - это аксиома), то можно получить эти 10 бит. Думаю, что разработчики AVR это знают, но, естественно, специально не рекламируют. Формально они правы: 10 бит - это реально, но какой ценой и устроит ли это Вас.

У меня более "приземленный" вопрос для тех, кто уже работает с xmeg'ой: на сколько реально она работает на 32 МГц? Кто-то уже пробовал? Вопрос не праздный. У меня альтернатива выбора LPC или xmega. Самая сложная функция - поиск записи в массиве из 120-150 тыс.записей. Пробы на макете из LPC2378 (45 МГц) дают 6-10 мс (меня устроит и 50 мс). Но, как посмотрю на разводку - xmega гораздо проще и удобнее. Ищу и другие плюсы кроме, ес-но, и стоимости.
Rst7
Цитата
Самая сложная функция - поиск записи в массиве из 120-150 тыс.записей. Пробы на макете из LPC2378 (45 МГц) дают 6-10 мс


Мда. Ладно, с АЦП не получается справиться, слишком сложно для эмбеддера. Но, блин, бинарный поиск надо знать как "Отче наш" - неужели 18 сравнений занимают столько времени?
SasaVitebsk
smile.gif
Ну может у человека неупорядочено дерево почему-то. smile.gif Хотя, конечно непонятно почему. Обычно при добавлении записей и упорядочивают сразу.
Также может сам ключ сравнения слишком велик, что тоже увеличит время поиска, хотя иногда свёртку делают.
Может он не заморачивался просто. Пишет же что его 50мс устроит. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.