Некоммерческое акционерное общество

АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ

Кафедра инженерной кибернетики

 

 

ПРОГРАММИРОВАНИЕ ЦИФРОВОЙ ТЕХНИКИ
 И МИКРОКОНТРОЛЛЕРОВ УПРАВЛЕНИЯ

Конспект лекций
для студентов всех форм обучения специальностей
5В070200 - «Автоматизация и управление» 

 

Алматы 2012

СОСТАВИТЕЛЬ: В. М. Тарасов. Программирование цифровой техники и микроконтроллеров управления. Конспект лекций для студентов всех форм обучения специальности 5В070200 «Автоматизация и управление» - Алматы: АУЭС, 2011. – 51 с.

 

В конспекте лекций по дисциплине «Программирование цифровой техники и микроконтроллеров управления» изложены основы программирования микроконтроллеров на примере микроконтроллера PIC16F877 и рассматриваются основные составляющие микроконтроллера. В конспекте разбираются конкретные практические задачи применения МК для автоматизации технологического оборудования.

Приложений - 1, библиографий – 11 названий.

 

Рецензенты: канд. техн. наук, доцент Федоренко И. А. проф. Цыба Ю.А.

Печатается по плану издания некоммерческого акционерного общества «Алматинский университет энергетики и связи» на 2011 год.

 

© НАО «Алматинский университет энергетики и связи», 2012 г

 

1 Микроконтроллеры в современном мире

 

Цель лекции: познакомить студентов с микроконтроллерами и их применением.

Краткое содержание лекции. Описана краткая история развития микроконтроллеров, семейства микроконтроллеров  типы их регистров. Задачи и роль микроконтроллеров, основы их стандартизации.

 

1.1 Краткая история развития микроконтроллеров

 

Микропроцессоры и производные от них — микроконтроллеры — являются широко распространенным и при этом незаметным элементом инфраструктуры современного общества, основанного на электронике и коммуникациях. Иссле­дования, проведенные в 1998 году, показали, что в каждом доме незаметно для нас «живет» около 100 микроконтроллеров и микропроцессоров. Они присут­ствуют буквально всюду: в звуковых открытках, стиральных машинах, микровол­новых печах, телевизорах, телефонах, персональных компьютерах и разных дру­гих устройствах. Даже в самом обыкновенном автомобиле скрывается более двад­цати таких устройств, где они, в частности, контролируют состояние беспроводных датчиков давления в шинах и отображают критичные данные, по­лучаемые по сети CAN.

Каждый год продается около четырех миллиардов подобных изделий, предна­значенных для реализации «мозгов» разнообразных «умных» устройств, начиная от интеллектуальных таймеров для яйцеварок и заканчивая системами управле­ния самолетом. Эволюция микропроцессоров, первые из которых были выпуще­ны компанией Intel в далеком 1971 году, привела к коренному изменению струк­туры общества, спровоцировав в начале XXI века вторую промышленную рево­люцию. Несмотря на то что микропроцессоры, являясь основным компонентом вездесущих ПК, широко известны, объем продаж таких микропроцессоров, как Intel Pentium, составляет всего около 2% от общего объема продаж по­добных устройств. Подавляющее же большинство продаж приходится на деше­вые микроконтроллеры, встраиваемые в специализированные электронные уст­ройства. Причем, если основной задачей микропроцессо­ров для ПК является обеспечение собственно вычислительной мощности, то во втором случае акцент смещается в сторону объединения на одном кристалле центрально­го процессора, памяти и устройств ввода и вывода. Такая интегрированная вычис­лительная система называется микроконтроллером.

Основную долю на рынке занимают устройства, оперирующие 8-битными данными, хотя имеются как 4-х, так и 16-битные устройства. Сущностью микроконтроллера является высокая степень системной интеграции при низкой стоимости. Суммарная  мощность вычислитель­ной системы может быть увеличена путем распределения процессоров по системе. Так, в каждом сочленении манипулятора робота может использоваться свой микроконтроллер, выполняющий простые локальные операции и обменивающийся данными с более мощным процессором, определяющим функцио­нирование всего робота.

Семейство микроконтроллеров фирмы Microchip — одно из наиболее популярных семейств, использующихся при изучении микроконтроллеров на самых разных этапах учеб­ного процесса, начиная со старших классов школы и заканчивая в университете. Освоение микроконтроллеров этой фирмы облегчается не­большим набором команд и относительно простой передовой архитектурой. По­мимо использования в промышленности и образовательном процессе, микроконтроллеры семейства PIC® применяются в большинстве любительских устройств, в чем можно убедиться, открыв любой журнал, посвященный радио­любительству.

Компания Microchip Inc относительно молодой участник рынка микро­контроллеров, на который она вышла в 1989 году после разработки нового се­мейства микроконтроллеров с гарвардской архитектурой. К концу 1999 года ком­пания Microchip была уже вторым по величине производителем 8-битных микро­контроллеров, уступая только компании Motorola.

 

1.2 Задачи и роль микроконтроллеров

 

Для современных локальных систем автоматического регулирования и управления основным элементом является микроконтроллер, см. рисунок 1.1.

На объект  управления воздействуют Х1…Хn - входные воздействия от исполнительных механизмов (ИМ), различные возмущающие факторы f1fm, - не учтенные в системах управления. Выходные данные объекта измеряются датчиками. Задача микропроцессорной системы - принять сигнал от аналоговых датчиков (АД) и дискретных  датчиков (ДД), а затем выработать управляющие выходные сигналы на исполнительные механизмы.

Микропроцессорная система должна работать в реальном масштабе времени. Для синхронизации системы применяются таймеры. Аналоговые сигналы от датчиков по очереди преобразуются в цифровые сигналы в аналого-цифровом преобразователе (АЦП), затем обрабатываются по определенной программе в центральном процессоре управления (ЦПУ). Выходной цифровой сигнал, созданный центральным процессором управления, преобразуется цифро-аналоговым преобразователем (ЦАП) в аналоговый сигнал. Через коммутатор, определяющий канал передачи, он воздействует на один из исполнительных механизмов (ИМ).

Экстренные ситуации, например, авария, обрабатываются с помощью подпрограммы обработки прерываний, которая прерывает фоновую программу, и обрабатывает сигнал от датчика прерываний. После чего управление вновь возвращается  к фоновой программе с прерванного места.

Рисунок 1.1 – Система локальной автоматизации

 

Задачи микроконтроллеров состоят в следующем:

- управление и регулирование;

- сбор и обработка технологических параметров;

- отображение и контроль данных;

- сигнализация и защита от аварийных ситуаций;

- диспетчеризация, архивирование и протоколирование.

Система локальной автоматизации является объектом управления для системы верхнего уровня.

Несомненно, что исполнение систем автоматизации требует стандартизации. Для этого была создана международная ассоциация поставщиков решений для промышленных предприятий MЕSA (Manufacturing Enterprise Solution Association). MESA контролирует, регулирует и разрабатывает единые протоколы для решения следующих задач:

- диспетчеризация производственной задачи;

- сбор данных и управление качеством;

- управление технологическим обслуживанием;

- анализ производительности;

- контроль документов;

- управление трудовыми ресурсами;

- координация технических процессов и учет готовой продукции.

В соответствии  с перечисленными задачами  микропроцессорные системы управления делятся на:

- информационно-управленческие системы;

- системы сбора и обработки информации;

- системы защиты;

- системы тестирования и контроля;

- SCADA   системы.

 

2 Выполнение арифметических операций в МП

 

Цель лекции: освоить выполнение арифметических операций в двоичной системе с применением дополнительного двоичного кода.

Краткое содержание лекции. Основы систем счислений и их роль. Двоичная арифметика в дополнительном коде. Знаковые биты.

 

2.1 Системы счислений

 

Микропроцессор, работает с числами в двоичной системе счисления. Для удобства восприятия чисел человеком применяется также шестнадцатеричная система и двоично-десятичная система. Системы счислений представлены в таблице 2.1.

 

Т а б л и ц а 2.1 – Системы счислений

Различные формы записи чисел от 0 до 20

Десятичная система

Двоичная система

Шестнадцатеричная система

Двоично-десятичный код

0

0000

0

0000

1

0001

1

0001

2

0010

2

0010

3

0011

3

0011

4

0100

4

0100

5

0101

5

0101

6

0110

6

0110

7

0111

7

0111

8

1000

8

1000

9

1001

9

1001

10

1010

А

0001 0000

11

1011

В

0001 0001

12

1100

С

0001 0010

13

1101

D

0001 0011

14

1110

Е

0001 0100

15

1111

F

0001 0101

16

10000

10

0001 0110

17

10001

11

0001 0111

18

10010

12

0001 1000

19

10011

13

0001 1001

20

10100

14

0010 0000

Двоично-десятичный код (Binary-Coded Decimal — BCD) является гибридом двоичного и десятичного представлений. Он широко используется при работе с портами ввода/вывода цифровых устройств, например, с символьным индикатором, имеющим семь сегментов. При таком представлении каждый десятичный разряд заменяется своим двоичным четырех разрядным эквивалентом. Выполнение арифметических операций с числами, записанными в 2-10 коде, представляет собой не простую задачу. Поэтому, как правило, BCD-числа сначала преобразовываются в обыкновенные двоичные числа и после выполнения операций вновь преобразовываются в код BCD.

 

2.2 Двоичная арифметика

 

Двоичная арифметика подчиняется тем же правилам, что и привычная для нас арифметика по основанию 10. Простейшей арифметической операцией является операция сложения, представляющая сокращенную форму записи операции нахождения общего количества чего-либо. Двоичное сложение подчиняется всего четырем правилам:

0+0=0;          0+1=1;       1+0=1;                 1+1=10  (1 в  переносе).

Сначала эти правила применяются к самым младшим значащим битам (Least Significant Bit — LSB). При возникновении переноса он передается в бит, располо­женный левее. Процесс вычисления заканчивается старшими значащими битами (Most Significant Bit — MSB). Если из этой позиции происходит перенос, то имен­но он становится самым старшим битом суммы. Ниже в примерах а) и б) складываются числа 96 и 37:

а) десятичные числа:

   96   1-е слагаемое

+ 37   2-е слагаемое

  ^^     переносы

  133    сумма

б) двоичные числа:

 1100000   1-е слагаемое

+ 0100101   2-е слагаемое

^^              переносы

10000101   сумма

В соответствии с методикой вычитания десятичных чисел аналогичные правила вычитания применяются и к двоичным числам, начиная с младших битов и за­канчивая старшими. Для каждого бита, в котором из меньшего числа вычитается большее число, из ближайшего старшего бита занимается единица. С учетом заема правила вычитания в двоичной системе имеют вид:

0-0=0; 0-1=1 из старшего бита занимается 1; 1-0=1; 1-1=0.

Ниже в примерах а) и б) находится разность чисел 96 и 37:

а) десятичные числа:

  96    уменьшаемое

- 37   вычитаемое

  ^      заем

  59    разность

б) двоичные числа:

    1100000  уменьшаемое

   -0100101  вычитаемое

     ^^         заем

     0111011 разность

Несмотря на то, что эти знакомые методы прекрасно работают, при реализа­ции их в цифровых схемах возникает ряд проблем:

Что делать, если вычитаемое меньше уменьшаемого?

Как нам различать положительные и отрицательные числа?

Можно ли выполнить вычитание с помощью блока суммирования?

Чтобы понять суть проблем, найдем разность 37-96:

а) десятичные числа

     37  уменьшаемое

   - 96  вычитаемое

    ^     заем

     41  ожидаемая разность -59

б) двоичные числа

    0100101   уменьшаемое

  - 1100000   вычитаемое

    ^               заем

    1000101 ожидаемая разность -0111011

Результат получился неожиданным. Чтобы понять, что получилось, рассмотрим дополнительный код.

 

2.3 Дополнительный код

 

