Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 10. Использование EEPROM 277 видно, для дополнительного предохранения EEPROM от несанкционированной записи при сбоях, когда МК может выполнять произвольную последовательность команд. Устанавливаемый программно, флаг ЕЕМWЕ независимо ни от чего сбрасы­ вается аппаратно через четыре такта, и если в течение этих тактов флаг EEWE не бу­ дет установлен, то далее его установка не окажет никакого влияния . Расчет сделан на то, что при выполнении произвольных операций каждый из этих флагов может быть установлен случайно, но случайное совпадение таких действий в нужной по­ следовательности практически исключено. Именно поэтому при отсутствии в про­ грамме процедуры записи в EEPROM вероятность порчи данных в ней практически равна нулю. А вот при наличии такой процедуры мы своими руками вписываем нужную последовательность, и данные при выключении питания достаточно часто оказываются испорченными. Установленный нами бит разрешения EEWE в регистре управления сбросится авто­ матически, когда запись закончится, - этого сброса мы и ожидаем в начале проце­ дуры. На всякий случай, как мы говорили, то же самое рекомендуется делать и при чтении, но практически всегда (если только мы не читаем непосредственно после записи) это не будет задерживать программу дольше, чем на время выполнения команды sЬic, т. е. на два машинных цикла. Сама процедура получается даже коро­ че (листинг 1 0 .2) . ReadEEP : ; в ZH : ZL - адрес откуда читать ; возврат temp - прочтенный байт sЬic EECR, EEWE ; ожидание очистки флага записи rjmp ReadEEP out EEARH , ZH ; старший адреса out EEARL , ZL ;младший адреса sЬi EECR , EERE ; бит чтения in temp , EEDR ; чтение ret ; конец ReadEEP В этих процедурах регистр z не играет никакой выделенной роли, - он просто служит удобной парой регистров, которую можно заменить на любую другую. При чтении следует учитывать, что после установки бита EERE в единицу контрол­ лер пропускает 4 такта перед выполнением следующей команды. То есть сама по себе команда чтения in temp , EEDR выполняется за один такт, но вся вместе про­ цедура занимает минимум 5 тактов, без учета ожидания очистки флага и установок адреса. Отметим еще, что если запись производится в основном цикле, то на время записи следует запрещать прерывания, - если между установкой флага ЕЕМWЕ и флага EEWE « с в и к линится» стороннее прерывание, то первый окажется сброшен, и никакой запи­ не произойдет. Если мы используем процедуру записи внутри какого-либо пре­ рывания, то, разумеется, об этом можно не думать, поэтому в процедуре, приведен-

RkJQdWJsaXNoZXIy MTExODQxMg==