Приведенный выше алгоритм реализован в Программе 15.2. Значения байта данных и его адреса заносятся в регистры EEDATA и EEADR вызывающей программой. Возврат из подпрограммы происходит только после завершения цикла записи, который длится около 4 мс. Такое решение гарантирует, что указанные РСН не будут изменены во время цикла, что может привести к неверным результатам.
; ************************
; * ФУНКЦИЯ: Пишет один байт в модуль EEPROM *
; * ВХОД: Байт данных в EEDATA, адрес байта в EEADR *
; * ВЫХОД: Прерывания запрещены в течение 9 маш. циклов *
; * ВЫХОД: Используется 0-й банк памяти *
; ************************
ЕЕ PUT bsf STATUS,RP0
; Переключаемся в 1-й банкbcf STATUS,RP1
bsf EECON1,WREN
; Разрешаем записьbcf INTCON,GIE
; Запрещаем все прерыванияmovlw h’55’
; Загружаем кодовую последовательностьmovwf EECON2
movlw h’AA’
movwf EECON2
bsf EECON1,WR
; Инициируем цикл записиbcf EECON1,WREN
; Запрещаем дальнейшие операции записиbsf INTCON,GIE
; Разрешаем прерыванияEE_EXIT btfsc EECON1,WR
; Проверяем, запись завершена?goto EE_EXIT
; ЕСЛИ нет, ТО проверяем сноваbcf STATUS,RP0
; Возвращаемся в 0-й банкreturn
; и выходим из подпрограммы по окончании цикла записиЧтобы проиллюстрировать работу с EEPROM, вернемся к Примеру 12.3 (стр. 439), в котором мы сохраняли 3-байтные показания одометра во внешней последовательной EEPROM. Однако на этот раз мы воспользуемся встроенной EEPROM-памятью. Предположим также, что показания одометра хранятся в ячейках EEPROM с адресами h’10’…h’12’.
В новой программе, код которой приведен в Программе 15.3, для чтения и последующей записи 3-байтного значения одометра из/в модуль EEPROM используются подпрограммы EE_GET
и EE_PUT. Адрес первого (старшего) байта в начале подпрограммы копируется в регистр EEADR, а по ходу выполнения подпрограммы для указания на требуемые ячейки этот регистр инкрементируется и декрементируется.