Обычно, если уменьшаемое меньше вычитаемого, мы меняем операнды местами и добавляем знак минуса к результату, т.е. вычисляем выраже­ние  разность = вычитаемое - уменьшаемое. Если мы не выполним такой перестановки, как показано в примере, приведенном выше, то результат покажется неверным. На самом деле число 41 является правильным в том смысле, что представляет со­бой разность между числом 59 (правильный результат) и 100, то есть число 41 представляет собой дополнительный код числа 59 в десятичной системе.  Более того, сам факт заема из старшего разряда числа указывает на то, что результат операции отрицателен и представлен в дополнительном коде. Для преобразования числа, представленного в дополнительном ко­де, в «нормальный» вид достаточно просто инвертировать каждый десятич­ный разряд и к полученному значению прибавить единицу. Инвертирование де­сятичного разряда заключается в вычитании его значения из 9.

Далее дополнительный код будем обозначать курсивом.

Таким образом, дополнительный код числа -59 в десятичной системе равен: 59 -> 40+1=41.

Причиной, по которой мы не оставляем отрицательные  числа в дополнительном коде, является необычность для нас такого представления. Разумеется, использование дополнительного кода для представления отрицательных значений применимо и к двоичным числам. Причем, простота инвертирования (0—>1, 1—>0) делает этот метод очень привлекательным. Обратимся к приведенному выше примеру:

1000101 -> 0111010 + 1 = -0111011, т.е. -59 в десятичной системе.

И все же отрицательные числа следует оставлять в дополнительном коде. Операция преобразования в дополнительный код является обратимой.

  

2.4 Знаковый разряд

 

При работе с десятичными числами для обозначения положительных и отрицательных чисел используются знаки «+» и «-» соответственно. В системе с двумя состояниями мы можем оперировать только единицами и нулями. Тем не менее, взглянув на последний пример, можно получить ключ к решению этой проблемы. Как уже было сказано, отрицательное значение получается в результате заема в старший разряд числа. Так что мы можем использовать этот разряд в качестве знакового бита (sign bit), причем 0 будет эквивалентен знаку «+», и 1 -- знаку «-». Таким образом, число b’11000101’ будет соответствовать значе­нию —59, а число b'00111011 — значению +59 (в примерах знаковый бит выделен полу­жирным шрифтом). Преимущество такого представления заключается в том, что при арифметических операциях со знаковым битом можно обращаться так же, как с обычным битом.

При этом результат операции будет иметь верный знак. Рассмотрим два примера в дополнительном коде а) 96-37 и б) 37-96:

а) уменьшаемое больше вычитаемого

б) уменьшаемое меньше вычитаемого

  01100000  (+96)

+11011011 (дополнительный код -37)

  00111011  (+59)

   00100101   (+37)

+ 10100000  (дополнительный код -96)

   11000101   (дополнительный код -59)

Из примеров видно, что если отрицательное число представлено в дополни­тельном коде, то нам не нужно изобретать аппаратный вычитатель, поскольку прибавление отрицательного числа эквивалентно вычитанию положительного. Другими словами, А - В = А + (-В).

Более того, если числа будут записаны в до­полнительном коде, результаты всех последующих арифметических операций будут автоматически в правильном коде.

С арифметическими операциями над отрицательными числами, представленными в дополнительном коде, связаны две проблемы.

Первая из этих проблем - переполнение (overflow). Она заключается в том, что при сложении двух положи­тельных или двух отрицательных чисел может возникнуть переполнение в знако­вом бите. В приведенных ниже примерах старший бит знаковый.

 

         а) сумма положительных чисел получается отрицательной

        б) сумма отрицательных чисел получается положительной

   01000  (+8 обычный код)

+ 01011  (+11 обычный код)

   10011  (дополнительный код -13 !!!)

   11000   (-8 дополнительный код)

+ 10101   (-11 дополнительный код)

   01101   (обычный код +13 !!!)

 

Смена значения знакового бита означает переполнение знакового бита. За этой ситуацией надо следить. Об этом в некоторых микропроцессорах выводится сигнализация.

Вторая проблема связана с выполнением арифметических операций над знаковыми операндами с числами разной разрядности. В этом случае необходимо выполнить расширение числа с помощью знаковых разрядов.

При расширении данных дополнительные разряды слева следует заполнять знаковым битом. Этот метод называется расширением знака (sign extension).

 

С учетом сказанного, выполним расширение знаковым разрядом до 8 бит, тогда приведенные выше примеры будут выглядеть так.

   а) сумма положительных чисел

   б) сумма отрицательных чисел

   00001000    (+8 обычный код)

+ 00001011   (+11 обычный код)

   00010011   (+19 обычный код)

   11111000   (-8 дополнительный код)

+11110101   (-11 дополнительный код)

   11101101   (-19 дополнительный код)

Результат получился правильный в обоих случаях.

 

 

3 Регистры общего и специального назначения

 

Цель лекции: знакомство с регистрами микроконтроллера, с влиянием арифметических операций на биты регистра Status, с абсолютной адресацией.

Краткое содержание лекции. Регистры специального назначения (РСН) и регистры общего назначения (РОН). Представление подключения технологического оборудования как двоичного числа. Контроль операций с помощью регистра Status. Фиксированная адресация.

 

3.1 Регистры PORTC и TRISC

 

Информация в микроконтроллере хранится в регистрах (file), состоящих из 8 разрядов (бит). Они делятся на регистры общего назначения (РОН), которые может использовать программист для хранения переменных, и регистры специального назначения (РСН), выполняющие определенные функции управления работой микроконтроллера.

У микроконтроллеров имеются выводы для подключения внешних устройств. Информация с этих выводов сохраняется в специализированной области памяти. Выводы объединены в функциональные группы-регистры РСН, например: PORTA, PORTB, PORTC, PORTD. В результате выполнения программы на выводы порта либо будет подаваться напряжение, либо нет. Содержание регистра порта, а также нумерация разрядов порта показана на рисунке 3.1. Наличие напряжения будем обозначать цифрой 1, отсутствие - цифрой 0, хотя часто обозначают и наоборот.

      

Все выводы регистра нумеруются, начиная с нуля, справа налево, и называются разрядами или битами. К выводам порта подключаются     приборы    и       устройства,

Рисунок 3.1- Схема регистра

управляющие технологическим процессом, или кнопки и датчики для ввода информации в МК. С их помощью можно подключить, например, вентилятор, конвейер, насос подачи реагента и т.д. Если на соответствующем выводе порта будет напряжение (обозначаемое цифрой 1), то устройство будет включено. Представленные на рисунке 3.1 набор нулей и единиц формально считают числом в двоичной системе счисления. Положение цифры в числе называют разрядом. Это же число в 16-й системе будет A3h.

Рисунок 3.2 – Схема подключения оборудования

 

РСН TRISC поразрядно определяет направление потока информации через регистр PORTC. Если в каком-то разряде регистра TRISC записана “1”, то информация от периферийного устройства через регистр PORTC поступает в ЦПУ. Например, на рисунке 3.2 от кнопки Кн, конечного выключателя Кв. Если в каком-то разряде регистра TRISC записан “0”, то информация от ЦПУ через регистр PORTC поступает на периферийное устройство, например, на пускатели К1 и К2, сирену S1, лампочку L2.

 

3.2 Регистр Status

 

Регистр специального назначения Status играет большую роль при выполнении математических и логических операций. Он контролирует результаты операций: был ли перенос, получился ли нулевой результат и другие операции. На основе этого контроля выполняется ветвление алгоритма и контроль правильности полученных результатов. Его биты RP0, RP1 определяют, с адресами какого банка работает программа (банков четыре).

В таблице 3.1 показано расположение и имена битов регистра Status, которые используются для контроля арифметических и логических операций, а также для выбора банков и других целей.

 

Т а б л и ц а 3.1 – Биты регистра Status

Номера бит

7

6

5

4

3

2

1

0

Имена бит

IRP

RP1

RP0

-TO

-PD

Z

DC

C

 

В таблице 3.1 приняты следующие обозначения:

1)                IRP - бит выбора банка при косвенной адресации (IRP=1 - выбор банка 2 или банка 3, IRP=0 - выбор банка 0 или 1);

2)                RP1, RP0 - биты выбора банка при непосредственной адресации (т.е. разряды 5 и 6). Их значения для выбора банков показаны в таблице 3.2;

3)                TO - флаг переполнения сторожевого таймера;

4)                PD - флаг включения питания;

5)                Z (zero)- флаг нулевого результата. Записывается “1” при нулевом результате арифметической или логической операции;

6)                DC - флаг десятичного переноса или заема. Записывается “1”, если был перенос из младшего полубайта регистра в старший полубайт,  актуально при выполнении команд сложения и вычитания в двоично-десятичной системе;

7)                C (carry) - флаг переноса или заема. Записывается “1”, если был перенос из старшего бита регистра для команд сложения и вычитания. Вычитание, как известно, выполняется с помощью сложения уменьшаемого и вычитаемого, которое представлено в дополнительном коде.

К отдельным битам регистра можно обращаться по имени или по номеру. Запись BTFSC STATUS, Z  эквивалентна записи BTFSC STATUS, 2.

 

         Т а б л и ц а 3.2 – Выбор номера банка 5 и 6 битами (RP1 и RP0)

RP1(первый бит номера банка)

RP0 (нулевой бит номера банка)

Номер банка (десятичная система)

0

0

0

0

1

1

1

0

2

1

1

3

Примечание. RP1 и RP0 образуют разряды двоичного числа

 

После рассмотрения назначения бит регистра Status понятно, почему его очистка приводит к результату, показанному в таблице 3.3.

 

Т а б л и ц а 3.3 – Значения регистра Status после команды CLRF

IRP

RP1

RP0

-TO

-PD

Z

DC

C

0

0

0

1

1

1

1 или 0

1 или 0

 

Рассмотрим влияние арифметических операций на биты регистра Status.

 

Т а б л и ц а 3.4 – Математические примеры на сложение

Сложение чисел 128+20

Сложение чисел 240+20

а) Десятичная система

б) Двоичная система

в) Десятичная система

г) Двоичная система

  128

+  20

  148

  10000000

+00010100

  10010100

  240

+  20

              260

    11110000

  +00010100

   100000100 (равно 4!)

В примерах а) и б) таблицы 3.4 все нормально, результаты реальны, т.к. 14810=100101002. В примерах в) и г) также результаты совпадают, поскольку 26010=1000001002. Однако поскольку в регистре всего 8 бит, то самая старшая единица уйдет в перенос в бит Carry, и в результате формально получим, что 240+20=4 поскольку регистр переполнился. В примере б) бит С=0, в примере г) бит С=1. Таким образом, если в регистре Status бит С=1 при сложении, то было переполнение регистра и результат неверен.

 

Т а б л и ц а 3.5 – Математические примеры на вычитание

Вычитание чисел 16-4

Вычитание чисел 4-16

а) Десятичная система

б) Двоичная система

в) Десятичная система

г) Двоичная система

  16

 -  4

  12

     10010000

 + 11111100  

  100001100

  4

          - 16

           -12

   00000100

+ 11110000

   11110100

П р и м е ч а н и е: курсивом выделены числа в дополнительном коде.

 

В окне наблюдения (watch) в первом случае мы увидим, что результат равен 12, при этом бит переноса передается в Carry. Во втором случае в окне наблюдения увидим, что результат равен 244, при этом бит Carry равен нулю. Таким образом, если в регистре Status бит С=0, то результат вычитания неверно отражается в окне наблюдения, поскольку, в действительности, он находится в дополнительном коде. Если в регистре Status бит С=1, то результат вычитания верно отражается в окне наблюдения.

 

3.3 Фиксированная (абсолютная) адресация

 

Чтобы выполнить какие-либо действия с информацией в регистре, его имя или адрес должны быть указаны в команде. Будучи составной частью кода команды, 7-битный адрес операнда (регистра) является «фиксированным и, поэтому не может быть изменен во время выполнения программы.

Хотя явное задание этих адресов может показаться очевидным способом для указания местоположения объекта в памяти данных, существует ряд ситуаций, в которых такое указание неудобно.

В качестве примера, иллюстрирующего эту недостаточную гибкость, предло­жим, что мы хотим очистить содержимое всех регистров данных 0-го банка, т.е. регистров h'20'…h'7F'. Очевидным решением этой задачи будет многократное (96 раз) использование команды clrf (очистка регистра), как показано ниже в программе:

         Clrf h’20’; очищаем регистр по адресу h’20’.

         Clrf h’21’; очищаем регистр по адресу h’21’.

         . . . .

         Clrf h’7E’; очищаем регистр по адресу h’7E’.

         Clrf h’7F’; очищаем регистр по адресу h’7F’.

