в которых содержимое EEPROM задается посредством ассемблерной директивы de (Data EEPROM). После занесения программы в микроконтроллер содержимое модуля EEPROM будет выглядеть так, как показано на Рис. 15.3.
Рис. 15.3.
Любые данные, занесенные таким образом в память, могут впоследствии быть считаны программой. Например, чтобы узнать значение sin(50), надо будет прочитать ячейку EEPROM с адресом h’05’ (50/10), в которой хранится число h’C4’ или 196 десятичное (196/256 = 0.76525).
Несмотря на то что память программ можно инициализировать аналогичным образом, используя директиву dw, как это сделано в Программе 15.5, такая возможность используется довольно редко. Это связано с тем, что в соответствии с идеологией гарвардской архитектуры, базирующейся на разделении адресных пространств памяти программ и памяти данных, ни одна из команд не сможет считать эти данные. Команды могут обращаться только к памяти данных. Однако все более-менее современные PIC-микроконтроллеры с FLASH-памятью программ позволяют программам косвенным образом читать и писать эти данные аналогично тому, как это делается при работе с модулем EEPROM. К таким микроконтроллерам, в частности, относятся все модели группы PIC16F87X. Причем между исходными моделями и более поздними версиями с суффиксом «А» имеются определенные различия. Но сначала мы поговорим о первых.
Обе модели PIC16F873/4 имеют FLASH-память программ объемом 4 Кбайт и модуль EEPROM объемом 128 байт, тогда как модели PIC16F876/7 имеют уже 8 Кбайт памяти программ и 256 байт EEPROM. В остальном эти модели полностью идентичны.
Основные характеристики модуля EEPROM микроконтроллеров группы PIC16F87XA:
• Не менее 100 000 (максимум 106) циклов стирания/записи EEPROM-памяти на ячейку.
• Не менее 10 000 (максимум 105) циклов стирания/записи FLASH-памяти программ.
• Максимальная длительность цикла записи/стирания составляет 8 мс (4 мс typ) как для модуля EEPROM, так и для FLASH-памяти.
Хотелось бы обратить внимание на максимальное число циклов перезаписи FLASH-памяти программ (10 000[189]). Несмотря на то что такого значения более чем достаточно при изменении программы устройства, оно накладывает определенные ограничения на использование памяти программ в качестве хранилища долговременных данных. По этой причине FLASH-память программ более пригодна для хранения неизменяющихся данных, таких как таблицы соответствия, нежели для хранения информации, требующей частого обновления, такой как показания одометра.
FLASH-память занимает меньше места на кристалле, чем обычная EEPROM-память. Хотя это и ускоряет процесс записи, однако заряды, которые в конечном счете стекают через изоляцию плавающего затвора, оказывают отрицательное воздействие на механизм хранения и приводят к более раннему ухудшению параметров памяти.
На Рис. 15.4 показан модуль EEPROM модели PIC16F87X вместе с памятью программ. Такое представление справедливо, поскольку регистры EEDATA и EEADR используются для работы с обеими областями памяти. Разумеется, память программ имеет как больший объем (8 Кбайт против 256 байт), так и большую разрядность (14 бит против 8). Именно поэтому в микроконтроллерах были реализованы дополнительные РСН, использующиеся для хранения старшего байта адреса (EEADRH) и данных (EEDATH).
Рис. 15.4.
Как мы скоро убедимся, процессы чтения и записи обеих областей памяти очень похожи. Память, к которой осуществляется обращение, задается управляющим битом EEPGD регистра EECONl (EECONl[7]). За исключением появления этого нового бита и переноса битов EEIF и EEIE в регистры PIR2 и PIE2 соответственно, регистр EECON1, показанный на Рис. 15.4, ничем не отличается от регистра базового варианта модуля из модели PIC16F62X, изображенного на Рис. 15.2. Виртуальный регистр EECON2 остался таким же.
Чтение и запись модуля EEPROM производятся точно так же, как и в более простых моделях PIC16F62X. Единственное изменение, которое необходимо внести в подпрограммы EE_GET и EE_PUT, связано с тем, что в новых моделях регистры EEDATA и EEADR находятся во 2-м банке, а регистры EECONl и EECON2 — в 3-м банке.
Процесс чтения из FLASH-памяти похож на процесс чтения из модуля EEPROM, только при этом используются 2-байтные регистры адреса и данных. Однако не забывайте, что мы работаем с той же памятью программ, откуда коды команд считываются в исполнительный блок процессора. Из-за этого после команды установки бита RD (EECON 1 [0]) должны располагаться две пустые команды пор. Одним словом, чтение FLASH-памяти программ осуществляется по следующему алгоритму:
1. Скопировать адрес интересующей нас ячейки в регистры EEADRH: EEADR.
2. Установить бит EEPGD, показывая, что мы обращаемся к памяти программ.
3. Установить бит RD для запуска цикла чтения.