Основная процедура, относящаяся к теме данной главы, приведена в Программе 15.11. При ВЫСОКОМ уровне на выводе GPIO2 2-байтное число переполнений при низкой температуре LO_TEMP: LO_TEMP+1 заносится в два младших байта EEPROM с использованием подпрограммы ee_put из Программы 15.2.
При ВЫСОКОМ уровне на выводе GPIO3 вычисляется разность между 2-байтными значениями, полученными при высокой и низкой температурах. Если посмотреть на график, приведенный на Рис. 15.8, то можно заметить, что разность отсчетов при изменении температуры на 30 °C в любом случае не превысит 256, так что для хранения этой разности достаточно будет одного байта. Данное значение сохраняется в EEPROM обычным образом.
UPDATE_LO
movf LO_TEMP,w; Берем старший байт значения для низкой температуры
bsf STATUS,RP0; Переключаемся в 1-й банк
movwf EEDATA; Кладем в регистр данных EEPROM
clrf EEADR; Адрес в EEPROM — h’00’
call EE_PUT; Запоминаем значение
movf LO_TEMP+1,w; Берем младший байт значения для низкой температуры
bsf STATUS,RP0; Переключаемся в 1-й банк
movwf EEDATA; Кладем в регистр данных EEPROM
incf EEADR,f; Адрес в EEPROM — h’01’
call EE_PUT; Запоминаем значение
goto READING_EXIT
UPDATE_HI; Вычисляем HI_TEMP-LO_TEMP и сохраняем разность в EEPROM
; Достаточно вычесть только младшие байты, поскольку разность не может быть больше 256
movf HI_TEMP+1,w; Берем старший байт значения при высокой
subwf L0_TEMP+1,w; Вычитаем младший байт значения при низкой температуре
movwf DELTA_TEMP; температуре Запоминаем разность
bsf STATUS,RP0; Переключаемся в 1-й банк
movwf EEDATA; Разность — по адресу h’02’
movlw 2
movwf EEADR
call EE_PUT
goto READING_EXIT
В Примере 14.3 мы вычисляли энергию разряда дефибриллятора путем суммирования квадратов отклонений напряжения от базового значения. Причем после анализа графика в качестве базового было принято значение 2.6 В. Это среднее значение может изменяться от экземпляра к экземпляру прибора, а также с течением времени. Поэтому было решено доработать программное обеспечение, введя в него возможность самообучения, которое будет осуществляться, скажем, при замыкании кнопки, подключенной к выводу RA4. При нажатии на кнопку надо будет выполнить 256 выборок значений напряжения в режиме ожидания, с последующим их сложением для получения 2-байтной суммы. Взяв старший байт ЭТОЙ суммы, МЫ получим усредненное значение напряжения (взятие старшего байта 2-байтного числа эквивалентно его делению на 256). Это значение мы запишем в EEPROM по адресу h’00’ и впоследствии будем использовать в качестве базового уровня, периодически обновляя его при необходимости. Предполагая, что в вашем распоряжении имеется подпрограмма GET_ANALOG из Программы 14.1 (стр. 516), напишите соответствующую подпрограмму.
Решение
Из Рис. 14.20 на стр. 534 видно, что напряжение с датчика тока дефибриллятора подается на вывод RA0/AIN0 микроконтроллера. С учетом того что модуль АЦП уже инициализирован, как это было сделано в Программе 14.6 на стр. 536, нам останется только 256 раз считать оцифрованное значение с 0-го канала АЦП для накопления 16-битной суммы. Взяв старший байт этой суммы, мы получим усредненное значение, т. е. частное от деления суммы на 256. Если во время взятия отсчетов дефибриллятор находился в режиме ожидания, то полученное среднее значение будет представлять собой базовое напряжение.
После определения базового напряжения это однобайтное значение можно записать в EEPROM обычным образом. Впоследствии его можно будет считать из EEPROM и использовать вместо константы BASELINE (Программа 14.6).
В Программе 15.12 регистр COUNT используется в качестве счетчика итераций цикла. В каждом проходе цикла новое значение АЦП прибавляется к общей сумме, накапливаемой в регистрах ACCUMULATOR: ACCUMULATOR+1. После выхода из цикла содержимое регистра ACCUMULATOR (старший байт суммы) заносится в EEPROM по адресу h’00’ с использованием подпрограммы EE_PUT.