Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
276 Часть 111. Практическое программирование микроконтроллеров А VR вующее прерывание (отметим, что в семействе Classic его не было). Прерывание EEPROM, если оно разрешено, генерируется по окончании очередного цикла запи си, когда память освобождается . Использовать его удобно, если нам требуется за писывать достаточно большие массивы, - например, запись 1 00 байтов может длиться порядка секунды, и тормозить МК на весь этот период бьuю бы неразумно. Следует быть внимательными: если установить флаг EEWE в начале программы, то прерывание сгенерируется немедленно, т. к. условие для его возникновения - ну левое значение флага EEWE, и если ничего не делать, то прерывание (разрешено же ! ) будет генерироваться постоянно. Следует разрешить прерывание EEPROM где-то по ходу программы, и внутри него осуществлять запись каждого очередного байта. Когда массив заканчивается, прерывания EEPROM запрещают. Такой способ можно назвать «правильным», но он заметно сложнее в применении, чем простой «лобовой» метод, рекомендуемый, кстати, и в фирменном описании. Простой алгоритм состоит в том, что мы запускаем бесконечный цикл ожидания сброса флага EEWE и тогда записываем очередной байт (и, кстати, производим чте ние тоже - если запись не закончилась, читать нельзя). В этом случае, если нам нужно записать всего один байт, МК вообще не будет затормаживаться (перед пер вой записью доступ к EEPROM свободен), и лишь при записи нескольких байтов подряд будет возникать упомянутая задержка. Факт задержки следует учесть, когда приходится стыковать запись в EEPROM с асинхронными процедурами пересылки данных, - например, если при приеме данных из последовательного порта они поступают быстрее, чем успевают записываться в EEPROM, то некоторые можно потерять . Чтобы такого не случилось, следует записывать данные через буфер в SRAM. Но при достаточно редком обращении к этой процедуре в форме, напри мер, обновления в EEPROM небольшого количества данных, проще подождать не сколько лишних миллисекунд, чем путаться в прерываниях без прямой необходи мости. Процедура записи в EEPROM, которую мы будем использовать, ничем не отлича ется от приводимой в фирменных описаниях контроллеров, - я только изменил некоторые обозначения регистров (листинг 1 0 . 1 ) . WriteEEP : ; в ZH : ZL - адрес EEPROM куда писать ; в temp - записываемый байт sbic EECR, EEWE ; ждем очистки бита rjmp WriteEEP ; разрешения записи EEWE out EEARН, ZH ; старший адреса out EEARL , ZL ;младший адреса out EEDR, temp ; данные sbi EECR, EEМWE ; установить флаг разрешения записи sbi EECR, EEWE ; установить бит разрешения ret ; ( конец WriteEEP ) Отметим, что процедура разрешения записи двухступенчатая: «лишний» флаг ЕЕМWЕ (официально он называется флагом управления разрешением записи) введен, оче-
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==