Калибровочные значения в Xmega

    XMega имеет ряд регистров, которые содержат калибровочные значения для ЦАП, АЦП и генераторов. Эти значения определяются во время производства и программируются  в контроллер, поэтому их нужно только считывать и записывать в соответствующие регистры калибровки.
    Регистры считываются с помощью контроллера NVM (энергонезависимая память). Этот контроллер интегрирован в чип и контролирует все обращения к памяти (программирование с помощью PDI, JTAG, чтение и запись подписей и т. д.).
    Поэтому доступ к калибровочным сигнатурам также должен выполняться через этот контроллер.
    Значения считываются с помощью этой функции:
#include <stddef.h>
#include <avr/pgmspace.h>
int LeseKalibrationsbyte(int Index)
{
int result;
NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
result = pgm_read_byte(Index);
NVM_CMD = NVM_CMD_NO_OPERATION_gc;
return(result);
}
    Функция вызывается (примере для смещения DACB) следующим образом:
DACB.OFFSETCAL = LeseKalibrationsbyte(offsetof(NVM_PROD_SIGNATURES_t, DACBOFFCAL));

    Сначала создается функция, называемая LeseKalibrationsbyte. Значение int перед именем функции означает, что функция возвращает значение типа integer, а индекс int означает, что функция ожидает целочисленное значение в вызове функции, значение затем сохраняется в локальной переменной, называемой индексом .
    Затем создается локальная переменная типа Integer с именем result .
NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
    После этого контроллеру NVM приходит уведомление, что следующая функция для чтения не имеет доступа к флэш-памяти, а к дополнительной области с байтами калибровки. Далее, с pgm_read_byte (index), один байт, который определяется значением индекса , считывается из флеш-памяти и сохраняется в результате . Следующая команда просто добавляет команду NOP для контроллера NVM.
#include <stddef.h>
#include <avr/pgmspace.h>

    Предусмотрены так же функции для чтения флэш-памяти и функции offsetto .
    Функция ReadCalibrationsByte теперь вызывается иначе:
DACB.OFFSETCAL = LeseKalibrationsbyte(offsetof(NVM_PROD_SIGNATURES_t, DACBOFFCAL));

    Возвращаемое значение сохраняется в регистре DACB.OFFSETCAL . Затем вызывается функция. Мы помним, что как значение целое число должно быть передано в функцию. Это целое число формируется следующим образом. С помощью функции offsetof учитывается расстояние от начального положения указанной выше структуры до элемента, указанного в качестве второго параметра. То есть в примере offsetof возвращает 50 или 0x32, потому что расстояние от начала структуры NVM_PROD_SIGNATURES_t до элемента DACBOFFCAL 50. Как структурирована структура, можно увидеть в файле iox128a1.h AVR. Это 50 - это значение, которое передается в функцию и затем вызывается в индексной функции.

    Внутри функции есть команда
result = pgm_read_byte(Index);
    Содержимое по адресу 50 считывается из области подписи.
    Если значение затем сравнивать с таблицей, выясняется, что это значение точно соответствует местоположению хранения калибровочного значения, и это значение затем сохраняется в результате .
    Далее это значение возвращается из функции и сохраняется в регистре DACB.OFFSETCAL .
    Таким образом, любой контроллер, независимо от содержимого регистров калибровки, может быть автоматически откалиброван. Эта функция также может использоваться для калибровки АЦП или генераторов.
    Для этой цели вместо DACBOFFCAL необходимо ввести только соответствующее имя калибровочного регистра (например, ADCBCAL0 для регистра CAL ADCB). Кроме того , регистр назначения должен быть изменен, т.е. вместо DACB.OFFSETCAL использовать ADCB.CALL.




    Blogger Comment
    Facebook Comment

0 коммент.:

Отправить комментарий