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

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

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

 

 

Программирование цифровой техники

и микроконтроллеров управления

Методические указания к выполнению лабораторных работ

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

 

 

Алматы 2012

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

 

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

Иллюстраций - 25, таблиц - 28, библиографий – 9 названий.

 

Рецензенты: канд. техн. наук, доцент Б.С. Джумагалиев  доцент Фадеев В.Б.

 

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

 

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

 

Введение

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

Микроконтроллеры широкого назначения выпускаются зарубежными фирмами: Motorola, Nec Corporation, Siemens, Microchip и другими.

Оборудованию, содержащему МК, присущи важные поло­жительные свойства, по сравнению с аналоговыми устройствами:

-   возможность дистанционного измерения и проверка оборудования с пульта управле­ния оператора;

-   высокая надежность и малое потребление энергии;

-   непрерывная самодиагностика и высокая аппаратная надеж­ность;

-   регистрация и запоминание параметров аварийных режимов;

-   дистанционная передача оператору информации о состоянии и срабатываниях устройств.

Для обучения студентов цифровой технике и программированию микроконтроллеров в университете имеется учебный микропроцессорный комплект УМК-7.  Помимо обучения языку ассемблер на примере МК PIC16F877, студенты знакомятся с внутренней и внешней структурой современных микроконтроллеров.

Предполагается, что студенты освоили дисциплину «Элементы и устройства автоматики», и умеют создавать проект и запускать его на выполнение. В случае необходимости студенты могут обновить знания, прочитав методические указания к лабораторным работам по ЭУА.

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

Требования к отчету.

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

 Лабораторная работа должна быть защищена студентом.

Оборудование и программное обеспечение, необходимое для проведения лабораторных работ: Windows 98 или выше, среда MPLAB, комплект УМК-7.

 

1 Байтовые  и битовые команды. Логика

 

Цель работы: изучение инструкций BSF, BCF, ADDWF, ANDWF IORWF, XORWF, SUBWF для выполнения сложения, вычитания,  и применения логических функций.

 

1.1 Краткие теоретические сведения по теме работы

 

Регистры, применяемые в программе, могут находиться  в разных банках. Номер банка, с которым работает программа, определяется регистром специального назначения (РСН) Status, см. приложение А. Кроме того этот регистр контролирует результат выполнении операций, фиксируя переполнение и обнуление регистров. На основе этого контроля создается ветвление алгоритма [1, 2].

Формат и описание инструкций BSF, BCF, ADDWF, SUBWF, ANDWF, IORWF, XORWF приведены в приложении Б.

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

Выполним сложение 240+4 с десятичными числами (слева) и в двоичной системе справа см. пример а). В примере б) выполнено вычитание 240-128 слева в десятичной системе счисления, справа в двоичной системе. При вычитании в двоичном коде используется вместо вычитания сложение уменьшаемого и вычитаемого, представленного в дополнительном коде:

пример а) 240+4           пример б) 240-128

   240             11110000           240            11110000   

+     4   ®    + 00000100          -128  ®    + 01111111    - инверсия числа 128

   244             11110100           112            101101111   - сумма
                                                               +                1 - дополнительный код

                                                                    01110000  - результат.

Как видно при вычитании было переполнение регистра, поскольку он имеет 8 разрядов. Единица девятого разряда, она выделена жирным шрифтом, будет перенесена в бит С регистра Status. В самом регистре останется только 8 разрядов, которые в десятичной форме дают правильный результат 112. Был также перенос из 3 разряда единицы в 4-й разряд, т.е. из младшего в старший полубайт, поэтому в регистре Status бит DC будет также равен единице.

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

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

Логическая функция ‘И’ (‘AND’) применяется в том случае, если оборудование должно включаться, при срабатывании (включении) двух датчиков одновременно. Например, освещение в помещении автоматически включается при низкой освещенности и наличия в нем людей.

Логическая функция ‘Исключающее ИЛИ’ (‘XOR’) применяется, например, для управления освещением длинного тоннеля. В разных концах тоннеля устанавливаются переключатели Х1 и Х2, имеющие нормально открытый и нормально закрытый контакты. С любого конца тоннеля, изменив положение переключателя, можно включить освещение, если оно было выключено или включить – если оно было включено.

        

Таблица 1.1 –Логические функции Y=f(X1,X2)

 

Инструкция

Таблица истинности

Условное обозначение

 

Интерпретация на электрической схеме

Х1

Х2

Y


IORWF
Функция OR (ИЛИ)

 

0

0

1

1

0

1

0

1

0

1

1

1

 

Х1

                  Y

Х2

              Х1

 

              Х2

 

При замыкании любого контакта в цепи будет ток


ANDWF Функция AND (И)

0

0

1

1

0

1

0

1

0

0

0

1

 

Х1

                  Y

Х2

               X1          X2

 

 

 

Ток в цепи будет только при замыкании обоих контактов


XORWF Функция XOR  (Исключи-
тельно ИЛИ)

0

0

1

1

0

1

0

1

0

1

1

0

 

 

Х1

                   Y

Х2

Ток в цепи будет только тогда, когда переключатели X1 и X2 будут в разном положении

 

1.2 Задания и исходные данные

 

Изучите программу Л1, которая выполняет различные действия с  двумя константами и выводит результаты работы в регистр REZ. Определите, в каких банках находятся применённые регистры. В программе инструкция ORG h’00’ – это указатель для ассемблера, что код, следующий за этим выражением, будет записан, начиная с нулевого адреса электрически программируемого постоянного запоминающего устройства (ЭППЗУ). Указатель EQU от equal (англ.) – равносильный, равный.

Программа Л1.

 

Include <p16F877.inc>; в этом файле описаны символьные имена РСН.

R1       EQU    h'21'; R1 - символьное имя регистра по адресу h’21’.

R2       EQU    h'22'; R2 - символьное имя регистра по адресу h’22’.

R3       EQU    h'23'; R3 - имя регистра по адресу h’23’.

REZ     EQU    h'24'; REZ - имя регистра для записи результатов.

;                 Инструкции для настройки МК

ORG    h'00'; следующая инструкция NOP  будет записана по адресу h’00’.

NOP; пишется для настройки отладчика.

NOP

NOP

ORG    h'05'; следующая инструкция CLRF запишется по адресу h’05’.

CLRF  STATUS; очищаем регистр от мусора, выбираем нулевой банк.

BSF     STATUS, 5; переходим в первый банк в нём регистр TRISC.

CLRF    TRISC; настраиваем все биты PORTC на вывод данных.

BCF  STATUS,  5; возвращаемся в нулевой банк.

;                 Рабочая часть программы. Ввод данных

MOVLW   D'240'; запись константы  в  аккумулятор W.

MOVWF   R1; запись содержимого W в регистр R1.

MOVLW   D'130'; запись константы в аккумулятор W.

MOVWF   R2; запись содержимого W в регистр R2.

MOVLW   D'5'; запись константы в W.

MOVWF   R3; запись содержимого W в регистр R3.

;                 Выполнение вычислений

MOVF   R1, W; запись константы из R1 в регистр W.

SUBWF   R2, W; вычитание W=R2-W=R2- R1.

MOVWF   REZ; переслать содержимое W в регистр REZ.

MOVF   R2, W; запись константы из R2 в регистр W.

ADDWF  R1, W;  W=R2+W=R1+R2.

MOVWF   REZ

MOVF   R2, W; копируем содержимое R2 в W.

SUBWF   R1, W; вычитание W=R1-W=R1-R2. Результат оставляем в W.

MOVWF   REZ; переслать содержимое W в регистр REZ.

MOVF   R2, W; запись константы в регистр W из R2.

ADDWF R3, W; W=R3+W=R2+R3.

MOVWF   REZ

MOVF   R2, W; запись константы в регистр W из R2.

SUBWF R2, W

MOVWF   REZ

MOVF   R2, W; запись константы в регистр W из R2.

ANDWF   R1, W; операция W=R1 AND W(R2), результат в W.

MOVWF   REZ

END; конец программы.

 

Самостоятельно продолжите программу командами для выполнения операций R2+R3, R1 OR R2, R1 XOR R2.

 

Данные для варианта возьмите из таблицы 1.2.

 

 

 

         Т а б л и ц а 1.2 – Варианты заданий

Вариант

Числа R1, R2, R3

Вариант

Числа R1, R2, R3

1

81h, 12h, 1h

6

86h, 67h, 6h

2

82h, 23h, 2h

7

87h, 68h, 7h

3

83h, 34h, 3h

8

88h, 69h, 8h

4

84h, 45h, 4h

9

89h, 6Ah, 9h

5

85h, 56h, 5h

10

8Ah, 6Bh, Ah

 

1.3 Порядок выполнения работы

 

Загрузите MPLAB. На новом листке напишите программу на ассемблере, учитывая регистр и отступы программы, и сохраните её в папке. Создайте новый проект с таким же именем в той же папке, как описано в [3]. Символ «;» обозначает комментарии и последующий текст строки программы не читается компилятором. Перепишите проект в микроконтроллер. Создайте окно наблюдения для всех применяемых в программе регистров в необходимом формате чисел. Выполните программу в ручном, пошаговом режиме. Результаты всех операций с числами запишите в таблицу 1.3. В отчете дополнительно приведите ручной расчет операций сложения и вычитания и укажите их влияние на Status.

Т а б л и ц а 1.3 - Пример записи результатов работы команд

Числа на входе

Действие

Результат в REZ

Значение в Status

Форма B

Форма B или D

Форма B или D

Форма D

Форма B

R1=D’240’

R2=D’130’

R1-R2=240-130

D’110’

-

00011001

R1=D’240’

R2=D’130’

R1+R2=240+130

D’114’

-

00011001

R1=D’240’

R2=D’130’

R2-R1=130-240

D’146’

-

00011010

R2=D’130’

R3=D’5’

R2+R3=130+5

D’135’

-

00011000

R2=D’130’

R2=D’130’

R2-R2130-130

D’0’

-

00011111

R1=D’240’

R2=D’0’

R2-R1=0-240

D’16’

-

00011010

R1=b’11110000’

R2=b10000010

R1 AND R2

-

10000000

00011011

R1=b’11110000’

R2=b10000010

R1 OR R2

-

11110010

00011011

R1=b’11110000’

R2=b10000010

R1 XOR R2

-

01110010

00011011

 

1.4 Контрольные вопросы

 

1.        Как определить с каким банком работает программа?

2.        Что выполняет инструкция ADDWF  R1,  F?

3.        Что выполнят инструкция  SUBWF  R2,  F?

4.        Что выполняет инструкция ANDWF R1,  F?

5.        Что выполняет инструкция IORWF R1,  W?

6.        Что выполняет инструкция XORWF R2,  W?

7.        Приведите инструкции установки и сброса бита.

8.        Назначение директивы ORG h’05.

9.        Приведите таблицы истинности логических операций.

