Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
284 Часть 111. Практическое программирование микроконтроллеров АVR часы, - лучше бы тогда часов не было вообще) . Если схема спроектирована верно, и EEPROM надежно защищена от сбоев, автоматическая запись должна произво диться один-единственный раз при первом запуске контроллера. Кроме того, она должна осуществляться при случайной порче данных. Для этого нам потребуется как-то узнавать, есть ли уже в EEPROM какие-то дан ные или нет, и правильно лй они записаны. Можно учесть тот факт, что в пустой EEPROM всегда записаны одни единицы (любой считанный байт будет равен $ FF ) , но в общем случае это ненадежно. Наиболее универсальный способ - выделить для этого один какой-нибудь байт в EEPROM и всегда придавать ему определенное значение, а при загрузке МК его проверять. Это не гарантирует 1 00%-ной надежно сти при сбоях (т. к. данные в незащищенной EEPROM могут меняться произвольно, в том числе и с сохранением значения отдельных байтов), но мы будем считать, что какую-то весомую вероятность распознавания сбойной ситуации это дает, и нам такой эшелонированной защиты достаточно. Опыт автора показывает, что спроек тированные таким образом приборы работают годами в режиме 24х7 без единого сбоя . Итак, общая схема алгоритма такова: читаем контрольный байт из EEPROM, если он равен заданной величине (обычно я выбираю чередование единиц и нулей: $АА ) , то это значит, что коэффициенты уже записаны. Если же нет, то записываем значе ния «по умолчанию», в том числе и этот контрольный байт. Пусть у нас есть неко торые значения двухбайтовых коэффициентов ко, к1 и т. д. (в отдельных байтах: кон : КОL, КlH : КlL и т. п. ), которые записываются в EEPROM с самого начала (с адре са о : о, по которому располагается старший байт первого коэффициента кон ) , а по адресу $ 1 0 записывается контрольный байт, равный $АА. Тогда в программе в конце процедуры начальной загрузки по метке Reset до команды sei (обязательно перед ней, а не после) добавляется текст, приведенный в листинге 1 0 .4. ; чтение коэффициентов из EEPROM =========== clr ZH ; ст . адрес =О ldi ZL, $ 1 0 ; адрес контрольного байта rcall ReadEEP cpi temp , $AA ; если он равен $АА breq пm_RК ; то на чтение в ОЗУ rcall ZapisK ; иначе запись значений по умолчанию пm_RК: ; извлечение коэфф . из EEPROM в SRAМ clr ZL ; начальный адрес EEPROM 0 : 0 ldi YL , AddrKOH ; начальный адрес SRAМ LoopRK : rcall ReadEEP ; читаем байт st Y+ , temp ; складываем в ОЗУ inc ZL ; следующий адрес cpi ZL , 8 ; всего 4 коэффициента , В байт brne LoopRK
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==