; *******************
; * ФУНКЦИЯ: Суммирует 256 выборок аналогового сигнала для *
; * ФУНКЦИЯ: нахождения среднего значения, являющегося *
; * ФУНКЦИЯ: базовым напряжением, которое запоминается в *
; * ФУНКЦИЯ: модуле EEPROM *
; * РЕСУРСЫ: Подпрограммы GET_ANALOG, EE_PUT *
; * ВХОД: Нет *
; * ВЫХОД: Среднее значение 0-го канала — в EEPROM (h’00’) *
; *******************
LEARN clrf BASE; Обнуляем старший байт суммы
clrf BASE+1; Обнуляем младший байт суммы
clrf COUNT; Обнуляем счетчик цикла
LEARN_LOOP
clrw; Работаем с 0-м аналоговым каналом
call GET_ANALOG; Оцифровываем
addwf BASE+1,f; Прибавляем к младшему байту суммы
btfsc STATUS,С; Был перенос?
incf BASE,f; ЕСЛИ да, TO инкрементируем старший байт
decfsz COUNT,f; Уменьшаем счетчик цикла на единицу
goto LEARN_LOOP
; Запоминаем среднее в EEPROM
movf BASE,w; Берем среднее значение
bsf STATUS,RP1; Переключаемся во 2-й банк
clrf EEADR; Будем писать по адресу h’00’
movwf EEDATA; Загружаем байт данных
call EE_PUT; Запоминаем его
return ; Все сделали
В реальной ситуации лучшего результата можно достичь, беря 65 536 отсчетов и накапливая их в 3-байтной сумме. И опять же, старший байт этой суммы будет представлять собой усредненное значение.
15.1. В соответствии с хорошим стилем программирования данные, записываемые в EEPROM, следует верифицировать. Как можно модифицировать подпрограмму EE_PUT из Программы 15.2, чтобы она возвращала в регистре ERROR число —1 в случае, если запись прошла неудачно? В противном случае в этом регистре должен быть ноль.
15.2. В Программе 15.5 мы поместили
Размещение сегментов программы по адресам, заданным пользователем, является не очень хорошей идеей, поскольку при последующих модификациях программы может произойти наложение участков кода. Более надежным будет оставить размещение меток на совести ассемблера. Однако в нашем случае необходимо прибавлять значение
15.3. В Microchip-совместимых ассемблерах имеется директива da, которая может использоваться для описания строк символов в памяти программ, например:
MESSAGE da "Hello world\n",0
Эта директива помещает символы, расположенные между кавычками, в память программ, причем в каждое 14-битное слово заносится по два символа, представленных 7-битным кодом ASCII. Завершается строка словом с нулевым значением. Служебный символ \п означает «новая строка», его ASCII-код равен h’0A’.
Полагая, что мы работаем с PIC16F87X, напишите подпрограмму, называемую PDATA, для выборки каждого символа из памяти программ и передачи его на терминал с помощью подпрограммы PUTCHAR из Программы 12.14 (стр. 421).
15.4. В некоторых системах безопасности гостиниц для электронных замков номеров используются перепрограммируемые смарт-карты на базе микроконтроллеров PIC. При регистрации в гостинице в эту карту заносятся следующие данные:
1. 4-разрядный номер комнаты, например 1311.
2. Дата начала срока действия ключа, например 13072005.
3. Дата окончания срока действия ключа, например 15072005.