
- •Основные понятия и определения. Лекция №1. Микропроцессоры и микроконтроллеры. Общие сведения. Шина адреса, шина управления.
- •Что такое микропроцессор?
- •Шинная структура связей
- •Лекция №2. Архитектура микропроцессоров и микроконтроллеров. Risc и cisc система команд в мп и мк. Архитектура микропроцессорных систем
- •Типы микропроцессорных систем
- •Risc и cisc система команд в мп и мк
- •Команды пересылки данных
- •Арифметические команды
- •Логические команды
- •Команды переходов
- •Лекция №3. Внутренняя организация процессора. Назначение и функциональные особенности блоков. Быстродействие процессора
- •Классификация и структура
- •Процессорное ядро
- •Функции процессора
- •Лекция №4. Последовательность выполнения команд микропроцессором. Режимы адресации.
- •Адресация операндов
- •Методы адресации
- •Адресация байтов и слов
- •Регистры процессора
- •Система команд мп. Лекция №5. Архитектура изучаемого микроконтроллера. Назначение внутренних блоков. Микроконтроллеры семейства avr
- •Микроконтроллер aTtiny2313 фирмы Atmel
- •Архитектура микроконтроллеров семейства Tiny
- •Организация памяти
- •Память программ
- •Память данных
- •Способы адресации памяти данных
- •Прямая адресация
- •Лекция №6. Блок регистров общего назначения. Команды с непосредственной адресацией. Различные режимы адресации. Энергонезависимая память данных (eeprom)
- •Доступ к eeprom
- •Меры предосторожности
- •Счетчик команд и выполнение программы
- •Лекция №7. Система команд изучаемого микроконтроллера.
- •Лекция №8. Команды переходов и сдвига. Остальные команды.
- •Выводы микроконтроллера. Лекция №9. Описание выводов микроконтроллера.
- •Описание выводов
- •Кварцевый генератор
- •Лекция №10. Пространство ввода/вывода микроконтроллера.
- •Порт ввода/вывода в
- •Регистр направления данных порта b - ddrb
- •Альтернативные функции portb
- •Порт ввода/вывода d
- •Регистр направления данных порта b - ddrb
- •Порт d, как порт ввода/вывода общего назначения
- •Альтернативные функции порта d
- •Регистры и обработка прерываний микроконтроллера. Лекция №13. Регистр состояния и указатель стека микроконтроллера.
- •Регистр состояния - sreg
- •Указатель стека sp
- •Лекция №14. Обработка внешних прерываний в микроконтроллере.
- •Обработка внешних прерываний. Общий регистр маски прерываний gimsk
- •Общий регистр флагов прерываний
- •Регистр управления микроконтроллером - mcucr
- •Лекция №15. Обработка прерываний от таймеров/счетчиков в микроконтроллере.
- •Регистр маски прерывания от таймера/счетчика - timsk
- •Регистр флагов прерываний от таймеров/счетчиков - tifr
- •Прерывания в микроконтроллере. Лекция №16. Определитель таймеров/счетчиков. Принцип работы таймера/счетчика 0.
- •Определитель таймеров/счетчиков
- •Регистр управления таймером/счетчиком 0 - tccr0
- •Лекция №17. Режимы работы таймера/счетчика 1.
- •Регистр a управления таймером/счетчиком 1 - tccr1a
- •Таймер/счетчик 1 - tcnt1h и tcnt1l
- •Регистр совпадения a таймера/счетчика 1 - ocr1ah и ocr1al
- •Регистр захвата таймера/счетчика 1 - icr1h и icr1l
- •Таймер/счетчик в режиме шим
- •Лекция №18. Универсальный асинхронный приемо-передатчик. Принцип работы и управления.
- •Передача данных
- •Прием данных
- •Управление uart регистр ввода/вывода uart
- •Регистр состояния uart (usr)
- •Регистр управления uart (ucr)
- •Генератор скорости передачи
- •Лекция №19. Аналоговый компаратор и сторожевой таймер микроконтроллера.
- •Аналоговый компаратор регистр управления и состояния аналогового компаратора (acsr).
- •Регистр управления сторожевым таймером - wdtcr
- •Форматы представления чисел в эвм. Лекция №20. Формат чисел с фиксированной точкой и элементарные операции над ними.
- •Компьютерное представление целых чисел
- •Лекция №21. Формат чисел с плавающей точкой и элементарные операции над ними.
- •Компьютерное представление вещественных чисел
- •Цифро-аналоговые преобразователи. Лекция №22. Основные понятия и определения цифро-аналоговых преобразователей (цап). Виды погрешностей преобразования.
- •Параметры цап
- •Лекция №23. Цап на взвешивающей матрице и на матрице r-2r. Принцип работы. Достоинства и недостатки. Цап на взвешивающей матрице
- •Цап на матрице r-2r
Меры предосторожности
К сожалению, у EEPROM-памяти есть один недостаток: при снижении напряжения питания хранящиеся в ней данные могут быть повреждены. Это может произойти по двум причинам:
Если напряжение питания ниже некоторой величины, запись в EEPROM будет произведена некорректно.
Микроконтроллер сам может выполнять команды некорректно, если напряжение питания будет ниже нормы.
Чтобы избежать повреждения данных, хранящихся в EEPROM, достаточно воспользоваться одним из трех следующих решений:
1. Удерживать микроконтроллер в состоянии сброса все время, пока напряжение питания находится ниже нормы. Для этого следует использовать встроенный детектор пониженного напряжения питания (Brown-out Detector, BOD).
2. Удерживать микроконтроллер в «спящем» режиме (Power Down) пока напряжение питания находится ниже нормы. Поскольку в этом режиме микроконтроллер не может выполнять никаких команд, такое решение эффективно защищает служебные регистры EEPROM от непреднамеренной записи.
3. Хранить константы во FLASH-памяти программ, если они не должны меняться во время работы программы. Микроконтроллер не может самостоятельно производить запись в FLASH-память. Соответственно, при понижении напряжения питания ее содержимое не будет повреждено.
Счетчик команд и выполнение программы
Функционирование конвейера
Одной из причин, обуславливающей большое быстродействие микроконтроллеров AVR, является использование двухуровневого конвейера при выполнении программы. Работа этого конвейера показана на Рис. 6.2.
Рис. 6.2. Последовательность выполнения команд в конвейере
Во время первого машинного цикла происходит выборка команды из памяти программ и ее декодирование. Во время второго цикла эта команда выполняется, а параллельно происходит выборка и декодирование второй команды и т. д. В результате фактическое время выполнения каждой команды получается равным одному машинному циклу.
Рис. 6.3. Функционирование АЛУ
Благодаря подключению АЛУ непосредственно к регистровому файлу, оно выполняет одну команду (чтение содержимого двух регистров, выполнение операции и запись результата в регистр-приемник) за один такт (машинный цикл), как показано на Рис. 6.3.
Задержки в конвейере
Выше была описана последовательность выполнения команд программы в идеальном случае. Однако в действительности при выполнении некоторых команд может происходить нарушение нормального функционирования конвейера. Наиболее ярким примером команд, вызывающих подобное нарушение, являются команды условного перехода, а также команды типа Test & Skip (проверка и пропуск следующей команды, если результат проверки положительный). В первом случае, если условие, проверяемое командой условного перехода, истинно, выполнение программы будет продолжено с некоторого адреса.А поскольку в конвейере уже произошла выборка команды, расположенной за командой перехода, время выполнения команды перехода увеличивается на один машинный цикл, во время которого происходит выборка команды, расположенной по требуемому адресу.
Во втором случае при выполнении команд типа Test & Skip следующая команда не выполняется в случае истинности проверяемого условия. Однако выборка пропускаемой команды уже произошла. Вследствие того что команда не выполняется, в конвейере образуется «дырка», которая заключается в пропуске одного или двух (в зависимости от пропускаемой команды) машинных циклов. Соответственно команды типа Test & Skip выполняются за один машинный цикл, если результат проверки условия отрицателен, и за два или три цикла, если результат проверки положителен.
Аналогично команды безусловного перехода RJMP (Relative JuMP) и IJMP (Index JuMP), команды вызова подпрограммы RCALL (Relative CALL) и ICALL (Index CALL) и команды возврата из подпрограмм RET (RETurn) и RETI (RETurn Interrupt) также изменяют содержимое счетчика команд PC (Program Counter), вызывая тем самым переход в памяти программ. В результате выполнения этих команд происходит «разрыв» в работе конвейера, а вследствие этого происходит задержка выполнения программы на несколько (2…4) машинных циклов. Для получения более подробной информации обратитесь к описанию команд, приведенному в 3-й части книги.
По той же причине нарушение нормального функционирования конвейера происходит и при возникновении прерывания. Минимальная задержка при этом составляет 4 машинных цикла.
Счетчик команд
Размер счетчика команд составляет 9 (модели ATtiny11x, ATtiny12x, ATtiny15L) или 10 (модели ATtiny28x) разрядов. Напрямую (как регистр) счетчик команд из программы недоступен.
При нормальном выполнении программы содержимое счетчика команд автоматически увеличивается на 1 или на 2 (в зависимости от выполняемой команды) в каждом машинном цикле. Этот порядок нарушается при выполнении команд перехода, вызова и возврата из подпрограмм, а также при возникновении прерываний.
После включения питания, а также после сброса микроконтроллера в счетчик программ автоматически загружается значение $000. Как правило, по этому адресу располагается команда относительного перехода (RJMP) к инициализационной части программы.
При возникновении прерывания в счетчик команд загружается адрес соответствующего вектора прерывания ($001…$010). Если прерывания используются в программе, по этим адресам должны размещаться команды относительного перехода к подпрограммам обработки прерываний. В противном случае основная программа может начинаться непосредственно с адреса $001.
Команды типа «проверка/пропуск» (Test & Skip)
В командах этого типа производится проверка условия, результат которой влияет на выполнение следующей команды. Если условие истинно, следующая команда игнорируется. Например, команда SBRS Rd.b проверяет разряд b регистра Rd и игнорирует следующую команду, если этот разряд равен «1». В действительности переход к следующей инструкции производится увеличением счетчика команд на 1, а пропуск команды требует загрузки нового значения в счетчик команд. Следовательно, когда проверяемое условие истинно, в конвейере возникает задержка. Длительность задержки зависит от размера пропускаемой команды и составляет от одного до двух машинных циклов.
Команды условного перехода
В этих командах производится проверка условия, результат которой влияет на состояние счетчика команд. Если условие истинно, происходит переход по заданному адресу. Если же условие ложно, выполняется следующая команда.
Команды условного перехода имеют ограничение по области действия. В действительности новое значение счетчика команд получается прибавлением к нему или вычитанием из него некоторого смещения. А поскольку под значение смещения в слове команды отводится всего 7 разрядов, максимальная величина перехода составляет 128 слов (–64…+64).
Так как переход по заданному адресу осуществляется загрузкой нового значения в счетчик команд, то в случае истинности проверяемого условия в конвейере возникает задержка длительностью в один машинный цикл.
Команда безусловного перехода
Для безусловного перехода по требуемому адресу в памяти программ имеется только одна команда — команда относительного перехода RJMP. Процесс выполнения команды заключается в изменении содержимого счетчика команд путем прибавления к нему или вычитания из него некоторого значения, являющегося операндом команды, как показано на Рис. 6.4. Положение разрядов k на рисунке показано условно.
Рис. 6.4. Относительная адресация памяти программ
В программах в качестве операндов этой команды вместо констант используются метки. Ассемблер сам вычисляет величину перехода и подставляет это значение в слово команды. Проиллюстрируем сказанное следующим примером:
Поскольку команда относительного перехода изменяет содержимое счетчика команд, она выполняется за 2 машинных цикла.
Команда вызова подпрограмм
Как и для реализации безусловных переходов, для вызова подпрограмм имеется только одна команда — команда относительного вызова RCALL. Если не принимать во внимание некоторые отличия, описанные ниже, эта команда работает так же, как и команда относительного безусловного перехода RJMP.
Команда RCALL сохраняет в стеке значение счетчика команд. За тем содержимое счетчика команд увеличивается или уменьшается на некоторое значение, являющееся операндом команды (Рис. 6.4).
В программах в качестве операндов этой команды, как и в случае команды RJMP, используются метки. Ассемблер сам вычисляет величину перехода и подставляет это значение в слово команды.
Команда относительного вызова подпрограмм выполняется за 3 машинных цикла, 2 из которых затрачиваются на сохранение в стеке двух байт счетчика команд.
Команды возврата из подпрограмм
В конце каждой подпрограммы обязательно должна находиться команда возврата из нее. В системе команд микроконтроллеров семейства имеется две таких команды. Для возврата из обычной подпрограммы, вызываемой командой RCALL, используется команда RET. Для возврата из подпрограммы обработки прерывания используется команда RETI.
Обе команды восстанавливают из стека содержимое счетчика команд, сохраненное там перед переходом к подпрограмме. Команда возврата из подпрограммы RETI дополнительно устанавливает в «1» флаг общего разрешения прерываний I регистра SREG, сбрасываемый аппаратно при возникновении прерывания.
На выполнение каждой из команд возврата из подпрограммы требуется 4 машинных цикла.
Стек
В микроконтроллерах AVR семейства Tiny стек реализован аппаратно. Глубина стека равна трем уровням, а размер равен размеру счетчика команд (9 или 10 разрядов). Стек расположен в собственной области памяти и имеет LIFO-организацию (Last In First Out — последним вошел, первым вышел), т. е. значение, записанное последним, будет прочитано первым.
При вызове подпрограммы адрес команды, расположенной за командой RCALL, сохраняется в стеке. При возврате из подпрограммы этот адрес извлекается из стека и загружается в счетчик команд. Тоже происходит и во время прерывания. При генерации прерывания адрес следующей команды сохраняется в стеке, а при возврате из подпрограммы обработки прерывания он восстанавливается из стека.
Непосредственно из программы стек недоступен, т. к. в наборе команд микроконтроллера отсутствуют команды занесения в стек и извлечения из стека. Указатель стека также недоступен из программы, т. е. он не может быть явно прочитан или модифицирован. Поэтому микроконтроллер сам управляет перемещением данных по стеку. Чтобы лучше понять работу стека, обратитесь к Рис. 6.5 и Рис. 6.6.
Рассмотрим выполнение команды RCALL (Рис. 6.5): содержимое счетчика команд пересылается на 1-й уровень стека, а предыдущие значения предварительно «сползают» на один уровень (значение, находившееся на первом уровне, перемещается на второй уровень и т. д.).Заметим, что в результате этой операции будет потеряно значение, расположенное на 3-м уровне стека.
При выполнении команды возврата из подпрограммы RET или RE-TI (Рис. 6.6) значение, хранящееся на 1-м уровне стека, заносится в счетчик команд. Во время этой операции все значения «поднимаются» на один уровень вверх (значение, находившееся на втором уровне, перемещается на первый уровень и т. д.).
Рис. 6.5. Работа стека при выполнении команды RCALL
Рис. 6.6. Работа стека при выполнении команды RET
Регистровый файл содержит 32 8-и разрядных регистра общего назначения (РОН), которые в командах обозначаются от r0 до r31. Раньше только один регистр – аккумулятор мог воспринимать результаты операций АЛУ. В МК-ах фирмы Atmel все 32 регистра могут выполнять функции аккумулятора. Такой подход значительно облегчает процесс написания программы и упрощает саму программу, избавляя ее от ненужных команд, перекладывающих результат из аккумулятора в нужный регистр. Шесть из 32-х регистров можно использовать как три 16-ти разрядных регистровых пары (указатели адреса в адресном пространстве данных).
Эти регистры обозначаются как X, Y и Z, и определены следующим образом:
Для адресации таблиц в памяти программ можно использовать только регистровую пару Z.
Регистр состояния SREG.
Этот регистр представляет собой набор флагов, показывающих текущее состояние МК. Эти флаги автоматически устанавливаются в “1” или в “0” при наступлении определенных событий (в соответствии с результатами выполнения команд). Все разряды этого регистра доступны как для чтения, так и для записи. После сброса МК все разряды регистра сбрасываются в “0”.
флаг С - флаг переноса. = 1 если в результате выполнения операции произошел выход за границы байта.
флаг Z - флаг нуля. = 1 если результат выполнения операции равен нулю.
Режимы адресации.
Большинство команд, использующих регистры общего назначения, могут использовать любые регистры общего назначения. Исключение составляют шесть команд, оперирующих с константами (они работают только со второй половиной регистрового файла r16-r31). Такие команды имеют режим непосредственной адресации:
ldi Rd,K - загрузить константу K в Rd.
cpi Rd,K - сравнить константу K и содержимое рег. Rd
subi Rd,K - вычесть константу K из содержимого регистра Rd, результат поместить в рег. Rd.
sbci Rd,K - вычесть константу K и флаг переноса из содержимого регистра Rd, результат поместить в рег. Rd
andi Rd,K - лог. И между константой K и содержимым регистра Rd, результат поместить в регистровую пару Rd.
ori Rd,K - лог. ИЛИ между константой K и содержимым регистра Rd, результат поместить в регистр Rd.
В МК-ах AVR фирмы ATMEL предусмотрены несколько способов адресации:
1.) Все выше описанные команды относятся к непосредственной адресации – когда - данные, над которыми осуществляется операция, находятся в самой команде;
2.) регистровая адресация - данные, над которыми осуществляется операция, находятся в регистрах Rr (источник) и Rd (приемник)
inc Rd – увеличить на единицу (инкремент) содержимое регистра Rd.
dec Rd - уменьшить на единицу (декремент) содержимое регистра Rd.
mov Rd,Rr – скопировать содержимое регистра Rr в регистр Rd.
and Rd,Rr - лог.И меджу содержимым регистра Rr и регистра Rd. Результат находится в Rd.
cp Rd,Rr - сравнить содержимое регистра Rr и регистра Rd. (Rd-Rr);
3.) прямая адресация - пересылка данных между одним из РОН и ячейкой памяти ОЗУ
lds Rd,address – скопировать данные из ячейки памяти с указанным в команде адресом в регистр Rd.
sts address,Rr - скопировать данные из регистра Rr в ячейку памяти с указанным в команде адресом.
4.) косвенная адресация - данные, над которыми осуществляется операция находятся в ячейке памяти, адрес которой хранится в регистре X, Y или Z.
ld Rd,X -загружает один байт из адресного пространства памяти данных в РОН Rd. Адрес ячейки памяти, к которой производится обращение, содержится в регистровой паре Х.
st Y,Rr - …
5.) косвенная с преддекрементом - данные, над которыми осуществляется операция находятся в ячейке памяти, адрес которой получается в регистре X, Y или Z, после вычитания из него единицы
ld Rd,-X
st -Z,Rr
6.) косвенная с постинкрементом - данные, над которыми осуществляется операция находятся в ячейке памяти, адрес которой хранится в регистре X, Y или Z; после чего, содержимое регистра X, Y или Z увеличивается на единицу
ld Rd,X+
st Z+,Rr
7.) относительная косвенная адресация - данные, над которыми осуществляется операция находятся в ячейке памяти, адрес которой получается суммированием содержимого регистра Y или Z с константой, задавемой в команде
ldd Rd,Y+q (q=0..63.) - (содержимое индексного регистра не изменяется)
std Z+q,Rr (q=0..63.)