Итак, общая схема алгоритма такая: читаем контрольный байт из EEPROM, если он равен заданной величине (обычно я выбираю чередование единиц и нулей: $АА), то это значит, что коэффициенты уже записаны. Если же нет, то записывает значения «по умолчанию», в том числе и значение этого контрольного байта. Далее в любом случае переходим к процедуре чтения из EEPROM и перегрузки записанных констант в SRAM, откуда они при необходимости извлекаются точно так же, как ранее в процедурах расчета физических величин. Так мы сможем ничего не менять в основной программе, описанной ранее в этой главе, а лишь дописать некий текст в секции начальной загрузки.
Пусть значения коэффициентов записываются в EEPROM с самого начала (с адреса 0:0, в том же порядке, в котором они расположены в SRAM), а по адресу $10 записывается контрольный байт, равный $АА. Тогда в программе, приведенной в Приложении 5 , в конце процедуры начальной загрузки по метке reset вместо всего фрагмента, начинающегося с заголовка «запись коэффициентов» до команды sei (обязательно перед ней, а не после) добавляется текст листинга 15.9.
Листинг 15.9
;чтение коэффициентов из EEPROM =====
clr ZH ;ст. адрес =0
ldi ZL,$10 ;адрес контрольного байта
rcall ReadEEP
cpi temp,$AA ;если он равен $AA
breq mm_RK ;то на чтение в ОЗУ
rcall ZapisK ;иначе запись значений по умолчанию
mm_RK: ;извлечение коэфф. из EEPROM в SRAM
clr ZL ;начальный адрес EEPROM 0:0
ldi YL,tZH ;начальный адрес SRAM, см. основной текст
LoopRK:
rcall ReadEEP ;читаем байт
st Y+,temp ;складываем в ОЗУ
inc ZL ;следующий адрес
cpi ZL,8 ; всего 4 коэффициента, 8 байт
brne LoopRK
Процедура записи коэффициентов по умолчанию, обозначенная как ZapisK(листинг 15.10), может быть вставлена в любом месте программы.
Листинг 15.10
ZapisK:
;запись предварительных коэффициентов по умолчанию
clr ZH ;с нулевого адреса в EEPR
clr ZL
; Z tempr=471
ldi temp,High(471) ;ст.
rcall WriteEEP
inc ZL
ldi temp,Low(471) ;мл.
rcall WriteEEP
inc ZL
; К tempr=1020
ldi temp,High(1020) ;ст.
rcall WriteEEP
inc ZL
ldi temp,Low(1020) ;мл.
rcall WriteEEP
inc ZL
; Z press=12
ldi temp,0x00 ;ст.
rcall WriteEEP
inc ZL
ldi temp,12 ;мл.
rcall WriteEEP
inc ZL
; К prs=916
ldi temp,High(916) ;ct.
rcall WriteEEP
inc ZL
ldi temp,Low(916) ;мл.
rcall WriteEEP
ldi ZL,$10
ldi temp,$AA ;все Ok, записываем
rcall WriteEEP ;контрольный байт
ret
Манипулируя значением контрольного байта, можно даже определить, предварительные у нас коэффициенты записаны, или уже окончательные после калибровки, если вдруг возникает такая задача.
Конечно, иногда может понадобиться запись какой-то константы по ходу работы программы: например, если вы делаете электронный регулятор уровня какой-то величины (громкости, освещения, яркости свечения), то будет очень правильно записывать текущее значение в EEPROM, чтобы при следующем включении восстанавливалось установленное состояние, и пользователю не приходилось бы делать регулировку заново. Только при этом следует учесть, что EEPROM все же не RAM, и запись в нее, во-первых, имеет ограниченное (хотя и большое — до 100 000) число циклов, во-вторых, протекает на много порядков медленнее, а в-третьих, ведет к повышенному расходу энергии. Потому использовать EEPROM как ОЗУ, конечно, не стоит.
Кроме записи констант, наиболее часто EEPROM служит для хранения, например, заводского номера и названия прибора, фамилии конструктора-программиста или названия фирмы-изготовителя, и всякой другой полезной информации (ср. данные, которые извлекает операционная система ПК при подсоединении устройства plug&play, например, через USB). Можно заполнять различные поля, вплоть до серийного номера, и вести базу выпущенных экземпляров. Несложно сделать и так, чтобы эта информация выдавалась «наверх» автоматически при подсоединении прибора к компьютеру с загруженной программой, и текущие значения параметров выводились в отдельном окне — тогда можно обойтись без громоздкой и «прожорливой» индикации и получить компактный компьютерный «прибамбас». Только вот как все эти данные извлекать и при необходимости изменять, не затрагивая самой программы? Для этого существуют последовательные интерфейсы, к рассмотрению которых мы сейчас и перейдем.
Читать дальше
Конец ознакомительного отрывка
Купить книгу