10.   Опишите преимущества МК по сравнению с релейной аппаратурой.

11.   Назначение символа точка с запятой в программе.

12.   В каком банке находятся регистры R1, R2 и REZ.

13.   Какой результат будет при сложении 230+60 в регистре МК?

14.   Какой результат будет при вычитании 130-135 в регистре МК?

15.   Назначение РСН  TRISC и его местонахождение.

16.   Какой адрес у аккумулятора W?

17.   Какое напряжение в PORTC?

 

2 Маскирование. Суммирование массива

 

Цель работы: обучение маскированию данных. Создание алгоритма и программы суммирования массива.

 

2.1 Краткие теоретические сведения по теме работы

 

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

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

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

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

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

 

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

 

 

Объекты

Операция

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

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

XOR (инверсия с 4 по 7 бит)

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

Число

10101010

10101010

10101010

11011101

Маска

11110000

11110000

11110000

11011101

Результат

11111010

10100000

01011010

00000000

Циклические структуры организуются с помощью операторов условий совместно с оператором перехода.

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

 

Т а б л и ц а 2.2

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

BTFSS  STATUS, C    

GOTO METKA

MOVWF  R2

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

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

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

BTFSS  STATUS, Z

MOVF  R2, W

MOVWF  PORTC

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

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

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

В предыдущих лабораторных работах мы применяли абсолютную адресацию, при этом адрес регистра записывается непосредственно в инструкцию. В этой лабораторной работе будем применять косвенную адресацию, при которой в инструкцию записывается указатель адреса, который может меняться в процессе выполнения программы [1, 2, 3].

 

2.2 Задания и исходные данные

 

Изучите способы организации программ с косвенной адресацией на примере приведённой блок-схемы и приведенных ниже фрагментов программы Л2. Регистр FSR, который является просто указателем, хранит адрес ячейки, к которой происходит обращение через имя формально существующего регистра INDF.

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

Блок-схема алгоритма суммирования массива и нахождения среднего приведена на рисунке 2.1. В ней предполагается, в массив данные уже записаны.

Символьные имена регистров массива показаны на рисунке 2.2.

Рисунок 2.1 – Блок-схема

 

Фрагменты программы суммирования массива Л2.

Include<p16f877.inc>
EL_MAS_0   EQU h'40'; нулевой элемент массива.

EL_MAS_1   EQU h'41'; первый элемент массива.

EL_MAS_2   EQU h'42'; второй элемент массива.

EL_MAS_3   EQU h'43'; третий элемент массива.

IND_EL_MAS  EQU h'50'; для записи индекса добавляемого элемента массива.

SHAG   EQU  h'22'; шаг изменения данных.

KOL_EL          EQU h'44'; регистр для хранения количества элементов массива.

SUM  EQU h'51'; регистр для хранения суммы.

SREDNEE  EQU   h'52'; регистр для хранения среднего расхода энергии.

;        Стандартные операции настройки МК пропущены.

;                           Заполнение массива с шагом 2

         MOVLW  D'2'

            MOVWF  SHAG

            MOVLW D'11'

            MOVWF  EL_MAS_0

            ADDWF  SHAG, W; W= EL_MAS_0+SHAG

            MOVWF  EL_MAS_1

            ADDWF  SHAG, W;  W= EL_MAS_1+SHAG

            MOVWF  EL_MAS_2

            ADDWF  SHAG, W;  W= EL_MAS_2+SHAG

            MOVWF  EL_MAS_3

            CLRF  SUM

            CLRF  IND_EL_MAS

            MOVLW  D'4'; количество элементов массива.

            MOVWF  KOL_EL

            MOVLW  EL_MAS_0; запись адреса регистра EL_MAS_0.

            MOVWF  FSR; запись в регистр FSR адреса нулевого регистра массива.

NEXT_ELEM 

            MOVF  SUM, W

            ADDWF  INDF, W; сложить W и текущий элемент массива.

            MOVWF  SUM; запоминаем полученную сумму.

;                           Подготовка к следующему циклу

         INCF  FSR, F; переход к адресу следующего регистра массива.

            INCF  IND_EL_MAS, F; фиксируем индекс следующего элемента.

            MOVF KOL_EL, W

            XORWF  IND_EL_MAS, W; проверяем индекс        элемента равен 4?

            BTFSS STATUS,  Z; проверка: все элементы суммировали (Z=1)?

            GOTO    NEXT_ELEM; только если Z =0, повторяем цикл.

,;                      Подготовка вычисления среднего значения

            MOVF SUM, W;   если Z=1, все элементы сложили, запоминаем сумму.

            MOVWF  SREDNEE; копируем SUM в  SREDNEE.

            . . . .

            END

         Напишите самостоятельно команды деления на 4 с помощью двух сдвигов вправо командой RRF регистра SREDNEE, см. таблицу 2.3. Не забывайте обнулять бит Carry перед сдвигом.

Количество повторений  в цикле определяется следующим образом. Сначала записывается количество элементов в регистр Kol_El. Затем при каждом повторе цикла, увеличиваем индекс элемента в регистре и проверяем, получен ли ноль командой XORWF  IND_EL_MAS, W, здесь W= Kol_El. Поскольку регистр с индексом 4 будет лишним, выходим из цикла.

 

3.3 Порядок выполнения работы

 

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

Рисунок 2.2 – Окно наблюдения

 

 

Выполняя программу в пошаговом режиме, заполните таблицу 2.3.

 

         Т а б л и ц а  2.3– Сумма массива и среднее массива

Вариант

Адрес регистра массива, указываемый в FSR

Число в регистре массива

Сумма в регистре W или  значение  регистра SREDNEE

Индекс регистра

Форма h

Форма D

Форма В

11

1

40h

D ‘11’

11

00001011

11

2

41h

D ‘13’

24

00011000

11

3

42h

D ‘15’

39

00100111

11

4

43h

D ‘17’

56

00111000

Сдвигая регистр SREDNEE вправо, делим 56 на 2

28

00011100

Сдвигая регистр SREDNEE еще раз вправо, делим 56 на 4.

14

00001110

         Т а б л и ц а 2.4 – Варианты заданий

Вариант

Значение первого регистра

Адреса регистров массива

Вариант

Значение первого регистра

Адреса регистров массива

1

D’21’

21h – 24h

6

D’26’

26h – 29

2

D’22’

22h – 25h

7

D’27’

27h – 30h

3

D’23’

23h - 26h

8

D’28’

28h – 31h

4

D’24’

24h - 27h

9

D’29’

29h – 32h

5

D’25’

 25h - 28h

10

D’30’

30h – 33h

П р и м е ч а н и е – Шаг заполнения массива примите равным двум.

 

2.4 Контрольные вопросы

 

1.  Какие биты Status меняют свои значения при операциях вычислений?

2.   Поясните команду условного перехода BTFSS STATUSZ.

3.  Как можно определить равенство чисел?

4.  Какие способы адресации вы знаете?

5.  Как контролируется в цикле выход за пределы массива?

6.  Назначение регистра FSR.

7.  Назначение регистра INDF.

8.     Назначение символа точка с запятой в программе.

9.  Зачем очищается регистр SUM перед циклом сложения?

10. Какое участие принимает бит C регистра Status в операции сдвига?

11. Как очистить нечетные разряды регистра?

12. Как установить  в разряды регистра единицы?

13. Зачем применяют логическую функцию Исключительно ИЛИ?

14. Приведите таблицы истинности для AND, OR, XOR.

15. Какой адрес у аккумулятора W?

 

3 Автоматизация окрасочной камеры. Подпрограммы

 

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

 

1.1 Краткие теоретические сведения по теме работы

 

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

Подпись:  Рисунок 3.1 – Блок-схемаОтсчет времени можно организовать с помощью подпрограмм со счетчиками, что и реализовано в алгоритме, показанном на рисунке 3.1. Вся работа подпрограммы сводится к уменьшению значений всех счетчиков до нуля, на что тратится определенное время. Длительность времени задержки определяется начальной величиной счетчиков и временем выполнения инструкций подпрограммы в МК.

Время задержки примерно определяется  произведением счётчиков на длительность машинного цикла выполнения команды Sch_out×Sch_in×Tm.

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

Подпрограммы пишут после инструкции GOTO$ основной программы. Подпрограмма из основной программы вызывается по имени. Значение аккумулятора W является аргументом для подпрограммы Timer. После завершения ее работы управление передается в главную программу на следующую инструкцию после вызова Timer [1, 2, 4].

 

2.2 Задания и исходные данные

 

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

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

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

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

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

- пауза в 1 секунду для замены заготовки в камере;

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

На рисунке 3.2 показана схема подключения оборудования к битам регистра PORTC.

 

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

 

На рисунке 3.3 показана временная диаграмма работы окрасочной камеры.

Рисунок 3.3 – Временная диаграмма работы окрасочной камеры

 

Фрагменты программы Л3 для автоматизации окрасочной камеры.

include<p16F877.inc>; файл с описанием имен РСН.

;           Описание символьных имен регистров общего назначения

Sch_in      EQU  H'22'; счетчик внутреннего цикла задержки.

Sch_out    EQU  H'24' ; счетчик внешнего цикла задержки.

Sch3         EQU  H'23' ; счетчик третьего цикла задержки.

         Инструкции стандартной настройки МК опущены.

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

            MOVLW   B'10000000'

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

Sled_det          BSF  PORTC, 0; включаем звуковую сигнализацию S1.

MOVLW d’40’; W задаем время таймера. При отладке принять d’2’.

CALL Timer

MOVLW   B’10001110’

MOVWF   PORTC; выключаем S1, включаем D1, D2 и L1.

MOVLW d’60’; задаем время окраски.

CALL Timer

BCF  PORTC, 2; выключаем D1, продолжают работать D2, L1 и L2.

MOVLW d’40’; задаем время работы D2 и L1.

CALL Timer

            MOVLW   B'10000000'

MOVWF   PORTC; окраска закончена, сигнализация L2 работает.

MOVLW d’20’; задаем время для замены заготовки.

CALL Timer

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

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

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

MOVWF  Sch3; значение W является аргументом для подпрограммы.

M3    MOVLW   D'150'

MOVWF  Sch_out; устанавливаем значение внешнего счетчика.

M_out; метка внешнего счетчика.

MOVLW   D’255';

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

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

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

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

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

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

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

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

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

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

GOTO   M3; инструкция срабатывает только при Z=0.

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

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

 

3.2 Задания и исходные данные

 

Разработайте программу, включающую и выключающую оборудование на заданное время, согласно варианту задания из таблицы 3.1. Измените предыдущую программу вашего проекта.

 

         Т а б л и ц а 3.1 – Варианты  заданий

Вариант

Биты подключения S1, D1, D2
 
L1, L2.

Время работы, сек

Вариант

Биты подключения S1, D1, D2
 
L1, L2.

Время работы, сек

S1

D1

D2