Несмотря на то, что этот код вполне работоспособен, он чрезвычайно неэф­фективен. Каждая из 96 команд выполняет одну и ту же операцию, хотя и для дру­гого адреса.

 

4 Косвенная адресация. Логика

 

Цель лекции: познакомить с применением косвенной адресации, логическими функциями и маскированием.

Краткое содержание лекции. Косвенная адресация и её применение. Логические функции NOT, OR, AND, XOR их применение. Таблицы истинности логических функций.

 

4.1 Косвенная адресация

 

В любом микропроцессоре имеется одна из разновидностей косвенной адресации, при которой один или более внутренних регистров используются для хранения адреса операнда в памяти данных. Такие адресные или индексные регистры ис­пользуются в качестве указателя на данные. Основное отличие от прямой адреса­ции заключается в том, что содержимое регистра-указателя может изменяться в процессе выполнения программы. То есть искомый адрес является переменной величиной. Например, для очистки массива данных можно ис­пользовать цикл, инкрементируя в каждом проходе цикла регистр, указывающий на адрес очищаемого регистра.

В микроконтроллерах РIС реализован достаточно простой вариант такого ти­па адресации. Имеется отдельный элемент ИЛИ-НЕ, который детектирует обраще­ние по прямому 7-битному адресу b'0000000' и, просто передает на шину адреса памяти данных содержимое регистра h'04', называе­мого индексным регистром (FSR). Это происходит, если в качестве адресата ко­манды используется нулевой адрес, по которому располагается регистр косвен­ной адресации INDF. Этот регистр является виртуальным, т.е. физически не су­ществует. Он используется исключительно для передачи содержимого регистра FSR на шину. 

В качестве простого примера предположим, что содержимое регистра FSR равно h'66',тогда команда clrf h’00’ (или clrf INDF) очистит регистр, располо­женный по адресу h'66’ а не по адресу h'00’. Содержимое регистра FSR можно изменить в любой момент времени, например, его можно инкрементировать в каждом проходе цикла, как в программе очистки регистров, рассмотренной ниже.

Перепишем программу очистки массива, заменив линейную структуру циклом, как показано на рисунке 4.1. Теперь наша программа будет рабо­тать по следующему алгоритму, представляющему собой перечень задач:

1) Установить указатель FSR на начало массива.

2) Очистить адресуемый регистр данных, указав в качестве адресата регистр данных h'00'.

3) Инкрементировать указатель FSR.

4) Проверить, не достиг ли указатель конца массива, в нашем случае — адреса h'7F'. Если нет, то перейти к пункту 2.

5) Если массив очищен, то продолжить выполнение программы.

Код, соответствующий этому алгоритму, приведен ниже в программе. Очистку регистров по-прежнему выполняет команда clrf, которая «проходит» по массиву, начинающемуся с адреса h'20’. При каждом прохо­де цикла указатель в регистре данных h'04' инкрементируется. В конце концов, со­держимое регистра FSR выйдет за границу заданного диапазона, в результате чего программа выйдет из цикла и продолжит выполнение следующей секции кода.

Clearfiles; подпрограмма очистки массива.

Movlw h’20’; помещаем начальный адрес в W.

Movwf  FSR; и копируем его в FSR.

Metka  Clrf  INDF; очищаем регистр, на который указывает FSR.

Incf  FSR F; инкрементируем указатель на адрес следующего регистра.

Теперь проверяем, не достиг ли указатель верхней границы массива?

Movf  FSR W; копируем указатель в W.

Addlw  -h’7F’; сравниваем с адресом последнего регистра.

Btfss  STATUSZ; проверяем, если флаг Zero=1, то завершаем цикл. 

Goto Metka; если нет, выполняем повтор цикла.

Return; если да, завершаем цикл и выходим из подпрограммы.

 

4.2 Логические  функции

 

Английский математик Джордж Буль  в середине 19-го столетия создал раздел алгебры, касающийся символической обработки логических отношений. Этот раздел алгебры, называе­мый Булевой алгеброй, оперирует величинами, которые могут иметь только два со­стояния: истина или ложь.

4.2.1 Инверсия или операция NOT (НЕ).

Инверсия обозначается символом надчеркивания. Таким образом, выражение означает, что переменная f является обратной величиной переменной А. То есть, если А = 0, то f = 1, и наоборот, если А = 1, то f = 0. На рисунке 4.2а эта зависимость представлена в виде таблицы истинности (truth table).

Рисунок 4.2 – Операция NOT

 

Общепринятое изоб­ражение элемента НЕ приведено на рисунке 4.2б. Кружок на изображении логи­ческих схем всегда означает инверсию и очень часто используется в сочетании с другими логическими элементами (см. например, рисунок 4.3в).

4.2.2 Операция AND.

Операция AND (И) реализует функцию «все или ничего». Результат операции будет истинным только в том случае, если оба входа истинны. На рисунке 4.3 име­ются две входные переменные. Опера­цию AND иногда называют операцией логического умножения, поскольку (по аналогии с обычным умножением) результат этой операции между любым битом и 0 всегда будет равен 0.

Рисунок 4.3 - Операция  AND

 

4.2.3 Операция  OR

Операция OR (ИЛИ) может использоваться, в тех случаях, когда нужно обнаружить ситуацию, что на всех входах нули, см. рисунок 4.4.

Рисунок 4.4 - Операция  OR

 

Если предположить, что вход В является управляющим входом, а вход А — входом данных, то из рисунка 4.4а видно, что данные проходят через вентиль при В = 0 и задерживаются (на выходе постоянно 1) при В = 1.

4.2.4 Операция Exclusive OR – XOR ( Исключительно ИЛИ).

Функция XOR (Исключающее ИЛИ) истинна, ес­ли истинен только один из входов. Поэтому на символе изображено «=1», см. рисунок 4.5б. В отличие от обычной операции ИЛИ, при 1 на обоих входах на выходе будет 0.

Аналогично, из таблицы истинности операции Исключающее ИЛИ-НЕ (XNOR), показанной на рисунке 4.5в, видно, что выход такого элемента истинен при одинаковых сигналах на обоих входах. Таким образом, вентиль Исключающее ИЛИ-НЕ можно рассматривать в качестве однобитного компаратора.

Рисунок 4.5 - Операция  XOR

 

Исключающее ИЛИ и Исключающее ИЛИ-НЕ часто применяются  для определения переполнения в знако­вом бите. Эта ситуация возникает, если знаковые биты (sign) обоих операндов одинаковы (SB =SA), а знаковый бит SC результата отличается от них. Схема такого детектора, см.  рисунок 4.6, описывается логи­ческой функцией:V=(SBÅSA)( SBÅSC).

Рисунок 4.6 – Обнаружение переполнения в знаковом бите

 

5 Маскирование. Стек

 

Цель лекции: изучение маскирования, стека и его назначение.

Краткое содержание лекции. Использование логических функций для контроля и изменения значений регистров (маскирование). Счетчик команд и стек. Их работа при вызове подпрограмм.

 

5.1 Маскирование

 

При маскировании выполняется побитные логические операции разрядов исходного числа или проверки равенства чисел:

-     логическая операция AND исходного числа и числа-маски очищает разряд числа в исходном числе, если в соответствующем разряде числа-маски записан 0, и не изменяет его, если в разряде маски записана единица;

-     логическая операция OR исходного числа и числа-маски устанавливает в разряд исходного числа  1, если в таком же разряде маски будет записана 1, и не изменяет его, если в этом разряде маски записан 0;

-     логическая операция XOR («исключающее ИЛИ»)  исходного числа и числа-маски инвертирует содержимое бита исходного числа, если в соответствующем разряде числа маски записана 1. И не изменяет его, если в этом разряде маски записан 0. Часто применяется для определения равенства регистра какому-либо числу, записанному в маске.

         Примеры результатов маскирования приведены в таблице 5.1.

 

Т а б л и ц а 5.1 – Результаты маскирования

 

 

Объекты

Операция

OR (установка с 4 по 7 бит)

AND (очистка с 0 по 3 бит)

XOR
(биты с 0 по 3 не изменяем, инверсия с 4 по 7 бит)

XOR
(проверка на равенство)

Число

10101010

10101010

10101010

11011101

Маска

11110000

11110000

11110000

11011101

Результат

11111010

10100000

01011010

00000000

 

Применяя маскирование, напишем программу регулирования расхода газа в установку для её нагрева без применения обратной связи.

Пусть определен требуемый расход газа (Treb_Raskhod), подаваемый в горелку установки при котором идет нормальный технологический процесс. Давление в трубе меняется, поэтому фактический расход (Fakt_Raskhod) не совпадает с требуемым расходом.

Вращая шток заслонки на трубе с помощью МЭО в сторону Bolshe, мы можем увеличить расход газа, вращая шток в сторону Menshe, мы можем уменьшить расход газа.

Сравнивая значения Treb_Raskhod и Fakt_Raskhod, будем определять направление вращения МЭО. Если Treb_Raskhod < Fakt_Raskhod заслонку надо прикрыть, если Treb_Raskhod > Fakt_Raskhod приоткрыть.

Подпрограмма определения направления "B" или "M" вращения МЭО.

В программе используется особенность кодировки латинских букв “М” и “В” в нулевом и первом разрядах.

MEO           MOVF TREB_RASKHOD, W; требуемый расход  --> W.

         SUBWF  FAKT_RASKHOD, W; W= Fakt_Raskhod - Treb_Raskhod.

         MOVLW b'01001101'; записываем код буквы М, направление Menshe.

         BTFSS  STATUS, C; проверяем C = 1?

         MOVLW  b'01000010'; при C=0, записываем код буквы "В" (Bolshe).

         MOVWF  NAPRAV_MEO; запоминаем код символа направления.

         ANDLW  b'00000011'; маской оставляем только 0 и 1 разряды для МЭО.

         MOVWF  PORTC; пересылаем импульс управления на МЭО.

         RETURN

С помощью применения операций AND и XOR можно определить, равны ли определенные биты входного числа заданному значению.

Пусть входное число в регистре PORTB  равно 10101110. Три  младших разряда контролируют состояние наличия в баке жидкости, заданной температуры и наличие нормального напряжения. Если эти три бита, равны 111, то открывается задвижка слива содержимого бака (это жидкий рубильник на 1000А с расплавом натрия).

MOVLW  b’00000111’; заданное число-маска.

ANDWF  PORTBW; считываем из PORTB нужные биты в W.

XORLW  b’00000111’; проверяем равенство их заданному числу.

BTFSC  STATUS, Z; если Z = 0, пропускается следующая команда.

CALL SLIV; если Z = 1, вызываем подпрограмму SLIV.

MOVLW  b’01100111’; дальнейшее продолжение программы.

В рассматриваемом случае подпрограмма SLIV не будет вызвана.

 

5.2 Счетчик команд

 

Счетчик команд (Program Counter — PC) используется для адресации, или указания, считываемой из памяти программ команды. Этот 13-битный регистр обычно инкрементируется после каждой выборки, функционируя как двоичный счетчик. Однако, как мы с вами увидим в следующей лекции, существует ряд ко­манд, таких как команда goto, выполнение которых вызывает переход к другому месту в памяти программ. Соответственно, нормальное функционирование счет­чика команд нарушается. Программист может также напрямую обращаться к счетчику команд через память данных.

В счетчике команд микроконтроллера PIC16F84 задействованы только младшие 10 бит (210 = 1024), поэтому число команд ограничено. Если программа попытается перейти по адресу, находящемуся вне этого диапазона, то адрес окажется «сверх памяти программ». В любом случае счетчик команд очищается при сбросе микроконтроллера, т.е. первая выполняемая команда, всегда располагается по адресу h’000’. Этот адрес называется вектором сброса.

 

5.3 Стек

 

