Раздел: Документация
0 ... 49 50 51 52 53 54 55 ... 195 Перед выполнением операции чтения также необходимо проконтролировать состояние флага EEWE. Дело в том, что, пока выполняется операция записи в EEPROM (флаг EEWE установлен), нельзя ни выполнять чтение EEPROM-памяти, ни изменять регистр адреса. После загрузки требуемого адреса в регистр EEAR необходимо установить в 1 бит EERE регистра EECR. Когда запрошенные данные будут помещены в регистр данных EEDR, произойдет аппаратный сброс этого бита. Однако следить за состоянием бита EERE для определения момента завершения операции чтения не требуется, так как операция чтения из EEPROM всегда выполняется за один такт. Кроме того, после установки бита EERE в 1 процессор пропускает 4 такта перед началом выполнения следующей инструкции. С учетом сказанного функция чтения из EEPROM может быть реализована следующим образом: Пример на ассемблере
Пример на Си unsigned char EEPROM write(unsigned int uiAddress) { while(EECR & (1<<EEWE)); /* Ждать завершения предыдущей записи */ EEAR = uiAddress;/* Проинициализировать регистр адреса */ EECR 1= (1<<EERE);/* Выполнить чтение */ return EEDR; } Меры предосторожности К сожалению, у EEPROM-памяти есть один недостаток: при снижении напряжения питания хранящиеся в ней данные могут быть повреждены. Это может произойти по двум причинам: 1.Если напряжение питания ниже некоторой величины, запись в EEPROM будет произведена некорректно. 2.Микроконтроллер сам может выполнять команды некорректно, если напряжение питания будет ниже нормы. Чтобы избежать повреждения данных, хранящихся в EEPROM, достаточно воспользоваться одним из трех следующих решений: 1.Удерживать микроконтроллер в состоянии сброса все время, пока напряжение питания находится ниже нормы. Для этого следует использовать встроенный детектор пониженного напряжения питания (Brown-Out Detector — BOD). Более подробно о нем будет рассказано в подразделе 4.4.4. 2.Удерживать микроконтроллер в «спящем» режиме (Power Down), пока напряжение питания находится ниже нормы. Поскольку в этом режиме микроконтроллер не может выполнять никаких команд, такое решение эффективно защищает служебные регистры EEPROM от непреднамеренной записи. 3.Хранить константы в FLASH-памяти программ, если они не должны меняться во время работы программы. Микроконтроллер не может самостоятельно производить запись в FLASH-память, соответственно при понижении напряжения питания ее содержимое не будет повреждено. 2.3. Счетчик команд и выполнение программы 2.3.1. Счетчик команд Счетчик команд представляет собой регистр, в котором содержится адрес следующей исполняемой команды. Напрямую из программы он не доступен. Размер счетчика команд зависит от объема имеющейся памяти программ и составляет от 11 (ATmega48x) до 17 (ATmega2560x/2561x) битов. При нормальном выполнении программы содержимое счетчика команд автоматически увеличивается на 1 или на 2 (в зависимости от выполняемой команды) в каждом такте. Этот порядок нарушается при выполнении команд перехода, вызова и возврата из подпрограмм, а также при возникновении прерываний. После включения питания, а также после сброса микроконтроллера в счетчик программ автоматически загружается стартовый адрес ($0000 или начальный адрес сектора загрузчика). Как правило, по этому адресу располагается команда безусловного перехода к инициализационной части программы. При возникновении прерывания в счетчик команд загружается адрес соответствующего вектора прерывания. Если прерывания используются в программе, то по адресам векторов прерываний должны размещаться команды перехода к подпрограммам обработки прерываний. 2.3.2. Функционирование конвейера Как и во всех микроконтроллерах AVR, в микроконтроллерах семейства Mega используется конвейерная обработка команд. Функционирование конвейера показано на Рис. 2.36. Системный тактовый сигнал г J-V Выборка 1 -й команды-j- Выполнение 1-й команды Выборка 2-й команды" Выполнение 2-й команды я Выборка 3-й команды" Выполнение 3-й команды Выборка 4-й команды" 12 ТЗ Рис. 2.36. Последовательность выполнения команд в конвейере Во время первого такта происходит выборка команды из памяти программ и ее декодирование. Во время второго такта эта команда выполняется, а параллельно происходит выборка и декодирование второй команды и т. д. В результате фактическое время выполнения каждой команды получается равным одному периоду тактового сигнала микроконтроллера. Однако в действительности при отработке ряда команд происходит нарушение нормального функционирования конвейера. Наиболее ярким примером команд, вызывающих подобное нарушение, являются команды условного перехода, а также команды типа Test & Skip (проверка и пропуск следующей команды, если результат проверки положительный). В случае истинности условия, проверяемого командой условного перехода, выполнение программы должно будет продолжиться с некоторого адреса. А поскольку в конвейере уже произошла выборка команды, расположенной за командой перехода, время выполнения команды перехода увеличивается на один такт, во время которого происходит выборка команды, расположенной по требуемому адресу. Во втором случае, при выполнении команд типа Test & Skip следующая команда не выполняется в случае истинности проверяемого условия. Однако выборка пропускаемой команды уже произошла. Вследствие того, что команда не выполняется, в конвейере образуется «дырка», которая заключается в пропуске одного (или двух, в зависимости от пропускаемой команды) тактов. Соответственно, команды типа Test & Skip выполняются за один такт, если результат проверки условия отрицателен, и за два или три такта, если он положителен. 0 ... 49 50 51 52 53 54 55 ... 195
|