S1

D1

D2

1

1, 2, 3, 4, 5

5

6

3

6

6, 7, 0, 1, 2

6

6

4

2

2, 3, 4, 5, 6

6

7

4

7

7, 0, 1, 2, 3

7

7

5

3

3, 4, 5, 6, 7

7

6

5

8

0 ,1 ,2 ,3, 4

8

6

6

4

4, 5, 6, 7, 0

8

5

6

9

1, 3, 5, 7, 0

9

5

7

5

5, 6, 7, 0, 1

9

7

7

10

2, 4, 6, 0, 1

10

6

3

 

3.3 Выполнение задания

 

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

Выполнение отладки программы. Оставьте только первый вызов подпрограммы Timer, установив аргумент W=2. Остальные вызовы выключите, напечатав перед инструкциями Call символ «;». Установите значения для счетчиков Sch_in и Sch_out равные 2. Введите разработанную программу  в микроконтроллер. После отладки программы в пошаговом режиме, восстановите первоначальные значения аргумента W, счетчиков Sch_in и Sch_out и запустите ее в автоматическом режиме. Рассчитайте значение W для заданного времени работы оборудования по варианту методом пропорций, если известно, что при W=20 время задержки равно 1 секунде. Для уточнения времени задержки  можно добавить в циклы дополнительные бесполезные инструкции NOP, которые ничего не делают, но требуют время на свое выполнение.

 

         Т а б л и ц а  3.2– Результаты настройки циклов задержки

 

 

Вариант

 

 

Оборудование

Параметры подпрограммы Timer

Время работы, сек

Значение счетчиков

Sch_in

Sch_out

Sch3

 

S1

 

 

 

 

 

D1, D2, L1

 

 

 

 

 

D2, L1

 

 

 

 

 

Внимание! Обязательно сохраните подпрограмму Timer в папке «Мои документы», поскольку она будет применяться в следующих работах.

Результаты занесите в таблицу 3.2. Продемонстрируйте работу программы преподавателю.

 

3.4 Контрольные вопросы

 

1.   Почему создан третий цикл в подпрограмме Timer?

2.   Назначение подпрограмм.

3.   Цикл, вложенный цикл.

4.   Что такое машинный цикл?

5.   За сколько машинных циклов выполняется каждая команда в Timer?

6.   Почему в Timer выбраны указанные значения Sch_in и Sch_out?

7.   Как вызывается подпрограмма на выполнение?

8.   Опишите работу инструкции DECF  Sch_outF.

9.   Приведите формулу для расчета времени задержки.

10.       Как разделяются главная программа и подпрограммы?

11.       Какими операторами начинается и заканчивается  подпрограмма?

12.       Как выполняется отладка подпрограммы Timer?

13.       Что является аргументом для подпрограммы Timer?

 

4 Умножение и деление

 

Цель работы: изучить алгоритмы выполнения умножения и деления. Научиться сравнивать числа и выполнять ветвление алгоритма.

 

4.2  Краткие теоретические сведения по теме работы

 

Инструкции условных переходов BTFSC и BTFSS проверяют состояние заданного бита в любом регистре, см. таблицу 2.2 второй лабораторной работы. Основываясь на этих инструкциях, создают циклические алгоритмы для умножения и деления.

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

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

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

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

 

         Т а б л и ц а 4.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+25+25+25+25+25+25+25+25+25=250.

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

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

 

4.2 Задания и исходные данные

 

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

 

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

Цикл

Частное

Рабочий регистр

Действие

Рабочий регистр

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

С=0?

Действие

1

1

35

Rab_peg= Rab_peg- Delitel

25

1

Нет

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

2

2

25

15

1

Нет

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

3

3

15

5

1

Нет

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

4

4

5

-5

0

Да

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

 

3

5

 

 

 

 

Остаток=5

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

 

Фрагменты программы деления и умножения Л4.

Примененные регистры общего назначения показаны на рисунке 4.2. Стандартная настройка микроконтроллера  опущена.

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

 

         CLRF  PORTC; записать в PORTC нули (потушить светодиоды).

            CLRF Delitel; очищаем делитель.

;                                     Умножаем 6×0,8=6×4/5=4(4)

         MOVLW D'6'

            MOVWF Chislo; заданное число

            MOVWF Umn_Chislo; регистр, из подпрограммы Umnozhenie.

            MOVLW D'4'

            MOVWF Mnozh; множитель.

            MOVLW D'5'

            CALL  Umnozhenie; в результате получим произведение в регистре Pr.

;                                     Подготовка к делению

         Movf Pr, W; значение Pr получено в подпрограмме Umnozhenie.

            Movwf  Delimoe

            Movlw  D'5'

            movwf Delitel; если не дать значение будет деление на ноль.

            CALL Delenie

            Goto$

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

            Clrf  Pr

            Clrf  Kol_slag

Sled_slag

            Movf 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

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

            RETURN

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

            CLRF  Chastnoe

            Movf  Delimoe, W;

            MOVWF  Rab_peg; записали Delimoe в рабочий регистр.

            MOVF  Delitel, W; проверка на нуль.

            BTFSC  STATUS, Z; защита от деления на нуль.

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

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

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

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

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

;                                              Возврат на один шаг

            DECF  Chastnoe, F; восстанавливаем частное.

            ADDWF  Rab_peg, W; восстанавливаем Rab_peg.

            MOVWF  Ostatok; получаем остаток.

            RETURN

NUL     MOVLW  D'255'; метка завершения программы при делении на ноль.

            MOVWF  PORTC; сигнализируем о попытке деления на нуль.

            END

 

5.2           Порядок выполнения работы

 

Задание на лабораторную работу. Напишите программу умножения на дробное число для варианта из таблицы 4.4.

 

         Таблица 4.4– Варианты заданий

Вариант

Коэффициент

Число

Вариант

Коэффициент

Число

1

1,33

62

6

6,33

12

2

2,33

35

7

7,33

11

3

3,33

22

8

8,33

10

4

4,33

17

9

9,33

9

5

5,33

14

10

10,33

8

 

 

 

Рисунок 4.2 – Окно наблюдения

Создайте окно наблюдения для всех регистров в необходимом формате чисел и приведите в отчете по лабораторной работе. Чтобы быстро получить данные в окне наблюдения запустите составленную программу в автоматическом режиме (кнопка F9). После её выполнения нужно нажать кнопку F5, чтобы установились значения регистров в окне наблюдения.

 

Результаты работы запишите в таблицу 4.5

 

Таблица 4.5 Вариант 11. Результаты умножения на 0,8.

Коэффициент

Число

Множитель

Делитель

Результат

Остаток

Точность

0,8

6

4

5

4

4

83,3%

 

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

 

5.2           Контрольные вопросы

 

1.  Поясните команду условного перехода BTFSC STATUS, C.

2.  Поясните команду условного перехода DECFSZ R3, F.

3.  Расскажите об алгоритме умножения на целое число.

4.  Какой логической операцией можно определить равенство чисел?

5.  Расскажите об алгоритме деления на целое число.

6.  Расскажите об алгоритме умножения на дробное число.

7.  Как контролируется отрицательный результат вычитания?

8.  Как контролируется нулевой результат вычитания?

9.     Какой результат будет при умножении 26 на 10 в регистре МИКРОКОНТРОЛЛЕР?

10.  Умножить 4 на 0,8 можно двумя способами: 4×4/5 или 4/5×4. Будут ли результаты одинаковы?

11.   Поясните инструкцию условного перехода BTFSS  STATUSZ.

12.   Как можно определить равенство чисел?

13.   Когда флаги  Z и C  регистра Status одновременно равны нулю?

14.   Как выполняется сравнение чисел?

 

5 Регулирование расхода газа

 

Цель работы: закрепление навыков организации условных переходов. Написание программы регулирования расхода газа с помощью исполнительного механизма МЭО вращающего заслонку на трубе.

 

5.1 Краткие теоретические сведения по теме работы

 

На производстве газ подается под давлением в технологическую установку. Давление в трубе меняется, но требуется поддерживать постоянный расход газа. Давление газа P, после заслонки измеряется датчиком, и данные пересылаются в МИКРОКОНТРОЛЛЕР. Расход газа (объем) определяется по формуле V=K×SQRT(P). Здесь K коэффициент, зависящий от свойств газа. Чтобы при понижении давления поддержать постоянный расход газа Vраб, необходимо приоткрыть заслонку (направление «Bolshe») на трубопроводе с помощью исполнительного механизма МЭО. Подача импульса на МЭО длится одну – две секунды. При увеличении давления заслонка прикрывается (направление «Menshe»), уменьшая тем самым подачу газа. Эти действия  выполняются подачей разно полярных импульсов на МЭО. Через небольшой промежуток времени повторно измеряется давление, и повторяется корректировка подачи газа, тем самым достигается достаточно постоянный расход газа.

Для упрощения вычислений ограничимся целочисленными значениями квадратного корня с некоторым избытком от действительного значения корня. Для вычисления корня применим алгоритм возведения целого числа N в квадрат  с помощью ряда:

N2=1+3+5+7+9…Количество слагаемых равно числу N.

Для  N=5 получаем  52=1+3+5+7+9=25.

Если задано давление 30, то мы будем накапливать сумму, добавляя слагаемые до тех пор, пока сумма не будет больше 30. То есть целочисленное значение корня примем равным 6. Допустим K=4, тогда расход газа V=6×4=24. Если был задан расход 20, то заслонку следует слегка закрыть направление «Menshe». Если был задан расход 28, то заслонку следует слегка приоткрыть направление «Bolshe» [1, 2, 3, 4].

 

5.2 Задания и исходные данные

 

Сигнал для прикрытия заслонки будем подавать на МЭО через нулевой разряд PORTC. Сигнал на увеличения открытия заслонки через первый разряд PORTC. Этот фрагмент оформим в виде подпрограммы. При этом используем особенности кодировки латинских букв «В» и «М» в 0 и 1 разрядах для управления вращением МЭО. Буква «В» имеет 1 в первом разряде, а буква «М» имеет 1 в нулевом разряде. 

Фрагменты программы регулирования расхода газа Л5.Стандартная настройка МИКРОКОНТРОЛЛЕР опущена.

;        Ввод данных в регистры SHAG, DAVLENIE, FAKT_RASKHOD

         MOVLW  D'2'

            MOVWF  SHAG; шаг изменения слагаемых.

            MOVLW D'14'

            MOVWF TREB_RASKHOD; требуемый расход газа.

            MOVLW D'8'; значение давления газа.

            MOVWF DAVLENIE; задаем давление газа.

            MOVWF CHISLO; для подпрограммы SQRT.

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

         CLRF  NAPRAV_MEO

            CLRF FAKT_RASKHOD

            CLRF PORTC

            CALL  SQRT; вычисляем корень с избытком.

            CALL VYCH_OB’EM; вычисляем объем.

            CALL  MEO; выполняем управлением МЕО.

            GOTO$