Корректную работу основной программы и подпрограмм обеспечивает стек. В него записывают номер последней команды из счетчика команд при вызове подпрограммы. Из этой подпрограммы может быть вызвана другая подпрограмма. Чтобы, в конечном счете, вернуться обратно в основную программу, последовательность действий при возврате должна в точ­ности соответствовать последовательности действий при входе. Это обеспечива­ется LIFO-структурой стека (последний пришел – первый ушел), который автоматически поддерживает произволь­ные вложенные последовательности, причем глубина вложенности ограничена  только размером стека. В микроконтроллерах среднего семейства число уровней вложенности равно восьми. Стековый механизм также используется и для обработки прерываний. Поэтому в системах, использующих как подпрограммы, так и прерывания, глубина вложенности будет немного меньше. Этот способ настолько удобен, что практически используется во всех микропроцессорах.

Рассмотрим ситуацию, показанную на рисунке 5.1, где главная программа MP вызывает подпрограмму первого уровня P1, которая, в свою очередь, вызывает  подпрограмму второго уровня P2.

Рисунок 5.1 – Вложенные подпрограммы

 

При вызове подпрограммы Р1 в стек записывается номер последней команды из счетчика команд, обозначим её как MPn. При вызове из подпрограммы Р1 новой подпрограммы Р2 в вершину стека записывается из счетчика команд номер последней команды, обозначим её как Р1k, а команда MPn опускается на более низкий уровень стека. При выполнении команды Return из Р2, Команда P1k переходит в счетчик команд, а команда MPn вновь поднимается на вершину стека. Подпрограмма Р1 продолжает выполняться со следующей команды после Call P2. При выполнении команды Return из Р1, Команда MPn переходит в счетчик команд, стек освобождается и  основная программа продолжает работу со следующей команды после Call P1.

Поскольку стек совместно со своим указателем является частью «железа» микроконтроллера и не требует инициализации, программист должен учитывать только следующие моменты:

- вызов подпрограмм должен осуществляться с помощью команды Call;

- точка входа  в подпрограмму должна быть помечена (это её имя);

- последней командой в подпрограмме должна быть команда Return или
Retlw, причем, последняя используется для загрузки в рабочий регистр заданной константы
L при возврате из подпрограммы.

 

6 Конвейер и подпрограмма задержки

 

Цель лекции: объяснить совместный механизм работы счетчика команд, стека, конвейера, основной программы и подпрограмм.

Краткое содержание лекции. Конвейер и его назначение, совместный механизм работы счетчика команд, стека, конвейера, основной программы и подпрограмм. Время выполнения команд. Программа задержки и её расчет.

 

6.1 Конвейер

 

Конвейер реализован в виде двух 14-битных регистров. В первом регистре находится команда, только что считанная из памяти программ по адресу, определяемому значением счетчика команд. Второй регистр подключен к дешифратору и соответственно содержит исполняемую в данный момент команду. Такое исполнение позволяет осуществлять выборку команды одновременно с исполнением команды, выбранной в предыдущем цикле. Что ускоряет работу микроконтроллера. Естественно, при этом предполагается, что последовательность выполнения команд имеет линейный характер. В случае команды, выполняющих переход к другому месту памяти программ, команда, находящаяся на вершине конвейера, должна быть заменена другой командой. Это называется сбросом конвейера, сброс увеличивает время исполнения команды на машинный цикл. Как видно из рисунка 6.1, обычно команда выполняется за один машинный цикл.

Рисунок 6.1 - Конвейер

 

Из рисунка также видно, почему первые три команды в программах пустые (инструкция NOP). В это время в память данных записывается «мусор».

 

6.2 Программа задержки

 

Напишем подпрограмму Timer для формирования за­держки. Её блок-схема представлена на рисунке 6.2.

 

Рисунок 6.2 – Блок – схемы подпрограмм задержки

 

Программное фор­мирование задержки заключается в простом «ничего не делании» в течение требуе­мого времени. Обычно это реализуется с помощью цикла, в котором заданная константа декрементируется до нуля, как показано на рисунке 6.2 слева.

Выбирая соот­ветствующее значение константы N, можно сформировать задержку определенной дли­тельности. Понятно, что эта задержка будет зависеть от частоты тактового сигна­ла микроконтроллера. У нас тактовая частота равна 12 МГц, следовательно, длительность машинного цикла, содержащего 4 такта ТМ=4/F=4/(12×106) =0,333 мкс.

Фрагмент текста программы:

MOVLW   D'N'; аргумент для подпрограммы (для константы Sch_in).

         CALL Timer

Timer; подпрограмма Timer. Применен один цикл.

MOVWF   Sch_in; устанавливаем значение счетчика равное N.

M_in; метка счетчика.

DECF   Sch_in, F; уменьшаем значение счетчика Sch_in на 1.

BTFSS   STATUS, Z; если оно равно нулю (Z=1), пропускаем GOTO.

GOTO   M_in; срабатывает только при Z=0.

RETURN; конец подпрограммы Timer.

 

6.3 Расчет времени задержки

 

Чтобы определить величину задержки Tz, нужно учесть, сколько времени выполняется та или иная команда подпрограммы, и вычислять общее число машинных циклов, которое тратится на вы­полнение подпрограммы.

 Команда CALL  Timer, используемая для перехода к подпрограмме, выполняется за два машинных цикла из-за сброса конвейера.

Команда MOVWF   Sch_in выполняется за один ма­шинный цикл.

Команды DECF   Sch_in, F, декрементирующие содержимое счетчика, за­трачивают и в общей сложности N проходов цикла.

Команда BTFSS   STATUS, Z, проверяющая состояние флага Z (не стал ли W равен нулю после предыдущего декрементирования?), также выполняется N раз. Однако при последнем проходе происходит выход из цикла за счет пропуска команды перехода, что добавляет один цикл из-за сброса конвейера. Таким образом, общая задержка, вносимая этой командой, состав­ляет N + 1 циклов.

Команда GOTO. Выполняется только N-1 раз, поскольку выход из цикла происходит за счет пропуска команды Goto. Каждое ее выполнение занимает 2 цикла из-за сброса конвейера. Она, таким образом, выполняется 2(N- 1) раз.

Команда RETURN выполняется за 2 цикла.

Подсчет количества циклов приведен в таблице 6.1. Напишем выражение для расчета времени задержки: TZМ(4+4N)=0,333(4+4N).

 

Таблица 6.1 - Число циклов выполнения команд

Команда

Call

Movwf

Decf

Btfss

Goto

Return

Сумма

Количество циклов

2

1

N

N+1

2(N-1)

2

4+4N

 

Максимальное значение N может быть только D’255’. При этом получится задержка: TZ=0,333(4+4×225)=341 мкс. В действительности максимальная задержка будет при N=0. Рассчитайте её самостоятельно. Поэтому для задержек больше чем 341 мкс, придется создавать дополнительно еще один или два внешних цикла как показано на рисунке 6.2 справа.

Будем приближенно считать, ошибка составит всего 4 ТМ, что внешний цикл кратно увеличивает время задержки. Рассчитаем значение счетчика Sch_out необходимо для получения задержки в 0,05с методом пропорций:

Sch_out=1- - 341 мкс, Sch_out=? - - 50000. Получим Sch_out=147.

 Задержку можно увеличить, добавляя в тело цикла команды Nор (нет операции). Каждая команда Nор добавляет один машинный цикл, не влияя при этом на флаги регистра STATUS.

Наша процедура задержки является примером подпро­граммы, которая имеет входной параметр W, определяющий время задержки, но она ничего не возвра­щает в главную программу. Эта подпрограмма просто выполняет свою задачу, заключающуюся в фор­мировании задержки, а также изменяет регистры данных, рабочий регистр и некоторые флаги регистра Status.

 

7 Выполнение умножения и деления

 

Цель лекции: создание подпрограмм для целочисленного умножения и деления.

Краткое содержание лекции. Умножение и деление при помощи сдвига. Инструкции условных переходов. Роль регистра Status. Целочисленное деление. Умножение на дробное число.

 

7.1 Умножение и деление при помощи сдвига

 

Умножение числа на N-ю степень двойки реализуется сдвигом исходного зна­чении на N позиций влево. Таким образом, последовательность операций (00110 (6) << 01100 (12) << 11000 (24)), эквивалентна умножению числа 6 на 4. Оператор «<<» используется для обозначения сдвига влево. Это же правило примени­мо и к отрицательным числам

Аналогичным образом деление числа на N-ю степень двойки реализуется сдвигом значения на N позиций вправо, т.е. 1100 (12)>> 0110 (6) >> 0011 (3).  Этот же способ применим также к знаковым числам.

Обратите внимание, что освободившиеся при сдвиге вправо освобождающие позиции заполня­ются не нулями, а содержимым знакового бита. Таким образом, при сдвиге поло­жительных чисел слева вдвигаются нули, а при сдвиге отрицательных чисел — единицы.

В общем случае применяются специальные алгоритмы для умножения и деления, использующие инструкции условных переходов при ветвлении.

 

7.2 Инструкции условных переходов

 

Инструкции условных переходов BTFSC и BTFSS проверяют состояние заданного бита в любом регистре и в зависимости от результата, пропускают или не пропускают следующую инструкцию программы см. таблицу 7.1. Инструкция BTFSC пропускает следующую инструкцию, если заданный бит сброшен. В реальных программах вместо указанных в таблице инструкций пишутся инструкции, соответствующих разработанному алгоритму.

 

Т а б л и ц а 7.1 - Использование битов CARRY (C) и ZERO (Z)

Использование бита CARRY (C)

BTFSS  STATUS, C    

GOTO METKA

MOVWF  R2

Если в бите Carry установлена единица, то пропускается следующая инструкция программы GOTO МЕТКА и сразу выполняется инструкция MOVWF  R2

Если  бит Carry сброшен, то выполняется следующая инструкция программы  GOTO METKA

Использование бита ZERO (Z)

BTFSS  STATUS, Z

CALL  SDVIG

MOVWF  PORTC

Если в бите Zero установлена единица, то пропускается следующая инструкция программы CALL  SDVIG и сразу выполняется инструкция MOVWF  PORTC

Если  бит Zero сброшен, то выполняется следующая инструкция программы  CALL  SDVIG  и затем MOVWF  PORTC

 

7.3 Целочисленное умножение

 

Умножение можно выполнить последовательным сложением, а деление – вычитанием, но при этом в некоторых алгоритмах необходимо как-то сравнивать два числа: одно  из них множитель, второе количество выполненных сложений умножаемого числа. В ассемблере отсутствуют инструкции сравнения чисел. Чтобы определить, какое из чисел больше (меньше), применяют такой алгоритм:

1) Выполняют вычитание чисел. При этом в зависимости от результата, устанавливаются флаги C и Z регистра Status, см. таблицу 7.2.

2) Далее применяют инструкции условных переходов из таблицы 7.1.

 

Т а б л и ц а 7.2 – Регистрация событий в регистре Status

Соотношения значений в W и РОН UMENSH

Значения флагов регистра Status после выполнения вычитания

Флаг Z

Флаг C

UMENSH-W>0

0 -Нулевого результата не было

1 - был перенос из 7 бита W в бит С (при сложении в дополнительном коде)

UMENSH-W<0

0 - Нулевого результата не было

0 - не было переноса из 7 разряда W в бит С (при сложении в дополнительном коде)

UMENSH-W=0

1 - был нулевой результат операции

1- был перенос из 7 разряда W в бит С (при сложении в дополнительном коде)

П р и м е ч а н и е – В регистр UMENSH помещается уменьшаемое число

Напишем подпрограмму выполнения умножения последовательным сложением. Например, чтобы умножить 25 на 10 нужно выполнить десять раз сложение: 25*10=25+25+25+25+25+25+25+25+25+25=250.

Umnozhenie; подпрограмма. Входы Umn_Chislo и Mnozh, выход Pr.

         Clrf  Pr

         Clrf  Kol_slag

Sled_slag

         Movf  Pr, W; загружаем Pr в W.

         Addwf  Umn_Chislo, W; добавление очередного слагаемого.

         Movwf  Pr

         Incf Kol_slag, F; контролируем количество сложений.

         Movf  Kol_slag, W

         XORwf  Mnozh, F; маскированием проверяем Kol_slag=Mnozh?

         Btfss  STATUS, Z; проверяем Z=1?

         Goto Sled_slag; строка выполняется только при Z=0.

         RETURN

 

