Пусть значения коэффициентов записываются в EEPROM с самого начала (с адреса 0:0, в том же порядке, в котором они расположены в SRAM), а по адресу $10 записывается контрольный байт, равный $АА. Тогда в программе, приведенной в
;чтение коэффициентов из 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), может быть вставлена в любом месте программы.
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). Можно заполнять различные поля, вплоть до серийного номера, и вести базу выпущенных экземпляров. Несложно сделать и так, чтобы эта информация выдавалась «наверх» автоматически при подсоединении прибора к компьютеру с загруженной программой, и текущие значения параметров выводились в отдельном окне — тогда можно обойтись без громоздкой и «прожорливой» индикации и получить компактный компьютерный «прибамбас». Только вот как все эти данные извлекать и при необходимости изменять, не затрагивая самой программы? Для этого существуют последовательные интерфейсы, к рассмотрению которых мы сейчас и перейдем.
Глава 16
Некоторые последовательные интерфейсы МК
Звонок в офис интернет-провайдера:
— Алло! Это Интернет?
— Да, слушаем Вас!
— Соедините с www.yahoo.com.