Views: 2470
(актуально для компилятора 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);