7.4 Целочисленное деление

 

Алгоритм целочисленного деления показан на примере деления 35 на 10 в таблице 7.3. Из алгоритма в таблице видно, что, если делитель равен нулю, то программа зациклится.

 

Таблица 7.3 - Алгоритм целочисленного деления

 

Цикл

Частное

 

Действие

Значение бита «С»

 

С=0?

 

Действие

INC

DEC

 

0

 

Rab_peg=35

 

 

 

1

1

 

Rab_peg= Rab_peg- Delitel=25

1

Нет

Повторяем цикл

2

2

 

Rab_peg= Rab_peg- Delitel=15

1

Нет

Повторяем цикл

3

3

 

Rab_peg= Rab_peg- Delitel=5

1

Нет

Повторяем цикл

 

4

 

Rab_peg= Rab_peg- Delitel=-5

0

Да

Возвращаемся назад на 1 шаг

 

 

3

Ostatok = Rab_peg+Delitel=5

 

 

 

Результат деления: частное=3, остаток =5, т.е. 35/10=3 (5)

 

Delenie; подпрограмма. Входы Delimoe и Delitel, выходы Chastnoe и Ostatok.

         CLRF  Chastnoe

         MOVF  Delimoe, W;

         MOVWF  Rab_peg; копируем Delimoe в рабочий регистр.

         MOVF  Delitel, W; копируем Delitel в W.

         BTFSC  STATUS, Z; защита от деления на нуль, Delitel=0?

         GOTO NUL; если Delitel=0, выходим из программы.

Metka  INCF Chastnoe, F; накапливаем частное.

         SUBWF  Rab_peg, F; вычитаем Rab_peg=Rab_peg-Delitel.

         BTFSC  STATUS, C; проверяем разность отрицательная? C=1?

         GOTO  Metka; выполняется только при C=1.

; Было выполнено одно лишнее вычитание. Возвращаемся на один шаг.

         DECF  Chastnoe, F; восстанавливаем частное, уменьшая его на 1.        ADDWF  Rab_peg, W; восстанавливаем предыдущее значение Rab_peg.

         MOVWF  Ostatok; запоминаем остаток, он равен W.

         RETURN

NUL  MOVLW  D'255'; защита от деления на ноль.

         MOVWF  PORTC; сигнализируем о зацикливании программы.

         END

 

7.5 Умножение на дробное число

 

Умножение на дробное число можно выполнить с точностью до целых с помощью умножения заданного числа на целое число (множитель), и затем деления результата на другое целое число (делитель). Множитель и делитель подбираются на калькуляторе или MSExcel.

Пример. Выполним умножение числа 6 на 0,8. Сначала на калькуляторе подберем целочисленный множитель и целочисленный делитель, таким образом, чтобы получить примерно заданный коэффициент. В данном случае подходят множитель 4 и делитель 5, поскольку 4/5=0,8. Далее умножаем заданное число на четыре, и затем результат делим на пять. Остаток будет определять погрешность проведённых вычислений.

 

8 Программирование клавиатуры. Дешифратор

 

Цель работы: создание программ с вводом данных клавиатурой, рассмотрение схем дешифратора и компаратора.

Краткое содержание лекции. Подключение клавиатуры и её опрос. Дребезг контактов, защита от дребезга контактов. Дешифратор и его работа. Компаратор и его работа.

 

8.1 Клавиатура

 

Клавиатура используется в реальных программах для ввода данных, инструкций, для изменения алгоритма вычислений. С клавиатуры можно подавать сигнал ’1’ в PORTD, без применения дополнительного источника питания. Сигнал будет обработан микропроцессором, и будут внесены изменения в работу программы.

Рассмотрим схему подключения пленочной клавиатуры (см. рисунок 8.1). Такая схема продиктована тем, что все кнопки подключаются к одному регистру PORTD, имеющему 8 разрядов. На рисунке приведена, в качестве примера, монтажная схема подключения кнопки с цифрой «1» к PORTD. Разряды RD7, RD6, RD5, RD4 предназначены для подачи сигнала «1». Остальные для приема сигнала.

Роль кнопок клавиатуры в программе и их расположение.

“5” - Кнопка Pusk1 на пульте;

“6” - Кнопка Pusk2 по месту;

Shift”- Кнопка Stop1 на пульте;

“9” - Кнопка Stop2 по месту.

К биту 1 PORTD подключена кнопка K1, к биту 7 кнопка K7.

Кнопки имитируют реальное оборудование.

Рисунок 8.1 – Подключение клавиатуры

 

В разряде RD0 по заводской схеме всегда записана «1», т.е. бит RD0 заземлен. Одна клемма кнопки «1» подключена к выводу RD7, а вторая клемма кнопки подключена к выводу RD3. Бит RD7 должен быть запрограммирован на вывод, а бит RD3 - на ввод.

Создадим программу для автоматической окрасочной камеры, выполняющую следующие действия:

- при подаче питания включить световую сигнализацию на пульт оператора L2 и звуковую сигнализацию S1;

- через 2 секунды выключить сирену и включить двигатель краскораспылителя D1, двигатель вентилятора D2 и лампочку L1, сигнализирующую об окраске;

- через три секунды выключить двигатель краскораспылителя D1;

- ещё через 2 секунды выключить вентилятор D2 и лампочку L1;

- в течение одной секунды заменяется заготовка в камере;

- повторить процесс окрашивания новой заготовки, начиная с включения сирены;

- предусмотреть запуск камеры для окрашивания каждой детали кнопками «Пуск» и  останов камеры кнопками «Стоп» по месту и с пульта оператора.

Поскольку клавиатура выполнена из упругих материалов, то на одно нажатие кнопки происходит многократное замыкание и размыкание контактов, называемое дребезгом контактов. Дребезг контактов вносит неопределенность в работу программы, приходится принимать меры, чтобы сработал только один импульс.

Дребезг контактов клавиатуры убирается разными способами, например, включением подпрограммы Timer или запретом поступления импульса в ЦПУ. Кнопка Stop в данной программе находится в подпрограмме Timer. Выключение оборудования кнопкой здесь возможно, потому что при выполнении программы, МК практически все время находится во внутреннем 30икле  подпрограммы Timer. При других алгоритмах такой вариант выключения невозможен, необходимо предусматривать прерывание.

 

8.2 Фрагменты программы

 

         ; ниже инструкции для настройки PORTD выделены курсивом.

         CLRF  TRISC

         MOVLW  b'00001111'

         MOVWF TRISD; настройка  PORTD: биты 0-3 на ввод, 4-7 на вывод.

         BCF  STATUS,  5

         CLRF  PORTC

Рабочая часть программы.

         MOVLW   B'11110000'

         MOVWF   PORTD; подаем питание на выводы клавиатуры.

         MOVLW   B'10000000'

         MOVWF   PORTC; включаем сигнализацию наличия питания на пульт.

Sled_det      BTFSS  PORTD,  2; проверяем нажатие кнопок Pusk1 и Pusk2.

         GOTO  Sled_det; если кнопка еще не нажата, повторяем проверку.

         BSF  PORTC, 0; включаем звуковую предупреждающую сигнализацию.

         MOVLW d'40'; задаем время работы сигнализации S1.

         CALL Timer

         Далее идут команды для управления технологическим процессом.

         GOTO  Sled_det; переход на метку Sled_det для нового запуска камеры.

GOTO $; разделитель основной программы и подпрограмм.              

Timer; в подпрограмме показан только внутренний цикл с кнопками Stop.

M_in; Метка внутреннего счетчика.

         BTFSC  PORTD,  1; проверяем нажатие кнопки Stop1 или Stop2.

         GOTO Stop; если нажата, переход к инструкциям останова камеры.

         DECF   Sch_in, F; уменьшаем значение счетчика Sch_in на 1.

         BTFSS   STATUS, Z; если Sch_in равно нулю (Z=1), пропускаем GOTO.

         GOTO   M_in; срабатывает только при Z=0.

. . . .

         RETURN

Stop  CLRF  PORTC; останов работы окрасочной камеры.

         END; конец текста всей программы.

 

8.3 Дешифратор

 

Изображенная на рисунке 8.2 микросхема, содержащая определенным образом соединенные элементы И-НЕ, является типичным примером интегральных микросхем средней степени интеграции. Если вспомнить, что на выходе элемен­та И-НЕ логический 0 присутствует только в том случае, если на всех его входах присут­ствует логическая 1, то можно увидеть, что при любых сочета­ниях сигналов на входах выборки BA сигнал логический 0 будет при­сутствовать на выходе только одного вентиля. Так, выход Y1 будет активным (активным здесь считается значение 0) при  ВА=012. После  рассмотрения таблицы истинности становится понятно, что данная схема декодирует двоичное число ВА таким образом, что при подаче числа N   становится   активным  только выход Yn.   Вход разрешения G подключен параллельно ко всем элементам. Таким образом, дешифратор выполняет свои функции только в том слу­чае, если на входе G присутствует низкий уровень (логический 0). Если на входе G присутствует высокий уровень, то независимо от состояния входов В и А (в таблице истинности эта ситуация обозначается символом «X» — безразличное состояние) все выходы устанавливаются в неактивное состояние (логический 0).

Рисунок 8.2 – Схема дешифратора и таблица истинности

 

8.4 Компаратор

 

Матрица логических элементов. используемая для обнаружения ра­венства между двумя 8-ми битными числами Р и Q, показана на рисунке 8.3.

Рисунок 8.3. - Микросхема 8-битного компаратора

 

Каждый из восьми логических элементов Исключающее ИЛИ-НЕ формирует логический 1, если оба входных бита РN и QN одина­ковы. Соответственно, низкий уровень на выходе элемента И-НЕ появится только в том случае, если все 8 пар битов одинаковы. Микросхема компаратора обычно имеет также вход G, сигнал с которого подается на один из входов элемента И-НЕ и выполняет функ­цию глобального разрешения.

На условном обозначении микросхемы по стандарту ANSI/IEC, функция сравнения указывается аббревиатурой СОМР.

 

9 Основные элементы цифровой техники

 

Цель лекции: изучить основные схемы цифровой техники.

Краткое содержание лекции. Сумматор. Арифметико-логическое устройство. Бистабильные схемы. Триггеры и регистры. D-триггер. Т-триггер.

 

9.1 Сумматор

 

Одной из первых функций, реализованных в ИС помимо обычных логичес­ких функций, было сложение. В таблице истинности, показанной на рисунке 9.1, приведены значения бита суммы S и флага переноса С, образующихся при сло­жении двух битов А и В и бита переноса из предыдущего разряда Со.

Рисунок 9.1 – Сложение чисел

 

Например, из 7-й строки таблицы истинности следует, что при сложении двух единиц и 0-го переноса сумма будет равна 1, перенос равен 1 (1+1+1=11). Для реализации этой строки таблицы нам нужно распознать комбинацию битов 111, описываемую выражением А×В×Со. Эту операцию выполняет 7-й элемент схемы. Таким образом, для сумматора мы просто объединяем по ИЛИ все возможные комбинации входных переменных:

Применяя такую схему для каждого разряда и подключая при этом выход пе­реноса разряда с номером К - 1 к входу переноса разряда с номером  К, мы сможем выполнять сложение любых N-битных чисел.

Разумеется, сумматоры можно использовать и для вычитания, если перевести операнды в дополнительный код.

 

Рисунок 9.2 -  Программируемый сумматор/вычитатель

 

Схему сумматора/вычитателя можно реализо­вать при помощи набора логических элементов Исключающее-ИЛИ, выступающих в роли программируемых инверторов. Вход выбора режима ADD/SUB, управляющий этими инверторами на рисунке 9.2, подключен также к входу переноса, что вызывает добавление единицы в режиме вычитания.

 

9.2 Арифметико-логическое устройство

 

Таблица 9.1 - АЛУ

SS1 S0

  Операция

0   0   0

Сброс (F=0000)

0   0   1

Вычитание  (В-А)

0   1   0

Вычитание  (А-В)

0   1   1

Сложение   (А+В)

1   0   0

Искл. ИЛИ  (АÅВ)

