Встроенные системы - Краткое руководство
Система
Система - это устройство, в котором все элементы в сборе работают вместе в соответствии с набором правил. Его также можно определить как способ работы, организации или выполнения одной или нескольких задач в соответствии с фиксированным планом. Например, часы - это система отображения времени. Его компоненты следуют набору правил, чтобы показывать время. Если одна из его частей выйдет из строя, часы перестанут работать. Итак, мы можем сказать, что в системе все ее подкомпоненты зависят друг от друга.
Встроенная система
Как следует из названия, Embedded означает что-то, что связано с чем-то другим. Встраиваемую систему можно представить как компьютерную аппаратную систему, в которую встроено программное обеспечение. Встроенная система может быть независимой системой или частью большой системы. Встроенная система - это система на основе микроконтроллера или микропроцессора, которая предназначена для выполнения определенной задачи. Например, пожарная сигнализация - это встроенная система; будет только дым.
Встроенная система состоит из трех компонентов:
В нем есть железо.
Имеет прикладное программное обеспечение.
Он имеет операционную систему реального времени (RTOS), которая контролирует прикладное программное обеспечение и предоставляет механизм, позволяющий процессору запускать процесс в соответствии с расписанием, следуя плану по контролю задержек. RTOS определяет способ работы системы. Он устанавливает правила во время выполнения прикладной программы. Небольшая встроенная система может не иметь ОСРВ.
Таким образом, мы можем определить встроенную систему как основанную на микроконтроллере, программно управляемую, надежную систему управления в реальном времени.
Характеристики встроенной системы
Single-functioned- Встроенная система обычно выполняет специализированную операцию и делает то же самое неоднократно. Например: пейджер всегда работает как пейджер.
Tightly constrained- Все вычислительные системы имеют ограничения на проектные метрики, но во встроенной системе могут быть особенно жесткими. Метрики дизайна - это мера таких функций реализации, как стоимость, размер, мощность и производительность. Он должен быть такого размера, чтобы поместиться на одном кристалле, должен работать достаточно быстро, чтобы обрабатывать данные в реальном времени, и потреблять минимальную мощность, чтобы продлить срок службы батареи.
Reactive and Real time- Многие встроенные системы должны постоянно реагировать на изменения в системной среде и должны вычислять определенные результаты в реальном времени без каких-либо задержек. Рассмотрим пример автомобильного круиз-контроллера; он постоянно отслеживает и реагирует на датчики скорости и тормоза. Он должен многократно вычислять ускорение или снижение ускорения в течение ограниченного времени; отложенное вычисление может привести к невозможности управления автомобилем.
Microprocessors based - Он должен быть на базе микропроцессора или микроконтроллера.
Memory- Он должен иметь память, поскольку его программное обеспечение обычно встраивается в ПЗУ. Ему не нужны никакие вторичные запоминающие устройства в компьютере.
Connected - К нему должны быть подключены периферийные устройства для подключения устройств ввода и вывода.
HW-SW systems- Программное обеспечение используется для большей функциональности и гибкости. Оборудование используется для обеспечения производительности и безопасности.
Преимущества
- Легко настраиваемый
- Низкое энергопотребление
- Бюджетный
- Повышенная производительность
Недостатки
- Усилия по развитию
- Большее время выхода на рынок
Базовая структура встроенной системы
На следующем рисунке показана базовая структура встроенной системы.
Sensor- Он измеряет физическую величину и преобразует ее в электрический сигнал, который может быть прочитан наблюдателем или любым электронным прибором, таким как преобразователь A2D. Датчик сохраняет измеренную величину в памяти.
A-D Converter - Аналого-цифровой преобразователь преобразует аналоговый сигнал, посылаемый датчиком, в цифровой сигнал.
Processor & ASICs - Процессоры обрабатывают данные, чтобы измерить результат и сохранить его в памяти.
D-A Converter - Цифро-аналоговый преобразователь преобразует цифровые данные, подаваемые процессором, в аналоговые данные
Actuator - Привод сравнивает выходной сигнал, выдаваемый преобразователем DA, с фактическим (ожидаемым) выходным сигналом, сохраненным в нем, и сохраняет утвержденный выходной сигнал.
Процессор - это сердце встраиваемой системы. Это базовый блок, который принимает входные данные и производит выходные данные после обработки данных. Разработчику встроенных систем необходимо знать как микропроцессоры, так и микроконтроллеры.
Процессоры в системе
У процессора есть два основных блока:
- Блок управления потоком программы (CU)
- Единица исполнения (ЕС)
CU включает в себя блок выборки для выборки инструкций из памяти. В ЕС есть схемы, которые реализуют инструкции, относящиеся к операции передачи данных и преобразования данных из одной формы в другую.
EU включает арифметическое и логическое устройство (ALU), а также схемы, которые выполняют инструкции для задачи управления программой, такой как прерывание, или переход к другому набору инструкций.
Процессор выполняет циклы выборки и выполняет инструкции в той же последовательности, в которой они извлекаются из памяти.
Типы процессоров
Процессоры могут быть следующих категорий -
Процессор общего назначения (GPP)
- Microprocessor
- Microcontroller
- Встроенный процессор
- Цифровой сигнальный процессор
- Медиа-процессор
Системный процессор для конкретных приложений (ASSP)
Процессоры команд для конкретных приложений (ASIP)
Ядро (я) GPP или ядро (я) ASIP на интегральной схеме специального назначения (ASIC) или в схеме очень крупномасштабной интеграции (VLSI).
Микропроцессор
Микропроцессор - это отдельная микросхема СБИС с центральным процессором. Кроме того, он может также иметь другие модули, такие как коучи, арифметический модуль обработки с плавающей запятой и модули конвейерной обработки, которые помогают в более быстрой обработке инструкций.
Цикл выборки и выполнения микропроцессоров предыдущего поколения определялся тактовой частотой порядка ~ 1 МГц. Процессоры теперь работают на тактовой частоте 2 ГГц.
Микроконтроллер
Микроконтроллер - это однокристальная СБИС (также называемая microcomputer), который, хотя и имеет ограниченные вычислительные возможности, обладает расширенными возможностями ввода / вывода и рядом функциональных блоков на кристалле.
Процессор | баран | ПЗУ |
Порт ввода / вывода | Таймер | Последовательный COM-порт |
Микроконтроллеры особенно используются во встроенных системах для приложений управления в реальном времени со встроенной памятью программ и устройствами.
Микропроцессор против микроконтроллера
Давайте теперь посмотрим на наиболее заметные различия между микропроцессором и микроконтроллером.
Микропроцессор | Микроконтроллер |
---|---|
Микропроцессоры по своей природе многозадачны. Может выполнять несколько задач одновременно. Например, на компьютере мы можем проигрывать музыку во время написания текста в текстовом редакторе. | Ориентирован на одну задачу. Например, стиральная машина предназначена только для стирки одежды. |
ОЗУ, ПЗУ, порты ввода-вывода и таймеры могут быть добавлены извне и могут различаться по количеству. | RAM, ROM, порты ввода-вывода и таймеры не могут быть добавлены извне. Эти компоненты должны быть встроены вместе в микросхему и зафиксированы в количестве. |
Разработчики могут выбрать необходимое количество памяти или портов ввода / вывода. | Фиксированное число для памяти или ввода-вывода делает микроконтроллер идеальным для ограниченной, но конкретной задачи. |
Внешняя поддержка внешней памяти и портов ввода / вывода делает микропроцессорную систему более тяжелой и дорогостоящей. | Микроконтроллеры легкие и дешевле микропроцессора. |
Внешним устройствам требуется больше места, а их энергопотребление выше. | Система на основе микроконтроллера потребляет меньше энергии и занимает меньше места. |
Микроконтроллеры 8051 работают с 8-битной шиной данных. Таким образом, они могут поддерживать внешнюю память данных до 64 КБ и внешнюю память программ до 64 КБ в лучшем случае. В совокупности микроконтроллеры 8051 могут адресовать 128 КБ внешней памяти.
Когда данные и код находятся в разных блоках памяти, тогда архитектура называется Harvard architecture. В случае, если данные и код лежат в одном блоке памяти, тогда архитектура называетсяVon Neumann architecture.
Архитектура фон Неймана
Архитектура фон Неймана была впервые предложена компьютерным ученым Джоном фон Нейманом. В этой архитектуре существует один путь или шина данных как для инструкции, так и для данных. В результате ЦП выполняет одну операцию за раз. Он либо извлекает инструкцию из памяти, либо выполняет операцию чтения / записи данных. Таким образом, выборка команды и операция с данными не могут происходить одновременно, имея общую шину.
Архитектура фон Неймана поддерживает простое оборудование. Это позволяет использовать одну последовательную память. Сегодняшняя скорость обработки значительно превышает время доступа к памяти, и мы используем очень быстрый, но небольшой объем памяти (кэш), локальный для процессора.
Гарвардская Архитектура
Архитектура Гарварда предлагает отдельные шины хранения и сигналов для инструкций и данных. Эта архитектура имеет хранилище данных, полностью содержащееся в ЦП, и нет доступа к хранилищу инструкций как к данным. Компьютеры имеют отдельные области памяти для программных инструкций и данных, использующих внутренние шины данных, что обеспечивает одновременный доступ как к инструкциям, так и к данным.
Программы должны быть загружены оператором; процессор не может загрузиться сам. В гарвардской архитектуре нет необходимости заставлять два воспоминания разделять свойства.
Архитектура фон Неймана против архитектуры Гарварда
Следующие пункты отличают архитектуру фон Неймана от архитектуры Гарварда.
Архитектура фон Неймана | Гарвардская Архитектура |
---|---|
Единая память должна использоваться как кодом, так и данными. | Отдельная память для кода и данных. |
Процессору необходимо получить код в отдельном тактовом цикле и данные в другом тактовом цикле. Таким образом, требуется два тактовых цикла. | Одного такта достаточно, поскольку для доступа к коду и данным используются отдельные шины. |
Более высокая скорость, поэтому меньше времени. | Медленнее по скорости, поэтому требуется больше времени. |
Простая конструкция. | Сложный по дизайну. |
CISC и RISC
CISC - это компьютер со сложным набором команд. Это компьютер, который может обрабатывать большое количество инструкций.
В начале 1980-х годов разработчики компьютеров рекомендовали компьютерам использовать меньше инструкций с простыми конструкциями, чтобы их можно было выполнять намного быстрее в ЦП без необходимости использования памяти. Такие компьютеры классифицируются как компьютер с сокращенным набором команд или RISC.
CISC против RISC
Следующие пункты отличают CISC от RISC:
CISC | RISC |
---|---|
Большой набор инструкций. Легко программировать | Меньший набор инструкций. Сложно программировать. |
Более простой дизайн компилятора с учетом большего набора инструкций. | Комплексный дизайн компилятора. |
Многие режимы адресации вызывают сложные форматы команд. | Мало режимов адресации, исправлен формат инструкции. |
Длина инструкции переменная. | Длина инструкций варьируется. |
Более высокие тактовые циклы в секунду. | Низкий тактовый цикл в секунду. |
Упор делается на оборудование. | Упор делается на программное обеспечение. |
Блок управления реализует большой набор команд с помощью микропрограммного блока. | Каждая инструкция должна выполняться аппаратно. |
Более медленное выполнение, поскольку инструкции должны считываться из памяти и декодироваться блоком декодера. | Более быстрое выполнение, поскольку каждая инструкция должна выполняться аппаратно. |
Конвейерная обработка невозможна. | Конвейерная обработка инструкций возможна с учетом одного такта. |
Компиляторы и ассемблеры
Компилятор
Компилятор - это компьютерная программа (или набор программ), которая преобразует исходный код, написанный на языке программирования (исходный язык), в другой компьютерный язык (обычно двоичный формат). Наиболее частая причина преобразования - создание исполняемой программы. Имя «компилятор» в основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык низкого уровня (например, язык ассемблера или машинный код).
Кросс-компилятор
Если скомпилированная программа может работать на компьютере, имеющем другой ЦП или операционную систему, чем компьютер, на котором компилятор скомпилировал программу, то этот компилятор известен как кросс-компилятор.
Декомпилятор
Программа, которая может переводить программу с языка низкого уровня на язык высокого уровня, называется декомпилятором.
Конвертер языков
Программа, которая переводит программы, написанные на разных языках высокого уровня, обычно называется языковым переводчиком, переводчиком исходного текста или языковым преобразователем.
Компилятор, вероятно, выполнит следующие операции -
- Preprocessing
- Parsing
- Семантический анализ (перевод, управляемый синтаксисом)
- Генерация кода
- Оптимизация кода
Ассемблеры
Ассемблер - это программа, которая берет базовые компьютерные инструкции (называемые языком ассемблера) и преобразует их в набор битов, которые процессор компьютера может использовать для выполнения своих основных операций. Ассемблер создает объектный код, переводя мнемонику инструкций сборки в коды операций, преобразовывая символические имена в ячейки памяти. В языке ассемблера используется мнемоника для представления каждой низкоуровневой машинной операции (кода операции).
Инструменты отладки во встроенной системе
Отладка - это методический процесс поиска и уменьшения количества ошибок в компьютерной программе или части электронного оборудования, чтобы они работали должным образом. Отладка затруднена, когда подсистемы тесно связаны, потому что небольшое изменение в одной подсистеме может создать ошибки в другой. Инструменты отладки, используемые во встроенных системах, сильно различаются по времени разработки и функциям отладки. Мы обсудим здесь следующие инструменты отладки -
- Simulators
- Стартовые комплекты микроконтроллеров
- Emulator
Симуляторы
Код тестируется для MCU / системы путем его моделирования на главном компьютере, используемом для разработки кода. Симуляторы пытаются смоделировать поведение всего микроконтроллера программно.
Функции тренажеров
Симулятор выполняет следующие функции -
Определяет семейство процессора или устройства обработки, а также его различные версии для целевой системы.
Контролирует подробную информацию о части исходного кода с метками и символическими аргументами по мере выполнения каждого отдельного шага.
Предоставляет статус RAM и смоделированных портов целевой системы для каждого отдельного шага выполнения.
Отслеживает реакцию системы и определяет пропускную способность.
Обеспечивает отслеживание вывода содержимого программного счетчика по сравнению с регистрами процессора.
Предоставляет подробное описание данной команды.
Контролирует подробную информацию о командах симулятора по мере их ввода с клавиатуры или выбора из меню.
Поддерживает условия (до 8, 16 или 32 условий) и безусловные точки останова.
Предоставляет точки останова и трассировку, которые вместе являются важным инструментом тестирования и отладки.
Облегчает синхронизацию внутренних периферийных устройств и задержек.
Стартовый комплект микроконтроллера
Стартовый комплект микроконтроллера состоит из -
- Аппаратная плата (оценочная плата)
- Системный программист
- Некоторые программные инструменты, такие как компилятор, ассемблер, компоновщик и т. Д.
- Иногда оценочная версия компилятора ограничивается IDE и размером кода.
Большим преимуществом этих комплектов перед симуляторами является то, что они работают в режиме реального времени и, таким образом, позволяют легко проверять функциональность ввода / вывода. Однако стартовых комплектов вполне достаточно и это самый дешевый вариант для разработки простых проектов микроконтроллеров.
Эмуляторы
Эмулятор - это комплект оборудования или программное обеспечение, или они могут быть обеими, которые имитируют функции одной компьютерной системы (гостя) в другой компьютерной системе (хосте), отличной от первой, так что эмулируемое поведение очень похоже на поведение реальной системы (гость).
Под эмуляцией понимается способность компьютерной программы в электронном устройстве имитировать (имитировать) другую программу или устройство. Эмуляция фокусируется на воссоздании оригинальной компьютерной среды. Эмуляторы могут поддерживать более тесную связь с подлинностью цифрового объекта. Эмулятор помогает пользователю работать с любым приложением или операционной системой на платформе так же, как программное обеспечение работает в своей исходной среде.
Периферийные устройства во встроенных системах
Встроенные системы взаимодействуют с внешним миром через свои периферийные устройства, такие как следующие & mins;
- Интерфейсы последовательной связи (SCI), такие как RS-232, RS-422, RS-485 и т. Д.
- Интерфейс синхронной последовательной связи, такой как I2C, SPI, SSC и ESSI
- Универсальная последовательная шина (USB)
- Мультимедийные карты (SD-карты, Compact Flash и т. Д.)
- Такие сети, как Ethernet, LonWorks и т. Д.
- Полевые шины, такие как CAN-Bus, LIN-Bus, PROFIBUS и т. Д.
- имеры, такие как ФАПЧ, блоки захвата / сравнения и обработки времени.
- Дискретный ввод-вывод, также известный как ввод / вывод общего назначения (GPIO)
- Аналого-цифровое / цифровое-аналоговое (АЦП / ЦАП)
- Отладка, например, JTAG, ISP, ICSP, порт BDM, порты BITP и DP9
Критерии выбора микроконтроллера
Выбирая микроконтроллер, убедитесь, что он соответствует поставленной задаче и является экономически эффективным. Мы должны посмотреть, может ли 8-битный, 16-битный или 32-битный микроконтроллер лучше всего справиться с вычислительными потребностями задачи. Кроме того, при выборе микроконтроллера следует учитывать следующие моменты:
Speed - Какую максимальную скорость может поддерживать микроконтроллер?
Packaging- Это 40-контактный DIP (двухрядный корпус) или QFP (четырехканальный плоский корпус)? Это важно с точки зрения пространства, сборки и прототипирования конечного продукта.
Power Consumption - Это важный критерий для продуктов с батарейным питанием.
Amount of RAM and ROM на чипе.
Count of I/O pins and Timers на чипе.
Cost per Unit - Это важно с точки зрения конечной стоимости продукта, в котором будет использоваться микроконтроллер.
Кроме того, убедитесь, что у вас есть такие инструменты, как компиляторы, отладчики и ассемблеры, доступные с микроконтроллером. Самое главное, вы должны покупать микроконтроллер из надежного источника.
Краткая история 8051
Первый микропроцессор 4004 был изобретен корпорацией Intel. 8085 и 8086микропроцессоры также были изобретены Intel. В 1981 году Intel представила 8-битный микроконтроллер под названием8051. Это упоминалось какsystem on a chipпотому что у него было 128 байт ОЗУ, 4 Кбайт встроенного ПЗУ, два таймера, один последовательный порт и 4 порта (шириной 8 бит), все на одном кристалле. Когда он стал широко популярным, Intel разрешила другим производителям производить и продавать различные варианты 8051 с его кодом, совместимым с 8051. Это означает, что если вы напишете свою программу для одной версии 8051, она будет работать и с другими версиями, независимо от производитель. Это привело к появлению нескольких версий с разной скоростью и объемом оперативной памяти на кристалле.
8051 Типы / Члены
8052 microcontroller- 8052 имеет все стандартные функции микроконтроллера 8051, а также дополнительные 128 байт ОЗУ и дополнительный таймер. Он также имеет 8 Кбайт встроенного программного ПЗУ вместо 4 Кбайт.
8031 microcontroller- Это еще один член семейства 8051. Этот чип часто называют 8051 без ПЗУ, поскольку он имеет 0 Кбайт встроенного ПЗУ. Вы должны добавить к нему внешнее ПЗУ, чтобы использовать его, который содержит программу, которую нужно извлечь и выполнить. Эта программа может иметь размер до 64 Кбайт. Но в процессе добавления внешнего ПЗУ в 8031 он потерял 2 порта из 4. Чтобы решить эту проблему, мы можем добавить внешний ввод / вывод к 8031
Сравнение 8051 члена семьи
В следующей таблице сравниваются функции, доступные в 8051, 8052 и 8031.
Характерная черта | 8051 | 8052 | 8031 |
---|---|---|---|
ПЗУ (байты) | 4K | 8K | 0K |
RAM (байты) | 128 | 256 | 128 |
Таймеры | 2 | 3 | 2 |
Контакты ввода / вывода | 32 | 32 | 32 |
Серийный порт | 1 | 1 | 1 |
Источники прерывания | 6 | 8 | 6 |
Особенности микроконтроллера 8051
Микроконтроллер 8051 поставляется со следующими функциями:
- Встроенная программная память (ROM) 4 Кбайт
- 128 байт встроенной памяти данных (RAM)
- Четыре банка регистров
- 128 пользовательских программных флагов
- 8-битная двунаправленная шина данных
- 16-битная однонаправленная адресная шина
- 32 регистра общего назначения по 8 бит каждый
- 16-битные таймеры (обычно 2, но может быть больше или меньше)
- Три внутренних и два внешних прерывания
- Четыре 8-битных порта (у короткой модели два 8-битных порта)
- 16-битный программный счетчик и указатель данных
- 8051 также может иметь ряд специальных функций, таких как UART, АЦП, операционный усилитель и т. Д.
Блок-схема микроконтроллера 8051
На следующем рисунке показана блок-схема микроконтроллера 8051 -
В 8051 операции ввода-вывода выполняются с использованием четырех портов и 40 контактов. На следующей схеме контактов подробно показаны 40 контактов. Операционный порт ввода / вывода резервирует 32 контакта, из которых каждый порт имеет 8 контактов. Остальные 8 контактов обозначены как V cc , GND, XTAL1, XTAL2, RST, EA (полоса), ALE / PROG (полоса) и PSEN (полоса).
Это 40-контактный PDIP (пластиковый двухрядный корпус)
Note- В корпусе DIP вы можете распознать первый и последний вывод по прорези в середине ИС. Первый штифт находится слева от этой отметки разреза, а последний штифт ( в данном случае 40- й штифт) - справа от метки разреза.
Порты ввода-вывода и их функции
Четыре порта P0, P1, P2 и P3 используют 8 контактов каждый, что делает их 8-битными портами. После СБРОСА все порты настраиваются как входы, готовые к использованию в качестве входных портов. Когда первый 0 записывается в порт, он становится выходом. Чтобы перенастроить его как вход, на порт необходимо отправить 1.
Порт 0 (контакт № 32 - контакт № 39)
Он имеет 8 контактов (с 32 по 39). Его можно использовать для ввода или вывода. В отличие от портов P1, P2 и P3, мы обычно подключаем P0 к подтягивающим резисторам на 10 кОм, чтобы использовать его в качестве порта ввода или вывода с открытым стоком.
Он также обозначается как AD0-AD7, что позволяет использовать его как для адреса, так и для данных. В случае 8031 (т.е. микросхемы без ПЗУ), когда нам нужно получить доступ к внешнему ПЗУ, то P0 будет использоваться как для адресации, так и для шины данных. ALE (контакт № 31) указывает, есть ли у P0 адрес или данные. Когда ALE = 0, он предоставляет данные D0-D7, но когда ALE = 1, он имеет адрес A0-A7. Если подключение к внешней памяти недоступно, P0 должен быть подключен внешне к подтягивающему резистору 10 кОм.
MOV A,#0FFH ;(comments: A=FFH(Hexadecimal i.e. A=1111 1111)
MOV P0,A ;(Port0 have 1's on every pin so that it works as Input)
Порт 1 (контакты с 1 по 8)
Это 8-битный порт (контакты с 1 по 8), который может использоваться как вход или выход. Он не требует подтягивающих резисторов, потому что они уже подключены внутри. После сброса порт 1 настраивается как входной порт. Следующий код можно использовать для отправки чередующихся значений 55H и AAH на порт 1.
;Toggle all bits of continuously
MOV A,#55
BACK:
MOV P2,A
ACALL DELAY
CPL A ;complement(invert) reg. A
SJMP BACK
Если порт 1 настроен для использования в качестве порта вывода, то, чтобы снова использовать его в качестве порта ввода, запрограммируйте его, записав 1 во все его биты, как в следующем коде.
;Toggle all bits of continuously
MOV A ,#0FFH ;A = FF hex
MOV P1,A ;Make P1 an input port
MOV A,P1 ;get data from P1
MOV R7,A ;save it in Reg R7
ACALL DELAY ;wait
MOV A,P1 ;get another data from P1
MOV R6,A ;save it in R6
ACALL DELAY ;wait
MOV A,P1 ;get another data from P1
MOV R5,A ;save it in R5
Порт 2 (контакты с 21 по 28)
Порт 2 занимает в общей сложности 8 контактов (контакты с 21 по 28) и может использоваться как для операций ввода, так и для операций вывода. Как и P1 (порт 1), P2 также не требует внешних подтягивающих резисторов, потому что они уже подключены внутри. Он должен использоваться вместе с P0 для предоставления 16-битного адреса внешней памяти. Поэтому он также обозначается как (A0 – A7), как показано на схеме контактов. Когда 8051 подключен к внешней памяти, он обеспечивает путь для старших 8-ми битов 16-битного адреса и не может использоваться в качестве ввода-вывода. После сброса порт 2 настраивается как входной порт. Следующий код можно использовать для отправки чередующихся значений 55H и AAH на порт 2.
;Toggle all bits of continuously
MOV A,#55
BACK:
MOV P2,A
ACALL DELAY
CPL A ; complement(invert) reg. A
SJMP BACK
Если порт 2 настроен для использования в качестве порта вывода, то, чтобы снова использовать его в качестве порта ввода, запрограммируйте его, записав 1 во все его биты, как в следующем коде.
;Get a byte from P2 and send it to P1
MOV A,#0FFH ;A = FF hex
MOV P2,A ;make P2 an input port
BACK:
MOV A,P2 ;get data from P2
MOV P1,A ;send it to Port 1
SJMP BACK ;keep doing that
Порт 3 (контакты с 10 по 17)
Он также имеет 8 бит и может использоваться как ввод / вывод. Этот порт подает очень важные сигналы. P3.0 и P3.1 являются RxD (приемник) и TxD (передатчик) соответственно и совместно используются для последовательной связи. Контакты P3.2 и P3.3 используются для внешних прерываний. P3.4 и P3.5 используются для таймеров T0 и T1 соответственно. P3.6 и P3.7 - это контакты для записи (WR) и чтения (RD). Это активные низкие контакты, это означает, что они будут активны, когда им будет присвоен 0, и они используются для обеспечения операций чтения и записи во внешнее ПЗУ в системах на базе 8031.
P3 бит | Функция | Штырь |
---|---|---|
P3.0 | RxD | 10 |
P3.1 < | TxD | 11 |
P3.2 < | Дополнение INT0 | 12 |
P3.3 < | INT1 | 13 |
P3.4 < | T0 | 14 |
P3.5 < | Т1 | 15 |
P3.6 < | WR | 16 |
P3.7 < | Дополнение RD | 17 |
Двойная роль порта 0 и порта 2
Dual role of Port 0- Порт 0 также обозначается как AD0 – AD7, поскольку он может использоваться как для обработки данных, так и для обработки адресов. При подключении 8051 к внешней памяти порт 0 может предоставлять как адрес, так и данные. Затем микроконтроллер 8051 мультиплексирует ввод как адрес или данные, чтобы сохранить контакты.
Dual role of Port 2- Помимо работы в качестве ввода-вывода, порт P2 также используется для обеспечения 16-разрядной адресной шины для внешней памяти вместе с портом 0. Порт P2 также обозначается как (A8– A15), а порт 0 обеспечивает младшие 8-разрядные данные через A0 – A7. Другими словами, мы можем сказать, что когда 8051 подключен к внешней памяти (ПЗУ), максимальный размер которой может составлять до 64 КБ, и это возможно по 16-битной адресной шине, потому что мы знаем, что 216 = 64 КБ. Порт 2 используется для старших 8-ми битов 16-битного адреса, и он не может использоваться для ввода-вывода, и таким образом адресуется любой программный код внешнего ПЗУ.
Аппаратное соединение контактов
Vcc - Контакт 40 обеспечивает питание микросхемы и составляет +5 В.
Gnd - Контакт 20 обеспечивает заземление для ссылки.
XTAL1, XTAL2 (Pin no 18 & Pin no 19)- 8051 имеет встроенный генератор, но для его работы требуются внешние часы. Кристалл кварца подключен между выводами XTAL1 и XTAL2 микросхемы. Этому кристаллу также нужны два конденсатора по 30 пФ для генерации сигнала нужной частоты. Одна сторона каждого конденсатора подключена к земле. 8051 IC доступна с различной скоростью, и все зависит от этого кварцевого кристалла, например, микроконтроллеру на 20 МГц требуется кристалл с частотой не более 20 МГц.
RST (Pin No. 9)- Это входной контакт и активный высокий контакт. При подаче высокого импульса на этот вывод, то есть 1, микроконтроллер перезагрузится и прекратит все действия. Этот процесс известен какPower-On Reset. Активация сброса при включении приведет к потере всех значений в регистре. Он установит программный счетчик на все 0. Чтобы обеспечить действительный ввод сброса, импульс высокого уровня должен быть высоким как минимум в течение двух машинных циклов, прежде чем он станет низким, что зависит от емкости конденсатора и скорости его зарядки. (Machine Cycle минимальная частота, необходимая для выполнения одной инструкции).
EA or External Access (Pin No. 31)- Это входной контакт. Этот вывод является активным нижним выводом; при подаче слабого импульса он активируется. В случае микроконтроллера (8051/52), имеющего встроенное ПЗУ, вывод EA (bar) подключен к V cc . Но в микроконтроллере 8031, который не имеет встроенного ПЗУ, код сохраняется во внешнем ПЗУ, а затем загружается микроконтроллером. В этом случае мы должны подключить советник (контакт № 31) к Gnd, чтобы указать, что программный код хранится извне.
PSEN or Program store Enable (Pin No 29)- Это также активный низкий вывод, то есть он активируется после подачи низкого импульса. Это выходной контакт, который используется вместе с выводом EA в системах на базе 8031 (т.е. БЕСПЗУ), чтобы обеспечить хранение программного кода во внешнем ПЗУ.
ALE or (Address Latch Enable)- Это выходной контакт с активным высоким уровнем. Он особенно используется для 8031 IC для подключения к внешней памяти. Его можно использовать при принятии решения о том, будут ли выводы P0 использоваться как шина адреса или шина данных. Когда ALE = 1, выводы P0 работают как шина данных, а когда ALE = 0, выводы P0 действуют как шина адреса.
Порты ввода-вывода и битовая адресация
Это наиболее широко используемая функция 8051 при написании кода для 8051. Иногда нам нужно получить доступ только к 1 или 2 битам порта, а не ко всем 8 битам. 8051 предоставляет возможность доступа к отдельным битам портов.
При доступе к порту однобитовым способом мы используем синтаксис «SETB X. Y», где X - номер порта (от 0 до 3), а Y - номер бит (от 0 до 7) для битов данных D0-D7. где D0 - младший бит, а D7 - старший разряд. Например, «SETB P1.5» устанавливает высокий бит 5 порта 1.
Следующий код показывает, как мы можем постоянно переключать бит P1.2.
AGAIN:
SETB P1.2
ACALL DELAY
CLR P1.2
ACALL DELAY
SJMP AGAIN
Одноразрядные инструкции
инструкции | Функция |
---|---|
Бит SETB | Установите бит (бит = 1) |
Бит CLR | очистить бит (бит = 0) |
Бит CPL | дополнять бит (бит = НЕ бит) |
Бит JB, мишень | перейти к цели, если бит = 1 (перейти, если бит) |
Бит JNB, цель | перейти к цели, если бит = 0 (перейти, если нет бита) |
Бит JBC, цель | перейти к цели, если бит = 1, очистить бит (перейти, если бит, затем очистить) |
Счетчик команд
Программный счетчик - это 16- или 32-битный регистр, который содержит адрес следующей инструкции, которая должна быть выполнена. ПК автоматически переходит к следующей последовательной ячейке памяти каждый раз, когда выбирается инструкция. Операции перехода, перехода и прерывания загружают в счетчик программ адрес, отличный от следующего последовательного местоположения.
Активация сброса при включении приведет к потере всех значений в регистре. Это означает, что значение ПК (счетчика программ) после сброса равно 0, что заставляет ЦП извлекать первый код операции из ячейки памяти ПЗУ 0000. Это означает, что мы должны поместить первый байт кода обновления в ячейку ПЗУ 0000, потому что именно там CPU ожидает найти первую инструкцию
Сбросить вектор
Значение вектора сброса заключается в том, что он указывает процессору на адрес памяти, который содержит первую инструкцию микропрограммы. Без вектора сброса процессор не знал бы, с чего начать выполнение. После сброса процессор загружает в счетчик программ (ПК) значение вектора сброса из предопределенной области памяти. В архитектуре CPU08 это находится по адресу$FFFE:$FFFF.
Когда вектор сброса не нужен, разработчики обычно принимают это как должное и не программируют в окончательном изображении. В результате процессор не запускается на конечном продукте. Это распространенная ошибка, возникающая на этапе отладки.
Указатель стека
Стек реализован в ОЗУ, и для доступа к нему используется регистр ЦП, называемый регистром SP (указатель стека). Регистр SP является 8-битным регистром и может адресовать адреса памяти в диапазоне от 00h до FFh. Первоначально регистр SP содержит значение 07, указывающее на ячейку 08 как первую ячейку, используемую для стека 8051.
Когда содержимое регистра ЦП хранится в стеке, это называется операцией PUSH. Когда содержимое стека хранится в регистре ЦП, это называется операцией POP. Другими словами, регистр помещается в стек для его сохранения и извлекается из стека для его извлечения.
Бесконечная петля
Бесконечный цикл или бесконечный цикл можно идентифицировать как последовательность инструкций в компьютерной программе, которая выполняется бесконечно в цикле, по следующим причинам:
- цикл без условия завершения.
- цикл с условием завершения, которое никогда не может быть выполнено.
- цикл с условием завершения, которое заставляет цикл начинаться заново.
Такие бесконечные циклы обычно приводили к тому, что старые операционные системы перестали отвечать на запросы, поскольку бесконечный цикл потребляет все доступное время процессора. Операции ввода-вывода, ожидающие ввода данных пользователем, также называются «бесконечными циклами». Одна из возможных причин «зависания» компьютера - бесконечный цикл; другие причины включаютdeadlock и access violations.
Встроенные системы, в отличие от ПК, никогда не «выходят» из приложения. Они бездействуют в бесконечном цикле, ожидая, когда произойдет событие в виде прерывания илиpre-scheduled task. В целях экономии энергии некоторые процессоры вводятся в специальныеsleep или же wait modes вместо холостого хода через бесконечный цикл, но они выйдут из этого режима либо по таймеру, либо по внешнему прерыванию.
Прерывания
Прерывания - это в основном аппаратные механизмы, которые информируют программу о том, что произошло событие. Они могут произойти в любое время и поэтому асинхронны с потоком программы. Они требуют специальной обработки со стороны процессора и, в конечном итоге, обрабатываются соответствующей программой обслуживания прерываний (ISR). Прерывания нужно обрабатывать быстро. Если вы потратите слишком много времени на обслуживание прерывания, вы можете пропустить другое прерывание.
Little Endian против Big Endian
Хотя числа всегда отображаются одинаково, они не сохраняются в памяти одинаковым образом. Машины с обратным порядком байтов хранят старший байт данных в самом младшем адресе памяти. Машина Big-Endian хранит 0x12345678 как -
ADD+0: 0x12
ADD+1: 0x34
ADD+2: 0x56
ADD+3: 0x78
Машины с обратным порядком байтов, с другой стороны, хранят младший байт данных в самом младшем адресе памяти. Машина Little-Endian хранит 0x12345678 как -
ADD+0: 0x78
ADD+1: 0x56
ADD+2: 0x34
ADD+3: 0x12
Языки ассемблера были разработаны для обеспечения mnemonicsили символы для команд машинного кода. Программы на ассемблере состоят из мнемоники, поэтому их следует переводить в машинный код. Программа, отвечающая за это преобразование, известна какassembler. Язык ассемблера часто называют языком низкого уровня, потому что он напрямую работает с внутренней структурой ЦП. Чтобы программировать на языке ассемблера, программист должен знать все регистры процессора.
Различные языки программирования, такие как C, C ++, Java и другие языки, называются языками высокого уровня, потому что они не имеют отношения к внутренним деталям процессора. Напротив, ассемблер используется для перевода программы на языке ассемблера в машинный код (иногда также называемыйobject code или же opcode). Точно так же компилятор переводит язык высокого уровня в машинный код. Например, чтобы написать программу на языке C, необходимо использовать компилятор C для перевода программы на машинный язык.
Структура языка ассемблера
Программа на языке ассемблера представляет собой серию операторов, которые являются либо инструкциями на языке ассемблера, такими как ADD и MOV, либо операторами, называемыми directives.
An instruction сообщает процессору, что делать, а directive (также называется pseudo-instructions) дает инструкцию ассемблеру. Например, инструкции ADD и MOV - это команды, которые выполняет ЦП, а ORG и END - это директивы ассемблера. Ассемблер помещает код операции в ячейку памяти 0, когда используется директива ORG, а END указывает на конец исходного кода. Инструкция по языку программы состоит из следующих четырех полей:
[ label: ] mnemonics [ operands ] [;comment ]
Квадратная скобка ([]) указывает на то, что поле является необязательным.
В label fieldпозволяет программе ссылаться на строку кода по имени. Поля меток не могут превышать определенное количество символов.
В mnemonics и operands fieldsвместе выполнять реальную работу программы и выполнять поставленные задачи. Такие операторы, как ADD A, C и MOV C, # 68, где ADD и MOV - мнемоники, которые производят коды операций; «A, C» и «C, # 68» являются операндами. Эти два поля могут содержать директивы. Директивы не генерируют машинный код и используются только ассемблером, тогда как инструкции переводятся в машинный код для выполнения ЦП.
1.0000 ORG 0H ;start (origin) at location 0
2 0000 7D25 MOV R5,#25H ;load 25H into R5
3.0002 7F34 MOV R7,#34H ;load 34H into R7
4.0004 7400 MOV A,#0 ;load 0 into A
5.0006 2D ADD A,R5 ;add contents of R5 to A
6.0007 2F ADD A,R7 ;add contents of R7 to A
7.0008 2412 ADD A,#12H ;add to A value 12 H
8.000A 80FE HERE: SJMP HERE ;stay in this loop
9.000C END ;end of asm source file
В comment field начинается с точки с запятой, которая является индикатором комментария.
Обратите внимание на метку «ЗДЕСЬ» в программе. Любая метка, которая относится к инструкции, должна сопровождаться двоеточием.
Сборка и запуск программы 8051
Здесь мы обсудим базовую форму языка ассемблера. Шаги по созданию, сборке и запуску программы на ассемблере следующие:
Во-первых, мы используем редактор, чтобы ввести программу, аналогичную указанной выше. Редакторы, такие как программа MS-DOS EDIT, которая поставляется со всеми операционными системами Microsoft, могут использоваться для создания или редактирования программы. Редактор должен иметь возможность создавать файл ASCII. На следующем этапе ассемблер использует расширение «asm» для исходного файла.
Исходный файл "asm" содержит программный код, созданный на шаге 1. Он загружается на ассемблер 8051. Затем ассемблер преобразует инструкции языка ассемблера в инструкции машинного кода и создает.obj file (объектный файл) и .lst file(файл списка). Его также называютsource file, поэтому некоторые ассемблеры требуют, чтобы этот файл имел расширения src. Файл "lst" необязательный. Это очень полезно для программы, потому что в нем перечислены все коды операций и адреса, а также ошибки, обнаруженные ассемблерами.
Ассемблерам требуется третий шаг, называемый linking. Программа связывания берет один или несколько объектных файлов и создает абсолютный объектный файл с расширением «abs».
Затем файл «abs» загружается в программу с именем «OH» (преобразователь объекта в шестнадцатеричный), которая создает файл с расширением «шестнадцатеричный», готовый для записи в ПЗУ.
Тип данных
Микроконтроллер 8051 содержит один тип данных из 8 бит, и каждый регистр также имеет размер 8 бит. Программист должен разбить данные размером более 8 бит (от 00 до FFH или до 255 в десятичном формате), чтобы их мог обработать ЦП.
БД (определить байт)
Директива DB - это наиболее широко используемая директива данных в ассемблере. Он используется для определения 8-битных данных. Его также можно использовать для определения данных в десятичном, двоичном, шестнадцатеричном или ASCII-формате. Для десятичных чисел буква «D» после десятичного числа является необязательной, но обязательна для «B» (двоичный) и «Hl» (шестнадцатеричный).
Чтобы указать ASCII, просто поместите символы в кавычки («как это»). Ассемблер автоматически генерирует код ASCII для чисел / символов. Директива DB - единственная директива, которая может использоваться для определения строк ASCII, длина которых превышает два символа; поэтому его следует использовать для всех определений данных ASCII. Некоторые примеры БД приведены ниже -
ORG 500H
DATA1: DB 28 ;DECIMAL (1C in hex)
DATA2: DB 00110101B ;BINARY (35 in hex)
DATA3: DB 39H ;HEX
ORG 510H
DATA4: DB "2591" ;ASCII NUMBERS
ORG 520H
DATA6: DA "MY NAME IS Michael" ;ASCII CHARACTERS
Строки ASCII могут заключаться в одинарные или двойные кавычки. DB также используется для выделения памяти в виде блоков размером в байты.
Директивы ассемблера
Некоторые из директив 8051 следующие:
ORG (origin)- Директива origin используется для указания начала адреса. Принимает числа в шестнадцатеричном или десятичном формате. Если после числа указано H, число рассматривается как шестнадцатеричное, в противном случае - десятичное. Ассемблер преобразует десятичное число в шестнадцатеричное.
EQU (equate)- Он используется для определения константы, не занимая места в памяти. EQU связывает постоянное значение с меткой данных, так что метка появляется в программе, ее постоянное значение будет заменено меткой. При выполнении инструкции «MOV R3, #COUNT» в регистр R3 будет загружено значение 25 (обратите внимание на знак #). Преимущество использования EQU состоит в том, что программист может изменить его один раз, а ассемблер изменит все его вхождения; программисту не нужно искать всю программу.
END directive- Указывает конец исходного (asm) файла. Директива END - это последняя строка программы; все, что находится после директивы END, ассемблер игнорирует.
Ярлыки на языке ассемблера
Все метки на языке ассемблера должны соответствовать правилам, приведенным ниже -
Имя каждого ярлыка должно быть уникальным. Имена, используемые для меток в программировании на языке ассемблера, состоят из букв в верхнем и нижнем регистре, цифр от 0 до 9 и специальных символов, таких как вопросительный знак (?), Точка (.), Со скоростью @, подчеркивание (_), и доллар ($).
Первый символ должен быть алфавитным; это не может быть число.
Зарезервированные слова не могут использоваться в качестве метки в программе. Например, слова ADD и MOV являются зарезервированными словами, поскольку они являются мнемоникой команд.
Регистры используются в ЦП для временного хранения информации, которая может быть данными для обработки или адресом, указывающим на данные, которые должны быть извлечены. В 8051 есть один 8-битный тип данных, от MSB (самый старший бит) D7 до LSB (младший бит) D0. При использовании 8-битного типа данных любой тип данных, размер которого превышает 8 бит, должен быть разбит на 8-битные фрагменты перед обработкой.
Наиболее широко используемые регистры 8051 - это A (аккумулятор), B, R0-R7, DPTR (указатель данных) и PC (счетчик программ). Все эти регистры 8-битные, кроме DPTR и PC.
Регистры хранения в 8051
Здесь мы обсудим следующие типы регистров хранения -
- Accumulator
- R регистр
- B регистр
- Указатель данных (DPTR)
- Программный счетчик (ПК)
- Указатель стека (SP)
Аккумулятор
Аккумулятор, регистр A, используется для всех арифметических и логических операций. Если аккумулятор отсутствует, то каждый результат каждого вычисления (сложение, умножение, сдвиг и т. Д.) Должен быть сохранен в основной памяти. Доступ к основной памяти медленнее, чем доступ к регистру, например к аккумулятору, потому что технология, используемая для большой основной памяти, медленнее (но дешевле), чем технология, используемая для регистра.
Регистры "R"
Регистры «R» представляют собой набор из восьми регистров, а именно от R0, R1 до R7. Эти регистры функционируют как вспомогательные регистры или регистры временного хранения во многих операциях. Рассмотрим пример суммы 10 и 20. Сохраните переменную 10 в аккумуляторе, а другую переменную 20, скажем, в регистре R4. Чтобы обработать операцию добавления, выполните следующую команду -
ADD A,R4
После выполнения этой инструкции аккумулятор будет содержать значение 30. Таким образом, регистры «R» являются очень важными вспомогательными или helper registers. Сам по себе аккумулятор не был бы очень полезным, если бы не эти регистры "R". Регистры «R» предназначены для временного хранения значений.
Возьмем другой пример. Мы сложим значения R1 и R2 вместе, а затем вычтем значения R3 и R4 из результата.
MOV A,R3 ;Move the value of R3 into the accumulator
ADD A,R4 ;Add the value of R4
MOV R5,A ;Store the resulting value temporarily in R5
MOV A,R1 ;Move the value of R1 into the accumulator
ADD A,R2 ;Add the value of R2
SUBB A,R5 ;Subtract the value of R5 (which now contains R3 + R4)
Как видите, мы использовали R5, чтобы временно удерживать сумму R3 и R4. Конечно, это не самый эффективный способ вычисления (R1 + R2) - (R3 + R4), но он иллюстрирует использование регистров «R» как способ временного хранения значений.
Регистр "B"
Регистр «B» очень похож на накопитель в том смысле, что он может содержать 8-битное (1-байтовое) значение. Регистр "B" используется только двумя инструкциями 8051:MUL AB и DIV AB. Чтобы быстро и легко умножить или разделить A на другое число, вы можете сохранить другое число в «B» и использовать эти две инструкции. Помимо использования инструкций MUL и DIV, регистр «B» часто используется как еще один регистр временного хранения, во многом как девятый регистр R.
Указатель данных
Указатель данных (DPTR) - единственный доступный пользователю 16-битный (2-байтовый) регистр 8051. Аккумулятор, регистры R0 – R7 и регистр B представляют собой регистры с 1-байтовым значением. DPTR предназначен для указания на данные. Он используется 8051 для доступа к внешней памяти с использованием адреса, указанного DPTR. DPTR - единственный доступный 16-битный регистр, который часто используется для хранения 2-байтовых значений.
Счетчик программ
Программный счетчик (ПК) - это 2-байтовый адрес, который сообщает 8051, где в памяти находится следующая инструкция для выполнения. ПК запускается в 0000h при инициализации 8051 и увеличивается каждый раз после выполнения инструкции. PC не всегда увеличивается на 1. Некоторые инструкции могут требовать 2 или 3 байта; в таких случаях ПК будет увеличен на 2 или 3.
Branch, jump, и interruptоперации загружают Программный счетчик с адресом, отличным от следующего последовательного местоположения. Активация сброса при включении приведет к потере всех значений в регистре. Это означает, что значение ПК равно 0 после сброса, что заставляет ЦП выбирать первый код операции из ячейки ПЗУ 0000. Это означает, что мы должны поместить первый байт апкода в ячейку ПЗУ 0000, потому что именно там ЦП ожидает найти первая инструкция.
Указатель стека (SP)
Указатель стека, как и все регистры, кроме DPTR и PC, может содержать 8-битное (1-байтовое) значение. Указатель стека указывает место, откуда следующее значение должно быть удалено из стека. Когда значение помещается в стек, значение SP увеличивается, а затем значение сохраняется в полученной ячейке памяти. Когда значение извлекается из стека, значение возвращается из области памяти, указанной SP, а затем значение SP уменьшается.
Этот порядок работы важен. SP будет инициализирован на 07h при инициализации 8051. Если значение помещается в стек одновременно, значение будет сохранено во внутреннем адресе ОЗУ 08h, потому что 8051 сначала увеличит значение SP (с 07h до 08h), а затем сохранит помещенное значение в эту память. адрес (08ч). SP модифицируется непосредственно 8051 шестью инструкциями: PUSH, POP, ACALL, LCALL, RET и RETI.
ПЗУ 8051
Некоторые члены семейства 8051 имеют только 4 Кбайт встроенного ПЗУ (например, 8751, AT8951); некоторые из них имеют 8 КБ ПЗУ, например AT89C52, а есть некоторые члены семейства с 32 Кбайт и 64 Кбайт встроенного ПЗУ, такие как Dallas Semiconductor. Следует помнить, что ни один член семейства 8051 не может получить доступ к более чем 64 Кбайт кода операции, поскольку счетчик программ в 8051 является 16-битным регистром (от 0000 до адреса FFFF).
Первое расположение ПЗУ программы внутри 8051 имеет адрес 0000H, тогда как последнее расположение может отличаться в зависимости от размера ПЗУ на кристалле. Среди членов семейства 8051 AT8951 имеет $ k байтов ПЗУ на кристалле, имеющего адрес памяти от 0000 (первая ячейка) до 0FFFH (последняя ячейка).
8051 Флаговые биты и регистр PSW
Регистр слова состояния программы (PSW) - это 8-битный регистр, также известный как flag register. Его ширина 8 бит, но используется только 6 бит. Два неиспользуемых битаuser-defined flags. Четыре флага называютсяconditional flags, что означает, что они указывают условие, которое возникает после выполнения инструкции. Эти четыреCY (Нести), AC (вспомогательная переноска), P (паритет), и OV(перелив). Биты RS0 и RS1 используются для изменения регистров банка. На следующем рисунке показан регистр слова состояния программы.
Регистр PSW содержит биты состояния, которые отражают текущий статус ЦП.
CY | CA | F0 | RS1 | RS0 | OV | - | п |
---|
CY | PSW.7 | Перенести флаг |
AC | PSW.6 | Вспомогательный флаг переноски |
F0 | PSW.5 | Флаг 0 доступен пользователю для общих целей. |
RS1 | PSW.4 | Регистр бита выбора банка 1 |
RS0 | PSW.3 | Регистр бита выбора банка 0 |
OV | PSW.2 | Флаг переполнения |
- | PSW.1 | Определяемый пользователем ФЛАГ |
п | PSW.0 | ФЛАГ паритета. Устанавливается / сбрасывается аппаратно во время цикла команд, чтобы указать четное / нечетное число 1 бита в аккумуляторе. |
Мы можем выбрать соответствующий бит банка регистров, используя биты RS0 и RS1.
RS1 | RS2 | Зарегистрировать банк | Адрес |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10ч-17ч |
1 | 1 | 3 | 18H-1FH |
CY, the carry flag- Этот флаг переноса устанавливается (1) всякий раз, когда происходит перенос из бита D7. На него влияет 8-битная операция сложения или вычитания. Его также можно сбросить на 1 или 0 напрямую с помощью таких инструкций, как «SETB C» и «CLR C», где «SETB» означает перенос установленного бита, а «CLR» означает чистый перенос.
AC, auxiliary carry flag- Если есть перенос из D3 и D4 во время операции ADD или SUB, устанавливается бит AC; в противном случае он очищается. Он используется для инструкции для выполнения двоично-десятичной арифметики.
P, the parity flag- Флаг четности представляет только количество единиц в регистре аккумулятора. Если регистр A содержит нечетное количество единиц, то P = 1; и для четного числа единиц P = 0.
OV, the overflow flag- Этот флаг устанавливается всякий раз, когда результат операции числа со знаком слишком велик, что приводит к переполнению старшего бита в знаковый бит. Он используется только для обнаружения ошибок в арифметических операциях со знаком.
пример
Покажите состояние флагов CY, AC и P после добавления 9CH и 64H в следующей инструкции.
MOV A, # 9CH
ДОБАВИТЬ A, # 64H
Solution: 9C 10011100
+64 01100100
100 00000000
CY = 1 since there is a carry beyond D7 bit
AC = 0 since there is a carry from D3 to D4
P = 0 because the accumulator has even number of 1's
В микроконтроллере 8051 всего 128 байт ОЗУ. Мы обсудим распределение этих 128 байтов ОЗУ и рассмотрим их использование в качестве стека и регистра.
Распределение пространства памяти RAM в 8051
128 байтам ОЗУ внутри 8051 присвоены адреса от 00 до 7FH. Доступ к ним можно получить напрямую как к ячейкам памяти, и они разделены на три разные группы следующим образом:
32 байта от 00H до 1FH отведены для банков регистров и стека.
16 байтов от 20H до 2FH отведены для памяти чтения / записи с побитовой адресацией.
80 байтов от 30H до 7FH используются для хранения для чтения и записи; это называетсяscratch pad. Эти 80 ячеек RAM широко используются 8051 программистом для хранения данных и параметров.
Зарегистрировать банки в 8051
Для банков регистров и стека отведено 32 байта ОЗУ. Эти 32 байта разделены на четыре банка регистров, каждый из которых имеет 8 регистров, R0 – R7. Ячейки RAM от 0 до 7 зарезервированы для банка 0 R0 – R7, где R0 - это ячейка RAM 0, R1 - ячейка RAM 1, R2 - ячейка 2, и так далее, пока ячейка памяти 7, которая принадлежит R7 банка 0.
Второй банк регистров R0 – R7 начинается с ячейки 08 ОЗУ и переходит в ячейки OFH. Третий банк R0 – R7 начинается с ячейки памяти 10H и переходит в ячейку 17H. Наконец, ячейки ОЗУ с 18H по 1FH зарезервированы для четвертого банка R0 – R7.
Банк реестра по умолчанию
Если ячейки ОЗУ 00–1F выделены для четырех банков регистров, к какому банку регистров R0 – R7 у нас есть доступ при включении питания 8051? Ответ - регистровый банк 0; то есть доступ к ячейкам ОЗУ от 0 до 7 осуществляется по именам от R0 до R7 при программировании 8051. Потому что гораздо проще ссылаться на эти ячейки ОЗУ по именам, например от R0 до R7, а не по их ячейкам памяти.
Как сменить регистрационный банк
Банк регистров 0 используется по умолчанию при включении 8051. Переключиться на другие банки можно с помощью регистра PSW. Биты D4 и D3 PSW используются для выбора нужного банка регистров, поскольку к ним можно получить доступ с помощью команд с битовой адресацией SETB и CLR. Например, «SETB PSW.3» установит PSW.3 = 1 и выберет регистр банка 1.
RS1 | RS2 | Выбран банк |
---|---|---|
0 | 0 | Банк0 |
0 | 1 | Банк1 |
1 | 0 | Банк2 |
1 | 1 | Банк3 |
Стек и его операции
Стек в 8051
Стек - это часть ОЗУ, используемая ЦП для временного хранения информации, такой как данные или адрес памяти. ЦП нуждается в этой области хранения, учитывая ограниченное количество регистров.
Как осуществляется доступ к стекам
Поскольку стек является частью ОЗУ, внутри ЦП есть регистры, указывающие на него. Регистр, используемый для доступа к стеку, известен как регистр указателя стека. Указатель стека в 8051 имеет ширину 8 бит и может принимать значение от 00 до FFH. Когда 8051 инициализируется, регистр SP содержит значение 07H. Это означает, что ячейка ОЗУ 08 является первой ячейкой, используемой для стека. Операция сохранения регистра ЦП в стеке известна какPUSH, а получение содержимого из стека обратно в регистр ЦП называется POP.
Попадание в стек
В 8051 указатель стека (SP) указывает на последнее использованное место стека. Когда данные помещаются в стек, указатель стека (SP) увеличивается на 1. Когда выполняется PUSH, содержимое регистра сохраняется в стеке, а SP увеличивается на 1. Чтобы поместить регистры в стек, мы должны использовать свои адреса RAM. Например, инструкция «PUSH 1» помещает регистр R1 в стек.
Выскакивание из стопки
Выталкивание содержимого стека обратно в данный регистр противоположно процессу выталкивания. При каждой операции выталкивания верхний байт стека копируется в регистр, указанный инструкцией, и указатель стека уменьшается один раз.
Последовательность выполнения программы продолжается последовательно, от одной инструкции к следующей, если не выполняется инструкция передачи управления. Различные типы команд передачи управления на ассемблере включают условные или безусловные переходы и инструкции вызова.
Инструкции по петле и прыжку
Зацикливание в 8051
Повторение последовательности инструкций определенное количество раз называется loop. ИнструкцияDJNZ reg, labelиспользуется для выполнения операции цикла. В этой инструкции регистр уменьшается на 1; если он не равен нулю, то 8051 переходит к целевому адресу, на который указывает метка.
В регистр загружается счетчик количества повторений до начала цикла. В этой инструкции и регистры уменьшения, и решение о переходе объединены в одну инструкцию. Регистры могут быть любыми из R0 – R7. Счетчик также может быть местом в ОЗУ.
пример
Multiply 25 by 10 using the technique of repeated addition.
Solution- Умножение может быть достигнуто путем повторного сложения множимого столько же раз, сколько множитель. Например,
25 * 10 = 250 (FAH)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC
MOV R2,#10 ; the multiplier is replaced in R2
Add A,#25 ;add the multiplicand to the ACC
AGAIN:DJNZ R2,
AGAIN:repeat until R2 = 0 (10 times)
MOV R5 , A ;save A in R5 ;R5 (FAH)
Drawback in 8051 - Циклическое действие с инструкцией DJNZ Reg labelограничен 256 итерациями. Если условный переход не выполняется, выполняется инструкция, следующая за переходом.
Зацикливание внутри цикла
Когда мы используем цикл внутри другого цикла, он называется nested loop. Два регистра используются для хранения счетчика, когда максимальное число ограничено 256. Таким образом, мы используем этот метод, чтобы повторить действие больше 256 раз.
Example
Напишите программу на -
- Загрузите аккумулятор со значением 55H.
- Дополнить АКК 700 раз.
Solution- Поскольку 700 больше 255 (максимальная емкость любого регистра), для хранения счетчика используются два регистра. Следующий код показывает, как использовать два регистра, R2 и R3, для подсчета.
MOV A,#55H ;A = 55H
NEXT: MOV R3,#10 ;R3 the outer loop counter
AGAIN:MOV R2,#70 ;R2 the inner loop counter
CPL A ;complement
Другие условные прыжки
В следующей таблице перечислены условные переходы, используемые в 8051 -
Инструкция | Действие |
---|---|
JZ | Перейти, если A = 0 |
JNZ | Перейти, если A ≠ 0 |
DJNZ | Уменьшение и переход, если регистр ≠ 0 |
CJNE A, данные | Перейти, если A ≠ данные |
CJNE reg, # данные | Перейти, если байт ≠ данные |
JC | Перейти, если CY = 1 |
JNC | Перейти, если CY 1 |
JB | Перейти, если бит = 1 |
JNB | Перейти, если бит = 0 |
JBC | Перейти, если бит = 1, и сбросить бит |
JZ (jump if A = 0)- В этой инструкции проверяется содержимое аккумулятора. Если он равен нулю, то 8051 переходит к целевому адресу. Инструкцию JZ можно использовать только для аккумулятора, она не применяется ни к каким другим регистрам.
JNZ (jump if A is not equal to 0)- В этой инструкции проверяется, что содержимое аккумулятора не равно нулю. Если он не равен нулю, то 8051 переходит к целевому адресу.
JNC (Jump if no carry, jumps if CY = 0)- Бит флага переноса в регистре флага (или PSW) используется для принятия решения, переходить или нет "метку JNC". ЦП смотрит на флаг переноса, чтобы увидеть, поднят ли он (CY = 1). Если он не повышен, то ЦП начинает выборку и выполнение инструкций с адреса метки. Если CY = 1, он не будет прыгать, но выполнит следующую инструкцию ниже JNC.
JC (Jump if carry, jumps if CY = 1) - Если CY = 1, выполняется переход к целевому адресу.
JB (jump if bit is high)
JNB (jump if bit is low)
Note - Следует отметить, что все условные переходы являются короткими переходами, т. Е. Адрес цели должен находиться в пределах от –128 до +127 байт от содержимого программного счетчика.
Безусловные инструкции по прыжкам
В 8051 есть два безусловных скачка -
LJMP (long jump)- LJMP - это 3-байтовая инструкция, в которой первый байт представляет код операции, а второй и третий байты представляют 16-битный адрес целевого местоположения. 2-байтовый целевой адрес позволяет перейти в любую ячейку памяти от 0000 до FFFFH.
SJMP (short jump)- Это 2-байтовая инструкция, в которой первый байт - это код операции, а второй - относительный адрес целевого местоположения. Относительный адрес находится в диапазоне от 00H до FFH, который разделен на переходы вперед и назад; то есть в пределах от –128 до +127 байт памяти относительно адреса текущего ПК (счетчик программ). В случае прямого перехода целевой адрес может находиться в пределах 127 байтов от текущего ПК. В случае обратного перехода целевой адрес может находиться в пределах –128 байт от текущего ПК.
Вычисление адреса короткого перехода
Все условные переходы (JNC, JZ и DJNZ) являются короткими переходами, потому что они представляют собой 2-байтовые инструкции. В этих инструкциях первый байт представляет код операции, а второй байт представляет относительный адрес. Целевой адрес всегда зависит от значения программного счетчика. Для вычисления целевого адреса второй байт добавляется к ПК инструкции непосредственно под переходом. Взгляните на программу, приведенную ниже -
Line PC Op-code Mnemonic Operand
1 0000 ORG 0000
2 0000 7800 MOV R0,#003
3 0002 7455 MOV A,#55H0
4 0004 6003 JZ NEXT
5 0006 08 INC R0
6 0007 04 AGAIN: INC A
7 0008 04 INC A
8 0009 2477 NEXT: ADD A, #77h
9 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0, A
12 000F F9 MOV R1, A
13 0010 FA MOV R2, A
14 0011 FB MOV R3, A
15 0012 2B OVER: ADD A, R3
16 0013 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 0017 END
Вычисление целевого адреса обратного перехода
В случае перехода вперед, величина смещения представляет собой положительное число от 0 до 127 (от 00 до 7F в шестнадцатеричном формате). Однако для прыжка назад смещение имеет отрицательное значение от 0 до –128.
ЗВОНИТЕ Инструкции
CALL используется для вызова подпрограммы или метода. Подпрограммы используются для выполнения операций или задач, которые необходимо выполнять часто. Это делает программу более структурированной и экономит место в памяти. Есть две инструкции - LCALL и ACALL.
LCALL (длинный звонок)
LCALL - это 3-байтовая инструкция, в которой первый байт представляет код операции, а второй и третий байты используются для предоставления адреса целевой подпрограммы. LCALL может использоваться для вызова подпрограмм, которые доступны в адресном пространстве 64 Кбайт 8051.
Для успешного возврата к точке после выполнения вызванной подпрограммы ЦП сохраняет адрес инструкции непосредственно под LCALL в стеке. Таким образом, когда вызывается подпрограмма, управление передается этой подпрограмме, и процессор сохраняет ПК (счетчик программ) в стеке и начинает получать инструкции из нового места. Инструкция RET (возврат) передает управление обратно вызывающей стороне после завершения выполнения подпрограммы. Каждая подпрограмма использует RET в качестве последней инструкции.
ACALL (Абсолютный вызов)
ACALL - это 2-байтовая инструкция, в отличие от LCALL, которая состоит из 3 байтов. Целевой адрес подпрограммы должен находиться в пределах 2 Кбайт, потому что для адреса используются только 11 бит из 2 байтов. Разница между ACALL и LCALL заключается в том, что целевой адрес для LCALL может находиться где угодно в пределах 64-килобайтного адресного пространства 8051, в то время как целевой адрес CALL находится в пределах 2-килобайтного диапазона.
An addressing modeотносится к тому, как вы обращаетесь к данной области памяти. Существует пять различных способов или пять режимов адресации для выполнения этой инструкции, а именно:
- Режим немедленной адресации
- Режим прямой адресации
- Зарегистрируйте режим прямой адресации
- Зарегистрировать режим косвенной адресации
- Индексированный режим адресации
Режим немедленной адресации
Начнем с примера.
MOV A, #6AH
В общем, мы можем написать,
MOV A, #data
Это называется immediate потому что 8-битные данные немедленно передаются в аккумулятор (операнд назначения).
На следующем рисунке описана вышеуказанная инструкция и ее выполнение. Код операции 74H сохраняется по адресу 0202. Данные 6AH сохраняются по адресу 0203 в памяти программ. После считывания кода операции 74H данные по следующему адресу памяти программ передаются в аккумулятор A (E0H - адрес аккумулятора). Поскольку инструкция состоит из 2 байтов и выполняется за один цикл, счетчик программ будет увеличен на 2 и укажет на 0204 в памяти программ.
Note- Символ «#» перед 6AH указывает, что операнд является данными (8 бит). В отсутствие символа «#» в качестве адреса будет использоваться шестнадцатеричное число.
Режим прямой адресации
Это еще один способ обращения к операнду. Здесь адрес данных (исходные данные) задается как операнд. Возьмем пример.
MOV A, 04H
Банк регистров # 0 (4-й регистр) имеет адрес 04H. Когда команда MOV выполняется, данные, хранящиеся в регистре 04H, перемещаются в аккумулятор. Поскольку регистр 04H хранит данные 1FH, 1FH перемещается в аккумулятор.
Note- Мы не использовали '#' в режиме прямой адресации, в отличие от немедленного режима. Если бы мы использовали '#', значение данных 04H было бы передано в аккумулятор вместо 1FH.
Теперь взгляните на следующую иллюстрацию. Он показывает, как выполняется инструкция.
Как показано на рисунке выше, это 2-байтовая инструкция, для выполнения которой требуется 1 цикл. ПК будет увеличен на 2 и укажет на 0204. Код операции для инструкции MOV A, адрес - E5H. Когда выполняется инструкция 0202 (E5H), аккумулятор становится активным и готовым к приему данных. Затем ПК переходит к следующему адресу 0203 и ищет адрес местоположения 04H, где находятся исходные данные (для передачи в аккумулятор). В 04H элемент управления находит данные 1F и передает их в аккумулятор, и, следовательно, выполнение завершается.
Зарегистрируйте режим прямой адресации
В этом режиме адресации мы используем имя регистра напрямую (как исходный операнд). Попробуем разобраться на примере.
MOV A, R4
За один раз регистры могут принимать значения от R0 до R7. Всего таких регистров 32. Чтобы использовать 32 регистра всего с 8 переменными для адресации регистров, используются банки регистров. Имеется 4 банка регистров с именами от 0 до 3. Каждый банк состоит из 8 регистров с именами от R0 до R7.
Одновременно можно выбрать банк с одним регистром. Выбор банка регистров возможен черезSpecial Function Register (SFR) назван Processor Status Word(PSW). PSW - это 8-битный SFR, в котором каждый бит может быть запрограммирован по мере необходимости. Биты обозначены от PSW.0 до PSW.7. PSW.3 и PSW.4 используются для выбора банков регистров.
Теперь взгляните на следующую иллюстрацию, чтобы получить четкое представление о том, как это работает.
Код операции EC используется для MOV A, R4. Код операции хранится по адресу 0202, и когда он выполняется, управление переходит непосредственно к R4 уважаемого банка регистров (который выбирается в PSW). Если выбран банк регистров №0, то данные из R4 банка регистров №0 будут перемещены в аккумулятор. Здесь 2F хранится в 04H. 04H представляет собой адрес R4 банка регистров # 0.
Движение данных (2F) выделено жирным шрифтом. 2F передается в аккумулятор из ячейки памяти данных 0C H и показан пунктирной линией. 0CH - это адрес регистра 4 (R4) банка регистров №1. Приведенная выше инструкция имеет размер 1 байт и требует 1 цикла для полного выполнения. Это означает, что вы можете сэкономить программную память, используя режим прямой адресации регистров.
Зарегистрируйте режим косвенной адресации
В этом режиме адресации адрес данных сохраняется в регистре как операнд.
MOV A, @R0
Здесь значение внутри R0 рассматривается как адрес, по которому хранятся данные, передаваемые в аккумулятор. Example: Если R0 имеет значение 20H, а данные 2FH хранятся по адресу 20H, то значение 2FH будет передано в аккумулятор после выполнения этой инструкции. См. Следующую иллюстрацию.
Итак, код операции для MOV A, @R0это E6H. Предполагая, что выбран банк регистров № 0, R0 банка регистров № 0 содержит данные 20H. Управление программой перемещается в 20H, где он находит данные 2FH и передает 2FH в аккумулятор. Это 1-байтовая инструкция, и программный счетчик увеличивается на 1 и переходит в 0203 программной памяти.
Note- Только R0 и R1 могут формировать команду косвенной адресации регистров. Другими словами, программист может создать инструкцию с помощью @ R0 или @ R1. Разрешены все банки регистров.
Индексированный режим адресации
Мы рассмотрим два примера, чтобы понять концепцию режима индексированной адресации. Взгляните на следующие инструкции -
MOVC A, @A+DPTR
и
MOVC A, @A+PC
где DPTR - указатель данных, а PC - счетчик программ (оба являются 16-битными регистрами). Рассмотрим первый пример.
MOVC A, @A+DPTR
Исходный операнд - @ A + DPTR. Он содержит исходные данные из этого места. Здесь мы добавляем содержимое DPTR с текущим содержимым аккумулятора. Это добавление даст новый адрес, который является адресом исходных данных. Данные, указанные этим адресом, затем передаются в аккумулятор.
Код операции - 93H. DPTR имеет значение 01FE, где 01 находится в DPH (старшие 8 бит), а FE находится в DPL (младшие 8 бит). Аккумулятор имеет значение 02H. Затем выполняется 16-битное сложение, и 01FE H + 02H дает 0200 H. Данные в местоположении 0200H передаются в аккумулятор. Предыдущее значение внутри аккумулятора (02H) будет заменено новыми данными из 0200H. Новые данные в аккумуляторе выделены на рисунке.
Это 1-байтовая инструкция с 2 циклами, необходимыми для выполнения, и время выполнения, необходимое для этой инструкции, велико по сравнению с предыдущими инструкциями (каждая из которых составляла 1 цикл).
Другой пример MOVC A, @A+PCработает так же, как в приведенном выше примере. Вместо добавления DPTR с аккумулятором, здесь данные внутри программного счетчика (ПК) добавляются с аккумулятором для получения целевого адреса.
Регистр специальных функций (или регистр специального назначения, или просто специальный регистр) - это регистр в микропроцессоре, который управляет или контролирует различные функции микропроцессора. Поскольку специальные регистры тесно связаны с некоторой специальной функцией или состоянием процессора, они могут быть недоступны для прямой записи обычными инструкциями (такими как добавление, перемещение и т. Д.). Вместо этого некоторые специальные регистры в некоторых архитектурах процессоров требуют специальных инструкций для их изменения.
В 8051 регистры A, B, DPTR и PSW являются частью группы регистров, обычно называемых SFR (регистры специальных функций). Доступ к SFR можно получить по его имени или по адресу.
В следующей таблице показан список SFR и их адресов.
Байт-адрес | Битовый адрес | ||||||||
---|---|---|---|---|---|---|---|---|---|
FF | |||||||||
F0 | F7 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | B |
E0 | E7 | E6 | E5 | E4 | E3 | E2 | E1 | E0 | АКК |
D0 | D7 | D6 | D5 | D4 | D3 | D2 | - | D0 | PSW |
B8 | - | - | - | до н.э | BB | BA | B9 | B8 | IP |
B0 | B7 | B6 | B5 | B4 | B3 | Би 2 | B1 | B0 | P3 |
A2 | AF | - | - | AC | AB | AA | A9 | A8 | IE |
A0 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | P2 |
99 | Не битовая адресация | СБУФ | |||||||
98 | 9F | 9E | 9D | 9C | 9B | 9А | 99 | 98 | SCON |
90 | 97 | 96 | 95 | 94 | 93 | 92 | 91 | 90 | P1 |
8D | Не битовая адресация | TH1 | |||||||
8C | Не битовая адресация | TH0 | |||||||
8B | Не битовая адресация | TL1 | |||||||
8A | Не битовая адресация | TL0 | |||||||
89 | Не битовая адресация | TMOD | |||||||
88 | 8F | 8E | 8D | 8C | 8B | 8A | 89 | 88 | TCON |
87 | Не битовая адресация | PCON | |||||||
83 | Не битовая адресация | DPH | |||||||
82 | Не битовая адресация | DPL | |||||||
81 год | Не битовая адресация | SP | |||||||
80 | 87 | 87 | 85 | 84 | 83 | 82 | 81 год | 80 | P0 |
Обратите внимание на следующие два момента, касающиеся адресов SFR.
Специальный функциональный регистр может иметь адрес от 80H до FFH. Эти адреса выше 80H, поскольку адреса от 00 до 7FH являются адресами оперативной памяти внутри 8051.
Не все адресное пространство от 80 до FF используется SFR. Неиспользуемые ячейки, от 80H до FFH, зарезервированы и не должны использоваться программистом 8051.
CY | PSW.7 | Перенести флаг |
AC | PSW.6 | Вспомогательный флаг переноски |
F0 | PSW.5 | Флаг 0 доступен пользователю для общих целей. |
RS1 | PSW.4 | Регистр бита выбора банка 1 |
RS0 | PSW.3 | Регистр бита выбора банка 0 |
OV | PSW.2 | Флаг переполнения |
- | PSW.1 | Определяемый пользователем ФЛАГ |
п | PSW.0 | ФЛАГ паритета. Устанавливается / сбрасывается аппаратно во время цикла команд, чтобы указать четное / нечетное число 1 бита в аккумуляторе. |
В следующем примере имена регистров SFR заменяются их адресами.
CY | AC | F0 | RS1 | RS0 | OV | - | п |
---|
Мы можем выбрать соответствующий бит банка регистров, используя биты RS0 и RS1.
RS1 | RS2 | Зарегистрировать банк | Адрес |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10ч-17ч |
1 | 1 | 3 | 18H-1FH |
Слово состояния программы (PSW) содержит биты состояния, отражающие текущее состояние ЦП. Варианты 8051 предоставляют один специальный функциональный регистр PSW с этой информацией о состоянии. 8251 предоставляет два дополнительных флага состояния, Z и N, которые доступны во втором специальном функциональном регистре PSW1.
А timerэто специальный тип часов, который используется для измерения временных интервалов. Таймер, который отсчитывает от нуля и далее для измерения прошедшего времени, часто называют таймером.stopwatch. Это устройство, которое ведет обратный отсчет от указанного временного интервала и используется для создания временной задержки, например, песочные часы - это таймер.
А counter- это устройство, которое хранит (а иногда и отображает) количество раз, когда происходило конкретное событие или процесс, относительно тактового сигнала. Он используется для подсчета событий, происходящих вне микроконтроллера. В электронике счетчики могут быть довольно легко реализованы с использованием регистровых схем, таких как триггер.
Разница между таймером и счетчиком
Точки, которые отличают таймер от счетчика, следующие:
Таймер | Счетчик |
---|---|
Регистр увеличивается с каждым машинным циклом. | Регистр увеличивается с учетом перехода от 1 к 0 при соответствующем внешнем входном контакте (T0, T1). |
Максимальная скорость счета составляет 1/12 частоты генератора. | Максимальная скорость счета составляет 1/24 частоты генератора. |
Таймер использует частоту внутренних часов и генерирует задержку. | Счетчик использует внешний сигнал для подсчета импульсов. |
Таймеры 8051 и связанные с ними регистры
8051 имеет два таймера, таймер 0 и таймер 1. Их можно использовать как таймеры или как счетчики событий. И Таймер 0, и Таймер 1 имеют ширину 16 бит. Поскольку 8051 следует 8-битной архитектуре, к каждому 16-битному обращению обращаются как к двум отдельным регистрам младшего и старшего байта.
Таймер 0 Регистр
К 16-битному регистру таймера 0 обращаются как к младшему, так и к старшему байту. Регистр младшего байта называется TL0 (младший байт таймера 0), а регистр старшего байта называется TH0 (старший байт таймера 0). К этим регистрам можно получить доступ, как к любому другому регистру. Например, инструкцияMOV TL0, #4H перемещает значение в младший байт таймера №0.
Регистр Таймера 1
К 16-битному регистру Таймера 1 обращаются как к младшему, так и к старшему байту. Регистр младшего байта называется TL1 (младший байт таймера 1), а регистр старшего байта называется TH1 (старший байт таймера 1). К этим регистрам можно получить доступ, как к любому другому регистру. Например, инструкцияMOV TL1, #4H перемещает значение в младший байт Таймера 1.
Регистр TMOD (режим таймера)
И Таймер 0, и Таймер 1 используют один и тот же регистр для установки различных режимов работы таймера. Это 8-битный регистр, в котором младшие 4 бита отведены для таймера 0, а старшие четыре бита - для таймеров. В каждом случае 2 младших бита используются для предварительной установки режима таймера, а 2 старших бита используются для определения местоположения.
Gate - Если установлено, таймер работает только при высоком уровне INT (0,1).
C/T - Бит выбора счетчика / таймера.
M1 - Бит режима 1.
M0 - Бит режима 0.
ВОРОТА
У каждого таймера есть средства запуска и остановки. Некоторые таймеры делают это программно, некоторые - аппаратно, а некоторые имеют как программные, так и аппаратные средства управления. Таймеры 8051 имеют как программное, так и аппаратное управление. Запуск и остановка таймера контролируется программно с помощью инструкцииSETB TR1 и CLR TR1 для таймера 1, и SETB TR0 и CLR TR0 для таймера 0.
Инструкция SETB используется для его запуска и останавливается инструкцией CLR. Эти инструкции запускают и останавливают таймеры, пока GATE = 0 в регистре TMOD. Таймеры могут быть запущены и остановлены внешним источником, установив GATE = 1 в регистре TMOD.
C / T (ЧАСЫ / ТАЙМЕР)
Этот бит в регистре TMOD используется для определения того, используется ли таймер в качестве delay generator или event manager. Если C / T = 0, он используется как таймер для генерации задержки таймера. Источником тактовых импульсов для создания временной задержки является частота кристалла 8051. Если C / T = 0, частота кристалла, подключенная к 8051, также определяет скорость, с которой таймер 8051 тикает с регулярным интервалом.
Частота таймера всегда составляет 1/12 от частоты кристалла, подключенного к 8051. Хотя различные системы на базе 8051 имеют частоту XTAL от 10 МГц до 40 МГц, мы обычно работаем с частотой XTAL 11,0592 МГц. Это связано с тем, что скорость передачи данных для последовательной связи 8051.XTAL = 11.0592 позволяет системе 8051 взаимодействовать с ПК без ошибок.
M1 / M2
M1 | M2 | Режим |
---|---|---|
0 | 0 | 13-битный режим таймера. |
0 | 1 | 16-битный режим таймера. |
1 | 0 | 8-битный режим автоматической перезагрузки. |
1 | 1 | Пролитый режим. |
Различные режимы таймеров
Режим 0 (режим 13-битного таймера)
И Таймер 1, и Таймер 0 в Режиме 0 работают как 8-битные счетчики (с предварительным делителем на 32). Регистр таймера сконфигурирован как 13-битный регистр, состоящий из всех 8 бит TH1 и младших 5 бит TL1. Старшие 3 бита TL1 не определены и должны игнорироваться. Установка флага выполнения (TR1) не очищает регистр. Флаг прерывания таймера TF1 устанавливается, когда счетчик переходит со всех единиц на все нули. Работа в режиме 0 для Таймера 0 такая же, как и для Таймера 1.
Режим 1 (режим 16-битного таймера)
Режим таймера «1» - это 16-битный таймер, который обычно используется. Он работает так же, как 13-битный режим, за исключением того, что используются все 16 бит. TLx увеличивается, начиная с 0 до максимального значения 255. Как только значение 255 достигается, TLx сбрасывается до 0, а затем THx увеличивается на 1. Поскольку это полный 16-битный таймер, он может содержать до 65536 различных значений, и он вернется к 0 после 65 536 машинных циклов.
Режим 2 (8-битная автоматическая перезагрузка)
Оба регистра таймера сконфигурированы как 8-битные счетчики (TL1 и TL0) с автоматической перезагрузкой. Переполнение из TL1 (TL0) устанавливает TF1 (TF0), а также перезагружает TL1 (TL0) с содержимым Th1 (TH0), которое задается программно. При перезагрузке TH1 (TH0) остается без изменений.
Преимущество режима автоматической перезагрузки заключается в том, что у вас может быть таймер, который всегда будет содержать значение от 200 до 255. Если вы используете режим 0 или 1, вам нужно будет проверить код, чтобы увидеть переполнение и, в этом случае, сбросьте таймер на 200. В этом случае драгоценные инструкции проверяют значение и / или перезагружаются. В режиме 2 об этом позаботится микроконтроллер. После того, как вы настроили таймер в режиме 2, вам не нужно беспокоиться о проверке, не переполнен ли таймер, и вам не нужно беспокоиться о сбросе значения, потому что оборудование микроконтроллера сделает все за вас. Режим автоматической перезагрузки используется для установки общей скорости передачи данных.
Режим 3 (режим разделения таймера)
Режим таймера «3» известен как split-timer mode. Когда Таймер 0 находится в режиме 3, он становится двумя отдельными 8-битными таймерами. Таймер 0 - это TL0, а Таймер 1 - это TH0. Оба таймера отсчитывают от 0 до 255 и в случае переполнения сбрасываются обратно в 0. Теперь все биты таймера 1 будут привязаны к TH0.
Когда Таймер 0 находится в режиме разделения, настоящий Таймер 1 (т.е. TH1 и TL1) может быть установлен в режимах 0, 1 или 2, но он не может быть запущен / остановлен, поскольку биты, которые это делают, теперь связаны с TH0. Реальный таймер 1 будет увеличиваться с каждым машинным циклом.
Инициализация таймера
Определитесь с режимом таймера. Рассмотрим 16-битный таймер, который работает непрерывно и не зависит от каких-либо внешних контактов.
Инициализируйте TMOD SFR. Используйте 4 младших бита TMOD и учитывайте таймер 0. Оставьте два бита, GATE 0 и C / T 0, равными 0, поскольку мы хотим, чтобы таймер не зависел от внешних контактов. Поскольку 16-битный режим - это режим таймера 1, очистите T0M1 и установите T0M0. Фактически, единственный бит, который нужно включить, - это бит 0 TMOD. Теперь выполните следующую инструкцию -
MOV TMOD,#01h
Теперь таймер 0 находится в режиме 16-битного таймера, но таймер не работает. Чтобы запустить таймер в рабочем режиме, установите бит TR0, выполнив следующую инструкцию -
SETB TR0
Теперь таймер 0 немедленно начнет отсчет, увеличивая его один раз за каждый машинный цикл.
Чтение таймера
16-битный таймер можно прочитать двумя способами. Либо считайте фактическое значение таймера как 16-битное число, либо вы обнаружите, когда таймер переполнился.
Обнаружение переполнения таймера
Когда таймер переполняется с максимального значения до 0, микроконтроллер автоматически устанавливает бит TFx в регистре TCON. Поэтому вместо проверки точного значения таймера можно проверить бит TFx. Если TF0 установлен, таймер 0 переполнен; если TF1 установлен, таймер 1 переполнен.
Прерывание - это сигнал процессору, отправляемый аппаратным или программным обеспечением, указывающий на событие, требующее немедленного внимания. Каждый раз, когда происходит прерывание, контроллер завершает выполнение текущей инструкции и начинает выполнениеInterrupt Service Routine (ISR) или Interrupt Handler. ISR сообщает процессору или контроллеру, что делать при возникновении прерывания. Прерывания могут быть аппаратными или программными.
Аппаратное прерывание
Аппаратное прерывание - это электронный предупреждающий сигнал, отправляемый процессору от внешнего устройства, например контроллера диска или внешнего периферийного устройства. Например, когда мы нажимаем клавишу на клавиатуре или перемещаем мышь, они запускают аппаратные прерывания, которые заставляют процессор считывать нажатие клавиши или положение мыши.
Программное прерывание
Программное прерывание вызывается либо исключительным условием, либо специальной инструкцией в наборе инструкций, которая вызывает прерывание, когда она выполняется процессором. Например, если арифметико-логический блок процессора запускает команду деления числа на ноль, чтобы вызвать исключение деления на ноль, что заставляет компьютер отказаться от вычисления или отобразить сообщение об ошибке. Инструкции программного прерывания работают аналогично вызовам подпрограмм.
Что такое опрос?
Состояние непрерывного мониторинга известно как polling. Микроконтроллер постоянно проверяет состояние других устройств; при этом он не выполняет никаких других операций и все время обработки расходует на мониторинг. Эту проблему можно решить с помощью прерываний.
В методе прерывания контроллер реагирует только при возникновении прерывания. Таким образом, от контроллера не требуется регулярно контролировать состояние (флаги, сигналы и т. Д.) Сопряженных и встроенных устройств.
Прерывания против опроса
Вот аналогия, которая отличает прерывание от опроса:
Прерывание | Опрос |
---|---|
Прерывание похоже на shopkeeper. Если кому-то нужна услуга или продукт, он идет к нему и сообщает ему о его потребностях. В случае прерываний, когда получены флаги или сигналы, они уведомляют контроллер о том, что их необходимо обслужить. | Метод опроса похож на salesperson. Продавец ходит от двери к двери, прося купить товар или услугу. Точно так же контроллер продолжает отслеживать флаги или сигналы один за другим для всех устройств и предоставляет обслуживание тому компоненту, который нуждается в этом обслуживании. |
Процедура обслуживания прерывания
Для каждого прерывания должна существовать процедура обслуживания прерывания (ISR), или interrupt handler. Когда происходит прерывание, микроконтроллер запускает процедуру обслуживания прерывания. Для каждого прерывания существует фиксированная ячейка в памяти, в которой хранится адрес процедуры обработки прерывания, ISR. Таблица ячеек памяти, отведенных для хранения адресов ISR, называется таблицей векторов прерываний.
Таблица векторов прерываний
Имеется шесть прерываний, включая СБРОС в 8051.
Прерывания | Расположение ПЗУ (шестнадцатеричный) | Штырь |
---|---|---|
Прерывания | Расположение ПЗУ (HEX) | |
Последовательный COM (RI и TI) | 0023 | |
Прерывания таймера 1 (TF1) | 001B | |
Внешнее аппаратное прерывание 1 (INT1) | 0013 | P3.3 (13) |
Внешнее аппаратное прерывание 0 (INT0) | 0003 | P3.2 (12) |
Таймер 0 (TF0) | 000B | |
Сброс | 0000 | 9 |
Когда вывод сброса активирован, 8051 переходит к адресу 0000. Это сброс при включении питания.
Для таймеров отведены два прерывания: одно для таймера 0 и одно для таймера 1. Ячейками памяти являются 000BH и 001BH соответственно в таблице векторов прерываний.
Два прерывания отведены для аппаратных внешних прерываний. № контакта 12 и контакт № 13 в Порте 3 предназначены для внешних аппаратных прерываний INT0 и INT1 соответственно. Ячейки памяти в таблице векторов прерываний - 0003H и 0013H соответственно.
Последовательная связь имеет одно прерывание, которое относится как к приему, так и к передаче. Этому прерыванию принадлежит ячейка памяти 0023H.
Шаги по выполнению прерывания
Когда прерывание становится активным, микроконтроллер выполняет следующие шаги:
Микроконтроллер закрывает выполняемую в данный момент инструкцию и сохраняет адрес следующей инструкции (ПК) в стеке.
Он также сохраняет текущий статус всех прерываний внутри (т. Е. Не в стеке).
Он переходит в то место в памяти таблицы векторов прерываний, которое содержит адрес процедуры обслуживания прерываний.
Микроконтроллер получает адрес ISR из таблицы векторов прерываний и переходит к нему. Он начинает выполнять подпрограмму обслуживания прерывания, которая называется RETI (возврат из прерывания).
После выполнения инструкции RETI микроконтроллер возвращается в то место, где она была прервана. Во-первых, он получает адрес программного счетчика (ПК) из стека, вставляя верхние байты стека в ПК. Затем он начинает выполняться с этого адреса.
Запуск по фронту и запуск по уровню
Модули прерывания бывают двух типов - запускаемые по уровню или по фронту.
Уровень срабатывает | Edge Triggered |
---|---|
Модуль прерывания, запускаемый по уровню, всегда генерирует прерывание всякий раз, когда устанавливается уровень источника прерывания. | Модуль прерывания, запускаемый по фронту, генерирует прерывание только тогда, когда он обнаруживает утверждающий фронт источника прерывания. Предел обнаруживается при фактическом изменении уровня источника прерывания. Его также можно обнаружить путем периодической выборки и определения установленного уровня, когда предыдущая выборка была отменена. |
Если источник прерывания все еще заявлен, когда обработчик прерывания микропрограммного обеспечения обрабатывает прерывание, модуль прерывания регенерирует прерывание, вызывая повторный вызов обработчика прерывания. | Модули прерываний, запускаемые по фронту, могут действовать немедленно, независимо от того, как ведет себя источник прерывания. |
Прерывания, запускаемые по уровню, громоздки для прошивки. | Прерывания, запускаемые по фронту, снижают сложность кода микропрограммного обеспечения, сокращают количество условий для микропрограммного обеспечения и обеспечивают большую гибкость при обработке прерываний. |
Включение и отключение прерывания
После сброса все прерывания блокируются, даже если они активированы. Прерывания должны быть разрешены с помощью программного обеспечения, чтобы микроконтроллер реагировал на эти прерывания.
Регистр IE (разрешение прерывания) отвечает за включение и отключение прерывания. IE - это регистр с побитовой адресацией.
Регистр разрешения прерывания
EA | - | ET2 | ES | ЕТ1 | EX1 | ET0 | EX0 |
---|
EA - Глобальное включение / отключение.
- - Не определено.
ET2 - Разрешить прерывание от Таймера 2.
ES - Включить прерывание последовательного порта.
ET1 - Разрешить прерывание от Таймера 1.
EX1 - Разрешить внешнее прерывание 1.
ET0 - Разрешить прерывание от Таймера 0.
EX0 - Разрешить внешнее прерывание 0.
Чтобы включить прерывание, мы предпринимаем следующие шаги -
Бит D7 регистра IE (EA) должен быть высоким, чтобы оставшаяся часть регистра вступила в силу.
Если EA = 1, прерывания будут разрешены, и на них будут отвечать, если их соответствующие биты в IE имеют высокий уровень. Если EA = 0, никакие прерывания не будут отвечать, даже если их связанные контакты в регистре IE имеют высокий уровень.
Приоритет прерывания в 8051
Мы можем изменить приоритет прерывания, назначив более высокий приоритет любому из прерываний. Это достигается программированием регистра, называемогоIP (приоритет прерывания).
На следующем рисунке показаны биты регистра IP. После сброса регистр IP содержит все 0. Чтобы дать более высокий приоритет любому из прерываний, мы делаем соответствующий бит в регистре IP высоким.
- | - | - | - | PT1 | PX1 | PT0 | PX0 |
---|
- | IP.7 | Не реализованы. |
- | IP.6 | Не реализованы. |
- | IP.5 | Не реализованы. |
- | IP.4 | Не реализованы. |
PT1 | IP.3 | Определяет уровень приоритета прерывания от Таймера 1. |
PX1 | IP.2 | Определяет уровень приоритета внешнего прерывания 1. |
PT0 | IP.1 | Определяет уровень приоритета прерывания от Таймера 0. |
PX0 | IP.0 | Определяет уровень приоритета внешнего прерывания 0. |
Прерывание внутри прерывания
Что произойдет, если 8051 выполняет ISR, принадлежащую прерыванию, а другое становится активным? В таких случаях прерывание с высоким приоритетом может прервать прерывание с низким приоритетом. Это известно какinterrupt inside interrupt. В 8051 прерывание с низким приоритетом может быть прервано прерыванием с высоким приоритетом, но не каким-либо другим прерыванием с низким приоритетом.
Запуск прерывания программным обеспечением
Бывают случаи, когда нам нужно протестировать ISR посредством моделирования. Это можно сделать с помощью простых инструкций по установке высокого уровня прерывания и, таким образом, к переходу 8051 к таблице векторов прерываний. Например, установите бит IE как 1 для таймера 1. ИнструкцияSETB TF1 прерывает 8051 в том, что он делает, и заставляет его перейти к таблице векторов прерываний.