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





Отметим, что можно применить рекомендуемый в фирменных описаниях способ защиты EEPROM переводом МК в состояние пониженного энергопотребления. Это можно сделать, например, если подсоединить монитор питания к выводу внешнего прерывания, и все время отслеживать соответствующий бит в регистре GIFR, при установке которого в единичное состояние немедленно уводить МК в "спящее" состояние (штатным способом — через обработчик прерывания— это сделать сложнее, т. к. в прерывании команда sleep будет просто проигнорирована, см. главу 14). Но кроме относительной сложности этого процесса, следует еще учитывать, что при резком снижении потребления напряжение источника немедленно опять повысится (особенно в случае батарейного питания). И если у вас предусмотрена процедура обратного вывода из этого состояния (например, чтобы схема не "защелкивалась" при случайных бросках напряжения), то при относительно малом значении гистерезиса монитора питания (для МС34064 — 20 мВ) это обязательно вызовет "дребезг" схемы, и неизвестно, что хуже. Увеличить гистерезис можно включением еще нескольких резисторов, но, на взгляд автора, лучше при наличии внешнего монитора обойтись вводом в режим сброса, как более простым и надежным способом, не требующим программного вмешательства, и к тому же автоматически предусматривающим защиту от "защелкивания".

Запись и чтение EEPROM
Запись и чтение данных в EEPROM осуществляется через специальные регистры ввода-вывода: регистр данных EEDR, регистр адреса EEAR (если объем EEPROM более 256 байт, то делится на два— EEARH И EEARL) И регистр управления EECR. Основная особенность этого процесса— большая продолжительность процедуры записи, которая для разных моделей AVR может длиться от 2 до 9 мс, в тысячи раз дольше, чем выполнение обычных команд. Обратим внимание, что в отличие от записи чтение осуществляется всего за один машинный цикл, даже быстрее, чем из обычной SRAM — это типичная особенность всех EEPROM, имеющих структуру NOR (в отличие от flash-памяти, которая сейчас сплошь делается на NAND-структурах).

При инициализации записи байта в EEPROM устанавливается флаг разрешения записи EEWE в регистре управления EECR, по окончании записи он автоматически сбрасывается. Для удобства почти во всех моделях AVR предусмотрено соответствующее прерывание (отметим, что в семействе Classic его не было). Прерывание EEPROM, если оно разрешено, генерируется по окончании очередного цикла записи, когда память освобождается. Использовать его удобно, если нам требуется записывать достаточно большие массивы: например, для 100 байт запись может длиться порядка секунды, и тормозить МК на весь этот период было бы неразумно. После разрешения этого прерывания оно сгенерируется немедленно, т. к. условие для его возникновения — нулевое значение флага EEWE (если ничего не делать, то прерывание будет генерироваться постоянно). Можно разрешить прерывание EEPROM где-то по ходу программы, и внутри его осуществлять запись каждого очередного байта. Когда массив заканчивается, прерывания EEPROM запрещают.

Такой способ можно назвать "правильным", но он заметно сложнее простого "лобового" метода, рекомендуемого, кстати, и в фирменном описании. Простой алгоритм состоит в том, что мы запускаем бесконечный цикл ожидания сброса флага EEWE и тогда записываем очередной байт (и, кстати, чтение тоже — если запись не закончилась, читать нельзя). В этом случае, если нам нужно записать всего один байт, МК вообще не будет затормаживаться (перед первой записью память свободна), и лишь при записи нескольких байтов подряд будет возникать упомянутая задержка. Факт задержки следует учесть, когда приходится стыковать запись в EEPROM с асинхронными процедурами пересылки данных: например, если при приеме данных из последовательного порта они поступают быстрее, чем успевают записываться в EEPROM, то некоторые можно потерять. Процедура записи в EEPROM, которую мы будем использовать, ничем не отличается от приводимой в фирменных описаниях контроллеров, я только изменил некоторые обозначения регистров (листинг 9.1).

WriteEEP: ;в ZH:ZL - адрес EEPROM куда писать ;в temp — записываемый байт sbic EECR,EEWE ; ждем очистки бита
rjmp WriteEEP ;разрешения записи EEWE out EEARH,ZH /старший адреса out EEARL,ZL /младший адреса out EEDR, temp /данные
sbi EECR,EEMWE /установить флаг разрешения записи sbi EECR,EEWE /установить бит разрешения ret ;(конец WriteEEP)



     
 

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