1   0   1

ИЛИ  (А+В)

1   1   0

И  (А*В)

1   0   1

Установка (F=1111)

Расширяя набор аргументов, мы придем к арифметико-логическо­му устройству (АЛУ). АЛУ представляет собой схему, выполняющую определен­ный набор арифметических и логических операций над входными данными в соответствии со значением на входах выбора режима.

Микросхема, таблица истинности которой приведена в таблице 9.1, выполняет 8 операций над двумя 4-битными числами. Выполняемая операция задается тремя битами выбора режима S0S1S2. Кроме сложения и вычитания, это АЛУ выполняет также операции OR, AND и XOR. Микросхема формирует также признак переполне­ния дополнительного кода.

 

9.3 Бистабильные схемы

 

Все рассмотренные ранее схемы, относятся к классу комбинационных схем. Значение их выходов зависит только от состояния входов в данный момент времени и не зависит от предыдущих событий. Такие же логические схемы, как защелки, счетчики, регистры и оперативная память (допускающая как  чтение, так и запись), относятся к классу последовательных схем. Состояние выходов таких схем зависит не только от текущего состояния входов, но и от предыстории сигналов на входах.

Возьмем обыкновенную кнопку, она не обладает памятью. Рассмотрим выключатель. Вы нажимаете на выключатель, и свет загорается. Чтобы выключить свет, вы должны перевести выключатель в выключенное состояние. Ключи такого типа называются бистабильными Каждый такой ключ ведет себя как 1-битная ячейка памяти.

В микросхемах оперативной памяти каждая бистабильная ячейка формируется с помощью двух перекрестно включенных транзисторов. Рассмотрим два логических элемента ИЛИ-НЕ, объединенных перекрест­ными обратными связями (см. рисунок 9.3).

Рисунок 9.3 - RS триггер

 

Вспомним, что при появлении логической 1 на ка­ком-либо входе элемента ИЛИ-НЕ на его выходе появляется логический нуль. Вооружившись этим знанием, проанализируем схему:

- если на  вход S подать 1, то выход Q переключится в 0. На обоих входах верх­него элемента появится 0, что приведет к появлению 1 на выходе Q. Если, теперь на входе S снова появится 0, то нижний элемент останется в 0 (пос­кольку на входе обратной связи с вывода Q присутствует 1) и состояние выхода верхнего элемента также не изменится. Таким образом, триггер устанавливается при подаче положительного импульса на вход S.

- если на вход R подать 1, то выход Q переключится в 0. На обоих входах нижнего элемента появится 0, что приведет к появлению 1 на выходе Q. Если теперь на входе R снова появится 0, то верхний элемент останется в 0 (поскольку на входе обратной связи с вывода Q присутствует 1) и состояние выхода нижнего элемента также не изменится. Таким образом, триггер сбрасывается при подаче положительного импульса на вход R.

При нормальном функционировании (предполагается, что оба входа не могут быть активными в один и тот же момент времени) оба выхода дополняют друг друга, что отражено на условном графическом изображении триггера (см. рисунок 9.3).

 

9.4 Триггеры и регистры

 

Существует много различных реализаций бистабильных ячеек. Например, за­мена элементов ИЛИ-НЕ на элементы И-НЕ приведет к образованию RS-триггера, в котором активным входным сигналом является логический ноль.

Дальнейшим развитием RS-триггера является D-защелка. В этом элементе вы­ходной сигнал (Q) повторяет входной (D), если на входе управления С присутству­ет активный уровень (в данном случае — высокий), и сохраняет предыдущее значение при неактивном уровне на входе управления. Таким образом, D-защелку можно рассматривать как 1-битную ячейку памяти, запоминающую значение, ко­торое присутствует на ее входе на момент завершения импульса управления.

На рисунке 9.4 взаимное влияние входов D и С обозначается символами «C1» и «1D». Префикс «1» у D указывает на то, что этот вход зависит от любого сигнала  в обозначении которого имеется суффикс «1», в данном случае от входа С, то есть фиксация значения 1D происходит по сигналу С1.

Рассмотрим триггер, тактируемый по спадающему фронту (см. рисунок 9.4), ин­версный выход Q которого подключен к входу 1D. D-триггер тоже представляет собой 1-битную ячейку памяти. Однако в нем данные передаются на выход только по активному фронту сигнала на управляющем (тактовом) входе. Наборы D-триггеров обычно называются регистрами, т.е. устройствами памя­ти, хранящими одно слово данных.

По каждому спадающему фронту на входе С1 данные с входа 1D будут защелкиваться и появляться на вы­ходе Q. Поскольку инверсный сигнал этого выхода подаётся обратно на вход, то в следующий раз триггер переключится в противоположное состояние. Это перио­дическое переключение между двумя состояниями помечено на временной диа­грамме символом «Т». В результате при подаче на вход триггера сигнала некото­рой частоты на его выходе будет сформирована последовательность импульсов, частота которых в 2 раза ниже. Такой триггер называют Т-триггером счетного типа или делителем на два.

Рисунок 9.4 - Т-триггер

 

Разумеется, Т-триггеры тоже можно каскадировать, как показано на рисунке 9.5. В данном случае 4 триггера с запуском по спадающему фронту соеди­нены таким образом, чтобы выход N-го разряда управлял тактовым входом разря­да N + 1. Соответственно, если частота сигнала на входе С равна 8 МГц, то на выхо­де Qa будет прямоугольный сигнал частотой 4 МГц, на выходе Qb — 2 MГц, на Qc — 1 MГц и на Qd 0,5 МГц.

Рисунок 9.5 – Каскадирование Т-триггеров

 

10 Структура микроконтроллера. Индикатор

 

Цель лекции: применение операций сдвига, перевод чисел в двоично-десятичную систему. Рассмотрение структуры микроконтроллера.

Краткое содержание лекции. Применение операций сдвига. Вывод цифр в цифровой индикатор. Структурная схема микроконтроллера.

 

10.1 Применение операций сдвига

 

Одним из использований операций сдвига является побитовая проверка данных. Предположим, что состояние 8 кнопок мобильного телефона сохранено в регистре данных h'20' см. таблицу 10.1.

Таблица 10.1 – Состояние кнопок

Кнопка

К7

К6

К5

К4

К3

К2

К1

К0

Состояние

0

0

1

0

1

1

1

1

 

Требуется определить самую левую разомкнутую кнопку, при этом считаем, что разомкнутой кнопке соответствует 1, замкнутой — 0. Рабочий регистр W в программе используется в качестве счетчика. Поскольку флаг переноса сбрасывается перед каждым сдвигом, вдвигается всегда логический 0. В какой-то момент значение регистра h’20’ становится равным нулю, и процесс завершается. Циклический сдвиг регистра на один бит вправо показан на рисунке 10.1.

 

 

Рисунок 10.1- Циклический сдвиг регистра на один бит вправо

 

Последовательность сдвигов: 00101111 (0)®00010111 (1) ® 00001011 (2) ® 00000101 (3) ® 00000010 (4) ® 00000001 (5) ® 00000000 (6). Всё на шестом шаге регистр равен нулю (при этом Z=1), следовательно, кнопка К5 является самой левой разомкнутой кнопкой.

На рисунке 10.2 показана блок-схема рассмотренного алгоритма.

При сдвиге вправо во флаг переноса выдвигается самый правый (младший) бит. Мы смо­жем определить позицию самой правой разомкнутой кнопки, заменив команду BTFSC STATUS, Z командой BTFSC STATUS, С.

Во многих случаях циклическое выдвигание бита во флаг переноса может использоваться для побитовой провер­ки данных. Например, мы можем модифицировать свою программу таким обра­зом, чтобы она подсчитывала число установленных битов в байте.

 

10.2 Цифровой индикатор

 

Большинство цифровых индикаторов работают по прин­ципу выборочного включения требуемых сегментов, как показано на рисунке 10.3. Обычно эти сегменты представляют собой светодиоды или электроды элемента на жидких кристаллах.

 

Рисунок 10.3 – Семи - сегментный индикатор

 

Входным сигналом в данном случае является 4-битный двоичный код, находя­щийся в рабочем регистре. Этот код представляет собой десять десятичных цифр в виде b’0000’…b’1001’. Выходным значением, также возвращаемым в W, является соответствующий 7-битный код, необходимый для отображения соответству­ющей цифры. Причем предполагается, что включение сегмента происходит при подаче на него 1, а выключение — соответственно при подаче 0. При необходимости можно реализовать и обратную полярность.

Преобра­зования реализуются подпрограммой в виде наборов команд Retlw, каждая из которых возвращает однобайтную константу. Каждая команда retlw помещает разные константы в аккумулятор W, неиспользу­емый 7-й бит, предназначенный для изображения точки, сброшен в ноль.

При использовании таблиц извлечение n-го элемента таблицы заклю­чается в выполнении N-ой команды. При этом константа, находящаяся в коде команды, будет помещена в аккумулятор W, после чего произойдет нормальный возврат в вызывающую программу. Если N=6, то исполнится  команда Retlw, возвращающая в W код b'011I1000' для символа 6.

Подпрограмма, код которой приведен ниже, осуществляет выбор­ку элемента таблицы, прибавляя число N, передаваемое через аккумулятор, к младшему байту счетчика команд (регистр PCL, расположенный по адресу h'02'). Действительно счетчик команд РС при вызове подпрограммы VYBOR_SEG будет указывать на адрес, где записана первая строка подпрограммы, например 100h. После выполнения команды  addwf  PCL, f в счетчике будет число 100h+6h+1h=107h поскольку счетчик инкрементируется после выполнения команды, и следующая выполненная команда бет иметь адрес 107h, что нам и требуется.

Подпрограмма дешифратора семи - сегментного индикатора.

VYBOR_SEG;                                                                                          Адрес

         addwf           PCL, f; прибавим W к PCL, получая PCL + W.                          100h

         retlw  b'00111111'; код для цифры 0. Возвращается при W=0.      101h

         retlw  b'00000110'; код для цифры 1. Возвращается при W=1.      102h

         retlw  b'10101101'; код для цифры 2. Возвращается при W=2.      103h

         retlw  b'01001111'; код для цифры 3. Возвращается при W=3.      104h

         retlw  b'01100110'; код для цифры 4. Возвращается при W=4.      105h

         retlw  b'01101101'; код для цифры 5. Возвращается при W=5.      106h

         retlw  b'01111101'; код для цифры 6. Возвращается при W=6.      107h

         retlw b'00000111'; код для цифры 7. Возвращается при W=7.      108h

         retlw  b'01111111'; код для цифры 8. Возвращается при W=8.      109h

         retlw  b'01101111'; код для цифры 9. Возвращается при W= 9.     10Аh

В программе не учитывается возможность того, что входное значение в может быть больше h’09’.

 

10.2 Структурная схема МК

 

Из рисунка 10.4 видно, что микроконтроллер может управлять различными устройствами и принимать от них данные при ми­нимуме дополнительных устройств, так как большое число пе­риферийных схем уже имеется непосредственно на кристалле микроконтроллера. Это позволяет уменьшить размеры конст­рукции и снизить потребление энергии от источника питания.

Рисунок 10.4 - Структура микроконтроллера

 

Рассмотрим типичные элементы микроконтроллеров:

1) Последовательный порт. Он позволяет обмениваться данными с внешними устройствами при малом количестве проводов.

2) Цифровые линии ввода/вывода.

3) Аналоговый порт.

4) Центральное процессорное устройство (ЦПУ) - это мозг микроконтроллера. Оно принимает из памяти программ коды команд, декодирует их и выполняет. ЦПУ состоит из регистров, арифметически- логического устройства (АЛУ) и цепей управ­ления.

5) Сторожевой таймер. Это специальный таймер, предна­значенный для предотвращения сбоя программы. Он работает следующим образом: после включения питания начинает отсчет заданного временного интервала, определяющего нормальное выполнение программы. Если программа не перезапус­тит его до истечения этого интервала времени, сторожевой тай­мер перезапустит микроконтроллер. Таким образом, программа должна давать сторожевому таймеру сигнал - все в порядке. Ес­ли она этого не сделала, значит, по какой-либо причине произо­шел сбой.