SQRT; подпрограмма вычисления корня. Вход – CHISLO, выход – KOREN.

            MOVLW D'1'

            MOVWF SLAGAEMOE; задаем первое слагаемое равное 1.

            MOVWF  SUM; сумма также равна 1.

            MOVWF KOL_SLAG; количество слагаемых также равно 1.

Sled_slag  INCF KOL_SLAG, F; отмечаем увеличение количества слагаемых.

            MOVF SLAGAEMOE, W

            ADDWF  SHAG, W; вычисляем значение очередного слагаемого.

            MOVWF SLAGAEMOE; запоминаем новое слагаемое.

            ADDWF  SUM, W; W= SLAGAEMOE+W

            MOVWF SUM; запоминаем новую сумму слагаемых.

;                           Подготовка к следующему циклу

         SUBWF CHISLO, W;

            BTFSC STATUS,  C; определяем, что больше CHISLO или SUM.

            GOTO  Sled_slag; выполняется только при С=1, повторяя цикл.

            MOVF KOL_SLAG, W; при C=0 выходим из цикла.

            MOVWF  KOREN; фиксируем корень с избытком.

            RETURN

VYCH_OB’EM; подпрограмма вычисления объема газа при K=4 V=4×KOREN.

            MOVF   KOREN , W; вход – KOREN, выход - FAKT_RASKHOD.

            MOVWF  FAKT_RASKHOD

            BCF STATUS, C

            RLF  FAKT_RASKHOD, F; умножаем на два.

            BCF  STATUS, C

            RLF FAKT_RASKHOD, F; ещё раз умножаем на два.

            RETURN

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

            MOVF TREB_RASKHOD, W; требуемый расход  пересылаем в W.

            SUBWF  FAKT_RASKHOD, W; W= Fakt_Raskhod - Treb_Raskhod.

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

            BTFSS  STATUS, C; C = 1?

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

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

            ANDLW  b'00000011'; маской обнуляем ненужные для МЭО разряды.

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

            RETURN

Timer; подпрограмма Timer не приведена.

            END

 

5.3 Порядок выполнения работы

 

РОН, примененные для хранения данных, показаны на рисунках 5.1 и 5.2. Окна наблюдения приведены при недостаточном и избыточном расходе.

 

Рисунок 5.1 – Увеличить подачу газа

Рисунок 5.2 – Уменьшить подачу

 

В таблице 5.1 приведены задания на оценку «отлично».

В таблице 5.2 приведены задания на оценку «хорошо».

 

Таблица 5.1 – Варианты заданий с дробным коэффициентом.

Вари-ант

Коэф.К

Давле-ние P1

Давле-ние P2

Требуемый расход

Вари-ант

Коэф.К

Давл-ение P1

Давле-ние P2

Требуемый расход

1

1,33

8

12

5

6

6,33

18

26

35

2

2,33

10

22

11

7

7,33

20

26

40

3

3,33

12

24

15

8

8,33

22

26

46

4

4,33

14

20

20

9

9,33

24

26

51

5

5,33

16

18

24

10

10,33

26

38

67

П р и м е ч а н и е - Выполнить программу для двух значений давления газа P1 и P2

 

Таблица 5.2 – Варианты заданий для целого K=4.

Вариант

Давление P1

Давление P2

Требуемый расход

Вариант

Давление P1

Давление P2

Требуемый расход

1

8

12

14

6

18

26

22

2

10

22

18

7

20

26

22

3

12

24

18

8

22

26

22

4

14

20

18

9

24

26

22

5

16

18

18

10

26

38

26

П р и м е ч а н и е - Выполнить программу для двух значений давления газа P1 и P2

 

Созданный проект выполняется дважды при Р1 и Р2 в автоматическом режиме. Каждый раз при нажатии на кнопку F5 значения регистров в окне устанавливаются. Рисунки окон привести в отчете.

 

5.4 Контрольные вопросы

 

1.     Назначение подпрограмм.

2.     Вызов подпрограммы. Что она передает в главную программу.

3.     Где и как записываются подпрограммы?

4.     Работа счетчика команд при вызове подпрограммы и ее завершении?

5.     Алгоритм возведения целых чисел в квадрат.

6.     Как вычисляется приближенное, целочисленное значение корня?

7.     Назначение МЭО. Как он работает?

8.     В каких случаях флаг Z равен единице при вычитании?

9.     В каких случаях флаг С  равен единице при вычитании?

10.  Когда флаги  Z и С  регистра Status одновременно равны нулю?

11.  Как выполняется сравнение чисел?

12.  Как используются кодировки латинских букв «В» и «М»?

 

6 Программирование клавиатуры

 

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

 

6.1 Краткие теоретические сведения по теме работы

 

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

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

Разряды RD7, RD6, RD5, RD4 предназначены для подачи сигнала ‘1’. Остальные для приема сигнала. В разряде RD0 по заводской схеме всегда записана «1». На рисунке 6.1 приведена, в качестве примера, монтажная схема подключения кнопки с цифрой «1» к PORTD. Одна клемма кнопки «1» подключена к выводу RD7, а вторая клемма кнопки подключена к выводу RD3. Бит RD7 должен быть запрограммирован на вывод, а бит RD3 - на ввод. Когда кнопка нажата, с бита RD7 проходит сигнал через кнопку «1» на клемму RD3 [1, 2, 3].

 

 

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

«5» - Кнопка Pusk1 на пульте;

«6» - Кнопка Pusk2 по месту;

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

«9» - Кнопка Stop2 по месту.

Рисунок 6.1 – Схема подключения клавиатуры и роль кнопок

 

6.2 Задания и исходные данные

 

Задание на проектирование. В программе автоматизации окрасочной камеры по лабораторной работе №3, предусмотреть запуск камеры для окрашивания каждой детали кнопками «Пуск» и  останов камеры кнопками «Стоп» по месту и с пульта оператора.

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

Фрагменты программы Л6. Программа пишется на основе лабораторной работой 3. Добавленные команды по сравнению с лабораторной работой 3, выделены курсивом.

 

;                  Инструкции для настройки PORTD на ввод/вывод

         CLRF  TRISC

            MOVLW  b'00001111'; настраиваем PORTD.

            MOVWF  TRISD; настраиваем биты 0-3 на ввод, 4-7 на вывод.

            BCF  STATUS,  5

            CLRF  PORTC

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

         MOVLW   B'11110000'

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

            MOVLW   B'10000000'

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

Sled_det          BTFSS  PORTD,  2; проверяем кнопка Pusk1(2) нажата?

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

            BSF  PORTC, 0; если нажата включаем звуковую сигнализацию S1.

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

            CALL Timer

            MOVLW   B'10001110'

            MOVWF   PORTC; включаем двигатели D1 и D2, сигнализацию L1.

            MOVLW d'60'; задаем время работы D1.

            CALL Timer

            BCF  PORTC, 2; выключаем D1, продолжают работать D2, L1 и L2.

            MOVLW d'20'; задаем время работы вентилятора и L1.

            CALL Timer

MOVLW  B'10000000'

MOVWF  PORTC; выключаем вентилятор D2 и сигнализацию L1.

MOVLW d’20’; задаем время для замены заготовки.

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; конец текста всей программы.

 

 

 

6.3 Порядок выполнения работы

 

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

 

Т а б л и ц а 6.1 – Варианты  заданий

Вариант

Биты подключения S1, D1, D2
 
L1, L2.

Кнопка Pusk

Кнопка Stop

Вариант

Биты подключения S1, D1, D2
 
L1, L2.

Кнопка Pusk

Кнопка Stop

1

1, 2, 3, 4, 5

1или 2

5 или 6

6

6, 7, 0, 1, 2

6 или 7

9 или 0

2

2, 3, 4, 5, 6

2 или 3

6 или 7

7

7, 0, 1, 2, 3

7 или 8

3 или 4

3

3, 4, 5, 6, 7

3 или 4

7 или 8

8

0 ,1 ,2 ,3, 4

8 или 6

4 или 2

4

4, 5, 6, 7, 0

4 или 2

6 или 8

9

1, 3, 5, 7, 0

9 или 0

2 или 3

5

5, 6, 7, 0, 1

5 или 6

1или 2

10

2, 4, 6, 0, 1

0 или 9

7 или 6

 

Время работы S1, D1, D2, L1 и L2 и биты их подключения к PORTC принять как в лабораторной работе 3.

Продемонстрируйте работу программы преподавателю.

 

6.4 Контрольные вопросы

 

1.        Расскажите, какую реальную задачу решает ваша программа

2.        Назначение клавиатуры.

3.        Зачем разряды PORTD настраивают на ввод и на вывод?

4.        Как инициализируется PORTD?

5.        Как проверяется нажатие кнопки клавиатуры?

6.        Почему каждая кнопка клавиатуры не имеет отдельной клеммы?

7.        Что выполняет инструкция BTFSS PORTD,  2?

8.        Что выполняет инструкция BTFSC PORTD,  2?

9.        Как подключить кнопки «7» и «5» параллельно?

10.   Что записано в файле p16F877.inc?

11.   Назначение сигнализации окрасочной камеры.

12.   Можно ли кнопку Stop разместить вне подпрограммы Timer.

 

7 Автоматизация упаковки. Генерация звука

 

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

 

7.1 Краткие теоретические сведения по теме работы

 

Перед запуском технологического оборудования всегда включается предупреждающая прерывистая звуковая или мигающая световая сигнализация. Это оборудование, как и всё остальное оборудование, подключается к битам PORTC. Согласно временной диаграмме, показанной на рисунке 7.1, одновременно со звуковой сигнализацией S1 горит лампочка L2. Следовательно, на нулевой бит необходимо подавать пульсирующее напряжение, а на первый бит постоянное.

 

Рисунок 7.1 – Временная диаграмма работы упаковщика

 

Чтобы не писать дополнительную подпрограмму, пульсирующее напряжение будем создавать, инвертируя нулевой бит PORTC через определённое время во внешнем цикле подпрограммы Timer из третьей лабораторной работы. Это можно выполнить с помощью логической операции Исключительно ИЛИ. В регистре Inver_Bit будем записывать номер инвертируемого бита, поскольку сирена подключена к нулевому биту, то Inver_Bit=h’01’.

 

Программа должна выполнять следующий алгоритм:

Inver_Bit=h’01’; указываем, что будем инвертировать нулевой бит.

_PORTC= PORTC; запоминаем состояние PORTC в регистре _ PORTC.

W=d’40’; задаём время сигнализации.

Call Timer; вызываем подпрограмму.

PORTC=_ PORTC; возвращаем в PORTC, сохранённое значение.

Inver_Bit=h’00’; запрещаем инвертирование бит PORTC.

 

Блок – схема изменённой части подпрограммы Timer показана на рисунке 7.2, справа даны пояснения.

 

