; **************************
; ФУНКЦИЯ: Пишет блок из 4-х слов в память программ *
; ВХОД: Начальный адрес блока в EEADRH:ADDR *
; ВХОД: Четыре слова в массиве DATA_ARRAY:8 *
; ВЫХОД: Четыре слова записаны в память программ *
; ВЫХОД: Рабочий банк — 0-й *
; РЕСУРСЫ: Подпрограмма FLASH_PUT *
; ***************************
FLASH_BLAST
bsf STATUS,RP1
; Переключаемся во 2-й банкbcf STATUS,RP0
movlw DATA_ARRAY
; Загружаем в FSR адресmovwf FSR
; младшего байта массива данных в ОЗУ; Теперь выполняем 4 цикла записи —
FB LOOP movf INDF,w
; Считываем старший байт слова иmovwf EEDATH
; помещаем его в старший регистр данныхincf FSR,f
; Указываем на младший байтmovf INDF,w
; Считываем младший байт слова иmovwf EEDATA
; помещаем его в младший регистр данныхincf FSR, f
; Указываем на старший байт следующего словаcall FLASH_PUT
; Пишем в буферный регистрbsf STATUS,RP1
; Снова переключаемся во 2-й банкbcf STATUS,RP0
incf EEADR,f
; Инкрементируем адрес в памяти программmovf EEADR,w
; Проверим младшие биты на равенство 00andlw b’00000011’
; Выделяем эти битыbtfss STATUS,Z
; ЕСЛИ оба равны нулю, ТО выходимgoto FB_LOOP
; ИНАЧЕ пишем следующее словоbcf STATUS,RP1
; Возвращаемся в 0-й банкreturn
; выходим по окончании цикла записиВ компиляторе CCS имеются следующие встроенные функции для работы с модулем EEPROM:
read_eeprom(<адрес>);
Возвращает байт, находящийся по указанному адресу EEPROM.
write_eeprom(<адрес>, <данные>);
Заносит значение, переданное во втором параметре, по указанному адресу EEPROM (первый параметр). Возврат из функции происходит только после завершения цикла записи.
Напишите функцию на языке Си, которая бы обновляла показания одометра, хранящиеся в EEPROM, аналогично Программе 15.3.
Решение
Как и в исходной ассемблерной программе, код которой приведен в Программе 15.3, новая функция (см. Программу 15.8) состоит из трех частей:
1. На этом этапе объявляется массив из 3 байт, названный odometer []
, который служит в качестве временного хранилища показаний одометра, содержащихся в EEPROM. Массив заполняется с помощью трех вызовов функции read_eeprom ().2. После загрузки 3-байтного значения в память данных оно инкрементируется с использованием оператора выбора if-else
:а) Инкрементируется младший байт и проверяется на нулевое значение. Если он не равен нулю, операция инкрементирования завершается, в противном случае происходит переход к обработке среднего байта.
б) Инкрементируется средний байт и проверяется на нулевое значение. Если он не равен нулю, операция инкрементирования завершается, в противном случае происходит переход к обработке старшего байта.
в) Инкрементируется старший байт.
3. В заключение каждый байт заносится обратно в EEPROM с помощью функции write_eeprom ()
.