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

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

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

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

 

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

Методические указания

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

 

 

Алматы 2013 

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

 

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

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

 

Рецензенты: профессор М.А. Башкиров.  канд. техн. наук  И.А. Федоренко

 

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

 

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

Введение

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

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

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

-   программируемость функций;

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

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

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

-   дистанционная передача информации и возможность оперативного управления.

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

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

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

 

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

 

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

Лабораторная работа должна быть защищена студентом. Защита предполагает решения задач подобных лабораторным заданиям в присутствии преподавателя и ответы на контрольные вопросы.

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

 

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

 

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

 

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, имеющие нормально открытый и нормально закрытый контакты. С любого конца тоннеля, изменив положение переключателя, можно включить освещение, если оно было выключено или включить – если оно было включено. Функция ‘XOR’ часто применяется  для определения равенства двух чисел.

        

Таблица 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’ – это указатель для ассемблера, что код, следующий за этим выражением, будет записан, начиная с нулевого адреса памяти программ. Адрес h’04’, который называется вектором прерывания, пропускается, поскольку прерывания в программе не предусмотрены. Указатель EQU от equal (англ.) – равносильный, равный.

Для облегчения понимания программы, некоторым регистрам общего назначения, используемых для хранения данных, присвоены символьные имена R1, R2, R3, REZ и указан их адрес, т.е. фактически это имена переменных.

Программа Л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; пишется для настройки отладчика, будет записана по адресу h’00’ ПЗУ.

NOP ; пишется для настройки отладчика, будет записана по адресу h’01’ ПЗУ.

NOP ; пишется для настройки отладчика, будет записана по адресу h’02’ ПЗУ.

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

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

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

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   H'05'; запись шестнадцатеричной константы в 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

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

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

 

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

 

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

 

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

Вариант

Числа R1, R2, R3

Вариант

Числа R1, R2, R3

1

81h, 12h, 1h

6

86h, 67h, 6h

2

82h, 23h, 2h

7

87h, 78h, 7h

3

83h, 34h, 3h

8

88h, 89h, 8h

4

84h, 45h, 4h

9

89h, 9Ah, 9h

5

85h, 56h, 5h

10

8Ah, ABh, Ah

 

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

 

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

Результаты всех операций с числами запишите в таблицу 1.3.

В отчете приведите: ручной расчет операций сложения и вычитания и укажите их влияние на Status, а также фотографии окна Watch windows и программы.

Т а б л и ц а 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=b’10000010’

R1 AND R2

-

10000000

00011011

R1=b’11110000’

R2=b’10000010’

R1 OR R2

-

11110010

00011011

R1=b’11110000’

R2=b’10000010’

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?

18.   Зачем регистрам присваивают символьные имена?

 

2 Циклы. Суммирование массива

 

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

 

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

 

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

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

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

 

Т а б л и ц а 2.1

Использование бита 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

 

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

 

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

 

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

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

 

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

 

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

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

 

Фрагменты программы суммирования массива Л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; приравниваем W=SUM.

            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, то все элементы сложили, запоминаем сумму в W.

            MOVWF  SREDNEE; копируем значение SUM в регистр SREDNEE.

            . . . .

            END

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

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

 

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

 

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

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

Приведите фотографии программы и окна наблюдения в отчёте.

 

         Т а б л и ц а  2.2– Сумма массива и среднее (пример заполнения)

Вариант

Адрес регистра массива, указываемый в 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.3 – Варианты заданий

 

Вари ант

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

 

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

 

Вариант

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

 

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

1

D’21’

21h – 24h

6

D’26’

26h – 29h 

2

D’22’

22h – 25h

7

D’27’

27h – 2Ah

3

D’23’

23h - 26h

8

D’28’

28h – 2Bh

4

D’24’

24h - 27h

9

D’29’

29h – 2Ch

5

D’25’

 25h - 28h

10

D’30’

2Ah – 2Dh

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

14.  С какой целью используют логическую функцию XOR в программе?

15.  Какой адрес будет у РОН следующим за РОН с адресом 39h?

 

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

 

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

 

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

 

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

На рисунке 3.2 показана схема подключения оборудования к регистру PORTC. К1 и К2 пускатели для двигателей D1 (Рн=3 кВт) и D2 (Рн=6 кВт). На стенде УКМ-7 включение оборудования имитируется зажиганием светодиодов.

 

