; **************************
; ФУНКЦИЯ: Пишет блок из 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; Проверим младшие биты на равенство 00
andlw 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 ().