5. Записать h’55’ в регистр EECON2.
6. Записать h’AA’ в регистр EECON2.
7. Установить бит WR для инициирования цикла записи.
8. Выполнить две пустые команды пор.
9. Сбросить бит WREN.
10. При необходимости разрешить прерывания.
11. Дожидаться сброса бита WR, свидетельствующего о завершении цикла записи, нет необходимости, поскольку на время записи работа процессора приостанавливается и возобновляется только по окончании записи.
Подпрограмма FLASH_PUT, код которой приведен в Программе 15.6, написана в предположении, что при входе в подпрограмму адрес ячейки уже находится в регистрах EEADRH: EEADR, а 14-битное значение — в регистрах EEDATH: EEDATA.
; ************************
; * ФУНКЦИЯ: Записывает одно слово в FLASH-память программ *
; * ВХОД: Слово данных в EEDATH: EEDATA *
; * ВХОД: Адрес ячейки в EEADDRH: EEADDR *
; * ВХОД: На время записи прерывания запрещаются *
; * ВЫХОД: Рабочий банк — 0-й *
; *************************
FLASH_PUT
bsf STATUS,RP0; Переключаемся в 3-й банк
bsf STATUS,RP1
bsf EECON1,EEPGD; Пишем в память программ
bsf EECON1,WREN; Разрешаем операцию записи
bcf INTCON,GIE; Запрещаем все прерывания
movlw h’55’; Загружаем кодовую последовательность
movwf EECON2;
movlw h’AA’
movwf EECON2
bsf EECON1,WR; Инициируем цикл записи
nop
nop
bcf EECON1,WREN; Запрещаем последующую запись
bsf INTCON,GIE; Разрешаем прерывания
bcf STATUS,RP1; Возвращаемся в 0-й банк
bcf STATUS,RP0
return; и выходим из n/n по окончании цикла записи
Все устройства, имеющие память программ с возможностью электрического стирания, содержат в слове конфигурации биты
Защита кода также влияет и на внутренние операции записи в память программ с помощью кода, подобного представленному на Рис. 15.6. Из самой программы запись может осуществляться только в незащищенные участки памяти программ при условии, что бит WRT установлен в 1 (состояние по умолчанию). Запись 0 в этот бит (_WRT_ENABLE_OFF) запретит внутреннюю запись в память программ независимо от установок битов защиты кода. На операцию внутреннего чтения биты защиты кода никак не влияют. Директива __config, присутствующая в Программе 15.5, используется для отключения защиты всей памяти программ, что, вообще говоря, делать не обязательно, поскольку в таком состоянии биты находятся по умолчанию.
Рис. 15.6.