Сброс микроконтроллера. В процессе сброса во все регистры ввода-вывода записываются их начальные значения и выполнение программы начинается с вектора сброса. По вектору сброса должна храниться инструкция абсолютного перехода JMP на метку процедуры обработки сброса. Если в программе не используются источники прерывания, то векторы прерываний не используются, а зарезервированные под них ячейки памяти могут использоваться для равномерного расположения кода программы. Имеется также случай, когда вектор сброса расположен в секции прикладной программы, а векторы прерываний находятся в загрузочном секторе или наоборот.
Порты ввода-вывода AVR-микроконтроллера немедленно возвращаются к их первоначальному состоянию, как только один из источников сброса становится активным. Для этого не требуется работа какой-либо синхронизации.
После прекращения действия всех источников сброса вступает в силу счетчик задержки, продлевающий внутренний сброс. Данная последовательность требуется для гарантирования запуска микроконтроллера при достижении напряжением питания стабильного уровня. Длительность задержки при старте определяется конфигурационными битами CKSEL.
В таблице 2.2 приведены электрические характеристики схемы сброса.
Источники сброса. ATmega128 имеет пять источников сброса:
Сброс при подаче питания. Микроконтроллер переходит в состояние сброса, если напряжение питания ниже порога сброса при подаче питания (VPOT).
Внешний сброс. Микроконтроллер переходит в состояние сброса, если на вывод RESET подать низкий логический уровень на время дольше, чем минимальная длительность импульса сброса.
Сброс по сторожевому таймеру. Если разрешена работа сторожевого таймера и истек период его срабатывания, то микроконтроллер сбрасывается.
Сброс при снижении питания. Микроконтроллер сбрасывается, если напряжение питания VCC становится ниже порогового значения (VBOT) и разрешена работа схемы контроля питания BOD.
Сброс через интерфейс JTAG. Микроконтроллер находится в состоянии сброса до тех пор, пока в регистре сброса записана 1 в одной из сканируемых цепей JTAG-системы.
Таблица 2.2. Характеристики сброса
Обозн. | Параметр | Условие | Мин. | Тип. | Макс. |
VPOT | Пороговое напряжение сброса при повышении питания (B) | 1.4 | 2.3 | ||
Пороговое напряжение сброса при снижении питания (B) | 1.3 | 2.3 | |||
VRST | Пороговый уровень сброса на выводе RESET (B) | 0.2 Vcc | 0.85 Vcc | ||
tRST | Минимальная длительность импульса сброса на выводе RESET (нс) | ||||
VBOT | Порог напряжения сброса схемы контроля питания BOD (B) | BODLEVEL=1 | 2.4 | 2.6 | 2.9 |
BODLEVEL=0 | 3.7 | 4.0 | 4.5 | ||
tBOD | Минимальная длительность снижения напряжения для срабатывания схемы контроля питания (мкс) | BODLEVEL=1 | |||
BODLEVEL=0 | |||||
VHYST | Ширина петли гистерезиса схемы контроля питания (мВ) |
Примечания:
1. Сброс при подаче питания не будет работать, если напряжение питания ниже VPOT.
2. У некоторых микроконтроллеров VBOT может быть ниже минимального рабочего напряжения. Данные микроконтроллеры на стадии производства испытываются при VCC = VBOT. Этим гарантируется то, что сброс микроконтроллера будет выполнен раньше, чем произойдет снижение питания микроконтроллера на недопустимый для его корректной работы уровень. Испытание ATmega128L выполнено при BODLEVEL=1, а ATmega128 при BODLEVEL=0. Установка BODLEVEL=1 не применима для ATmega128.
Сброс при подаче питания. Импульс сброса при подаче питания (POR) генерируется встроенной схемой. Пороговый уровень сброса приведен в таблице 2.2. POR инициируется всякий раз, когда VCC ниже порогового уровня. Схема POR может использоваться для запуска микроконтроллера, а также для выявления нарушения режима питания.
Функцией схемы сброса при подаче питания (POR) является удержание микроконтроллера в состоянии сброса в течение определенного времени после того, как напряжение достигло уровня сброса при подаче питания. Если напряжение питания снизится ниже определенного уровня, то микроконтроллер снова сбросится без всяких задержек.
Внешний сброс. Внешний сброс генерируется, если на вход RESET подать низкий уровень. Если подать импульс сброса длительностью более tRST (см. табл. 2.2), то будет генерирован сброс, даже если синхронизация не запущена. При подаче импульса сброса длительностью менее tRST сброс не гарантируется. Если сигнал на выводе RESET достигает порогового напряжения сброса VRST на его положительном фронте, то запускается счетчик задержки и микроконтроллер начнет работу только по истечении периода tTOUT.
Контроль напряжения питания. ATmega128 содержит встроенную схему контроля питания (BOD), которая выполняет сравнение уровня VCC с фиксированным пороговым значением. Порог срабатывания схемы BOD может выбираться с помощью конфигурационного бита BODLEVEL. Порог равен 2.7В, когда BODLEVEL незапрограммирован, или 4.0В, когда BODLEVEL запрограммирован. Для исключения автоколебательного режима схема BOD характеризуется гистерезисом. С учетом гистерезиса результирующие пороги срабатывания следующие: VBOT+ = VBOT + VHYST/2 и VBOT- = VBOT - VHYST/2.
Схема BOD может быть включена или отключена с помощью конфигурационного бита BODEN. Если разрешена работа BOD (BODEN запрограммирован) и уровень VCC снизился ниже порога срабатывания, то схема BOD переводит микроконтроллер в состояние сброса. Когда VCC достигает значения выше порога срабатывания, то запускается счетчик задержки и микроконтроллер начнет работу по истечении времени tTOUT.
Схема BOD реагирует на снижение VCC, если напряжение остается меньшим порога срабатывания дольше, чем период времени tBOD (табл. 2.2).
По истечении периода переполнения сторожевого таймера генерируется короткий импульс сброса длительностью равной одному периоду системной синхронизации (1 CK). Падающим фронтом этого импульса запускается счетчик задержки tTOUT.
Регистр управления и статуса микроконтроллера – MCUCSR. В регистре управления и статуса микроконтроллера хранится информация об источнике, который вызвал сброс микроконтроллера.
Разряды | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
JTD | - | - | JTRF | WDRF | BORF | EXTRF | PORF | |
R/W | R/W | R | R | R/W | R/W | R/W | R/W | R/W |
Начальное значение | См. описание разрядов |
Обратите внимание, что в режиме совместимости с ATmega103 доступны только биты EXTRF и PORF.
Бит 4 – JTRF. Флаг индикации сброса через JTAG-интерфейс. Данный бит принимает единичное состояние, если сброс был вызван записью 1 в регистр JTAG Reset JTAG-инструкцией AVR_RESET. Данный бит сбрасывается автоматически при подаче питания или путем непосредственной записи 0 в данный флаг.
Бит 3 – WDRF. Флаг индикации сброса сторожевым таймером. Данный бит устанавливается после сброса сторожевым таймером. Данный бит сбрасывается при подаче питания или путем записи 0 в данный флаг.
Бит 2 – BORF. Флаг индикации сброса схемой контроля напряжения питания. Данный флаг принимает единичное состояние, если схема контроля напряжения питания перевела микроконтроллер в состояние сброса. Данный бит сбрасывается при подаче питания и путем записи 0 в данный флаг.
Бит 1 – EXTRF. Флаг внешнего сброса. Данный бит устанавливается при возникновении внешнего сброса. Флаг сбрасывается при подаче питания или путем записи 0 в данный флаг.
Бит 0 – PORF. Флаг сброса при подаче питания. Данный флаг устанавливается, если сброс был инициирован подачей питания. Данный бит сбрасывается только путем записи 0 в данный флаг.
Если флаги сброса необходимо использовать для определения причины сброса, то программист должен предусмотреть сброс значений флагов MCUCSR желательно сразу после опроса их значений. Если регистр очищается перед возникновением другого сброса, то источник данного сброса может быть найден среди флагов сброса.
Встроенный источник опорного напряжения. ATmega128 содержит встроенный источник опорного напряжения (ИОН). ИОН используется схемой контроля питания и может быть подключен ко входу аналогового компаратора или к АЦП. Опорное напряжение АЦП 2.56В генерируется встроенным ИОН.
Сигналы разрешения и длительность запуска ИОН. ИОН характеризуется задержкой при включении, которая может оказать негативное влияние, если не будет учтена. Для оптимизации энергопотребления ИОН не всегда находится во включенном состоянии. ИОН остается во включенном состоянии в следующих случаях:
1. Когда разрешена работа схемы контроля питания BOD (запрограммирован конфигурационный бит BODEN).
2. Если ИОН подключен ко входу аналогового компаратора (установлен бит ACBG в ACSR).
3. Если разрешена работа АЦП.
Следовательно, когда работа BOD запрещена и установлен бит ACBG или разрешена работа АЦП, программист должен предусмотреть задержку на время запуска ИОН перед использованием выходных данных аналогового компаратора или АЦП. В целях снижения потребляемой мощности в режиме выключения (Power-down) программист должен избежать приведенных выше трех условий для гарантирования, что ИОН будет отключен после перевода микроконтроллера в режим выключения.
Сторожевой таймер. Сторожевой таймер тактируется от отдельного встроенного генератора частотой 1 МГц. Данное значение типично для напряжения питания VCC = 5В. Период переполнения сторожевого таймера можно задавать путем управления предделителем. Инструкция WDR выполняет сброс сторожевого таймера. Сторожевой таймер также сбрасывается при выключении или во время сброса микроконтроллера. Период переполнения определяют восемь различных коэффициентов деления предделителя. Если инструкция сброса сторожевого таймера WDR не выполняется в течение времени равного периоду переполнения сторожевого таймера, то ATmega128 сбрасывается и начинает выполнение программы по вектору сброса.
Для предотвращения неумышленного изменения периода переполнения или выключения сторожевого таймера могут быть использованы 3 различных уровня безопасности, которые выбираются конфигурационными битами M103C и WDTON (Табл. 2.3). Уровень безопасности 0 соответствует установкам в ATmega103. Для разрешения работы сторожевого таймера не требуются какие-либо специальные меры независимо от уровня безопасности.
Таблица 2.3. Конфигурация сторожевого таймера при различных настройках бит M103C и WDTON
M103C | WDTON | Уровень безопасности | Начальное состояние сторожевого таймера | Временная последовательность отключения сторожевого таймера | Временная последовательность изменения периода переполнения |
Незапрограммирован | Незапрограммирован | Выкл. | Есть | Есть | |
Незапрограммирован | Запрограммирован | Вкл. | Отключение невозможно | Есть | |
Запрограммирован | Незапрограммирован | Выкл. | Есть | Нет | |
Запрограммирован | Запрограммирован | Вкл. | Отключение невозможно | Есть |
Регистр управления сторожевого таймера – WDTCR
Разряд | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
- | - | - | WDCE | WDE | WDP2 | WDP1 | WDP0 | |
W/R | R | R | R | W/R | W/R | W/R | W/R | W/R |
Начальное значение |
Биты 7..5. Зарезервированы. Данные разряды являются зарезервированными и всегда считываются как 0.
Бит 4 – WDCE. Разрешение изменения сторожевого таймера. Данный бит необходимо установить непосредственно перед записью 0 в бит WDE. В противном случае запретить работу сторожевого таймере невозможно. После записи в данный бит 1 он автоматически аппаратно сбросится по истечении четырех тактов синхронизации микроконтроллера. На уровнях безопасности 1 и 2 данный бит необходимо устанавливать также перед изменением настроек предделителя.
Бит 3 – WDE. Разрешение сторожевого таймера. Работа сторожевого таймера разрешается (запрещается) путем установки (сброса) бита WDE. Сбросить бит WDE возможно, только если предварительно установить бит WDCE. Для выключения сторожевого таймера необходимо выполнить следующую последовательность:
1. Записать 1 в WDCE и WDE одной инструкцией. Логическая 1 должна быть записана в бит WDE, даже если до выполнения данной операции в нем уже была записана 1.
2. В течение следующих четырех тактов записать 0 в WDE, что приводит к отключению сторожевого таймера.
На 2-ом уровне безопасности запретить работу сторожевого таймера невозможно даже с помощью указанной выше последовательности.
Биты 2..0 – WDP2, WDP1, WDP0. Выбор коэффициента деления. Биты WDP2, WDP1 и WDP0 задают коэффициент деления частоты генератора сторожевого таймера после разрешения работы последнего. Значения коэффициентов деления и соответствующих периодов переполнения приведены в табл. 2.4.
Таблица 2.4. Настройка предделения генератора
сторожевого таймера
WDP2 | WDP1 | WDP0 | Количество тактов генератора сторожевого таймера | Типичное время переполнения при VCC = 3.0В | Типичное время переполнения при VCC = 5.0В |
16K (16,384) | 17.1 мс | 16.3 мс | |||
32K (32,768) | 34.3 мс | 32.5 мс | |||
64K (65,536) | 68.5 мс | 65 мс | |||
128K (131,072) | 0.14 с | 0.13 с | |||
256K (262,144) | 0.27 с | 0.26 с | |||
512K (524,288) | 0.55 с | 0.52 с | |||
1,024K (1,048,576) | 1.1 с | 1.0 с | |||
2,048K (2,097,152) | 2.2 с | 2.1 с |
В следующем примере приведены функции выключения сторожевого таймера на Ассемблере. В примере предполагается, что система прерываний настроена таким образом, чтобы во время выполнения функции не возникло прерывание (например, с помощью общего запрета прерываний инструкцией cli).
Пример кода на АссемблереWDT_off:; Запись 1 в WDCE и WDE (разрешение изменения;сторожевого таймера и разрешение работы;сторожевого таймера, соответственно)ldi r16, (1<<WDCE)|(1<<WDE)out WDTCR, r16; Выключение сторожевого таймераldi r16, (0<<WDE)out WDTCR, r16ret
Временные последовательности изменения конфигурации сторожевого таймера. Последовательность изменения настройки сторожевого таймера плавно изменяется между тремя уровнями безопасности. Ниже описаны процедуры изменения настроек для каждого из уровней.
Уровень безопасности 0.
Данный режим совместим с работой сторожевого таймера ATmega103. Сторожевой таймер первоначально отключен, но может быть активизирован путем записи 1 в бит WDE без каких-либо ограничений. Период переполнения таймера также может быть изменен без всяких ограничений. Для выключения активизированного сторожевого таймера должна быть выполнена процедура, описанная при рассмотрении бита WDE.
Уровень безопасности 1.
В данном режиме сторожевой таймер первоначально отключен. Его работа может быть разрешена путем записи 1 в бит WDE без каких-либо ограничений. Временная последовательность должна быть соблюдена при изменении периода переполнения сторожевого таймера или выключении разрешенного сторожевого таймера. В данном случае должна быть выполнена следующая последовательность:
1. С помощью одной и той же инструкции записать 1 в WDCE и WDE. Логическая 1 должна быть записана в WDE независимо от предыдущего значения бита WDE.
2. В течение следующих 4-х тактов одной инструкцией записать желаемое значение бит WDE и WDP, но со сброшенным значением бита WDCE.
Уровень безопасности 2.
В данном режиме сторожевой таймер всегда включен а значение бита WDE всегда считывается как 1. Временная последовательность должна быть соблюдена при изменении периода переполнения сторожевого таймера. При этом, должна быть выполнена следующая последовательность:
1. Записать в WDCE и WDE одной инструкцией. Не смотря на то, что WDE всегда установлен, для запуска временной последовательности в него все равно необходимо записывать 1.
2. В течение следующих 4-х тактов записать желаемое значение WDP одной инструкцией при сброшенном значении бита WDCE. Записываемое значение в бит WDE не оказывает никакого влияния.
Контрольные вопросы
1. Перечислите основные отличительные особенности МК ATmega128.
2. Перечислите режимы снижения энергопотребления МК и дайте разъяснения по ним.
3. Периферийные модули МК ATmega128 и их назначение. Приведите примеры использования модулей.
4. Основные параметры периферийных модулей МК ATmega128.
5. Перечислите источники сброса МК ATmega128. В чем их различия?
6. Для чего производится контроль напряжения в МК?
7. Назначение регистра статуса и управления МК MCUCSR. Назначение битов регистра. Примеры их использования.
8. Назначение встроенных источников опорного напряжения (ИОН).
9. Назначение сторожевого таймера, пример использования и программирования сторожевого таймера.
10. Формат регистра управления WRTCR сторожевого таймера. Команды обращения к регистру управления WRTCR.
2.3. Программная модель микроконтроллера [2]
С точки зрения программиста, AVR представляет собой 8-разрядный RISC микроконтроллер, имеющий быстрый Гарвардский процессор, память программ, память данных, порты ввода/вывода и различные интерфейсные схемы. Гарвардская архитектура AVR реализует полное логическое и физическое разделение не только адресных пространств, но и информационных шин для обращения к памяти программ и к памяти данных, причем способы адресации и доступа к этим массивам памяти также различны. Подобное построение уже ближе к структуре цифровых сигнальных процессоров и обеспечивает существенное повышение производительности. Центральный процессор работает одновременно как с памятью программ, так и с памятью данных; разрядность шины памяти программ расширена до 16 бит. Следующим шагом на пути увеличения быстродействия AVR является использование технологии конвейеризации, вследствие чего цикл «выборка - исполнение» команды заметно сокращен. Например, у микроконтроллеров семейства MCS51 короткая команда выполняется за 12 тактов генератора (1 машинный цикл), в течение которого процессор последовательно считывает код операции и исполняет ее. В PIC-контроллерах фирмы Microchip, где уже реализован конвейер, короткая команда выполняется в течение 8 периодов тактовой частоты (2 машинных цикла). За это время последовательно дешифрируется и считывается код операции, исполняется команда, фиксируется результат и одновременно считывается код следующей операции (одноуровневый конвейер). Поэтому в общем потоке команд одна короткая команда реализуется за 4 периода тактовой частоты или за один машинный цикл. В микроконтроллерах AVR тоже используется одноуровневый конвейер при обращении к памяти программ, и короткая команда в общем потоке выполняется, как и в PIC-контроллерах за один машинный цикл. Главное же отличие состоит в том, что этот цикл у AVR составляет всего один период тактовой частоты.
Файл регистров общего назначения. Файл регистров оптимизирован под расширенный набор инструкций AVR-микроконтроллеров. В целях достижения требуемой производительности и гибкости файлом регистров поддерживаются следующие схемы ввода-вывода:
· Один 8-разрядный операнд и один 8-разрядный результат.
· Два 8-разрядных операнда и один 8- разрядный результат.
· Два 8- разрядных операнда и один 16- разрядный результат.
· Один 16- разрядный операнд и один 16- разрядный результат.
На рис. 2.2 представлена структура регистров общего назначения. Файл регистров быстрого доступа содержит 32 8-разрядных рабочих регистра общего назначения, связанных непосредственно с ALU. За один тактовый цикл из файла регистров выбираются два операнда, выполняется операция, и результат вновь возвращается в файл регистров.
Все регистровые команды обращаются непосредственно к регистрам в течение одного тактового цикла. Исключением являются пять логических и арифметических операций с константами (SBCI, SUBI, CPI и ANDI), и операция ORI между константой и содержимым регистра, и команда непосредственной загрузки константы LDI. Эти команды используют вторую половину регистров регистрового файла - R16..R31.
Самые общие команды SBC, SUB, CP, AND и OR и все прочие операции между двумя регистрами или с одним регистром используют для записи результата в регистровый файл.
Каждому регистру соответствует адрес памяти данных, отображающий их в первых 32 ячейках пользовательского пространства данных. Хотя они не используются как физические ячейки SRAM, такая организация памяти обеспечивает гибкое обращение к регистрам, поскольку X,Y и Z регистры могут быть использованы для индексации любого регистра в файле.
Шесть из 32 регистров могут быть использованы как три 16-разрядных регистра указателя косвенной адресации адресного пространства данных, обеспечивающие эффективное вычисление адресов. Один из этих указателей адреса используется так же, как указатель адреса для функции непрерывного просмотра таблиц. Эти 16-разрядные дополнительные регистры обозначаются X-регистр, Y-регистр и Z-регистр (рис. 2.3.).
7 0 | 7 0 | |
X-регистр | R27($1B) | R26($1B) |
XH | XL | |
Y-регистр | R29($1D) | R28($1C) |
YH | YL | |
Z-регистр | R31($1F) | R30($1E) |
ZH | ZL |
Рис. 2.3. Регистры X, Y и Z- указатели памяти
В различных режимах адресации данные адресные регистры выполняют функции фиксированного смещения, автоматического инкрементирования и автоматического декрементирования
Регистр статуса SREG микроконтроллера. Регистр статуса содержит информацию о результате только что выполненной арифметической инструкции. Данная информация может использоваться для ветвления программы по условию. Следует понимать, что регистр статуса обновляется после выполнения всех операций АЛУ в объеме, предусмотренном для каждой конкретной инструкции. Флаги этого регистра в большинстве случаев позволяют отказаться от использования инструкций сравнения, делая код программы более компактным и быстрым.
Обратите внимание, что состояние регистра статуса автоматически не запоминается при вызове процедуры обработки прерываний и не восстанавливается при выходе из нее. Это необходимо выполнить программно.
Регистр статуса – SREG. Регистр статуса - SREG - размещен в пространстве I/O по адресу $3F ($5F) и его биты определяются как:
Бит 7 – I. Разрешение глобального прерывания. Бит разрешения глобального прерывания для разрешения прерывания должен быть установлен в состояние 1. Управление разрешением конкретного прерывания выполняется регистрами маски прерывания GIMSK и TIMSK. Если бит глобального прерывания очищен (в состоянии 0), то ни одно из разрешений конкретных прерываний, установленных в регистрах GIMSK и TIMSK, не действует. Бит I аппаратно очищается после прерывания и устанавливается для последующего разрешения глобального прерывания командой RETI. Бит I может также сбрасываться и устанавливаться с помощью инструкций CLI и SEI, соответственно.
Бит 6 – T. Бит сохранения копии. Команды копирования бита BLD (Бит LoaD) и BST (Бит STore) используют бит T как бит источник и бит назначения при операциях с битами. Командой BST бит регистра регистрового файла копируется в бит T, командой BLD бит T копируется в регистр регистрового файла.
Бит 5 – H. Флаг полупереноса. Данный флаг устанавливается при выполнении некоторых арифметических инструкций и индицирует о возникновении половинного переноса. Как правило, половинный перенос широко используется в двоично-десятичной арифметике. Более подробная информация приведена в описании набора инструкций.
Бит 4 – S. S = N V – Бит знака. Бит S всегда находится в состоянии, определяемом логическим исключающим ИЛИ (exclusive OR) между флагом отрицательного значения N и дополнением до двух флага переполнения V.
Бит 3 – V. Флаг переполнения двоичного дополнения. Флаг переполнения двоичного дополнения V поддерживает арифметику с двоичным дополнением. Более подробная информация приведена в описании набора инструкций.
Бит 2 – N. Флаг отрицательного значения. Флаг отрицательного результата N индицирует, что результатом выполнения арифметической или логической операции является отрицательное значение. Более подробная информация приведена в описании набора инструкций.
Бит 1 – Z. Флаг нулевого значения. Флаг нулевого результата Z индицирует, что результатом выполнения арифметической или логической операции является ноль. Более подробная информация приведена в описании набора инструкций.
Бит 0 – C. Флаг переноса. Флаг переноса C индицирует о возникновении переноса в результате выполнения арифметической или логической операции.
Указатель стека - Stack Pointer – SP. Микроконтроллеры AVR оснащены 16-разрядным указателем стека, размещенным в двух регистрах пространства I/O по адресам $3E ($5E) и $3D ($5D). Поскольку микроконтроллеры ATmega128, ATmega603/103 поддерживают объем SRAM до 64 Кбайт, то используются все 16 разрядов указателя стека.
Указатель стека указывает на область в SRAM данных, в которой размещаются стеки подпрограмм и прерываний. Объем стека в SRAM данных должен задаваться программой перед каждым вызовом подпрограммы и обработкой разрешенного прерывания. Указатель стека декрементируется на единицу, при каждом занесении командой PUSH данных в стек, и на две единицы при занесении данных в стек подпрограммой CALL и прерыванием.
Указатель стека инкрементируется на единицу, при извлечении данных из стека командой POP, и на две единицы при извлечении данных из стека при возврате из подпрограммы (RET) или возврате из прерывания (RETI).
В процессе обработки прерываний и вызовов подпрограмм адрес возврата счетчика команд (PC) сохраняется в стеке. Стек размещается в SRAM данных и, следовательно, размер стека ограничен только общим размером SRAM и уровнем ее использования. Все пользовательские программы в подпрограммах возврата (прежде, чем подпрограммы или прерывания будут выполняться) должны инициализировать указатель стека (SP). 16-разрядный указатель стека с возможностью чтения/записи располагается в пространстве I/O.
Гибкий модуль обработки прерываний имеет в пространстве I/O свой управляющий регистр с дополнительным битом разрешения глобального прерывания в регистре статуса. Все прерывания имеют свои векторы прерывания в таблице векторов прерывания, располагаемой в начале памяти программ. Приоритеты прерываний соответствуют положению векторов прерываний, прерывание с наименьшим адресом вектора имеет наивысший приоритет.
Модуль прерываний МК. Обработка прерываний в МК происходит в соответствии с общими принципами обработки прерываний в МПС. Модуль прерываний принимает запросы прерывания и организует переход к выполнению определенной прерывающей программы. Запросы прерывания могут поступать как от внешних источников, так и от источников, расположенных в различных внутренних модулях МК. В качестве входов для приема запросов от внешних источников чаще всего используются выводы параллельных портов ввода/вывода, для которых эта функция является альтернативной. Источниками запросов внешних прерываний также могут быть любые изменения внешних сигналов на некоторых специально выделенных линиях портов ввода/вывода.
Источниками внутренних запросов прерываний могут служить следующие события:
· переполнение таймеров/счетчиков;
· сигналы от каналов входного захвата и выходного сравнения таймеров/счетчиков или от процессора событий;
· готовность памяти EEPROM;
· сигналы прерывания от дополнительных модулей МК, включая завершение передачи или приема информации по одному из последовательных портов и другие.
Любой запрос прерывания поступает на обработку, если прерывания в МК разрешены и разрешено прерывание по данному запросу. Адрес, который загружается в программный счетчик при переходе к обработке прерывания, называется «вектор прерывания». В зависимости от организации модуля прерываний конкретного МК различные источники прерываний могут иметь разные векторы или использовать некоторые из них совместно. Использование различными прерываниями одного вектора обычно не вызывает проблем при разработке программного обеспечения, так как аппаратная часть МК фиксирована, а контроллер чаще всего выполняет одну-единственную программу.
Вопрос о приоритетах при одновременном поступлении нескольких запросов на прерывание решается в различных МК по-разному. Есть МК с одноуровневой системой приоритетов (все запросы равноценны), многоуровневой системой с фиксированными приоритетами и многоуровневой программируемой системой приоритетов.
Отдельно необходимо описать аппаратные прерывания, связанные с включением питания, подачей сигнала «сброс» и переполнением сторожевого таймера. Они имеют немаскируемый характер и чаще всего разделяют один общий вектор прерывания. Это вполне логично, поскольку результатом каждого из событий является начальный сброс МК.
Ниже описывается специфика обработки прерываний, реализованная в ATmega128.
Внешние прерывания. Внешние прерывания осуществляются через выводы INT7:0. Обратите внимание, что после разрешения внешние прерывания будут генерироваться, даже если линии INT7:0 настроены как выходы. Данная особенность может использоваться для программной генерации прерывания. Внешние прерывания могут генерироваться по подающему или нарастающему фронту, а также по низкому логическому уровню. Одна из этих установок задается в регистрах управления внешними прерываниями EICRA (INT3:0) и EICRB (INT7:4). Если внешнее прерывание разрешено и настроено на срабатывание при низком уровне, то прерывание будет инициироваться постоянно пока на выводе будет оставаться низкий уровень. Обратите внимание, что для распознавания падающего или нарастающего фронтов на INT7:4 необходимо наличие синхронизации ввода-вывода, описанной в разделе “Источники синхронизации и их распределение". Прерывания по низкому уровню и фронтам на INT3:0 определяются асинхронно. Это означает, что данные прерывания могут использоваться для пробуждения микроконтроллера из режимов глубокого сна. Синхронизация ввода-вывода останавливается во всех режимах сна за исключением режима холостого хода (Idle).
Обратите внимание, что при использовании прерывания по уровню для пробуждения микроконтроллера из режима выключения (Power-down), только после удержания изменившегося уровня в течение определенного времени генерируется прерывание. Это делает микроконтроллер менее чувствительным к шумам. Оценка изменения состояния уровня выполняется по двум его выборкам с интервалом равным периоду сторожевого таймера, который равен 1 мкс (номинальное значение) при 5.0В и 25C. Частота сторожевого таймера зависит от напряжения. Пробуждение микроконтроллера наступает, если на входе присутствует требуемый уровень в процессе выборок или если он удерживается до окончания задержки при запуске синхронизации (возникает при выходе из режимов сна). Время запуска определяется конфигурационными битами SUT. Если дважды выполнена выборка уровня с синхронизацией сторожевым таймером, но по истечении времени запуска этот уровень исчез, то пробуждение микроконтроллера наступит, но прерывание не будет сгенерировано. Для того чтобы активизировать прерывание по уровню необходимо, чтобы этот уровень удерживался в течение достаточного для пробуждения микроконтроллера времени.
Регистр А управления внешними прерываниями – EICRA
Разряд | ||||||||
ICS31 | ICS30 | ICS21 | ICS20 | ICS11 | ICS10 | ICS01 | ICS00 | |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
Исходное значение |
Данный регистр не доступен в режиме совместимости с ATmega103, но исходная установка соответствует настройке на прерывания по низкому уровню на INT3:0, что также как и в ATmega103.
Биты 3..0 – ISC31, ISC30, ISC00, ISC00. Биты выбора условия генерации внешнего прерывания 3 - 0
Внешние прерывания 3 - 0 активизируются через внешние выводы INT3:0, если установлены флаг I в регистре статуса SREG и соответствующая маска прерывания в EIMSK. Выбор уровня или фронта для активизации внешнего прерывания осуществляется в соответствии с таблицей 2.5. Фронты на INT3..INT0 выявляются асинхронно. Прерывания по входам INT3:0 будут сгенерированы, если длительность импульса будет больше минимально необходимой. При возникновении импульсов меньшей длительности генерация прерывания не гарантируется. Если выбрано прерывание по низкому уровню, то для генерации прерывания необходимо, чтобы этот уровень оставался на прежнем низком уровне до момента завершения выполнения текущей инструкции. После разрешения прерывания по уровню оно будет генерироваться непрерывно до тех пор, пока на входе присутствует низкий уровень. При изменении бит ISCn может возникнуть прерывание. Поэтому, рекомендуется вначале отключить прерывание INTn путем сброса бита разрешения прерывания в регистре EIMSK. После этого, значение бит ISCn может быть изменено. И, наконец, перед возобновлением работы прерываний необходимо сбросить флаг прерывания INTn путем записи 1 во флаг прерывания (INTFn) в регистре EIFR.
Таблица 2.5. Задание условия генерации запроса на прерывание
ISCn1 | ISCn0 | Описание |
Низкий уровень на INTn генерирует запрос на прерывание | ||
Любое изменение логического состояния на INTn генерирует запрос на прерывание | ||
Падающий фронт на INTn генерирует асинхронно запрос на прерывание | ||
Нарастающий фронт на INTn генерирует асинхронно запрос на прерывание |
Примечание. n = 3, 2, 1 или 0.
Перед изменением бит ISCn1/ISCn0 необходимо запретить работу прерывания путем очистки бита разрешения прерывания в регистре EIMSK. В противном случае прерывание может возникнуть после изменения данных бит.
Регистр B управления внешними прерываниями – EICRB
Разряд | ||||||||
ICS71 | ICS70 | ICS61 | ICS60 | ICS51 | ICS50 | ICS41 | ICS40 | |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
Исходное значение |
Биты 7,...,4 – ISCn1, ISCn0 (где n=7-4). Биты выбора условия генерации внешнего прерывания 7 - 4
Внешние прерывания 7 - 4 активизируются через внешние выводы INT7:4, если установлены флаг I в регистре статуса SREG и соответствующая маска прерывания в регистре EIMSK. Условие, по которому генерируется прерывание, выбирается исходя из данных таблицы 2.5. Для определения фронтов на выводах INT7:4 осуществляется выборка их состояний. Если выбрано прерывание по фронту или изменению уровня, то прерывание будет сгенерировано, если на входе появляется импульс, длительность которого больше одного периода синхронизации. При действии на входе более коротких импульсов генерация прерывания не гарантируется. Обратите внимание, что частота синхронизации ЦПУ может быть ниже чем частота XTAL, если разрешена работа делителя частоты XTAL. Если выбрано прерывание по низкому уровню, то прерывание генерируется, если до момента окончания выполнения текущей инструкции на входе по прежнему присутствует низкий уровень. Если разрешено прерывание по уровню, то оно будет генерироваться непрерывно до тех пор, пока на входе присутствует низкий уровень.
Регистр маски внешнего прерывания – EIMSK
Разряд | ||||||||
INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 | |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
Исходное значение |
Биты 7..0 – INT7 – INT0. Разрешение запроса на внешнее прерывание 7 - 0. Если в бит INT7 – INT0 и в бит I регистра статуса SREG записать 1, то разрешается работа внешнего прерывания по соответствующему выводу. Биты выбора условия генерации прерывания в регистрах управления внешними прерываниями EICRA и EICRB определяют по какому условию генерируется прерывание: по нарастающему фронту, по падающему фронту или по уровню. Любой из данных выводов сохраняет активность, даже если он настроен на вывод. Данная особенность может использоваться для программной генерации прерывания.
Регистр флажков внешних прерываний EIFR
Разряд | ||||||||
INTF7 | INTF6 | INTF5 | INTF4 | INTF3 | INTF2 | INTF1 | INTF0 | |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
Исходное значение |
Биты 7..0 – INTF7 - INTF0. Флаги внешних прерываний 7 – 0. Если фронт или изменение логического состояния на INT7:0 вызывает прерывание, то соответствующий флаг INTF7:0 принимает единичное состояние. Если установлены бит I регистра статуса SREG и соответствующий бит разрешения прерывания INT7:0 в регистре EIMSK, то микроконтроллер выполнит переход на вектор прерывания. Флаг сбрасывается аппаратно после выполнения процедуры обработки прерывания. Альтернативно флаг может быть сброшен программно путем записи 1 в соответствующий бит. Если INT7:0 настроены на генерацию прерывания по уровню, то флаги постоянно находятся в сброшенном состоянии. Обратите внимание, что при переходе в режим сна с отключенными прерываниями INT3:0 входные буферы этих выводов будут отключенными. В свою очередь это может вызвать изменение внутреннего состояния сигналов, которое приведет к установке флагов INTF3:0.