Views: 2534
(актуально для компилятора XC8 и HI-TECH)
Если при программировании контроллера необходимо предварительно записать данные в EEPROM, то можно воспользоваться следующим макросом
__EEPROM_DATA (0,1,2,3,4,5,6,7);// инициализация EEPROM
Макрос позволяет инициализировать блок в 8 байт. Если необходимо инициализация большего количества данных можно использовать несколько макросов. Пример,
__EEPROM_DATA (0,1,2,3,4,5,6,7);// инициализация EEPROM __EEPROM_DATA (33,48,2,3,4,5,6,7);// инициализация EEPROM __EEPROM_DATA (0,1,2,3,77,5,6,33);// инициализация EEPROM
Каждый следующий макрос инициализирует следующее 8 байт.
Макросы записи чтения из EEPROM
EEPROM_WRITE(address,value); и variable=EEPROM_READ(address);
но необходимо обратить внимание макрос для чтения не проверяет, закончилось ли запись EEPROM. Если после записи сразу сделать чтение из этой ячейки результат будет не предсказуем.
#include <htc.h>
void eetest(void)
{
unsigned char value = 1;
unsigned char address = 0;
// инициализация записи
EEPROM_WRITE(address,value); //макрос не ожидает окончание записи в память
// организация ожидания окончания записи для EEPROM_READ
while(WR) continue;
// чтение EEPROM из адреса
value = EEPROM_READ(address);
}
Функции записи чтения из EEPROM
variable=eeprom_read(address) и eeprom_write(address,value)
аналогичный пример записи чтения
#include <htc.h>
void eetest(void)
{
unsigned char value = 1;
unsigned char address = 0;
// запись
eeprom_write(address, value);// функция ожидает окончание записи в память
// чтение
value = eeprom_read(address);
...
Функции записи массива или последовательная запись данных
Если вы организуете циклическую запись в EEPROM надо учитывать тот факт, что изменять адрес в регистре EEADR можно только после окончания записи. Если это сделать не дождавшись, то запись в регистр адреса EEADR не воспримется устройством (не изменится).
teleaddr=0;
EEPROM_WRITE(teleaddr,0xdf);
while (WR) continue; //необходимо для изменения адреса
teleaddr++; //ß
EEPROM_WRITE(teleaddr,0xdf);
while (WR) continue;
teleaddr++;
EEPROM_WRITE(teleaddr,0x02);
while (WR) continue;
teleaddr++;
EEPROM_WRITE(teleaddr,0x07);
while (WR) continue;
teleaddr++;
Если убрать из последовательности ожидание окончания записи while(WR) continue; то все попытки записи будут предприняты только по адресу EEADR=0. Это актуально как для макроса EEPROM_WRITE, так и для функции eeprom_write.
В принципе, что макрос, что функция это одно и тоже, функция это вызов того же макроса.
НЕЛЬЗЯ использовать регистр EEADR непосредственно с функциями.
Возможно при помощи макросов
Записать блок кода/данных в области во флэш-памяти:
flash_write (указатель начала блока данных, длина блока, указатель начала области флэш-памяти); flash_write(source_pointer, length, dest_pointer);
чтение байта данных из флэш-памяти, и сохранение в переменной:
variable=flash_read (адрес); variable=flash_read(address);