Некоммерческое акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра инженерной кибернетики
ПРОГРАММИРОВАНИЕ ЦИФРОВОЙ ТЕХНИКИ И МИКРОКОНТРОЛЛЕРОВ УПРАВЛЕНИЯ
Методические указания
к выполнению лабораторных работ для студентов специальности 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 |
|||
|
0 0 1 1 |
0 1 0 1 |
0 1 1 1 |
Х1Y |
Х1
Х2
При замыкании любого контакта в цепи будет ток |
|
0 0 1 1 |
0 1 0 1 |
0 0 0 1 |
Х1Y |
X1 X2
Ток в цепи будет только при замыкании обоих контактов |
|
0 0 1 1 |
0 1 0 1 |
0 1 1 0 |
Х1Y Х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. Вся работа подпрограммы сводится к уменьшению значений всех счетчиков до нуля, на что тратится определенное время.
Длительность времени задержки определяется начальной величиной счетчиков и временем выполнения в МК инструкций подпрограммы.
Поскольку микропроцессор работает с высокой частотой, приходится создавать внешние циклы для увеличения времени задержки.
Подпрограммы пишут после инструкции 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 |
Время работы, сек |
Вариант |
Биты подключения S1, D1,
D2 |
Время работы, сек |
||||
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 |
Кнопка Pusk |
Кнопка Stop |
Вариант |
Биты подключения S1, D1, D2 |
Кнопка 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 – Варианты заданий
Вариант |
Биты подключения
оборудования |
Вариант |
Биты подключения
оборудования |
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.
Синтаксис: [label] BCF 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.
Синтаксис: [label] CLRF f.
Операнды: 0£f£127.
Операция: 00h à (f); 1 àZ.
Изменяемые флаги: Z.
Описание: Очистить содержимое регистра f и установить флаг Z=1.
COMF - Инвертировать f.
Синтаксис: [label] COMF 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.
Синтаксис: [label] DECFSZ 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.
Синтаксис: [label] IORLW k.
Операнды: 0£k£255.
Операция (W).OR.(k) à (W).
Изменяемые флаги: Z.
IORWF - Побитное 'ИЛИ' W и f.
Синтаксис: [label] IORWF 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.
Синтаксис: [label] MOVLW k.
Операнды: 0£k£255.
Операция: kà(W).
Изменяемые флаги: Нет.
Описание: В неиспользуемых битах ассемблер устанавливает '0'.
MOVWF - Переслать W в f.
Синтаксис: [label] MOVWF 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.
Синтаксис: [label] SUBLW k.
Операнды: 0£k£255.
Операция: k - (W) à (W).
Изменяемые флаги: C, DC, Z.
SUBWF - Вычесть W из f.
Синтаксис: [label] SUBWF f, d.
Операнды: 0£f£127; dÎ [0,1].
Операция: (f) –(W) à (dest).
Изменяемые флаги: C, DC, Z.
SWAPF - Поменять местами полубайты в регистре f.
Синтаксис: [label] SWAPF f, d.
Операнды: 0£f£127.
Операция: (f<3:0>) à (dest<7:4>).
Изменяемые флаги: Нет.
XORLW- Побитное 'исключающее ИЛИ' k и W.
Синтаксис: label] XORLW k.
Операнды: 0£k£255.
Операция: (W).XOR.k à (W).
Изменяемые флаги: Z.
XORWF- Побитное 'исключающее ИЛИ' W и f.
Синтаксис: [label] XORWF 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