6) Аналого-цифровой преобразователь. В моделях старшего класса есть и цифро-аналоговый преобразователь.

7) Тактовый генератор.  Этот генератор определяет ско­рость работы микроконтроллера и синхронизирует работу всех устройств.

8) Память программ. ОЗУ. Здесь хранятся переменные, стек и коды команд, формирующих программу для микрокон­троллера.

9) Встроенные таймеры-счетчики, которые используются для отсчета временного ин­тервала или счета объектов.

 

11 Прерывания и сторожевой таймер

 

Цель лекции: познакомить студентов с выполнением прерываний. Научить применять встроенный таймер TRM1 и регистры специального назначения, связанные с его настройкой.

Краткое содержание лекции. Прерывания. Реакция процессора на за­прос прерывания. Подсчет посетителей с помощью прерываний. Сторожевой таймер и его назначение.

 

11.1 Прерывания

 

Микроконтроллеры могут реагировать на запросы на прерывания от самых раз­ных источников, находящихся вне микроконтроллера, либо от различных портов и периферийных устройств, имеющихся в составе конкретного представителя се­мейства. Например, микроконтроллеры P1C16F874/7 поддерживают до 13 раз­личных прерываний от этих периферийных устройств, а также одно внешнее пре­рывание, подаваемое через вывод INT. Вход внешне­го прерывания использует ту же ножку микроконтроллера, к которой подключена нулевая линия PORTB, т.е. вывод RB0. Программист может запретить или разрешить прерывания от этих источников, а также полностью запретить работу всей системы прерываний. Поскольку процесс реакции на пре­рывание практически не зависит от его источника, то будем вести речь именно о внешнем прерывании.

Реакция процессора на за­прос прерывания выглядит так:

1) При выполнении каждой команды процессор проверяет наличие запроса прерывания от разрешенного источника. Если такой запрос отсутствует, микроконтроллер просто переходит к выполнению следующей команды. При наличии запроса следующие три машинных цикла затрачиваются на передачу управления процедуре обработки прерывания, в которой происходит автоматическое сохранение, по меньшей мере, состояния счетчика команд. Это необходимо для возврата из обработчика прерывания. Некото­рые процессоры могут также автоматически сохранять содержимое регистра STATUS и дру­гих регистров специального назначения. Если автоматическое сохранение нужных регистров отсутствует, то программист должен сам позаботиться об этом. Поскольку в РIС-микроконтроллерах среднего уровня реализован 8-уровневый аппаратный стек, из обработчика пре­рывания можно вызывать до семи вложенных друг в друга подпрограмм.

2) Запрещается вся система прерываний, что гарантирует блокирование всех прерываний на время обработки текущего прерывания. Это осуществляется сбросом 7-го бита регистра управления прерываниями INTCON, кото­рый  помечен как флаг общего разрешения прерываний (GIE). При сбросе мик­роконтроллера бит GIE всегда сбрасывается, так что по умолчанию пре­рывания запрещены.

Первая команда обработчика прерывания всегда размещается по адресу h'004' памяти программ, называ­емого вектором прерывания. Разумеется, код обработчика прерыва­ния находится в каком-либо другом месте памяти программ, поэтому первой ко­мандой будет команда Goto.

3) Выполнение требуемых действий.

4) Восстановление состояния процессора и возврат к тому месту основной программы, в котором произошло прерывание.

5) Как и все подпрограммы, процедура обработки прерывания должна завершаться командой возврата. Однако при прерывании необходимо не только извлечь из стека сохраненное значение PC, но и установить бит G1E регистра INTCON для разрешения последующих прерываний. Для этого используется команда возврата из прерывания Retfie. Таким образом, после возврата в фоновую программу можно будет обработать все отложенные или будущие прерывания.

 

11.2 Подсчет посетителей с помощью прерываний

 

Рассмотрим задачу подсчета числа посетителей в небольшом магазине. Одним из возможных решений является использование пары маломощный лазер — фотоэлемент, расположенных по бокам от входной двери. При пересечении луча покупателем на управляющий микроконтроллер поступит сигнал в виде прямоугольного импульса, как показано на рисунке 11.1. В этот момент микроконтроллер может быть занят выполнением своей основной задачи, например, организацией обмена данными между торговым терминалом и основным компью­тером склада.

Рисунок 11.1- Контроль числа посетителей магазина

 

Предположим, что при каждом проходе покупателя в магазин инкрементируется регистр, который мы назовем EVENT. Разумеется, покупатели будут еще и выходить из магазина, однако, если проход достаточно узкий, мы можем просто разделить общее количество проходов на два, чтобы получить реальное число по­сетителей. Таким образом, максимальное число посетителей, регистрируемое системой, составит 128. В подпрограмме обработчика прерываний применяется команда SWAPF, поскольку она не меняет состояние регистра STATUS.

Фрагменты программы подсчета числа посетителей.

         include <p16F877.inc>

_STATUS  EQU h'51';  регистр, для сохранения состояния  Status.

EVENT       EQU h'52';  счетчик событий при прерываниях.

_WORK     EQU h'53';  регистр, для сохранения состояния аккумулятора W.

         org h’000’; адрес вектора сброса.

         GOTO MAIN; записываем по адресу h’000’.

         org h’004’; адрес вектора прерывания.

         GOTO  PERS_COUNT; записываем по адресу h’004.

        

MAIN; метка фоновой (основной) программы.

         BSF INTCON, INTE;  разрешаем внешние прерывания.

         BSF INTCON, GIE;  разрешаем работу прерываний.

         CLRF  EVENT; очищаем счетчик событий (посетителей).

. . . .

         GOTO$; конец главной программы.

PERS_COUNT; подпрограмма - обработчик прерываний.

         BCF INTCON, INTE; запрещаем внешние прерывания.

         MOVWF _WORK; сохраняем значение W в регистре  _WORK.

         SWAPF STATUS, W

         MOVWF _STATUS; сохраняем значение  регистра Status.

         BCF  INTCON, INTF; сбрасываем флаг внешнего прерывания.

         INCF  EVENT, F; регистрация очередного посетителя.

         SWAPF _STATUS, W; возвращаем значение регистра Status.

         MOVWF  STATUS

         SWAPF _WORK, F

         SWAPF _WORK, W; возвращаем значение аккумулятора W.

         BSF INTCON, INTE; разрешаем внешние прерывания.

         RETFIE;  возврат в фоновую программу из обработчика.

         END

Процедуры обработки и других прерываний аналогичны обыч­ным подпрограммам, однако необходимо помнить следующее:

- обработчик прерывания должен завершаться командой Retfie.

- аккумулятор (W), а также все РСН, изменяемые в обработчике прерывания, должны быть сохранены при входе в обработчик. И при выходе из него восстановлены, если они используются в фоновой программе.

- параметры не могут передаваться обработчику прерываний или из обработчика прерывания через рабочий регистр (W). Вместо этого, при необходимости, следует использовать глобальные переменные (данные, расположенные в памяти по известному адресу).

- обработчики прерывания должны быть как можно быстрее, т.е. быть короткими и должны выполнять минимальный набор операций.

 

11.3 Сторожевой таймер

 

Многие системы на базе микроконтроллеров работают в сложной электро­магнитной обстановке, когда помехи наводятся как по сигнальным линиям, так и по линиям питания. Типичным примером такого устройства является система уп­равления приборной панелью автомобиля, на которую воздействуют помехи, со­здаваемые высоковольтными разрядами в блоке зажигания, и пульсации напря­жения питания, вызываемые работой генератора. Даже если поместить блок в эк­ран, а на всех линиях поставить фильтры, никто не сможет гарантировать, что в какой-нибудь момент времени программа не собьется с корректного положения в памяти программ и микроконтроллер не «сойдет с ума». Это может привести к серьезным последствиям в работе системы управления. Иногда эти проблемы можно решить ручным сбросом системы. Однако во многих случаях это невозможно, например, в случае космического зонда.

Один из способов решения данной проблемы заключается в использовании связки генератор - двоичный счетчик, которая будет сбрасывать микропроцессор при переполнении счетчика. Если программа будет периодически обнулять этот счетчик во избежание переполнения, то микроконтроллер никогда не сбросится. Если по какой-либо причине микроконтроллер выйдет из основного цикла, в котором выполнялся сброс счетчика, то счетчик рано или поздно переполнится и микроконтроллер будет сброшен, а программа начнет выполняться с самого начала. Эта схема называется сторожевым таймером (watchdog timer), поскольку увеличивает безопасность системы.

Все микро­контроллеры PIC имеют встроенный модуль сторожевого таймера. Встроенный генератор сторожевого таймера никак не связан с основным тактовым генератором процессора и, если сторожевой таймер включен то, постоянно генерирует собственный сигнал с номинальным периодом 18 мс.

Генератор сторожевого таймера подключен к 8-битному постделителю (postscaler). С его помощью номинальный период тайм-аута сторожевого таймера можно увели­чить до 0,018×128 = 2,3 с. Конкретное значение периода тайм-аута оп­ределяется состоянием битов PS[2:0] регистра OPTION_REG. Ге­нератор сторожевого таймера и счетчик постделителя сбрасываются при выполнении команды Clrwdt (Clear Watch DOG Timer — сброс сторожевого таймера). Соответствен­но, для предотвращения наступления тайм-аута сторожевого таймера необходимо периодически вызывать эту команду.

Поскольку генератор сторожевого таймера полностью независим от системного тактового сигнала, он продолжает работать даже после перевода микроконтроллера в «спящий» режим. Для этого команда Sleep сбрасывает сторожевой таймер и флаг ТО регистра Status. К тому же она активизирует флаг PD регистра Status, указывающий на то, что процессор находится в «спящем» режиме. Благодаря всем этим действиям между выполнением команды Sleep и наступле­нием тайм-аута сторожевого таймера проходит время, равное одному периоду сторожевого таймера. Если тайм-аут наступит при нахождении микроконтролле­ра в спящем режиме, то микроконтроллер проснется и продолжит выполнение программы с команды, следующей за командой Sleep. Обычно этой командой является команда сброса сторожевого таймера Clrwdt

 

12 Фактор времени и аналоговый мир

 

Цель лекции: научить студентов работать с временными факторами и обрабатывать аналоговые сигналы с применением цифровой техники.

Краткое содержание лекции. Модуль таймера TMR1 Управляющие биты TMR1. Применение таймера TMR1. Аналоговый мир и цифровая обработка сигналов. Преобразователи АЦП и ЦПА.

 

12.1 Модуль таймера TMR1

 

Во многих системах ключевые операции связаны со вре­менем. Это может быть измерение длительности какого-либо события, подсчет чис­ла внешних событий или же управление внешним объектом в течение определенно­го периода времени. В качестве примера можно указать задачу измерения интервала между импульсами, формируемыми датчиком при прохождении мимо него зубцов маховика коленчатого вала двигателя. Это значение далее ис­пользуется для определения скорости вращения вала.

В тех случаях, когда время становится одним из важнейших критериев, для реализации указанных функций обычно используются аппаратные счетчики, например таймер TMR1, а не программно – формируемые задержки.

Управляют работой таймера TMR1 регистры специального назначения PIR1, TICON, INTCON, TMR1, TMR1H, TMR1L.

TMR1 – 16-разрядный таймер/счетчик, состоящий из двух 8-разрядных регистров (TMR1H и TMR1L), доступных для чтения и записи. Счет выполняется в этих спаренных регистрах. Инкрементируя их значение от 0000h до FFFFh. Если к FFFFh добавить единицу регистр переполнится и далее счет продолжится с 0000h. При переполнении счетчика устанавливается в '1' флаг прерывания TMR1IF (нулевой бит в регистре PIR1<0>). Само прерывание можно разрешить/запретить установкой/сбросом бита TMR1IE в регистре Р1Е1<0>.

Примечание. Цифра в скобках  <0> обозначает номер бита регистра.

TMR1 может работать в режимах: режим таймера, режим счетчика.

Включается TMR1 установкой бита TMR1ON в ‘1’ (T1CON<0>).

Битом TMR1CS (T1CON<1>) выбирается внешний или внутренний источник тактовых импульсов. Счетчики TMR1 инкрементируются при каждом машинном цикле.

