Содержание
Урок 2. Регистры микроконтроллера. Порты ввода/вывода
- Урок1. Введение. Устройство микроконтроллера
Как известно из первого урока, каждый микроконтроллер имеет регистры общего назначения, которые представляю собой оперативную память, хранящую числа, обрабатываемые арифметико-логическим устройством (АЛУ). Причем, по ходу исполнения программы, эти числа могут изменяться: увеличиваться, уменьшаться, сбрасываться, снова загружаться и т.д. Вся память разбита на ячейки. Размер ячейки зависит от разрядности процессора 8, 16 или 32 бита. Каждой ячейке памяти соответствует свой адрес, используя который в нее можно записать число.
Для программиста понятие регистр может ассоциироваться с понятием переменной. В нашем курсе по микроконтроллерам мы будем учиться писать программы на языке С. Конечно же для более глубокого понимания принципа работы микроконтроллера лучше изучить его программирование на языке Assembler, но на мой взгляд этот язык будет сложен в понимания для начинающих программистов. В принципе, на ассемблере можно писать только небольшие и несложные программы, ну или подпрограммы (функции), где требуется высокое быстродействие. Лично я начинал изучать микроконтроллеры на языке C.
Данный курс рассчитан на людей, знающих азы языка программирования Си. Могу посоветовать для изучения Си следующие книги:
- Керниган, Ричи. Язык С
- Герберт Шилдт. Полный справочник по С
Нет желания писать прошивку для микроконтроллера? А может нет времени на изучение основ программирования микроконтроллера? А может нужно срочно выполнять дипломную работу, в которую входит написание программы для микроконтроллера? Какими бы не были причины, мы можем помочь Вам запрограммировать Ваше устройство. Если Вам нужна наша помощь, сделайте заказ, заполнив форму.
Итак, регистрам в программе на Си присваиваются имена. Когда создается какая-либо переменная, то она автоматически связывается с адресом свободной ячейки памяти.
Например:
unsigned char my_variable;
Данные, записываемые в эту переменную, будут занимать в оперативной памяти 1 байт, т.к. переменная типа unsigned char имеет размер 1 байт. Если мы захотим сложить два числа и получить результат, мы можем создать три переменных:
unsigned char var1, var2, sum;
Затем произвести арифметическую операцию сложения:
sum = var1 + var2;
Значение из регистров, которые связаны с переменными var1 и var2, поступят на обработку АЛУ. Затем АЛУ выдаст результат операции (в данном случае сложения) в ячейку памяти, связанную с переменной sum.
Помимо регистров общего назначения, в микроконтроллере есть регистры специального назначения, которые играют очень важную роль. Без них микроконтроллер был бы бессмысленной «железкой». С помощью регистров специального назначения выполняется управление функциями ядра и периферийными модулями микроконтроллера (таймеры, АЦП, аналоговые компараторы, UART, USB и т. д.), а также портами ввода-вывода. В отличие от регистров общего назначения, регистрам специального назначения строго присвоены свои адреса. Меняя значения регистров специального назначения можно управлять работой всех модулей микроконтроллера. Для примера рассмотрим карту памяти микроконтроллера PIC12F675.
Ячейки, обозначенные серым цветом – не используемая область памяти. Как видно, данный микроконтроллер имеет 64 байта ОЗУ (General Purpose Registers– регистры общего назначения) и два банка памяти. Если необходимо писать программу на ассемблере, то всегда нужно помнить в каком банке памяти находится необходимый регистр и на протяжении всей программы нужно постоянно переключаться между банками памяти. Написание программы на языке Си избавляет программиста от этой головной боли.
Итак, рассмотрим для примера регистр специального назначения GPIO. GPIO — 8-разрядный регистр порта ввода/вывода. С помощью этого регистра мы можем установить на определенных цифровых выходах микроконтроллера логическую 1 или 0. Данный регистр обычно настраивается совместно с регистром TRISIO. Регистр TRISIO определяет направление работы порта. Как было сказано в предыдущем уроке, порты микроконтроллера можно настроить для работы в качестве выходов или входов.
Микроконтроллер PIC12F675 представляет собой 8-выводную микросхему, у которой есть только 6 цифровых входов/выходов:
Рассмотрим более детально описание регистров GPIO и TRISIO:
Если записать в программе следующие строки
TRISIO = 0b00010100;
GPIO = 0b00100011;
то это означает, что пины 7,6,4 и 2 будут работать на выход. Пины 7,6 и 2 будут установлены в 1, а пин 4 будет иметь низкий уровень – 0. Биты 6 и 7, обозначенные серым цветом, в регистрах не используются и то, что будет в них записано не имеет никакого смысла. 0b00100011 – буква b данной записи обозначает двоичное представление числа.
Бывают также десятичное (привычное для нас), восьмеричное и шестнадцатеричное представление числа. В начале шестнадцатеричного числа записывается 0x, восьмеричного – цифра 0. Подробнее о системах счисления можно почитать здесь.
На этом второй урок по микроконтроллерам заканчивается. В следующих уроках рассмотрим необходимые инструменты для программирования микроконтроллера PIC12F675. Всю необходимою информацию по микроконтроллеру можно получить из даташита на него, который нужно будет скачать для следующих уроков.
- Урок 3. Установка MPLAB и PICC
Архитектура микроконтроллеров MCS-51
Архитектура семейства MCS-51 в значительной мере предопределяется ее назначением — построение компактных и дешёвых цифровых устройств. Все функции микроЭВМ реализуются с помощью единственной микросхемы. В состав семейства MCS-51 входит целый ряд микросхем от самых простых микроконтроллеров до достаточно сложных. Микроконтроллеры семейства MCS-51 позволяют выполнять как задачи управления различными устройствами, так и реализовывать отдельные узлы аналоговой схемы. Все микросхемы этого семейства работают с одной и той же системой команд, большинство из них выполняется в одинаковых корпусах с совпадающей цоколевкой (нумерация ножек для корпуса). Это позволяет использовать для разработанного устройства микросхемы разных фирм — производителей (таких как Intel, Dallas, Atmel, Philips и т.д.) без переделки принципиальной схемы устройства и программы.
Рис 1. Структурная схема контроллера К1830ВЕ751
Структурная схема контроллера представлена на рис.1. и состоит из следующих основных функциональных узлов: блока управления, арифметико-логического устройства, блока таймеров/счетчиков, блока последовательного интерфейса и прерываний, программного счетчика, памяти данных и памяти программ. Двусторонний обмен осуществляется с помощью внутренней 8-разрядной магистрали данных. Рассмотрим подробнее назначение каждого блока. По такой схеме построены практически все представители семейства MCS-51. Различные микросхемы этого семейства различаются только регистрами специального назначения (в том числе и количеством портов). Система команд всех контроллеров семейства MCS-51 содержит 111 базовых команд с форматом 1, 2 или 3 байта и не изменяется при переходе от одной микросхемы к другой. Это обеспечивает прекрасную переносимость программ с одной микросхемы на другую.
Блок управления и синхронизации
Блок управления и синхронизации (Timing and Control) предназначен для выработки синхронизирующих и управляющих сигналов, обеспечивающих координацию совместной работы блоков ОЭВМ во всех допустимых режимах ее работы. В состав блока управления входят:
- устройство формирования временных интервалов,
- логика ввода-вывода,
- регистр команд,
- регистр управления потреблением электроэнергии,
- дешифратор команд, логика управления ЭВМ.
Устройство формирования временных интервалов предназначено для формирования и выдачи внутренних синхросигналов фаз, тактов и циклов. Количество машинных циклов определяет продолжительность выполнения команд. Практически все команды ОЭВМ выполняются за один или два машинных цикла, кроме команд умножения и деления, продолжительность выполнения которых составляет четыре машинных цикла. Обозначим частоту задающего генератора через Fг. Тогда длительность машинного цикла равна 12/Fг или составляет 12 периодов сигнала задающего генератора. Логика ввода — вывода предназначена для приема и выдачи сигналов, обеспечивающих обмен информации с внешними устройствами через порты ввода вывода Р0-Р3.
Регистр команд предназначен для записи и хранения 8-ми разрядного кода операции выполняемой команды. Код операции, с помощью дешифратора команд и логики управления ЭВМ, преобразуется в микропрограмму выполнения команды.
Регистр управления потреблением (PCON) позволяет останавливать работу микроконтроллера для уменьшения потребления электроэнергии и уменьшения уровня помех от микроконтроллера. Еще большего уменьшения потребления электроэнергии и уменьшения помех можно добиться, остановив задающий генератор микроконтроллера. Этого можно достичь при помощи переключения бит регистра управления потреблением PCON. Для варианта изготовления по технологии n-МОП (серия 1816 или иностранных микросхем, в названии которых в середине отсутствует буква ‘c’) регистр управления потреблением PCON содержит только один бит, управляющий скоростью передачи последовательного порта SMOD, а биты управления потреблением электроэнергией отсутствуют.
Арифметико-логическое устройство (ALU) представляет собой параллельное восьмиразрядное устройство, обеспечивающее выполнение арифметических и логических операций. АЛУ состоит из:
- регистров аккумулятора, регистров временного хранения TMP1 и TMP2,
- ПЗУ констант,
- сумматора,
- дополнительного регистра (регистра В),
- аккумулятора (ACC),
- регистра состояния программ (PSW).
Регистр аккумулятор и регистры временного хранения — восьмиразрядные регистры, предназначенные для приема и хранения операндов на время выполнения операций над ними. Эти регистры программно не доступны.
ПЗУ констант обеспечивает выработку корректирующего кода при двоично-десятичном представлении данных, кода маски при битовых операциях и кода констант.
Параллельный восьмиразрядный сумматор представляет собой схему комбинационного типа с последовательным переносом, предназначенную для выполнения арифметических операций сложения, вычитания и логических операций сложения, умножения, неравнозначности и тождественности.
Регистр B — восьмиразрядный регистр, используемый во время операций умножения и деления. Для других инструкций он может рассматриваться как дополнительный сверхоперативный регистр.
Аккумулятор — восьмиразрядный регистр, предназначенный для приема и хранения результата, полученного при выполнении арифметико-логических операций или операций сдвига
Блок последовательного интерфейса и прерываний (ПИП) предназначен для организации ввода — вывода последовательных потоков информации и организации системы прерывания программ. В состав блока входят:
- буфер ПИП,
- логика управления,
- регистр управления,
- буфер передатчика,
- буфер приемника,
- приемопередатчик последовательного порта,
- регистр приоритетов прерываний,
- регистр разрешения прерываний,
- логика обработки флагов прерываний и схема выработки вектора.
Счетчик команд (Program Counter) предназначен для формирования текущего 16-разрядного адреса внутренней памяти программ и 8/16-разрядного адреса внешней памяти программ. В состав счетчика команд входят 16-разрядные буфер РС, регистр РС и схема инкремента (увеличения содержимого на 1).
Память данных (RAM) предназначена для временного хранения информации, используемой в процессе выполнения программы.
Порты P0, P1, P2, P3 являются квазидвунаправленными портами ввода — вывода и предназначены для обеспечения обмена информацией ОЭВМ с внешними устройствами, образуя 32 линии ввода- вывода.
Регистр состояния программы (PSW) предназначен для хранения информации о состоянии АЛУ при выполнении программы.
Память программ (EPROM) предназначена для хранения программ и представляет собой постоянное запоминающее устройство (ПЗУ). В разных микросхемах применяются масочные, стираемые ультрафиолетовым излучением или FLASH ПЗУ.
Регистр указателя данных (DPTR) предназначен для хранения 16 — разрядного адреса внешней памяти данных.
Указатель стека (SP) представляет собой восьмиразрядный регистр, предназначенный для организации особой области памяти данных (стека), в которой можно временно сохранить любую ячейку памяти.
[Назад] [Содержание] [Вперёд]
Руководство для начинающих по микроконтроллерам
Джон Уайлдер
Время от времени я вижу, как новички пытаются начать работу со встроенной электроникой, но терпят поражение и не знают, с чего начать. Некоторые даже совершают ошибку, пытаясь написать свой собственный код, не получив предварительного полного понимания микроконтроллера/микропроцессора, с которым они работают, языка программирования, с которым они работают, или даже основных концепций программирования. Не беспокойтесь, однако… эта статья должна стать хорошим учебником для начинающих в мире встраиваемой электроники.
В этой статье не делается попытка рассказать о каком-либо конкретном микроконтроллере/микропроцессоре, но она представляет собой скорее учебник для объяснения общих концепций, применимых ко всем микроконтроллерам/микропроцессорам.
Во-первых, давайте зададим себе пару вопросов. Первый вопрос —
Что такое микроконтроллер?
Микроконтроллер — это крошечный микрокомпьютер на микросхеме. Он имеет ЦП, ОЗУ (оперативное запоминающее устройство), регистры специальных функций, ПЗУ программ, ПЗУ данных, от одного до нескольких параллельных портов ввода-вывода (ввода/вывода) и может иметь множество встроенных периферийных устройств, включая но не ограничиваясь аналого-цифровым преобразователем (АЦП), цифро-аналоговым преобразователем (ЦАП), последовательным UART, одним или несколькими таймерами, компараторами/на микросхеме опорного напряжения, модулем захвата/сравнения/ШИМ (широтно-импульсной модуляции) , главный синхронный последовательный порт для связи SPI (последовательный периферийный интерфейс) / I2C (межинтегральная схема), порт USB, порт Ethernet, встроенные генераторы, а также множество других периферийных устройств.
Что такое микропроцессор (подождите, вы имеете в виду, что на самом деле есть разница)?
Микропроцессор — это все, что есть у микроконтроллера, но без программного ПЗУ на кристалле. Программный код находится вне микросхемы в отдельной внешней микросхеме EPROM.
ПЗУ программ и ПЗУ данных
Встроенная ПЗУ (постоянная память) микроконтроллера похожа на жесткий диск микроконтроллера. Он имеет два раздела. Один раздел зарезервирован для хранения программного кода, а другой раздел зарезервирован для постоянного хранения данных, которые используются чипом во время обычного выполнения программы. На данном микроконтроллере PIC с, скажем, 8 КБ пространства для программ пространство для программ будет занимать адреса ПЗУ 0x0000 — 0x1FFF (или 0 — 819).1 в десятичной форме). Пространство данных будет начинаться с адреса ПЗУ программы 0x2100. Если бы пространство ПЗУ данных имело длину 256 байт, пространство ПЗУ данных занимало бы адреса ПЗУ 0x2100–0x21FF (или 8448–8704 в десятичном формате).
CPU
CPU означает центральный процессор. По сути, это «мозги» микроконтроллера. Это то, что извлекает инструкции из памяти кода и выполняет извлеченные инструкции.
ОЗУ данных
ОЗУ данных (оперативное запоминающее устройство) — это пространство данных, которое используется для временного хранения постоянных и переменных значений, используемых микроконтроллером во время обычного выполнения программы. Объем физической оперативной памяти на данном микроконтроллере варьируется от одного микроконтроллера к другому. ОЗУ данных на микроконтроллере организовано в несколько «регистров», каждый из которых имеет свой уникальный «адрес». Регистр ОЗУ на 8-битном микроконтроллере может содержать в общей сложности 8 бит или один байт данных. Типичная спецификация пространства ОЗУ может указывать, что оно составляет 256 x 8. Это означает, что в ОЗУ всего 256 регистров, и эти регистры могут содержать 8 бит каждый.
Регистр — это просто место в памяти, в которое вы можете записывать или считывать данные. Некоторые из нас называют регистры «местоположениями».
Регистры специальных функций
Регистры специальных функций (или просто SFR) в микроконтроллере аналогичны регистрам в ОЗУ данных. Вы можете записывать данные в них, а также читать данные из них. Отличие заключается в том, что некоторые SFR напрямую управляют аппаратным обеспечением на кристалле микроконтроллера, в то время как другие управляются аппаратным обеспечением на кристалле микроконтроллера.
Каждый бит в SFR соответствует функции. В SFR у вас есть управляющие биты и флаговые биты. Управляющие биты подобны «переключателям», которые включают или выключают функцию в зависимости от того, записываете ли вы 1 или 0 в это место бита в SFR. Биты флага похожи на «световые индикаторы», которые указывают, существует ли данное условие, в зависимости от того, равен ли бит флага 1 или 0. Биты управления напрямую управляют оборудованием. Биты флагов контролируются аппаратно. В любой заданной программе мы обычно записываем в управляющие биты, когда читаем биты флагов (некоторые биты флагов должны быть очищены вручную путем записи в них в зависимости от микроконтроллера… подробнее об этом позже).
Каждому аппаратному элементу микроконтроллера будет назначен как минимум 1 SFR. Некоторым аппаратным средствам может быть назначено несколько SFR. Обратитесь к техническому описанию вашего микроконтроллера, чтобы узнать больше о его конкретной организации SFR.
Биты конфигурации
Большинство микроконтроллеров имеют специальные биты, известные как «биты конфигурации». Эти биты настраивают специальные параметры микроконтроллера, включая, помимо прочего, –
* Тип генератора
* Сторожевой таймер Вкл/Выкл
* Вкл./выкл. таймера включения питания
* Вкл./выкл. сброса при отключении питания
* Вкл./выкл. программирования низкого напряжения
* Вкл./выкл. монитора отказоустойчивых часов
* Вкл./выкл. внутреннего/внешнего переключения
На микроконтроллере PIC имеется являются четными битами конфигурации для защиты программного кода и защиты кода данных. Эти биты предотвращают чтение программы или областей данных внешним аппаратным обеспечением для программирования, чтобы другие не могли украсть ваш код. На чипе Atmel AT89S (производном 8051) это устанавливается так называемыми «блокировочными битами».
Некоторые называют конфигурационные биты «фьюз-битами». Это происходит из старых времен микропроцессоров, у которых были настоящие «предохранители» на чипе, которые перегорали, если определенные функции, управляемые битом предохранителя, были отключены. Эти предохранители были «однократно программируемыми»… как только они перегорели, их нельзя было «разжечь». Однако с появлением флэш-памяти, доступной на современных микроконтроллерах, буквальных «предохранителей» на микросхеме больше нет. Но сам термин перенесен из-за того, что конфигурационные биты, по сути, обеспечивают тот же контроль, что и фьюз-биты.
ALU (Арифметико-логическое устройство)
Это устройство отвечает за все математические и логические операции, выполняемые микроконтроллером. На большинстве микроконтроллеров АЛУ будет иметь 3 бита флага, связанных с ним —
* Нулевой бит — этот бит флага устанавливается аппаратно в 1 всякий раз, когда математическая операция приводит к нулевому результату. Он будет сброшен аппаратно на 0 всякий раз, когда математическая операция приводит к ненулевому результату.
* Бит переноса/заема — Этот бит флага работает как бит переноса для операций сложения и как флаг заимствования для операций вычитания. «Перенос» происходит, когда результат операции сложения приводит к значению, превышающему то, что регистр способен удерживать. 8-битный регистр может содержать максимальное значение 255 (FF в шестнадцатеричном формате или 11111111 в двоичном).
Если результат операции сложения больше 255, флаг переноса устанавливается в 1. Если результат операции сложения меньше 255, перенос не выполняется, поэтому флаг переноса очищается до 0.
Для операций вычитания флаг переноса вместо этого работает как флаг заимствования. Флаг заимствования работает в обратном порядке по отношению к флагу переноса. Если операция вычитания приводит к отрицательному результату, флаг заимствования очищается до 0. Если операция вычитания приводит к положительному результату, флаг заимствования устанавливается в 1.
* Бит переноса/заема цифр – Этот флаг бит делает то же самое, что и флаг переноса/заимствования, но он работает только для указания, происходит ли перенос/заимствование только между битами 3 и 4.
Биты флага АЛУ можно прочитать в любое время, чтобы узнать, были ли результаты математических операций нулевыми, положительными/отрицательными, больше/меньше и т. д. и т. д.
Нулевой бит — это удобный флаговый бит, который позволяет сравнить два значения, чтобы увидеть, равны ли они/не равны. Если мы возьмем два числа и вычтем их, результат будет равен нулю, если он равен, и не равен нулю, если не равен. Таким образом, чтобы сравнить два значения, чтобы увидеть, равны они или нет, мы вычитаем их, затем читаем/проверяем нулевой бит, чтобы увидеть, является ли бит 1 или 0. Если нулевой бит = 1, результат вычитания ноль, что означает, что два значения равны. Если нулевой бит = 0, результат вычитания не равен нулю, что означает, что два значения не равны.
Бит переноса/заимствования — это удобный флаг, который позволяет нам сравнивать два значения, чтобы увидеть, является ли одно значение больше или меньше другого значения. Пример… у нас есть два значения: VALUE1 и VALUE2. В коде мы выполняем эту операцию —
ЗНАЧЕНИЕ1 — ЗНАЧЕНИЕ2 = ЗНАЧЕНИЕ3
После выполнения операции вычитания мы читаем/проверяем высокое/низкое состояние бита переноса/заимствования.
Если ЗНАЧЕНИЕ2 больше ЗНАЧ1, результат вычитания будет отрицательным, что приведет к сбросу бита переноса/заема в 0. Если ЗНАЧЕНИЕ2 меньше ЗНАЧ1, результат вычитания будет положительным, что установит перенос /занять бит до 1.
Обратитесь к спецификации, чтобы узнать, какой SFR содержит эти биты. В микроконтроллерах PIC биты флага ALU находятся в STATUS SFR. На MCS-51 они находятся в PSW SFR (слово состояния программы).
Счетчик программ
Счетчик программ — это «указатель адреса», который сообщает ЦП, где найти следующую команду для выполнения в программном ПЗУ. ЦП выберет команду, которая находится по адресу ПЗУ программы, который в данный момент загружен в счетчик программ.
При перезагрузке микроконтроллера программный счетчик сбрасывается на 0x0000. ЦП выберет инструкцию, которая находится по адресу ПЗУ программы 0x0000. После того, как эта инструкция будет получена, счетчик команд автоматически увеличится до значения 0x0001. Счетчик программ постоянно автоматически увеличивается на значение 1, что заставляет ЦП последовательно обращаться к содержимому каждой ячейки регистра в программном ПЗУ. Это продолжается до тех пор, пока ЦП не выберет и не выполнит инструкцию, которая изменяет значение счетчика программ. Такими инструкциями, которые делают это, являются инструкции перехода (ajmp и ljmp на MCS-51, goto на PIC), вызовы подпрограмм (acall и lcall на MCS-51, вызов на PIC) и любые инструкции, которые добавляют или вычитают значение из или из счетчик программ.
Стек
Стек микроконтроллера в основном используется во время вызовов подпрограмм и переходов к обработчику прерывания. Это буфер «последним пришел первым обслужен», который используется для хранения адресов возврата. Во время вызова подпрограммы текущий адрес программного счетчика «заталкивается» в стек с добавленным к нему смещением +1, затем программный счетчик модифицируется значением адреса, по которому находится вызываемая подпрограмма. Это заставляет программный счетчик перейти к коду подпрограммы для выполнения подпрограммы.
В конце подпрограммы будет инструкция «возврата» (возврат на MCS-51, возврат на PIC). После выполнения инструкции возврата стек «извлекается», и последнее значение адреса ПЗУ, которое было помещено в стек, извлекается из стека и возвращается в счетчик программ. Это заставляет программный счетчик вернуться к инструкции, которая находится после инструкции, вызвавшей подпрограмму (отсюда необходимость смещения +1 во время помещения адреса ПК в стек), и выполнение программы продолжается с того места, где оно было остановлено. до вызова подпрограммы.
Некоторые микроконтроллеры имеют «программный стек» (MCS-51). Программный стек использует часть внутренней оперативной памяти микроконтроллера в качестве пространства стека. Другие микроконтроллеры имеют аппаратный стек (PIC). В аппаратном стеке стек представляет собой собственное выделенное пространство, которое отделено от всех других областей памяти на кристалле.
На некоторых микроконтроллерах стек доступен для записи. Это позволяет нам использовать стек для временного резервного копирования важных регистров во время вызовов подпрограмм и выполнения обработчиков прерываний. Перед выполнением подпрограммы или обработчика прерывания содержимое резервных регистров помещается в стек. Затем, непосредственно перед возвратом из подпрограммы или обработчика прерывания, содержимое, которое мы поместили в стек в начале подпрограммы, извлекается из стека по одному, а затем восстанавливается в исходное положение в порядке, обратном тому, в котором оно было помещается в стек (помните… «последним пришел — первым ушел»).
Хорошим примером этого может быть то, как мы резервируем аккумулятор и регистры PSW на MCS-51 во время выполнения процедуры обработки прерывания —
Код (текст):
push ACC ;резервное копирование аккумулятора в стек
push PSW ;создать резервную копию слова состояния программы в стек
;выполнить здесь код обработчика прерывания
pop PSW ;восстановить слово состояния программы
pop ACC ; код из прерывания
Как видите, мы сначала запихиваем в стек содержимое аккумулятора, а уже после него запихиваем в стек содержимое PSW. Затем выполняется код обработчика прерывания.
После выполнения кода обработчика прерывания сначала из стека выталкивается PSW, а затем из стека извлекается аккумулятор… в порядке, обратном тому, как они были помещены в стек.
Типовой SFR
Типовой SFR настроен, как показано ниже.
Код (текст):
| ПОРТ 1 SFR |
——————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Это SFR-защелка порта на микроконтроллере MCS-51 для параллельного порта 1. Каждый порт на MCS-51 является 8-битным параллельным портом, и каждый бит в SFR порта назначается каждому контакту порта. P1.0 будет контактом 0 на порту 1, P1.1 будет контактом 1 на порту 1, P1.2 будет контактом 2 на порту 1 и т. д. и т. д.
Как показано, все нули записаны в каждый из битов защелки порта 1 SFR. Это поместит все контакты порта 1 в низкое состояние (0 вольт). Если бы мы записали 1 в любой из битов SFR порта, это установит вывод, связанный с позицией бита, в которую мы записываем «1», в высоком состоянии (+5 В).
Пример, запишем значение 01010101 в порт 1 SFR –
Код (текст):
| ПОРТ 1 SFR |
——————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
Как показано, это установит контакты P1.0, P1.2, P1.4 и P1.6 в состояние высокого уровня, а контакты P1.1, P1.3, P1.5 и P1.7 — в состояние низкого уровня. .
Несколько слов о таблицах данных… и почему они так важны
Не все микроконтроллеры одинаковы. Каждый из них разработан с использованием определенного аппаратного обеспечения на чипе. Микроконтроллеры разных производителей имеют разную архитектуру. Вы обнаружите, что микроконтроллеры PIC сильно отличаются от микроконтроллеров MCS-51, точно так же, как MCS-51 сильно отличается, скажем, от Motorola 65xx в отношении того, как реализованы SFR, как организована RAM данных, набор команд, конфигурационное слово, как параллельные порты работают и т. д. и т.п.
ЕДИНСТВЕННЫЙ способ точно узнать, как работать с вашим микроконтроллером и его оборудованием, — это ознакомиться с его техническим описанием. Техническое описание объясняет каждый SFR, каждую часть встроенного оборудования, абсолютные максимальные электрические характеристики, организацию памяти программ/данных, как подключены параллельные порты и как они работают, сводку набора инструкций (для тех из вас, кто программирует на ассемблере). язык) и т. д. и т. д. Почти все, что вам, как программисту, необходимо знать о вашем микроконтроллере, находится в техническом описании микроконтроллера.
Большинство из них находятся в свободном доступе в Интернете с помощью простого поиска Google (я еще не нашел ни одного, которого нет). Заявление о том, что вы не смогли найти техническое описание, не является приемлемым оправданием, когда дело доходит до этого. ЕДИНСТВЕННАЯ причина, по которой кто-либо отказывается просматривать техническое описание, заключается либо в том, что они слишком ленивы, либо в том, что они их не понимают, но не хотят, чтобы другие знали, что они этого не понимают. Однако я скажу прямо сейчас … на большинство вопросов форума, касающихся микроконтроллеров, можно было бы ответить самостоятельно, если бы человек нашел время, чтобы найти ответ в таблице данных.
Спецификации абсолютно обязательны. Без них вы не сможете написать свой собственный код.
Об авторе
Джон Уайлдер — внештатный инженер-электронщик и энтузиаст электроники с более чем 20-летним стажем. Он провел четыре года в ВМС США в качестве техника по авиационной электронике. Джон также играет на гитаре с 13 лет и начал интегрировать электронику и музыку с 15 лет. Джон построил свой первый ламповый усилитель в 17 лет. «Музыкальная электроника», — говорит Джон, — его любовь и страсть.
Джон также является частым участником и активным участником инженерного сообщества Electro-Tech-Online. В Electro-Tech-Online вы можете задавать вопросы и получать ответы от своих коллег-инженеров по всем вопросам: от микроконтроллеров, возобновляемых источников энергии и автомобильной электроники до моделирования и проектирования схем. Кроме того, существуют специализированные форумы MCU для 8051/8951, AVR, ARM, Arduino, Oshonsoft Project, а также репозиторий кода, где участники делятся фрагментами кода.
Следите за новостями Джона в Твиттере: @PICmcuguy.
8051 Регистры микроконтроллера
By EG Projects
Регистры таймера
TCON — 8-битный регистр. Его биты используются для генерации внутренних или внешних прерываний. В нем же находятся самые важные биты таймера TR и TF. В нем находятся биты TR (запуск таймера) и TF (переполнение таймера), которые мы используем почти во всех приложениях таймера.
Регистр TCON
- IT0/IT1=> Используется для прерываний таймера, когда IT0/IT1=1 указывает прерывание по заднему фронту, а когда IT0/IT1=0 указывает прерывание по низкому уровню
- IE0/IE1=> Используется для внешних прерываний
- TR0/TR1=> Флаг управления запуском таймера 0/1, если он равен 1, это означает, что таймер работает.
- TF0/TF1=> Флаг переполнения таймера 0/1, если он равен 1, это означает, что таймер переполнен.
Эти два регистра TH и TL являются старшим байтом таймера и младшим байтом таймера, 0 и 1 являются номерами таймеров. Это 16-битные регистры. мы даем наши временные задержки в нем. поскольку 8051 является 8-битным микроконтроллером, мы обращаемся к его регистру в двух байтах: один байт для TH (старший байт таймера) и один для TL (младший байт таймера).
Как рассчитать значения для регистров TH и TL здесь приведен пример, нажмите на ссылку ниже.
www.microcontroller-project.com/internal- таймер – registers-of-8051 .html
8-битный регистр, используемый для выбора режима таймера. Есть 4 режима, в которых может быть загружен таймер.
1. 13-разрядный таймер
2. 16-разрядный таймер
3. 8-разрядная автоматическая перезагрузка
4. Режим разделенного таймера
TH0/TL0->Timer 0 16-разрядный регистр (только байтовая адресация) время.
Th2/TL1-> Таймер 1 16-битный регистр (только байтовая адресация) За один раз можно отправить 8 бит.
8051 Регистр TMOD
Последовательные регистры
Это 8-битный регистр, используемый для последовательной передачи данных. Это битовая адресация.
8051 Регистр SCON
SM0, SM1 и SM2 используются для указания режима последовательного соединения.
Существует пять различных режимов, четыре из которых показаны на схеме выше. Пятый — когда мы делаем SM2=1, что является 8-битным режимом передачи. Наиболее распространенным режимом является режим 1.
REN означает получение разрешения, когда REN=1 позволяет 8051 получать и передавать данные. Если вы хотите, чтобы 8051 одновременно передавал и принимал данные, REN должен быть установлен на «1». когда REN=0, это означает, что приемник отключен.
TB8 и RB8 используются для последовательных режимов 2 и 3.
TI и RI являются важными битами.
TI — это флаг прерывания передачи. Когда микроконтроллер 8051 заканчивает передачу 8-битного символа, он поднимает флаг TI, чтобы указать, что он готов передать другой байт.
RI — это флаг прерывания приема. Когда 8051 получает данные через контакт RxD (порт 1, контакт 0), он избавляется от стартового и стопового битов и помещает байт в SBUF. Затем он поднимает флаг RI, чтобы указать, что байт был получен и должен быть подобран, прежде чем он будет потерян.
Этот регистр используется при последовательной передаче или приеме данных. Мы помещаем в него данные, которые хотим передать, он также содержит данные, которые передаются с других периферийных устройств, таких как персональные компьютеры ПК, на микроконтроллер 8051. Это не битовая адресация.
Регистровые банки
8051 имеет четыре регистровых банка. При первой загрузке 8051 банк регистров 0 (адреса от 00h до 07h) используется по умолчанию. Внутренняя память поддерживает 4 банка регистров. Первые 8 байтов (00h — 07h) — это «регистровый банк 0». Далее следуют Bank1 (08 – 0F), Bank2 (10 – 17), Bank3 (18 – 1F). Банки регистров находятся в первых 32 байтах внутренней памяти.
Это 8-битный регистр. Слово состояния программы (PSW) содержит биты состояния, отражающие текущее состояние ЦП.
Аккумулятор представляет собой 8-разрядный регистр. Он содержит результат большинства арифметических и логических операций. Доступ к этому регистру обычно осуществляется путем прямой адресации. Это , адресуемое как по байтам, так и по битам.
Основное назначение регистра B (регистр расширения) — выполнение умножения и деления. Доступ к этому регистру осуществляется напрямую, когда мы пишем наш код на языке ассемблера. Микроконтроллер 8051 имеет одну команду умножения на 9.0011 (MUL) и подразделение (DIV) .
Указатель стека — это 8-битный регистр, прямой адрес SP — 81H, и он адресуется только по байтам, что означает, что вы не можете получить доступ к отдельным битам указателя стека. Содержимое указателя стека указывает на последнее сохраненное местоположение системного стека. Чтобы сохранить что-то новое в системном стеке, необходимо сначала увеличить SP на 1, а затем выполнить команду «сохранить».
- Push увеличивает SP и записывает данные.
- POP считывает данные, а затем уменьшает значение SP.
- Стек хранится во внутренней оперативной памяти и ограничен 128 байтами.
- Верхний адрес стека — 7F.
Это 16-битный регистр. Он используется для доступа к внешнему коду или памяти данных.
Указатель данных (DPTR) — это единственный доступный пользователю 16-битный (2-байтовый) регистр 8051.
PCON — это 8-битный регистр, используемый для управления скоростью передачи данных во время последовательной связи и режимов управления питанием 8051.
● Установите двойную скорость передачи, когда таймер 1 используется для последовательной связи в режимах 1, 2 и 3
● Переключение в спящий режим при отключении питания PD
● Переключение в режим ожидания, когда установлен бит IDL.
Биты регистра и функции
SMOD => Двойная скорость передачи, когда последовательный порт используется в режиме 1, 2 или 3.
GF1 => Бит флага общего назначения.
GF0 => Бит флага общего назначения.
PD => Отключение питания. Активирует операцию отключения питания.
IDL =>Идеальный режим. Активирует работу в идеальном режиме.
— => Зарезервировано
Ø В режиме IDL (идеальный) внутренние часы отключены от процессора, но остаются подключенными к функциям прерывания, таймера и последовательного порта. Режим IDL завершается по прерыванию или сбросу системы.
Мы можем получить доступ к портам 8051 и всем другим регистрам, используя sfr. На самом деле это местоположения регистров, которые предназначены для каждого отдельного порта или регистра и т. д.
- 8Ch — это SFR для регистра TH0
- 8Ah — это SFR для регистра 9 TL00205
- 8Dh — это SFR для регистра Th2
.
.
Добавить комментарий