Здесь W=h’00’ - маска для логической операции XOR. Приравнивая её нулю, предполагаем, что инверсия бит PORTC не нужна.

 

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

 

Если инверсия требуется, то изменяем маску, записывая в неё номера инвертируемых бит.

 

 

Выполняем логическую операцию маски (W) и PORTC. Если в каком-либо разряде маски записана ‘1’, то этот разряд в PORTC будет инвертирован, остальные разряды в PORTC останутся неизменными.

 

Рисунок 7.2 – Подпрограмма Timer

 

7.2 Задания и исходные данные

 

Задание на автоматизацию упаковочной машины. При подаче напряжения на установку включить лампочку L2 на пульте оператора и предупреждающую звуковую сигнализацию S1 по месту. Через 2 секунды выключить сигнализацию S1 и включить конвейер D1.  По конвейеру движутся изоляторы, фотодатчик фиксирует попадание изолятора в коробку. После попадания двух изоляторов включить лампочку L1. После попадания четырех изоляторов включить на две секунды упаковочный механизм D2, заменяющий полную коробку пустой коробкой. Количество упакованных коробок должно быть пересчитано. Фотодатчики имитировать кнопками K5 и K6 клавиатуры.

 

Т а б л и ц а 7.1 – Назначение битов PORTC и контактов клавиатуры

Регистр PORTC

Кнопки клавиатуры

Действия кнопок

0 разряд - предупреждающая звуковая сигнализация S1

5 или 6

Фотодатчики

1 разряд – двигатель  конвейера D1

 

 

2 разряд – двигатель D2 упаковочного механизма

 

 

3 разряд – световая сигнализация L1

 

 

7 разряд – световая сигнализация работы L2 на пульте оператора

 

 

 

Рисунок 7.3 – Окно наблюдения

В приведенной ниже программе отсутствует кнопка Stop, поскольку при таком алгоритме останов можно выполнить только с помощью прерывания.

 

7.3 Порядок выполнения работы

 

Отладка программы. При работе в пошаговом режиме ограничьте работу подпрограммы Timer, оставив только одну действующую команду, записывающую значение W в счетчик Sch3. После отладки программы соедините нулевой бит PORTC с клеммой сирены

На рисунке 7.3 показано окно наблюдения, которое необходимо создать.

Варианты заданий принять из таблицы 7.2.

        

         Т а б л и ц а 7.2 – Варианты заданий

Вариант

Биты подключения оборудования
S1, D1, D2, L1, L2.

Вариант

Биты подключения оборудования
S1, D1, D2, L1, L2.

1

1, 2, 3, 4, 5

6

6, 7, 0, 1, 2

2

2, 3, 4, 5, 6

7

7, 0, 1, 2, 3

3

3, 4, 5, 6, 7

8

0 ,1 ,2 ,3, 4

4

4, 5, 6, 7, 0

9

1, 3, 5, 7, 0

5

5, 6, 7, 0, 1

10

2, 4, 6, 0, 1

 

Фрагменты программы Л7.

include<p16F877.inc>; ниже имена РОН для таймера опущены.

KOL_IZOL   EQU h'45'; регистр, для записи количества изоляторов.

KOL_KOROB  EQU  h'46'; регистр, для хранения количества коробок.

Inver_Bit  EQU  H'47'; регистр, определяющий инвертируемый бит.

_PORTC  EQU  H'48'; регистр, для хранения состояния PORTC.

;        Стандартные операции настройки МК и клавиатуры опущены.

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

CLRF  KOL_KOROB

MOVLW   B'10000001'

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

Команды для включения прерывистого сигнала сирены.

MOVLW b'00000001'

MOVWF Inver_Bit; задаём бит для инвертирования.

MOVF  PORTC, W

MOVWF _PORTC; запоминаем состояние PORTC.

MOVLW d'40'; задаём время работы сирены. При отладке примите d’2’.

CALL Timer

MOVF  _PORTC, W

MOVWF PORTC; восстанавливаем состояние PORTC.

CLRF   Inver_Bit; выключаем сирену при следующих вызовах п/п Timer.

BCF  PORTC, 0; выключаем питание сирены S1.

MOVLW   B'10000010'

M1       MOVWF   PORTC; включаем транспортер D1, L2 продолжает работать.

CLRF  KOL_IZOL

Prov_dat 

BTFSS  PORTD, 2; проверяем срабатывание датчиков (кнопки "5" и "6").

GOTO Prov_dat 

MOVLW D'10'

CALL Timer; убираем дребезг контактов датчиков.

INCF KOL_IZOL, F; фиксируем поступление изолятора в коробку.

MOVLW D'2';

XORWF  KOL_IZOL, W; проверяем, поступило два изолятора?

BTFSC  STATUS, Z; проверяем Z = 0?

BSF  PORTC, 3; только при Z=1, включаем лампочку L1.

MOVLW D'4'; будем проверять поступление четырех изоляторов.

SUBWF  KOL_IZOL, W;  W=KOL_IZOL-4.

BTFSS  STATUS, Z; проверяем Z = 1? (поступили четыре изолятора?)

GOTO Prov_dat; при Z=0, повторяем проверку срабатывания датчика.

MOVLW  b'10000110'; только при Z=1, надо заменить коробку
            ; (включить D2) и выключить сигнализацию L1.

MOVWF  PORTC; пересылаем информацию в PORTC

INCF  KOL_KOROB, F; фиксируем заполнение очередной коробки.

MOVLW  d'50'; время смены коробок.

CALL Timer

MOVLW  b'10000010'; готовимся выключить D2.

GOTO M1;

GOTO$

Timer; Подпрограмма Timer

MOVWF  Sch3; W является аргументом для таймера.

; RETURN; команду включить только при наладке программы.

M3     MOVLW   D'150'

MOVWF  Sch_out; устанавливаем значение внешнего счетчика.

M_out; метка внешнего счетчика.

;                  Инструкции для генерации звука сирены или мигания

MOVLW b'00000000'; предполагаем, что сирену не надо включать.

MOVF  Inver_Bit, F; проверка регистра Inver_Bit на ноль.

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

MOVF  Inver_Bit, W; только при Z=0, будем инвертировать бит для S1.

XORWF PORTC,  F; маской в PORTC инвертируем бит для сирены.

MOVLW   D'255';

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

M_in; метка внутреннего счетчика. Дальнейшие инструкции Timer опущены.

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

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

Покажите работу программы преподавателю.

 

 

7.4 Контрольные вопросы

 

1.     Как задаётся время работы подпрограммы Timer.

2.     Назначение символа «;» в тексте программы?

3.     Порядок отладки программы.

4.     Что имитируют кнопки клавиатуры?

5.     Как устраняется дребезг контактов?

6.     Что такое паразитные наводки?

7.     Почему нельзя поместить кнопку Stop подпрограмму Timer?

8.     Как имитируется работа аварийных датчиков?

9.     Как определяется количество изоляторов равное двум?

10. Как определяется количество изоляторов равное четырем?

11. Как фиксируется заполнение коробки?

 

8 Перевод чисел из 2-й в 2_10 систему

 

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

 

8.1 Краткие теоретические сведения по теме работы

 

Как правило, всегда выполняется индикация состояния технологического процесса на пульт оператора в цифровом или символьном виде. Простейший индикатор цифр имеет семь сегментов. Чтобы вывести числа из МК на такой индикатор их необходимо представить в двоично-десятичной системе счислений. В этой системе в одном регистре могут поместиться две десятичные цифры, каждая из которых будет занимать половину байта. От 00000000 до 10011001 в двоичной системе. Таким образом, в регистр можно записать две десятичные цифры и получить числа от 00 до 99 [2].

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

Блок-схема алгоритма перевода частично приведена на рисунке 8.1.

Рисунок 8.1 – Блок-схема

 

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

 

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

 

Системное представление нашей подпрограммы приведено на рисунке 8.2,а. Входным сигналом в данном случае является 4-битный двоичный код, находя­щийся в рабочем регистре W. Выходным значением, также возвращаемым в W, является соответствующий 7-битный код, необходимый для отображения соответству­ющей цифры (подпрограмма Vyb_Seg). В микро­контроллерах PIC  гарвардская архитектура делает не­возможным использование значений памяти программ в виде данных. Вместо этого таблицы преобра­зования реализуются в виде наборов команд retlw, каждая из которых возвра­щает однобайтную константу, см. подпрограмму Vybor_Seg. Седьмой бит используется для точки.

 

8.2 Задания и исходные данные

 

Применяемые символьные имена регистров показаны на рисунке 8.3.

Рисунок 8.3 – Окно наблюдения

Подпрограмма Vybor_Seg осуществляет выбор­ку строки таблицы, прибавляя число N, передаваемое через рабочий регистр W, к младшему байту счетчика команд (регистр PCL, который расположен по адресу h'02'). Поскольку PCL уже указывает на первую команду retlw с кодом для цифры ‘0’, то после прибавления N он будет указывать на N-ю команду, что нам и требуется.

 

Фрагменты программы Л8.

Стандартные инструкции настройки МК и обнуление регистров опущены.

         MOVLW   b'11101011'; исходное двоичное число.

            MOVWF   CHISLO

            MOVWF Rab_Reg

;                                     Подсчитываем количество сотен

         MOVLW   D'100'

            MOVWF   VYCH; вычитаемое при определении количества сотен.

M_SOT    INCF K_SOT,  F;

            SUBWF   Rab_Reg, F; Rab_Reg= Rab_Reg-100

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

            GOTO   M_SOT; цикл подсчета количества сотен повторяется при С=1.

            ADDWF   Rab_Reg, F; был заем, выполняем возврат назад на один шаг.

            DECF   K_SOT, F       ; восстанавливаем количество сотен.

            MOVLW   D'10'

            MOVWF   VYCH         ; вычитаемое при определении количества десятков.

Подсчёт количества десятков выполняется аналогично подсчету количества сотен. Напишите эту часть программы самостоятельно.

;                           Находим код для индикации количество единиц

         MOVFW   Rab_Reg; рабочий регистр содержит единицы после возврата.

            MOVWF   K_ED; переписываем количество единиц в регистр.

            SWAPF    K_DES, W; перемещаем десятки в старшие разряды.

            ADDWF   K_ED, W; добавляем количество единиц в младшие разряды.

            MOVWF   R_D_ED; регистр теперь содержит десятки и единицы.

            MOVF  K_ED, W; W- аргумент для подпрограммы Vyb_Seg.

            CALL VYBOR_SEG; вызываем подпрограмму с аргументом W.

            MOVWF  Kod_seg_ed; записываем код для индикации единиц.

;                  Аналогично найдите коды для индикации десятков и сотен

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

VYBOR_SEG; подпрограмма, возвращающая код для включения сегментов.

            addwf     PCL, f;           получаем новый адрес в PLC=PCL + W

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

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

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

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

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

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

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

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

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

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

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

            END; конец программы.       

 

Задание. Переведите двоичное число в двоично-десятичное число и определите коды для изображения сотен, десятков и единиц на табло.

        

         Т а б л и ц а 8.1 – Варианты заданий

Вариант

Двоичное число

Вариант

Двоичное число

1

11010011

6

10100110

2

11110010

7

10110001

3

11101001

8

10111100

4

10010000

9

11000111

5

10011011

10

11010010

 

Из рисунка 8.3 видно, что заданное двоичное число b'11101011' содержит 2 сотни, 3 десятка и 5 единиц, то есть равно 235 в десятичной системе счисления. Это число и будет светиться на табло.

 

8.4 Контрольные вопросы

 

1.     Назначение 2-10 системы счисления.

2.     Сколько бит занимает 2-10 число?

3.     Какое максимальное 2-10 число можно записать в регистр?

4.     Как формируются цифры в индикаторе?

5.     Назначение команды addwf PCL, f?

6.     Что вернёт в вызывающую программу подпрограмма VYBOR_SEG, если при её вызове W=h’06’?

7.     С какой целью в программе применена команда Swap?

8.     Объясните алгоритм нахождения сотен.

9.     Какое назначение регистра R_D_ED?

10.  Как определяется, что получилась отрицательная разность?

11.  Как определяется, что получился нулевой результат?

12.  Назначение регистра PCL?

 

9 Таймер TMR1

 

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

 

9.1 Краткие теоретические сведения по теме работы

 

В микроконтроллере существует несколько таймеров-счётчиков. Они применяются для точного измерения интервалов времени, подсчета количества внешних импульсов и прерываний программы. Таймеры-счётчики контролируются регистрами специального назначения [1, 2]. В частности, TRM1 контролируется  регистрами специального назначения PIR1, TICON, INTCON, TMR1, TMR1H, TMR1L, описанные в  приложении В.

 

9.2 Задания и исходные данные

 

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

Временная диаграмма работы камеры показана на рисунке 3.3.

Проработайте блок-схему алгоритма автоматизации работы окрасочной камеры по рисункам 9.1 и 9.2. Ознакомьтесь с фрагментами программы. На её основании создайте программу для своего варианта.

Фрагменты программы Л9. Курсивом отмечены дополнительные команды по сравнению с лабораторной работой 3.

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

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

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

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

;                                     Настройка таймера TMR1

         BSF STATUS, 5

            CLRF TRISC 

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

            BCF STATUS, 5

Рисунок 9.1 - Блок-схема программы    Рисунок 9.2 - Блок-схема п/п Timer2

 

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

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

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

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

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

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

         Рабочая часть программы, совпадающая с программой в лабораторной работе 3, здесь опущена.

         GOTO$

Timer2; Подпрограмма Timer заменяется подпрограммой Timer2 с TMR1.

MOVWF  T_reg

; Return; для выключения Timer2 при отладке главной программы.

M_T_reg; следующие 4 команды только для отладки в режиме F7.

            ; MOVLW D'255'; для отладки Timer2.

            ; MOVWF TMR1H; для отладки Timer2.

            ; MOVLW D'254'; для отладки Timer2.

            ; MOVWF TMR1L; для отладки Timer2.

            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

 

9.3 Порядок выполнения работы

 

Разработайте программу, включающую и выключающую оборудование на заданное время для окрашивания трех деталей, согласно варианту задания из таблицы 9.1.

 

Т а б л и ц а 9.1 – Варианты  заданий

 

Вариант

Биты подключения
S1, D1, D2
 
L1, L2.

Время работы, сек

 

Вариант

Биты подключения
 
S1, D1, D2
 
L1, L2.

Время работы, сек

 

S1

 

D1

 

D2

 

S1

 

D1

 

D2

1

1, 2, 3, 4, 5

5

6

3

6

6, 7, 0, 1, 2

6

6

4

2

2, 3, 4, 5, 6

6

7

4

7

7, 0, 1, 2, 3

7

7

5

3

3, 4, 5, 6, 7

7

6

5

8

0 ,1 ,2 ,3, 4

8

6

6

4

4, 5, 6, 7, 0

8

5

6

9

1, 3, 5, 7, 0

9

5

7

5

5, 6, 7, 0, 1

9

7

7

10

2, 4, 6, 0, 1

10

6

3

 

Результаты занесите в таблицу 9.2.

 

Т а б л и ц а  9.2– Результаты настройки циклов задержки

Вариант

Оборудование

Параметры подпрограммы Timer2

Время, сек

Значение счетчиков

T_reg

TMR1H

TMR1L

 

S1

 

 

 

 

 

D1, D2, L1

 

 

 

 

 

D2, L1

 

 

 

 

 

Отладка программы. Оставьте только первый вызов подпрограммы Timer2, установив аргумент W=2. Установите значения для счетчиков приведенные в подпрограмме с пометкой для отладки. Счетчики TMR1  срабатывают не на каждое нажатие кнопки F7, из-за отсутствия синхронизации. После отладки программы в пошаговом режиме, выключите указанные строки и запустите ее в автоматическом режиме. Настройте заданное время работы установки.

Рисунок 9.1 – Окно наблюдения

 

9.4 Контрольные вопросы

 

1.     Назначение таймера TMR1.

2.     Сколько счетчиков у TMR1?

3.     Как устанавливается максимальное время TRM1?

4.     Какое максимальное число можно записать в счетчики TMR1.

5.     Назначение регистра TICON.

6.     Назначение регистра INTCON.

7.     Назначение регистра PIR1.

8.     Назначение регистра PIE1.

9.     Как задается длительность работы Timer2?

10.  Назначение предделителя.

11.  В каком банке находится регистр PIE1?

12.  Когда появляется флаг, сигнализирующий, что TMR1 переполнен?

13.  Как запускается TMR1?

14.  Назначение регистра T_reg.

15.  Какой будет результат в регистре при сложении 255+1?

 

10 Прерывания

 

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

 

10.1 Краткие теоретические сведения по теме работы

 

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

Фоновая программа в лабораторной работе предназначена для счета высушенных изделий, поступивших по конвейеру. Изделия сушатся нагревателями, подключёнными к PORTC. Прерывания в программе предназначены для учета количества посетителей при прохождении людей через турникет.

Источник внешних прерываний подключается к клемме RB0/INT регистра PORTB. Чтобы произошло прерывание, на эту клемму должен прийти импульс с технологического оборудования и тогда микроконтроллер перезапускается вектором прерывания по адресу h’04’ [1, 2]. В лабораторной работе эта клемма подключается к клемме К3 клавиатуры. Регистр PORTD настраивается таким образом, чтобы при нажатии кнопки клавиатуры, на клемме К3 появился сигнал и имитировал импульс с оборудования.

        

10.2 Задания и исходные данные

 

         Фрагменты программы Л10 «Обработка прерывания от RB0/INT».

         include <p16F877.inc>

SUM                EQU h'50';  счетчик, работающий в фоновой программе.

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

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

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

;        Описание счетчиков для подпрограммы Timer опущено.

         org 0x000; указание компилятору адреса для записи следующей строки.

            GOTO MAIN; вектор сброса записываем по адресу h’000’ ЭППЗУ.

            org 0x004; указание компилятору адреса для записи следующей строки.

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

            NOP

MAIN   NOP; пустая команда для отладчика.

            NOP; устанавливаем курсор на команду CLRF STATUS в режиме F7.

            CLRF STATUS

            BSF STATUS, 5

            CLRF  TRISC

            MOVLW   B'00001111'

            MOVWF  TRISB; настраиваем клемму прерывания RB0 на ввод.

            MOVLW   B'00001111'

            MOVWF  TRISD; настраиваем клавиатуру для имитации прерываний.

            BCF  STATUS, 5

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

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

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

            MOVLW   B'11110001'

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

            CLRF  SUM; очищаем регистр.

M_FON; метка бесконечного цикла фоновой программы.

            MOVLW H'F0'

            MOVWF PORTC; сигнализация работы фоновой программы.

            INCF  SUM, F; периодически увеличиваем регистр SUM.

; следующие четыре команды только для отладки в режиме F7.

         ; MOVLW  D’2’

; XORWF  SUM, W

; BTFSC   STATUS, Z

; CALL   PERS_COUNT; вызываем PERS_COUNT как подпрограмму.

            MOVLW D'20'; определяем время задержки свечения светодиодов.

            CALL Timer

            CLRF PORTC

            MOVLW D'20'; определяем время задержки тушения светодиодов.

            CALL Timer

            GOTO  M_FON

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

Timer; подпрограмма задержки времени Timer не приведена.

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

Работа программы начинается после включения питания или перезапуска микроконтроллера с вектора сброса по адресу h’00’ и согласно записанной там команде GOTO MAIN, управление передается в главную программу. В её начале настраиваются  на вход или выход биты регистров PORTB и PORTD. Затем разрешаются внешние прерывания, и работа самих прерываний, устанавливая биты в РСН (INTCON, INTE и INTCON, GIE). После настройки РСН начинается бесконечный цикл фоновой программы.

При кратковременном нажатии на кнопку «1» клавиатуры на клемму RB0 поступает импульс напряжения, он имитирует прохождение посетителя через турникет и формируется флаг-сообщение внешнего прерывания в бите INTF регистра INTCON. По этому флагу работа фоновой программы прерывается, и управление передается на вектор прерываний по адресу h’004’, где находится команда безусловного перехода goto PERS_COUNT на подпрограмму обработчика прерываний.

В обработчике прерываний сразу запрещаем внешние прерывания, чтобы защититься от дребезга контактов кнопки, который может вызвать дополнительные ложные прерывания. Затем сбрасываем флаг - сообщение, что поступил сигнал внешнего прерывания командой BCF INTCON, INTE. Если этого не сделать,  прерывания будут выполняться бесконечно, и не будет возврата в фоновую программу. Запоминаем значение регистра W в регистре _WORK и значение регистра  Status в регистре _STATUS. Далее выполняется обработка события, в нашем случае увеличивается значение регистра EVENT, контролирующего количество посетителей.

В конце своей работы обработчик восстанавливает значения РСН W и  Status, чтобы фоновая программа правильно продолжила свою работу, поскольку значения этих регистров могли измениться при работе обработчика. Восстановление выполняется с помощью команды SWAPF, так как эта команда не влияет на РСН Status. Снова разрешаем работу обработчика прерываний командой BSF INTCON, INTE и возвращаемся в фоновую программу по команде RETFIE.

Отметим, что на одно нажатие кнопки клавиатуры возможно увеличение регистра EVENT более чем на единицу. Это объясняется тем, что проводник, соединяющий вывод клавиатуры  и клемму RB0, не экранирован.

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

 

10.3 Порядок выполнения работы

 

Напишите программу для варианта из таблицы 10.1. Теоретически рассчитайте время задержки, учитывая, что частота работы микроконтроллера  12 МГц.

         Особенности работы с программой:

а) При отладке программы в пошаговом режиме прерывания не происходят, поэтому при отладке программы обработчик прерываний вызываем как обыкновенную подпрограмму. Вызов подпрограммы Timer следует отключить. Обработчик прерываний следует  вызывать из главной программы при значении регистра Sum=2. Для этого в фоновой программе требуется включить команды, помеченные символом «точка с запятой», см. листинг программы. После отладки их необходимо выключить.

         б) Дребезг контактов кнопки может вызвать дополнительные прерывания. Это устраняется запрещением прерываний в обработчике.

         в) Отлаженная программа запускается в автоматическом режиме. После выполнения нескольких прерываний, программа останавливается командой Half. Значения регистров Event, Sum, _Work, W, _Status, Status просматриваются в окне наблюдения и заносятся в таблицу отчёта.

 

         Т а б л и ц а 10.1 – Варианты заданий

Вариант

Источник прерываний

Время задержки  Timer, с

Вариант

Источник прерываний

Время задержки  Timer, с

1

Кнопка ‘1’

1

6

Кнопка ‘6’

1

2

Кнопка ‘2’

2

7

Кнопка ‘7’

2

3

Кнопка ‘3’

3

8

Кнопка ‘8’

3

4

Кнопка ‘4’

4

9

Кнопка ‘Shift’

4

5

Кнопка ‘5’

5

10

Кнопка ‘Enter’

5

 

Ввиду того, что клавиатура и проводники на стенде  УМК-7 не имеют защитного экрана, следует обязательно во все  разряды RD4..RD7 подавать сигнал ‘1’. Кроме того, все выводы клавиатуры необходимо подключить проводниками к выводам регистра PORTD.

Заполните таблицу 10.2 в отчете.

 

         Т а б л и ц а 10.2 – Данные отчета по лабораторной работе

Вариант

Источник прерываний

Время задержки Timer, с

Значение счетчика Sch3

Значение счетчика Sch_out

Значение счетчика Sch_in

 

 

 

 

 

 

 

10.4 Контрольные вопросы

 

1.     Как узнать значения регистров Event, Sum, _Work, W, _Status, Status.

2.     Можно ли из обработчика прерываний вызывать подпрограмму предназначенную для главной (фоновой) программы.

3.     Что такое прерывания?

4.     Каким образом включается разрешение прерываний?

5.     Назначение флага прерываний?

6.     Что такое дребезг контактов? Защита от дребезга.

7.     Что такое фоновая программа?

8.     По какому адресу расположен вектор прерываний?

9.      Что такое вектор сброса?

10.  Почему применяется команда SWAPF для сохранения РСН Status?

11.  Какие помехи (наводки) существуют в эксперименте, искажающие ожидаемые результат работы программы.

12. С какой целью и где сохраняют значения регистров W и Status.

 

11 Сложение двухбайтных чисел

 

Цель работы: обучение созданию программ для сложения двухбайтных чисел в различных системах счислений.

 

 

 

11.1 Краткие теоретические сведения

 

Сложение чисел применяется при определении каких-либо технологических параметров установки. Проанализировав сумму чисел, вносят соответствующие изменения в управление установкой.

В один байт можно записать числа от 0 до 255. Для некоторых практических задач это недостаточно. Если использовать два байта, то можно записать числа от 0 до 65535. Суммирование чисел можно выполнить, задавая слагаемые в 16-ной или иной системе счисления с помощью алгоритма, известного из курса информатики.

Например, требуется сложить десятичные числа 65284 и 65534.  Представим наши числа в 16-ной системе счисления, записав каждое из них в два регистра, см. таблицу  11.1. В лабораторной работе эти байты называются старшим и младшим для каждого слагаемого, например h’23’ и h’22’.

 

Т а б л и ц а  11.1 – Суммирование чисел в шестнадцатеричном коде

 

 

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

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

Слагаемые или регистр SUM_3

Старшие байты  (регистры)

Младшие байты (регистры)

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

65284

h’FF04’

S1_S =h’FF’

S1_M =h’04

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

65534

h’FFFE’

S2_S =h’FF’

S2_M =h’FE’

Полученные суммы

130818

SUM_3=h’01

SUM_S=h’FF’

SUM_M =h’02

 

Результат представим в десятичной системе счисления: h’01FF02’®
®1×164+15×163+15×162+0×161+2×160=65536+61440+3840+0+2=130818.

При сложении, байтов, если сумма более hFF’(то есть более 255) необходимо предусмотреть добавление единицы в нулевой бит более старшего байта (регистра). Очевидно, что сумма может занимать три байта. Момент переполнения регистра фиксируется в бите С регистра Status, он становится равным единице. Этот факт можно использовать для программного увеличения более старшего регистра на единицу, выполняя, таким образом, арифметический перенос.

С другой стороны можно считать, что в старшем байте представлена целая часть числа, а в младшем байте дробная часть числа. Такое число можно представить как многочлен A=K2×162+ К1×161+K0×160+ K-1/16-1-2/16-2.

Сложим дробные десятичные слагаемые 255,017 и 255,991. Переведем в шестнадцатеричную систему отдельно целую и дробную части [2].

 

         Алгоритм перевода целой части  числа в 16-ную систему счислений:

 

Начало алгоритма

    Ввести заданное число

    Делимое приравнять заданному числу

    Пока делимое больше нуля, повторять:

           Найти частное и остаток, разделив целочисленно делимое на 16

           Запомнить остаток

           Делимое приравнять частному

     Конец цикла

Конец алгоритма

Пример, переведем 255 в шестнадцатеричную систему счислений:
         255:16=15(15)
         15:16=0 (15).

         Итак, в шестнадцатеричной системе получили 25510=FF16.

 

         Алгоритм перевода дробной части числа в 16-ную систему счислений:

Начало алгоритма

     Ввести дробную часть числа

     Ввести количество значащих цифр в числе

     Умножаемое приравнять введенному числу

     Пока умножаемое больше нуля, повторять:

           Найти произведение умножаемого на 16

           Целую часть произведения записать в результат как 16-ную цифру

           Если найдены все цифры, выйти из цикла

     Конец цикла

Конец алгоритма

Переведем дробную часть первого слагаемого 0,017 с точностью до трех цифр в шестнадцатеричную систему, а затем округлим. Целые части чисел выделены жирным шрифтом.

0,017×16=0,272; 0,272×16=4,352; 0,352×16=5,63.

Таким образом, 0,01710=0,0416. Третью цифру 5, поскольку она меньше 8, отбрасываем.

Дробная часть второго слагаемого:

0,991×16=15,856; 0,856×16=13,696; 0,696×16=11,136.

Таким образом, 0,99110=0,FDB16.

Округляя полученное значение в шестнадцатеричной системе счислений до двух цифр, получим  0,99110=0,FE16.

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

 

         Т а б л и ц а 11.2 – Суммирование двухбайтных дробных чисел

 

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

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

Слагаемые или регистр SUM_3

Старшие байты  (регистры)

Младшие байты (регистры)

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

255,017

h’FF,04’

S1_S =h’FF’

S1_M =h’04

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

255,991

h’FF,FE’

S2_S =h’FF’

S2_M =h’FE’

Полученные суммы

511,008

SUM_3=h’01

SUM_S=h’FF’

SUM_M =h’02

 

Результат h’01FF,02’, полученный в шестнадцатеричной системе счисления, представим в десятичной форме:

         Sum=1×162+15×161+15×160+0×16-1+2×16-2=256+240+15+0+0,0078=511,0078.

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

Блок-схема алгоритма сложения двухбайтных чисел показана на рисунке 11.1, в ней предполагается, что слагаемые заданы.

 

Рисунок 11.1 – блок-схема

 

11.2 Задания и исходные данные

 

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

Фрагменты программы Л11 сложения двухбайтных чисел. Инструкции по настройке микроконтроллера и объявления переменных опущены.

         CLRF SUM_M; очищаем регистры для суммы.

            CLRF SUM_S

            CLRF SUM_3

;                                     Вводим первое слагаемое

         MOVLW  h’04’

            MOVWF S1_M; младший байт S1_M= h’04’.

            MOVLW  h’FF’

            MOVWF S1_S; старший байт S1_S= h’FF’.

;                                     Вводим второе слагаемое

         MOVLW h’FE’

            MOVWF S2_M; младший байт S2_M=h’FE’.

            MOVLW  h'FF'

            MOVWF S2_S; старший байт S2_S= h'FF'.

;                           Сложение младших байтов S1_M и S2_M

         MOVF S1_M, W

            ADDWF S2_M, W

            MOVWF SUM_M

            BTFSC STATUS, C; если был перенос, т. е. сумма более 255, то

            INCF SUM_S, F; увеличиваем байт только при С=1.

;                                     Сложение старших байтов

         MOVF SUM_S, W

            ADDWF S1_S, W

            BTFSC STATUS, C; был перенос?

            INCF SUM_3, F; увеличиваем третий байт суммы только при С=1.

            ADDWF S2_S, W

            MOVWF SUM_S

            BTFSC STATUS, C; был перенос?

            INCF SUM_3, W; увеличиваем третий байт суммы только при С=1.

            GOTO$

            END

 

11.3 Порядок выполнения работы

 

Выполните сложение двухбайтных чисел, используя шестнадцатеричную систему счисления по заданиям таблиц 11.3 и 11.4. Результаты занесите в таблицы 11.1 и 11.2.

 

         Т а б л и ц а 11.3 – Варианты заданий для целых десятичных чисел

Вариант

Число S1

Число S2

Вариант

Число S1

Число S2

1

60001

10001

6

65406

60006

2

30002

20002

7

60007

10007

3

40003

30003

8

30008

20008

4

65504

40004

9

40009

30009

5

64505

50005

10

50010

40010

 

         Т а б л и ц а 11.4 – Варианты заданий для дробных десятичных чисел

Вариант

Число S1

Число S2

Вариант

Число S1

Число S2

1

110,01

110,1

6

160,06

160,6

2

120,02

120,2

7

170,07

170,7

3

130,03

130,3

8

180,08

180,8

4

140,04

140,4

9

190,09

190,9

5

150,05

150,5

10

200,10

200,20

 

12.4 Контрольные вопросы

 

1.     Что такое основание системы счисления. Какие они могут быть?

2.     Как размещается число большее 255 в памяти МК?

3.     Приведите алгоритм перевода чисел из десятичной системы в шестнадцатеричную систему.

4.     Приведите алгоритм перевода из шестнадцатеричной системы в десятичную систему.

5.     Как определяется необходимость переноса в старшие байты суммы?

6.     Как выполняется программно перенос единицы в старшие байты.

7.     Сколько регистров необходимо при сложении двухбайтных чисел?

8.     Какой результат сложения шестнадцатеричных чисел F+1 и FF+1?

9.     Где регистрируется переполнение регистра при сложении чисел?

10.  Для чего выполняется суммирование чисел?

11.  Можно ли складывать дробные числа?

12.  Почему в числе 0,04516 отбросили при округлении цифру 5?

 


Приложение А

 

Регистр Status

 

В таблице А.1 показаны расположение и имена бит регистра Status.

 

         Т а б л и ц а А.1 – Биты регистра Status

Номера бит

7

6

5

4

3

2

1

0

Имена бит

IRP

RP1

RP0

-TO

-PD

Z

DC

C

 

В таблице А.1 приняты следующие имена:

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

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

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

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

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

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

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

 

         Т а б л и ц а А.2 – Выбор номера банка при непосредственной адресации

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

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

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

0

0

0

0

1

1

1

0

2

1

1

3

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

 

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

 

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

IRP

RP1

RP0

-TO

-PD

Z

DC

C

0

0

0

1

1

1

1 или 0

1 или 0

Приложение Б

 

Описание  инструкций МК PIC

 

Константа в инструкциях представлена символом k. В описании инструкций указаны флаги, которые могут измениться при ее выполнении. Параметр d (dest) в инструкциях определяет, в какой регистр записывается результат. Если d=0 или отсутствует, результат сохраняется в регистре W. Если d=1, результат сохраняется в регистре f (от слова file). В программах для параметра d вместо ‘0’ можно писать ‘W’, вместо  ‘1’ можно писать ‘f’.

Вместо адреса регистра в программе более удобно писать его символьное имя. Например, если регистр по адресу h’21’ имеет имя R1, тогда инструкция, описанная как ADDWF  f, d, в программе может быть записана двумя способами: ADDWF  h’21’ , W  или ADDWF  R1, W.

Директива ORG hxx’ – это указатель для ассемблера, что код, следующий за этим выражением, начинается с адреса hxx’ ЭППЗУ.

 

ADDLW - Сложить k с W.

Синтаксис: [label]   ADDLW  k.

Операнды:     0£k£255.

Операция: (W) + k à (W).

Изменяемые флаги: С, DC, Z.

 

ADDWF - Сложение W и f.

Синтаксис: [label]  ADDWF  f, d.

Операнды: 0£f£127.

Операция: (W) + (f) à (dest).

Изменяемые флаги: C, DC, Z.

 

ANDLW -  Побитное 'И' k и W.

Синтаксис: [label]   ANDLW  k.

Операнды:  0£k£255.

Операция: (W) .AND. k à (W).

Изменяемые флаги: Z.

 

ANDWF - Побитное 'И’ W и f.

Синтаксис: [label]  ANDWF  f, d.

Операнды: 0£f£127.

Операция: (W) .AND. (f) à (dest).

Изменяемые флаги: Z.

 

BCF - Очистить бит b в регистре f.

Синтаксис: [labelBCF  f, b.

Операнды: 0£f£127;  0£b£7.

Операция: 0 à (f<b>).

Изменяемые флаги: Нет.

 

BSF - Установить бит b в регистре f.

Синтаксис: [label]   BSF  f, b.

Операнды: 0£f£127;  0£b£7.

Операция: 1àf<b>.

Изменяемые флаги: Нет.

 

BTFSC  -  Проверить бит b в регистре f, пропустить следующую инструкцию, если b=0.

Синтаксис: [label]    BTFSC  f, b.

Операнды: 0£f£127; 0£b£7.

Изменяемые флаги: Нет.

Описание: Если бит b в регистре f равен 0, то следующая инструкция программы пропускается.

 

BTFSS  - Проверить бит b в регистре f, пропустить, если b = 1.

Синтаксис: [label]   BTFSS  f, b.

Операнды: 0£f£127;  0£b£7.

Изменяемые флаги: Нет.

Описание: Если бит b в регистре f равен ‘1’, то следующая инструкция программы пропускается.

 

CALL  Вызов подпрограммы

Синтаксис: [label]   CALL  f.

 

CLRF - Очистить f.

Синтаксис: [labelCLRF f.

Операнды: 0£f£127.

Операция: 00h à (f); 1 àZ.

Изменяемые флаги: Z.

Описание: Очистить содержимое регистра f и установить флаг Z=1.

 

COMF - Инвертировать f.

Синтаксис: [labelCOMF  f, d.

Операнды: 0£f£127.

Операция: (-f) à (dest).

Изменяемые флаги: Z.

Описание: Инвертировать все биты в регистре f.

 

DECF - Вычесть 1 из регистра f.

Синтаксис: [label]   DECF  f, d.

Операнды: 0£f£127.

Операция: (f) - 1 à (dest).

Изменяемые флаги: Z.

 

DECFSZ - Вычесть 1 из f  и пропустить, если f=0.

Синтаксис: [labelDECFSZ  f, d.

Операнды: 0£f£127.

Операция: (f) -1 à (dest).

Изменяемые флаги: Нет.

Описание: Декрементировать содержимое регистра f. Если результат равен '0', то следующая инструкция программы пропускается.

 

GOTO - Безусловный переход.

Синтаксис:  GOTO  k.

Операнды: 0£k£2047.

Операция: Переход на метку.

Изменяемые флаги: Нет.

 

INCF - Прибавить 1 к f.

Синтаксис: label]   INCF  f, d.

Операнды: 0£f£127.

Операция: (f) + 1 à (dest).

Изменяемые флаги: Z.

 

IORLW - Побитное 'ИЛИ' k и W.

Синтаксис: [labelIORLW  k.

Операнды: 0£k£255.

Операция (W).OR.(k) à (W).

Изменяемые флаги: Z.

 

IORWF  - Побитное 'ИЛИ'  W и f.

Синтаксис: [labelIORWF  f, d.

Операнды: 0£f£ 127.

Операция: (W).OR.(f) à (dest).

Изменяемые флаги: Z.

 

MOVF -  Переслать f.

Синтаксис: [labelMOVF  f, d.

Операнды: 0£f£127.

Операция: (f) à (dest).

Изменяемые флаги: Z.

Описание: Значение d=1 используется для проверки содержимого регистра f на ноль, которое регистрируется флагом Z.

 

MOVLW - Переслать k в W.

Синтаксис: [labelMOVLW  k.

Операнды: 0£k£255.

Операция: kà(W).

Изменяемые флаги: Нет.

Описание: В неиспользуемых битах ассемблер устанавливает '0'.

 

MOVWF - Переслать W в f.

Синтаксис: [labelMOVWF  f.

Операнды: 0£f£127.

Операция: (W) à (f).

Изменяемые флаги: Нет.

 

NOP - Нет операции.

 

RETURN - Возврат из подпрограммы.

Синтаксис: [label]   RETURN.

Операнды: Нет.

Операция: TOS à PC.

Изменяемые флаги: Нет.

Описание: Возврат из подпрограммы. Вершина стека TOS загружается в счетчик PC.

 

RLF - Циклический сдвиг регистра f влево через бит C регистра Status.

Синтаксис: [label]   RLF  f, d.

Операнды: 0£f£127.

Изменяемые флаги: С.

Описание: Выполняется циклический сдвиг влево содержимого регистра f через бит С регистра Status.


RRF - Циклический сдвиг регистра f вправо через бит C регистра status.

Синтаксис: [label]   RRF  f, d.

Операнды: 0£f£127.

Изменяемые флаги: С.

Описание: Выполняется циклический сдвиг вправо содержимого регистра f через бит С регистра Status.

 


SLEEP Перейти в режим SLEEP.

Синтаксис: [label]   SLEEP.

Операнды: Нет.

Операция: 00h à WDT;

00h à предделитель WDT;

1 à -ТО; 0 à PD.

Изменяемые флаги: -ТО, -PD.

Описание: Сбросить флаг включения питания -PD в '0'. Установить флаг -ТО переполнения WDT в '1'. Очистить таймер WDT и его предделитель. Перевести микроконтроллер в режим SLEEP и выключить тактовый генератор.

 

 

SUBLW - Вычесть W из k.

Синтаксис: [labelSUBLW  k.

Операнды: 0£k£255.

Операция: k - (W) à (W).

Изменяемые флаги: C, DC, Z.

 

SUBWF - Вычесть W из f.

Синтаксис: [labelSUBWF  f, d.

Операнды: 0£f£127; dÎ [0,1].

Операция: (f) –(W) à (dest).

Изменяемые флаги: C, DC, Z.

 

SWAPF - Поменять местами полубайты в регистре f.

Синтаксис: [labelSWAPF  f, d.

Операнды: 0£f£127.

Операция: (f<3:0>) à (dest<7:4>).

Изменяемые флаги: Нет.

 

XORLW- Побитное 'исключающее ИЛИ' k и W.

Синтаксис: labelXORLW  k.

Операнды: 0£k£255.

Операция: (W).XOR.k à (W).

Изменяемые флаги: Z.

 

XORWF- Побитное 'исключающее ИЛИW и f.

Синтаксис: [labelXORWF  f, d.

Операнды: 0£f£127.

Операция: (W).XOR.(f) à (dest).

Изменяемые флаги: Z.


Приложение В

 

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

 

TMR1 - 16-разрядный таймер/счетчик, состоящий из двух 8-разрядных регистров (TMR1H и TMR1L), доступных для чтения и записи.

Счет выполняется в спаренных регистрах (TMR1H:TMR1L), инкрементируется их значение от 0000h до FFFFh. При добавлении ещё одной единицы, будет переполнение регистров и в счетчиках будет снова 0000h. При переполнении счетчика устанавливается в '1' бит флага прерывания TMR1IF в регистре PIR1<0>. Само прерывание можно разрешить/запретить установкой/сбросом бита TMR1IE в регистре Р1Е1<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 (TMR1H, TMR1L). Регистры TMR1H и TMR1L не сбрасываются в 00h при сбросе по включению питания и других видах сброса.

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

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

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

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

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

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


Приложение Г

 

Карта памяти МК PIC16877


 

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

 

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

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

3.        Копесбаева А.А. Тарасов В.М. Элементы и устройства автоматики. Микропроцессорный комплекс. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 050702 – «Автоматизация и управление». - Алматы: АИЭС, 2007.

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

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

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

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

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

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

 

Содержание

 

Введение

1 Байтовые  и битовые команды. Логика

2 Маскирование. Суммирование массива

3 Автоматизация окрасочной камеры. Подпрограммы

4 Умножение и деление

5 Регулирование расхода газа

6 Программирование клавиатуры

7 Автоматизация упаковки. Генерация звука

8 Перевод чисел из 2-й в 2_10 систему.

9 Таймер TMR1

10 Прерывания

11 Сложение двухбайтных чисел

Приложение А. Регистр Status

Приложение Б. Описание инструкций микроконтроллера PIC

Приложение В. Модуль таймера TMR1

Приложение Г. Карта памяти МК PIC16877

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

3

4

8

12

17

21

24

27

32

36

39

43

49

50

53

54

55

 

Св. план 2012 г., поз. 31