Рисунок 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 обнулился (в Status 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.3 Задания и исходные данные

 

Разработайте программу, включающую и выключающую оборудование на заданное время, согласно варианту задания из таблицы 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

1

8

6

6

6, 7, 0, 1, 2

6

5

4

2

2, 3, 4, 5, 6

2

7

6

7

7, 0, 1, 2, 3

7

3

5

3

3, 4, 5, 6, 7

3

7

5

8

0 ,1 ,2 ,3, 4

8

3

4

4

4, 5, 6, 7, 0

4

5

6

9

1, 3, 5, 7, 0

9

2

4

5

5, 6, 7, 0, 1

5

6

4

10

2, 4, 6, 0, 1

10

2

3

 

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

 

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

Запустите программу в автоматическом режиме. Если подпрограмма Timer работает неверно, выполните отладку программы.

Отладка программы. Оставьте только первый вызов подпрограммы 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_out,  F.

9.   Опишите работу инструкции DECF  Sch_out,  W.

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

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

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

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

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

15.       Укажите инструкции включения сирены.

16.       Укажите инструкции включения вентилятора и краскораспылителя.

17.       Сколько раз выполняется подпрограмма Timer?

 

4 Умножение и деление. Подпрограммы

 

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

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

 

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

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

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

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

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

 

         Т а б л и ц а 4.1 – Регистрация событий в регистре 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, т.е. надо создать цикл, складывающий умножаемое 10 раз.

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

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

 

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

 

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

 

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

Цикл

Частное

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

Действие

Результат

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

С=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

 

 

Остаток=5

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

 

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

Выберите самостоятельно регистры РОН для переменных: Chislo, Umn_Chislo, Delimoe, Delitel, Chastnoe, Mnozh, Pr, Kol_slag.

Стандартную настройку микроконтроллера напишите самостоятельно.

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

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

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

;                           Главная программа. Умножаем 6×0,8=6×4/5=4(4)

         MOVLW D'6'

            MOVWF Chislo; заданное число. (1)

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

            MOVLW D'4'; (3)

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

            MOVLW D'5'; (5)

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

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

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

            Movwf  Delimoe; (8)

            Movlw  D'5'; (9)

            movwf Delitel; если не дать значение переменной Delitel, будет деление на ноль. (10)

            CALL Delenie

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

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

            Clrf  Pr; (1)

            Clrf  Kol_slag; (2)

Sled_slag

            Movf Pr, W; (3)

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

            Movwf Pr; (5)

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

            MOVF Kol_slag, W; (7)

            XORWF  Mnozh, F; маскированием проверяем равенство Kol_slag и Mnozh. (8)

            Btfss  STATUS, Z; (9)

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

            RETURN

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

            CLRF  Chastnoe; (1)

            Movf  Delimoe, W; (2)

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

            MOVF  Delitel, W; проверка делителя на нуль. (4)

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

            GOTO NUL; выполняется при Z=1. Выходим из подпрограммы, если Delitel=0. (6)

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

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

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

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

;                       Возврат на один шаг, если разность отрицательна

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

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

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

            RETURN

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

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

            END

 

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

 

Задание на лабораторную работу. Напишите программу умножения на дробный коэффициент для варианта из таблицы 4.3. Но вместо обычной инструкции ORG h’05’, напишите инструкцию ORG h’N’. Значение N примите по номеру варианта умноженного на десять. Цифры в скобках образца программы указывают номера инструкций по вариантам, расположение которых надо определить в памяти программ микроконтроллера.

 

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

Вариант

Коэффициент

Число

Вариант

Коэффициент

Число

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, чтобы установились значения регистров в окне наблюдения. Определите расположение инструкций в памяти  микроконтроллера по регистру PCL и заполните таблицу 4.5.

 

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

 

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

Вариант

Коэффициент

Число

Множитель

Делитель

Результат

Остаток

Точность

11

0,8

6

4

5

4

4

83,3%

 

Таблица 4.5 - Расположение подпрограмм

Вариант

DECF  Chastnoe, F

RETURN

CALL Delenie

11

 

 

 

 

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

 

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

 

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

2.  Регистр PCL и его назначение.

3.  Назначение стека и его взаимодействие с регистром PCL.

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

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

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

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

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

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

10. Какой результат будет при умножении 26 на 10 в регистре Pr микроконтроллера?

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

12.   Поясните инструкцию условного перехода BTFSS  STATUS,  Z.

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

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

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

 

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

 

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

 

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

 

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

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

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

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

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

 

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

 

 

Объекты

Операция

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

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

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

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

Число

10101010

10101010

10101010

11011101

Маска

11110000

11110000

11110000

11011101

Результат

11111010

10100000

01011010

00000000

 

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

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

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

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

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

 

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

 

Сигнал для прикрытия заслонки будем подавать на МЭО через нулевой разряд  PORTC. Сигнал на увеличения открытия заслонки через первый разряд PORTC. Этот фрагмент оформим в виде подпрограммы. При этом используем особенности кодировки латинских букв «В» и «М», которые печатаются в окне Watch, в 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.

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

            MOVF   KOREN , W

            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

            END

 

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

 

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

 

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

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

 

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

Вари-ант

Коэф.К

Давле-ние 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.3 – Варианты заданий для целого 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

 

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

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

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

 

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

 

1.     Назначение подпрограмм в разработанной программе.

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

3.     С какой целью выполняется маскирование в программе?

4.     Определите содержимое счетчика команд при вызове подпрограммы и ее завершении.

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

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

7.     Назначение МЭО. Как происходит управление этим механизмом в программе?

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

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

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

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

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

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

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

 

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

 

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

 

 

 

 

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

 

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

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

Разряды RD7, RD6, RD5, RD4 регистра PORTD запрограммируем на вывод, остальные - на ввод. В разряде RD0 по заводской схеме всегда записана единица. На рисунке 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, предусмотреть запуск камеры для окрашивания каждой детали кнопками «Пуск» и  останов камеры кнопками «Стоп» по месту и с пульта оператора.

Кнопка 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.

13.   Почему кнопка Stop не выключает микроконтроллер, если горит только одна лампочка питания 220 В.

 

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

 

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

 

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

 

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

 

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

 

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

 

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

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

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

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

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

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

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

Перед пульсациями запоминаем состояние регистра PORTC и после окончания пульсаций восстанавливаем первоначальное значение PORTC.

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

 

 

 

 

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

 

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

 

 

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

 

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

Остальные разряды в PORTC останутся неизменными. Продолжение нормальной работы  таймера.

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

 

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

 

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

Дребезг контактов кнопки, т.е. её многократное замыкание и размыкание при одном нажатии на кнопку из-за упругости материалов кнопки убирается включением подпрограммы Timer на время успокоения контактов. Если этого не сделать, то могут быть многочисленные ложные срабатывания.

 

Т а б л и ц а 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_datchika 

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_datchika; при Z=0, повторяем проверку срабатывания датчика.

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

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

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

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

CALL Timer

MOVLW  b'10000010'; готовимся выключить D2, подключённый к биту 3.

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, если регистр Inver_Bit=h’00’.

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

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

MOVLW   D'255';

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

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

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

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

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

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

 

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

 

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

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

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

4.     Что имитируют кнопки клавиатуры в рассматриваемых на лабораторных работах заданиях?

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

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

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

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

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

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

11.  Как работает маскирование?

12. Как получается прерывистый сигнал?

 

8 Перевод чисел из двоичной в двоично-десятичную систему

 

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

 

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 при вызове подпрограммы VYBOR_SEG уже указывает на первую команду retlw с кодом для цифры ‘0’, то даже при W=0 будет выбрана цифра «0». После прибавления N к W, PLC будет указывать на N-ю команду, что нам и требуется.

 

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

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

Регистры K_SOT, K_DES, K_ED предназначены для хранения соответственно количества сотен, десятков и единиц. Регистры Kod_seg_ed, Kod_seg_des, Kod_seg_ed предназначены для хранения кодов сотен, десятков и единиц для сегментов цифрового индикатора.

         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; был заем, выполняем возврат назад на один шаг, добавляя 100.

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

            MOVLW   D'10'

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

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

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

         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'01011011'; код для цифры 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

11001001

6

10001000

2

11010100

7

11011001

3

11110011

8

11000110

4

11100000

9

10101001

5

11010111

10

10111110

 

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

 

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

 

1.     Назначение двоично-десятичной  системы счисления.

2.     Сколько бит занимает код двоично-десятичной цифры?

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

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

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

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

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

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

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

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

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

12.  Назначение регистра PCL в данном примере?

 

Приложение А

 

Регистр 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  R1, W результат сложения R1 и W будет записан в W, а по инструкции ADDWF  R1, F результат сложения R1 и W будет записан в R1.

Директива ORG h’xx’ – это указатель для ассемблера, что код, следующий за этим выражением, начинается с адреса h’xx’ ЭППЗУ.

 

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.

Синтаксис: [label]  MOVF  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.

Приложение В

 

Карта памяти МК PIC16877


 

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

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

2.        Копесбаева А.А. Тарасов В.М. Элементы и устройства автоматики. Микропроцессорный комплекс. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 050702 – «Автоматизация и управление». - Алматы: АИЭС, 2007.

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

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

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

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

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

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

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

 

Содержание 

Введение

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

2 Циклы. Суммирование массива

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

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

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

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

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

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

Приложение А. Регистр Status

Приложение Б. Описание инструкций микроконтроллера PIC

Приложение В. Карта памяти МК PIC16877

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

3

4

8

13

18

22

26

29

34

39

40

43

44

Св. план 2013 г., поз. 72