Когда включен генератор тактовых импульсов (T1OSCEN=1), выводы RC1/T1OSI/CCP2 и РС0/T1OSO/TICK1 настроены как входы. Значение битов TRISC<1:0> игнорируется, а чтение данных с этих выводов дает результат '0'.

Управляющие биты TMR1 находятся в регистре T1CON.

Предделитель TMR1 очищается при записи в TMR1L или TMR1H.

Регистр PIE1 (адрес 8Ch) доступен для чтения и записи, содержит биты разрешения периферийных прерываний.  Чтобы разрешить периферийные прерывания необходимо установить в '1' бит PEIE регистра INTCON<6>.

Регистр INTCON (адреса 0Вh, 8Вh, 10Вh или 18Вh) доступен для чтения и записи. Он содержит биты разрешений и флаги прерываний: переполнения TMR1; изменения уровня сигнала на выводах PORTB; внешний источник прерываний RB0/INT.

 Регистр PIR1 доступен для чтения и записи, содержит флаги прерываний периферийных модулей.

Примечание. Флаги прерываний устанавливаются при возникновении условий прерываний вне зависимости от установленных битов разрешения конкретных прерываний и бита общего разрешения прерываний GIE (INTCON<7>). Программное обеспечение пользователя должно сбрасывать соответствующие флаги при обработке прерываний от периферийных модулей.

 

12.2 Применение таймера TMR1

 

Создадим программу, применяющую таймер, для автоматической окрасочной камеры, описанной в лабораторной работе «Подпрограммы». Дополнительно будем пересчитывать окрашенные детали.

Фрагменты программы. Курсивом отмечены дополнительные команды, управляющие работой таймера TMR1.

Include <p16F877.inc>; подключаем библиотеку символов.

T_reg     EQU h'20'; регистр, определяющий время задержки.

Kol_det  EQU h'21'; регистр, хранящий количество окрашенных деталей.

         ; настройка МК опущена. Ниже настройка TMR1.

         BSF STATUS, 5

         CLRF TRISC 

         CLRF PIE1; запрещаем периферийные прерывания.

         BCF STATUS, 5

         CLRF T1CON; установка TMR1 в режим ожидания, тактирование TMR1 от внутреннего генератора, значение предделителя частоты =1:1.

         CLRF TMR1H; очищаем старший регистр-счетчик TMR1.

         CLRF TMR1L; очищаем младший регистр-счетчик TMR1.

         CLRF INTCON; запрещаем прерывания от TMR1.

         MOVLW b'00110000';  тактирование от внутреннего генератора

         MOVWF T1CON;  устанавливаем предделитель частоты =1:8.

         Рабочая часть программы совпадает с программой лабораторной работы «Автоматизация окрасочной камеры». Подпрограмма Timer здесь заменяется подпрограммой Timer2.

GOTO$

Timer2; подпрограмма с TMR1.

MOVWF  T_reg; задание времени задержки.

M_T_reg;

         BCF PIR1, TMR1IF; сброс флага переполнения таймера в каждом цикле.

         BSF T1CON, TMR1ON; запуск таймера TMR1.

; следующие три строки это циклы работы таймера TRM1

M_ TRM1;  метка        

         BTFSS PIR1, TMR1IF; проверка флага перепол­нения таймера

         GOTO  M_ TRM1; если флага нет, то цикл TRM1 продолжается.

         DECFSZ  T_reg, F; уменьшаем число в регистре и проверяем на ноль.

         GOTO M_T_reg; (только при Z=0) время не кончилось, повторяем цикл.

         RETURN

         END

 

12.3 Аналоговый мир

 

Принимая во внимание тот факт, что основной задачей цифровых микрокон­троллеров является отслеживание и управление состоянием реального окруже­ния, параметры которого, как правило, измеряются аналоговыми датчиками, нам придется рас­смотреть методы взаимодействия между аналоговым и цифровым миром. Часто все, что требуется, - это сравнить уровни двух аналоговых сигналов. Однако в более сложных случаях входной аналоговый сигнал необходимо преобразовы­вать в его цифровой эквивалент, т.е. выполнять аналого-цифровое преобразование (АЦП). В дальнейшем полученный двоичный код можно будет обработать привычным образом. И наоборот, если выходной сигнал должен быть аналоговым, необходимо выполнять цифро-аналоговое преобразование (ЦАП).

Из этих операций, схематично изображенных на рисунке 12.1, наиболее сложной является операция аналого-цифрового преобразования. Во многих микроконт­роллерах имеется встроенный модуль многоканального АЦП. А вот для фор­мирования аналогового выходного сигнала, как правило, приходится использо­вать дополнительные внешние элементы

Рисунок 12.1 - Аналоговый мир и цифровая обработка

 

Информация, передаваемая при помощи аналогового сигнала, содержится в определенных параметрах, таких как амплитуда, частота или фаза, которые могут принимать любые значения из непрерывного стандартного диапазона величин.

На практике максимальное значение разрешающей способности АЦП и ЦПА, необходимое для обработки, определяется шумами и ограниченной точностью источников сигналов.

В цифровых сигналах информация представляется в виде совокупности диск­ретных символов. Так, в двоичной системе N-битное число может в лучшем случае представлять 2N уровней. Сетку (шаг) квантования можно подобрать таким образом, чтобы обеспе­чить точность, требуемую для решения каждой конкретной задачи. Так, в систе­мах передачи голоса по телефонным линиям вполне достаточно точности около 1 процента. В этом случае можно использовать 8-битное представление аналогового сиг­нала, которое даст нам 256 дискретных значений, что соответствует разрешающей способности около 0.5%. В музыкальном компакт-диске используется 16-битное представление (65 536 разрядов) — разрешающая способность около 0.0015%.

В качестве примера рассмотрим процесс квантования, представленный на рисунке 12.2. В данном случае входной сигнал преобразуется в трех битный код. Процесс квантования (оцифровки) сигнала заключается в сравнении аналогового значения со значениями фиксированного числа уровней — в данном случае их восемь. В качес­тве цифрового эквивалента исходного сигнала принимается ближайший по значению уровень. На рисунке 12.2 при входном напряжении 0,4285В,  его квантованное значении принимается по третьему уровню, т.е. 3/8=0,375В и выражается числом b’011’. Получившаяся ошибка 0,4285-0,375=-0.0535, называется шумом квантования.

Рисунок 12.2 - Процесс квантования

Приложение А

Список некоторых сокращений

1. Русские сокращения

АЛУ - Арифметико-логическое устройство.

АЦП - Аналого-цифровое преобразование/преобразователь.

БИС – Большая интегральная схема.

ИСР - Интегрированная среда разработки.

МЭК - Международная электротехническая комиссия.

ППЗУ - Программируемое постоянное запоминающее устройство.

РОН - Регистр общего назначения.

РСН  - Регистр специального назначения.

СППЗУ - Стираемое программируемое постоянное запоминающее устройство.

ЦАП - Цифро-аналоговое преобразование/преобразователь.

ЦОС - Цифровая обработка сигналов.

ЦПУ - Центральный процессор управления.

ЭСППЗУ - Электрически стираемое программируемое постоянное запоминающее устройство.

 

2. Английские сокращения

ADC (A/D) Analog-to-Digital Conversion – см. АЦП.

ALU  Arithmetic Logic Unit - см. АЛУ.

ANSI American National Standards Institution - Американский национальный институт стандартов.

ASCII American Standard Code for Information Interchange -Американский стандартный код обмена информацией.

BCD (Binary-Coded Decimal) - двоично-десятичный код.

Clrwdt (Clear Watch DOG Timer) - сброс сторожевого таймера.

FSR – регистр по адресу h'04', индексный регистр.

INDF  - регистр косвен­ной адресации.

INT (External Interrupt) - вход внешнего прерывания.

INTCON (Interrupt Control) – регистр управления прерыванием.

INTE (Interrupt Enable) – бит разрешения внешнего прерывания.

INTF (Interrupt Flag) – флаг внешнего прерывания.

ISR (Interrupt Service Routine) - процедура обработки прерывания.

LVP (Low-Voltage Programming) –низковольтное программирование.

LIFO - структура стека (последний пришел – первый ушел).

LSB (Least Significant Bit) - младшие значащие биты.

MЕSA (Manufacturing Enterprise Solution Association) - международная ассоциация поставщиков решений для промышленных предприятий.

MSB (Most Significant Bit) - старшие значащие биты.

MUX – мультиплексор.

OPTION_REG (Option Registry) – регистр опций.

PC (Program Counter) - счетчик команд.

PLC (Program counter low byte) – младший байт счетчика программ.

-PD (Power down) – бит режима пониженного энергопотребления.

PEIE (Peripheral interrupt enable) – бит разрешения прерываний от периферийных устройств.

PIC (Peripheral interface controller) - контроллер периферийного интерфейса.

PIPO (Parallel-in Parallel-out) – регистр с параллельным входом и параллельным выходом.

PIRX (Peripheral interrupt register X) – регистр флагов прерываний от периферийных устройств.

PSn (Post/ prescale select) – биты выбора коэффициента делителя.

PTCC (Real time counter/clock) – часы/счетчик реального времени.

T0CKI (Timer 0 clock input) – вход внешнего тактового сигнала TMR0.

T1CKI (Timer 1 clock input) – вход внешнего тактового сигнала TMR1.

T1CON (Timer 1 control register) – регистр управления TMR1.

T1OSCEN (Timer 1 oscillator enable) – бит включения генератора TMR1.

TMR1CS (Timer 1 clock select) – выбор источника сигнала TMR1.

TMR1H – счетчик TMR1 старший байт.

TMR1L - счетчик TMR1 младший байт.

T1IE (Timer 1 interrupt enable; PIE) – бит разрешения прерывания от TMR1.

TMR1IF (Timer 1 interrupt flag; PIR) - флаг разрешения прерываний от TMR1.

TMR1ON (Timer 1 ON: T1CON[0]) – бит включения TMR1.

-TO (Watching timer out) – флаг тайм аута  сторожевого таймера.

W (Working register) – рабочий регистр.


Список литературы 

1. Сайт в Internet www.microchip.ru.

2.  Погребинский М.П. Микропроцессорные системы управления электротехническими установками. –М.: МЭИ, 2003.

3.Кохц Дитер. Измерение, управление с помощью PIC-контроллеров. -Киев. Наукова думка. 2007.

4. Заец  Н.И. Радиолюбительские конструкции на PIC. –М.: Солон, 2003.

5. Яценков В.С. Микроконтроллеры Microchip. Практическое руководство. – 2 –е изд. исп. и допол. – М.: Горячая линия – Телеком, 2005.

6. Михаэль Хофман. Микроконтроллеры для начинающих. - М.: Горячая линия – Телеком, 2009.

7. Катцен С. PIC микроконтроллеры. Все, что необходимо вам знать. –М.: Додека, 2008.

8. Петров И.В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования/ Под ред. проф. В.П. Дьяконова. – М.: СОЛОН-Пресс, 2004. -256 с.

9. Копесбаева А.А. Микропроцессорные комплексы в системах управления. Конспект лекций. АИЭС. Алматы, 2009.

10.  Копесбаева А.А. Микропроцессорные комплексы в системах управления. Учебное пособие. АИЭС, 2010. -124 с.

11.  Тарасов В.М. Программирование цифровой техники и микроконтроллеров управления. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 5В070200 «Автоматизация и управление» - Алматы: АУЭС, 2012.

 

Содержание

 1 Микроконтроллеры в современном мире

 3

2 Выполнение арифметических операций в МП

6

3 Регистры общего и специального назначения

10

4 Косвенная адресация. Логика. Маскирование

14

5 Маскирование. Стек

18

6 Конвейер и подпрограмма задержки

21

7 Выполнения умножения и деления

24

8 Программирование клавиатуры. Дешифратор.

27

9 Основные элементы цифровой техники

31

10 Структура микроконтроллера, 2-10 система

36

11 Прерывания и сторожевой таймер

40

12 Фактор времени и аналоговый мир

44

Приложение А. Список некоторых сокращений

Список литературы

49

51

 

Св. план 2011 г., поз. 307