Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Для этого нам потребуется как-то узнавать, есть ли уже в EEPROM какие-то данные или нет, и правильно ли они записаны. Можно учесть тот факт, что в пустой EEPROM всегда записаны одни единицы (любой считанный байт будет равен $FF), но в общем случае это ненадежно. Наиболее универсальный способ — выделить для этого один какой-то байт в EEPROM, и всегда придавать ему определенное значение, а при загрузке МК его проверять. Это не гарантирует 100%-ной надежности при сбоях (т. к. данные в незащищенной EEPROM могут меняться произвольно, в том числе и с сохранением значения отдельных байт), но мы будем считать, что какую-то весомую вероятность распознавания сбойной ситуации это дает, и нам такой эшелонированной защиты достаточно. Опыт автора показывает, что спроектированные таким образом приборы работают годами в режиме 24x7, без единого сбоя.

Итак, общая схема алгоритма такова: читаем контрольный байт из EEPROM, если он равен заданной величине (обычно я выбираю чередование единиц и нулей: $АА), то это значит, что коэффициенты уже записаны. Если же нет, то записываем значения "по умолчанию", в том числе и этот контрольный байт. Пусть у нас есть некоторые значения двухбайтовых коэффициентов КО, К1 и т. д. (в отдельных байтах K0H:K0L, K1H:K1L и т. п.), которые записываются в EEPROM с самого начала (с адреса 0:0, по которому располагается старший байт первого коэффициента КОН), а по адресу $10 записывается контрольной байт, равный $АА. Тогда в программе в конце процедуры начальной загрузки по метке RESET до команды sei (обязательно перед ней, а не после) добавляется текст, приведенный в листинге 9.3.

Листинг 9.3
;чтение коэффициентов из EEPROM ===========
clr ZH ;ст. адрес =0
ldi ZL, $10 /адрес контрольного байта
rcall ReadEEP
cpi temp,$AA ;если он равен $АА breq mm_RK ;то на чтение в ОЗУ rcall ZapisK ;иначе запись значений по умолчанию mm_RK: /извлечение коэфф. из EEPROM в SRAM clr ZL /начальный адрес EEPROM 0:0 ldi YL,AddrKOH /начальный адрес SRAM 'LoopRK: rcall ReadEEP /читаем байт
st Y+,temp /складываем в ОЗУ inc ZL /следующий адрес cpi ZL,8 /всего 4 коэффициента, 8 байт brne LoopRK
Процедура записи коэффициентов по умолчанию, обозначенная как zapisK, может быть вставлена в любом месте программы (листинг 9.4).

Листинг 9.4
ZapisK:
/запись предварительных коэффициентов по умолчанию -clr ZH /с нулевого адреса в EEPROM clr ZL
/КО
ldi temp,High(КО) /ст rcall WriteEEP inc ZL
ldi temp,Low(КО) /мл rcall WriteEEP inc ZL
/К1
ldi temp,High(Kl) /ст rcall WriteEEP inc ZL
ldi temp, Low (Kl) /мл rcall WriteEEP inc ZL
ldi ZL,$10
ldi temp,$AA /все Ok, записываем rcall WriteEEP /контрольный байт
ret

Манипулируя значением контрольного байта, можно даже определить, предварительные у нас коэффициенты записаны или уже окончательные после калибровки, если вдруг возникает такая задача.
Иногда может понадобиться и запись какой-то константы в программу по ходу работы программы: например, если вы делаете электронный регулятор уровня какой-то величины (громкости, освещения, яркости свечения), то будет очень правильно записывать текущее значение в EEPROM, для того, чтобы при следующем включении восстанавливалось последнее состояние, и пользователю не приходилось бы делать регулировку заново. Только при этом следует учесть, что EEPROM все же не RAM, и запись в нее, во-первых, имеет ограниченное (хотя и большое — до 100 ООО) число циклов, во-вторых, протекает на много порядков медленнее, а в-третьих, ведет к повышенному расходу энергии. Потому использовать EEPROM, как ОЗУ, конечно, не стоит.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru