Некоммерческое акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра инженерной кибернетики
Программирование цифровой техники
и микроконтроллеров управления
Методические указания к выполнению лабораторных работ
для студентов всех форм обучения специальности 5В070200 - «Автоматизация и управление»
Алматы 2012
СОСТАВИТЕЛЬ: В. М. Тарасов. Программирование цифровой техники и микроконтроллеров управления. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 5В070200 -«Автоматизация и управление» - Алматы: АУЭС, 2012. – 55 с.
Представлены методические указания к выполнению лабораторных работ по дисциплине «Программирование цифровой техники». В лабораторных задачах разбираются конкретные практические задачи применения МК для автоматизации технологического оборудования. Во время лабораторных работ студенты осваивают применение микроконтроллеров и технологию разработки для них программ на примере микроконтроллера PIC16F877.
Иллюстраций - 25, таблиц - 28, библиографий – 9 названий.
Рецензенты: канд. техн. наук, доцент Б.С. Джумагалиев доцент Фадеев В.Б.
Печатается по плану издания некоммерческого акционерного общества «Алматинского университета энергетики и связи» на 2012 год.
© НАО «Алматинский университет энергетики и связи», 2012 г.
Современное состояние техники требует от специалистов знания микропроцессоров (МП) и микроконтроллеров (МК). В настоящее время в составе выпускаемых изделий многих фирм в дальнем и ближнем зарубежье содержатся микроконтроллеры, и область их применения постоянно увеличивается. Они присутствуют в технологическом оборудовании, автомобилях, телефона и т.д.
Микроконтроллеры широкого назначения выпускаются зарубежными фирмами: Motorola, Nec Corporation, Siemens, Microchip и другими.
Оборудованию, содержащему МК, присущи важные положительные свойства, по сравнению с аналоговыми устройствами:
- возможность дистанционного измерения и проверка оборудования с пульта управления оператора;
- высокая надежность и малое потребление энергии;
- непрерывная самодиагностика и высокая аппаратная надежность;
- регистрация и запоминание параметров аварийных режимов;
- дистанционная передача оператору информации о состоянии и срабатываниях устройств.
Для обучения студентов цифровой технике и программированию микроконтроллеров в университете имеется учебный микропроцессорный комплект УМК-7. Помимо обучения языку ассемблер на примере МК PIC16F877, студенты знакомятся с внутренней и внешней структурой современных микроконтроллеров.
Предполагается, что студенты освоили дисциплину «Элементы и устройства автоматики», и умеют создавать проект и запускать его на выполнение. В случае необходимости студенты могут обновить знания, прочитав методические указания к лабораторным работам по ЭУА.
До дня проведения работы студенты должны к ней подготовиться: прочитать описание лабораторной работы и составить программы для своего варианта задания.
Требования к отчету.
Отчет о лабораторной работе должен содержать титульный лист, задание, блок схему, текст программы, заполненную таблицу результатов и результаты работы программы в виде копий окон Watch, подобных приведенным в методических указаниях окнам, контрольные вопросы.
Лабораторная работа должна быть защищена студентом.
Оборудование и программное обеспечение, необходимое для проведения лабораторных работ: Windows 98 или выше, среда MPLAB, комплект УМК-7.
1 Байтовые и битовые команды. Логика
Цель работы: изучение инструкций BSF, BCF, ADDWF, ANDWF, IORWF, XORWF, SUBWF для выполнения сложения, вычитания, и применения логических функций.
1.1 Краткие теоретические сведения по теме работы
Регистры, применяемые в программе, могут находиться в разных банках. Номер банка, с которым работает программа, определяется регистром специального назначения (РСН) Status, см. приложение А. Кроме того этот регистр контролирует результат выполнении операций, фиксируя переполнение и обнуление регистров. На основе этого контроля создается ветвление алгоритма [1, 2].
Формат и описание инструкций BSF, BCF, ADDWF, SUBWF, ANDWF, IORWF, XORWF приведены в приложении Б.
Операции сложения и вычитания выполняются в двоичной системе счисления, причем вычитание выполняется с помощью прибавления к уменьшаемому вычитаемого, представленного в дополнительном коде.
Выполним сложение 240+4 с десятичными числами (слева) и в двоичной системе справа см. пример а). В примере б) выполнено вычитание 240-128 слева в десятичной системе счисления, справа в двоичной системе. При вычитании в двоичном коде используется вместо вычитания сложение уменьшаемого и вычитаемого, представленного в дополнительном коде:
пример а) 240+4 пример б) 240-128
240 11110000 240 11110000
+ 4 ® + 00000100 -128 ® + 01111111 - инверсия числа 128
244 11110100 112 101101111 -
сумма
+
1 - дополнительный код
01110000 - результат.
Как видно при вычитании было переполнение регистра, поскольку он имеет 8 разрядов. Единица девятого разряда, она выделена жирным шрифтом, будет перенесена в бит С регистра Status. В самом регистре останется только 8 разрядов, которые в десятичной форме дают правильный результат 112. Был также перенос из 3 разряда единицы в 4-й разряд, т.е. из младшего в старший полубайт, поэтому в регистре Status бит DC будет также равен единице.
В таблице 1.1 представлены логические функции, их таблицы истинности, условные обозначения и интерпретация на электрической схеме. Все логические операции выполняются поразрядно.
Логическая функция ‘ИЛИ’ (‘OR’) может применяться для включения оборудования любым из двух датчиков, расположенными в разных местах.
Логическая функция ‘И’ (‘AND’) применяется в том случае, если оборудование должно включаться, при срабатывании (включении) двух датчиков одновременно. Например, освещение в помещении автоматически включается при низкой освещенности и наличия в нем людей.
Логическая функция ‘Исключающее ИЛИ’ (‘XOR’) применяется, например, для управления освещением длинного тоннеля. В разных концах тоннеля устанавливаются переключатели Х1 и Х2, имеющие нормально открытый и нормально закрытый контакты. С любого конца тоннеля, изменив положение переключателя, можно включить освещение, если оно было выключено или включить – если оно было включено.
Таблица 1.1 –Логические функции Y=f(X1,X2)
Инструкция |
Таблица истинности |
Условное обозначение |
Интерпретация на электрической схеме |
||
Х1 |
Х2 |
Y |
|||
|
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’ – это указатель для ассемблера, что код, следующий за этим выражением, будет записан, начиная с нулевого адреса электрически программируемого постоянного запоминающего устройства (ЭППЗУ). Указатель EQU от equal (англ.) – равносильный, равный.
Программа Л1.
Include <p16F877.inc>; в этом файле описаны символьные имена РСН.
R1 EQU h'21'; R1 - символьное имя регистра по адресу h’21’.
R2 EQU h'22'; R2 - символьное имя регистра по адресу h’22’.
R3 EQU h'23'; R3 - имя регистра по адресу h’23’.
REZ EQU h'24'; REZ - имя регистра для записи результатов.
; Инструкции для настройки МК
ORG h'00'; следующая инструкция NOP будет записана по адресу h’00’.
NOP; пишется для настройки отладчика.
NOP
NOP
ORG h'05'; следующая инструкция CLRF запишется по адресу h’05’.
CLRF STATUS; очищаем регистр от мусора, выбираем нулевой банк.
BSF STATUS, 5; переходим в первый банк в нём регистр TRISC.
CLRF TRISC; настраиваем все биты PORTC на вывод данных.
BCF STATUS, 5; возвращаемся в нулевой банк.
; Рабочая часть программы. Ввод данных
MOVLW D'240'; запись константы в аккумулятор W.
MOVWF R1; запись содержимого W в регистр R1.
MOVLW D'130'; запись константы в аккумулятор W.
MOVWF R2; запись содержимого W в регистр R2.
MOVLW D'5'; запись константы в W.
MOVWF R3; запись содержимого W в регистр R3.
; Выполнение вычислений
MOVF R1, W; запись константы из R1 в регистр W.
SUBWF R2, W; вычитание W=R2-W=R2- R1.
MOVWF REZ; переслать содержимое W в регистр REZ.
MOVF R2, W; запись константы из R2 в регистр W.
ADDWF R1, W; W=R2+W=R1+R2.
MOVWF REZ
MOVF R2, W; копируем содержимое R2 в W.
SUBWF R1, W; вычитание W=R1-W=R1-R2. Результат оставляем в W.
MOVWF REZ; переслать содержимое W в регистр REZ.
MOVF R2, W; запись константы в регистр W из R2.
ADDWF R3, W; W=R3+W=R2+R3.
MOVWF REZ
MOVF R2, W; запись константы в регистр W из R2.
SUBWF R2, W
MOVWF REZ
MOVF R2, W; запись константы в регистр W из R2.
ANDWF R1, W; операция W=R1 AND W(R2), результат в W.
MOVWF REZ
END; конец программы.
Самостоятельно продолжите программу командами для выполнения операций R2+R3, R1 OR R2, R1 XOR R2.
Данные для варианта возьмите из таблицы 1.2.
Т а б л и ц а 1.2 – Варианты заданий
Вариант |
Числа R1, R2, R3 |
Вариант |
Числа R1, R2, R3 |
1 |
81h, 12h, 1h |
6 |
86h, 67h, 6h |
2 |
82h, 23h, 2h |
7 |
87h, 68h, 7h |
3 |
83h, 34h, 3h |
8 |
88h, 69h, 8h |
4 |
84h, 45h, 4h |
9 |
89h, 6Ah, 9h |
5 |
85h, 56h, 5h |
10 |
8Ah, 6Bh, Ah |
1.3 Порядок выполнения работы
Загрузите MPLAB. На новом листке напишите программу на ассемблере, учитывая регистр и отступы программы, и сохраните её в папке. Создайте новый проект с таким же именем в той же папке, как описано в [3]. Символ «;» обозначает комментарии и последующий текст строки программы не читается компилятором. Перепишите проект в микроконтроллер. Создайте окно наблюдения для всех применяемых в программе регистров в необходимом формате чисел. Выполните программу в ручном, пошаговом режиме. Результаты всех операций с числами запишите в таблицу 1.3. В отчете дополнительно приведите ручной расчет операций сложения и вычитания и укажите их влияние на Status.
Т а б л и ц а 1.3 - Пример записи результатов работы команд
Числа на входе |
Действие |
Результат в REZ |
Значение в Status Форма B |
||
Форма B или D |
Форма B или D |
Форма D |
Форма B |
||
R1=D’240’ |
R2=D’130’ |
R1-R2=240-130 |
D’110’ |
- |
00011001 |
R1=D’240’ |
R2=D’130’ |
R1+R2=240+130 |
D’114’ |
- |
00011001 |
R1=D’240’ |
R2=D’130’ |
R2-R1=130-240 |
D’146’ |
- |
00011010 |
R2=D’130’ |
R3=D’5’ |
R2+R3=130+5 |
D’135’ |
- |
00011000 |
R2=D’130’ |
R2=D’130’ |
R2-R2130-130 |
D’0’ |
- |
00011111 |
R1=D’240’ |
R2=D’0’ |
R2-R1=0-240 |
D’16’ |
- |
00011010 |
R1=b’11110000’ |
R2=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?
2 Маскирование. Суммирование массива
Цель работы: обучение маскированию данных. Создание алгоритма и программы суммирования массива.
2.1 Краткие теоретические сведения по теме работы
При маскировании выполняются побитные логические операции исходного числа и маски с целью одновременного изменения нескольких разрядов исходного числа или с цель проверки равенства чисел:
- логическая операция AND исходного числа и числа-маски очищает разряд в исходном числе, если в соответствующем разряде числа-маски записан 0, и не изменяет его, если в разряде маски записана единица;
- логическая операция OR исходного числа и числа-маски устанавливает в разряд исходного числа 1, если в таком же разряде маски записана 1, и не изменяет его, если в этом разряде маски записан 0;
- логическая операция «исключающее ИЛИ» (XOR) исходного числа и числа-маски инвертирует содержимое бита исходного числа, если в соответствующем разряде числа маски записана 1, и не изменяет его, если в этом разряде маски записан 0. Операция часто применяется для определения равенства регистра какому-либо числу, записанному в маске.
Примеры результатов маскирования приведены в таблице 2.1.
Т а б л и ц а 2.1 – Результаты маскирования
Объекты |
Операция |
|||
OR (установка 1 с 4 по 7 биты) |
AND (очистка с 0 по 3 бит) |
XOR (инверсия с 4 по 7 бит) |
XOR (проверка на равенство) |
|
Число |
10101010 |
10101010 |
10101010 |
11011101 |
Маска |
11110000 |
11110000 |
11110000 |
11011101 |
Результат |
11111010 |
10100000 |
01011010 |
00000000 |
Циклические структуры организуются с помощью операторов условий совместно с оператором перехода.
Инструкции условных переходов BTFSC и BTFSS проверяют состояние заданного бита в любом регистре и в зависимости от результата, пропускают или не пропускают следующую инструкцию программы. Инструкция BTFSC пропускает следующую инструкцию, если заданный бит сброшен. Инструкция BTFSS пропускает следующую инструкцию, если заданный бит установлен. На основе этого создается передача управления в другое место программы и организация циклов, см. таблицу 2.2.
Т а б л и ц а 2.2
Использование бита CARRY (C) |
|
BTFSS STATUS, C GOTO METKA MOVWF R2 |
Если в бите Carry установлена единица, то пропускается следующая инструкция программы GOTO МЕТКА и сразу выполняется инструкция MOVWF R2 |
Если бит Carry сброшен, то выполняется следующая инструкция программы GOTO METKA |
|
Использование бита ZERO (Z) |
|
BTFSS STATUS, Z MOVF R2, W MOVWF PORTC |
Если в бите Z установлена единица, то пропускается следующая инструкция программы MOVF R2 и сразу выполняется инструкция MOVWF PORTC |
Если бит Z сброшен, то выполняется следующая инструкция программы MOVF R2, W и затем MOVWF PORTC |
В реальных программах вместо указанных в таблице 2.2 инструкций пишутся инструкции, соответствующие разработанному алгоритму.
В предыдущих лабораторных работах мы применяли абсолютную адресацию, при этом адрес регистра записывается непосредственно в инструкцию. В этой лабораторной работе будем применять косвенную адресацию, при которой в инструкцию записывается указатель адреса, который может меняться в процессе выполнения программы [1, 2, 3].
2.2 Задания и исходные данные
Изучите способы организации программ с косвенной адресацией на примере приведённой блок-схемы и приведенных ниже фрагментов программы Л2. Регистр FSR, который является просто указателем, хранит адрес ячейки, к которой происходит обращение через имя формально существующего регистра INDF.
Задача. В массив записано потребление энергии за четыре месяца. Требуется определить суммарный расход энергии за указанный период и средний расход энергии в месяц.
Блок-схема алгоритма суммирования массива и нахождения среднего приведена на рисунке 2.1. В ней предполагается, в массив данные уже записаны.
Символьные имена регистров массива показаны на рисунке 2.2.
Рисунок 2.1 – Блок-схема
Фрагменты программы суммирования массива Л2.
Include<p16f877.inc>
EL_MAS_0 EQU h'40'; нулевой элемент массива.
EL_MAS_1 EQU h'41'; первый элемент массива.
EL_MAS_2 EQU h'42'; второй элемент массива.
EL_MAS_3 EQU h'43'; третий элемент массива.
IND_EL_MAS EQU h'50'; для записи индекса добавляемого элемента массива.
SHAG EQU h'22'; шаг изменения данных.
KOL_EL EQU h'44'; регистр для хранения количества элементов массива.
SUM EQU h'51'; регистр для хранения суммы.
SREDNEE EQU h'52'; регистр для хранения среднего расхода энергии.
; Стандартные операции настройки МК пропущены.
; Заполнение массива с шагом 2
MOVLW D'2'
MOVWF SHAG
MOVLW D'11'
MOVWF EL_MAS_0
ADDWF SHAG, W; W= EL_MAS_0+SHAG
MOVWF EL_MAS_1
ADDWF SHAG, W; W= EL_MAS_1+SHAG
MOVWF EL_MAS_2
ADDWF SHAG, W; W= EL_MAS_2+SHAG
MOVWF EL_MAS_3
CLRF SUM
CLRF IND_EL_MAS
MOVLW D'4'; количество элементов массива.
MOVWF KOL_EL
MOVLW EL_MAS_0; запись адреса регистра EL_MAS_0.
MOVWF FSR; запись в регистр FSR адреса нулевого регистра массива.
NEXT_ELEM
MOVF SUM, W
ADDWF INDF, W; сложить W и текущий элемент массива.
MOVWF SUM; запоминаем полученную сумму.
; Подготовка к следующему циклу
INCF FSR, F; переход к адресу следующего регистра массива.
INCF IND_EL_MAS, F; фиксируем индекс следующего элемента.
MOVF KOL_EL, W
XORWF IND_EL_MAS, W; проверяем индекс элемента равен 4?
BTFSS STATUS, Z; проверка: все элементы суммировали (Z=1)?
GOTO NEXT_ELEM; только если Z =0, повторяем цикл.
,; Подготовка вычисления среднего значения
MOVF SUM, W; если Z=1, все элементы сложили, запоминаем сумму.
MOVWF SREDNEE; копируем SUM в SREDNEE.
. . . .
END
Напишите самостоятельно команды деления на 4 с помощью двух сдвигов вправо командой RRF регистра SREDNEE, см. таблицу 2.3. Не забывайте обнулять бит Carry перед сдвигом.
Количество повторений в цикле определяется следующим образом. Сначала записывается количество элементов в регистр Kol_El. Затем при каждом повторе цикла, увеличиваем индекс элемента в регистре и проверяем, получен ли ноль командой XORWF IND_EL_MAS, W, здесь W= Kol_El. Поскольку регистр с индексом 4 будет лишним, выходим из цикла.
3.3 Порядок выполнения работы
Используя приведенные выше фрагменты, подготовьте программу по варианту из таблицы 2.4 для нахождения суммы массива. Создайте проект, скопируйте его в микроконтроллер. Создайте окно наблюдения для всех регистров в необходимом формате чисел и внесите в отчет по лабораторной работе. Необходимые регистры показаны на рисунке 2.2. |
|
Рисунок 2.2 – Окно наблюдения |
|
Выполняя программу в пошаговом режиме, заполните таблицу 2.3.
Т а б л и ц а 2.3– Сумма массива и среднее массива
Вариант |
Адрес регистра массива, указываемый в FSR |
Число в регистре массива |
Сумма в регистре W или значение регистра SREDNEE |
||
Индекс регистра |
Форма h |
Форма D |
Форма В |
||
11 |
1 |
40h |
D ‘11’ |
11 |
00001011 |
11 |
2 |
41h |
D ‘13’ |
24 |
00011000 |
11 |
3 |
42h |
D ‘15’ |
39 |
00100111 |
11 |
4 |
43h |
D ‘17’ |
56 |
00111000 |
Сдвигая регистр SREDNEE вправо, делим 56 на 2 |
28 |
00011100 |
|||
Сдвигая регистр SREDNEE еще раз вправо, делим 56 на 4. |
14 |
00001110 |
Т а б л и ц а 2.4 – Варианты заданий
Вариант |
Значение первого регистра |
Адреса регистров массива |
Вариант |
Значение первого регистра |
Адреса регистров массива |
1 |
D’21’ |
21h – 24h |
6 |
D’26’ |
26h – 29h |
2 |
D’22’ |
22h – 25h |
7 |
D’27’ |
27h – 30h |
3 |
D’23’ |
23h - 26h |
8 |
D’28’ |
28h – 31h |
4 |
D’24’ |
24h - 27h |
9 |
D’29’ |
29h – 32h |
5 |
D’25’ |
25h - 28h |
10 |
D’30’ |
30h – 33h |
П р и м е ч а н и е – Шаг заполнения массива примите равным двум. |
2.4 Контрольные вопросы
1. Какие биты Status меняют свои значения при операциях вычислений?
2. Поясните команду условного перехода BTFSS STATUS, Z.
3. Как можно определить равенство чисел?
4. Какие способы адресации вы знаете?
5. Как контролируется в цикле выход за пределы массива?
6. Назначение регистра FSR.
7. Назначение регистра INDF.
8. Назначение символа точка с запятой в программе.
9. Зачем очищается регистр SUM перед циклом сложения?
10. Какое участие принимает бит C регистра Status в операции сдвига?
11. Как очистить нечетные разряды регистра?
12. Как установить в разряды регистра единицы?
13. Зачем применяют логическую функцию Исключительно ИЛИ?
14. Приведите таблицы истинности для AND, OR, XOR.
15. Какой адрес у аккумулятора W?
3 Автоматизация окрасочной камеры. Подпрограммы
Цель работы: создание программы автоматизации окрасочной камеры с применением подпрограмм для задержки времени, расчет задержки времени.
1.1 Краткие теоретические сведения по теме работы
Подпрограммы применяют в тех случаях, когда в нескольких места алгоритма требуется выполнить одинаковые действия, но с разными данными. Кроме того, часто программу разбивают на подпрограммы, чтобы упростить её чтение.
Отсчет времени можно организовать с помощью подпрограмм со счетчиками, что и реализовано в алгоритме, показанном на рисунке 3.1. Вся работа подпрограммы сводится к уменьшению значений всех счетчиков до нуля, на что тратится определенное время. Длительность времени задержки определяется начальной величиной счетчиков и временем выполнения инструкций подпрограммы в МК.
Время задержки примерно определяется произведением счётчиков на длительность машинного цикла выполнения команды Sch_out×Sch_in×Tm.
Поскольку микропроцессор работает с высокой частотой, приходится создавать внешние циклы для увеличения времени задержки.
Подпрограммы пишут после инструкции GOTO$ основной программы. Подпрограмма из основной программы вызывается по имени. Значение аккумулятора W является аргументом для подпрограммы Timer. После завершения ее работы управление передается в главную программу на следующую инструкцию после вызова Timer [1, 2, 4].
2.2 Задания и исходные данные
Задание на проектирование. Создайте программу для автоматической окрасочной камеры, выполняющую такие действия:
- при подаче питания включить световую сигнализацию на пульт оператора L2 и звуковую сигнализацию S1 по месту;
- через 2 секунды сирену выключить и включить двигатель краскораспылителя D1, двигатель вентилятора D2 и лампочку L1, сигнализирующую об окраске;
- через три секунды выключить двигатель краскораспылителя D1;
- ещё через 2 секунды выключить вентилятор D2 и лампочку L1;
- пауза в 1 секунду для замены заготовки в камере;
- повторить процесс окрашивания новой заготовки, начиная с включения сирены.
На рисунке 3.2 показана схема подключения оборудования к битам регистра PORTC.
Рисунок 3.2 – Схема подключения оборудования
На рисунке 3.3 показана временная диаграмма работы окрасочной камеры.
Рисунок 3.3 – Временная диаграмма работы окрасочной камеры
Фрагменты программы Л3 для автоматизации окрасочной камеры.
include<p16F877.inc>; файл с описанием имен РСН.
; Описание символьных имен регистров общего назначения
Sch_in EQU H'22'; счетчик внутреннего цикла задержки.
Sch_out EQU H'24' ; счетчик внешнего цикла задержки.
Sch3 EQU H'23' ; счетчик третьего цикла задержки.
Инструкции стандартной настройки МК опущены.
; Рабочая часть программы
MOVLW B'10000000'
MOVWF PORTC; включаем сигнализацию L2 на пульт оператора.
Sled_det BSF PORTC, 0; включаем звуковую сигнализацию S1.
MOVLW d’40’; W задаем время таймера. При отладке принять d’2’.
CALL Timer
MOVLW B’10001110’
MOVWF PORTC; выключаем S1, включаем D1, D2 и L1.
MOVLW d’60’; задаем время окраски.
CALL Timer
BCF PORTC, 2; выключаем D1, продолжают работать D2, L1 и L2.
MOVLW d’40’; задаем время работы D2 и L1.
CALL Timer
MOVLW B'10000000'
MOVWF PORTC; окраска закончена, сигнализация L2 работает.
MOVLW d’20’; задаем время для замены заготовки.
CALL Timer
GOTO Sled_det; переход на метку Sled_det для повтора работы.
GOTO $; разделитель основной программы и подпрограмм.
Timer; подпрограмма Timer. Применено два вложенных цикла.
MOVWF Sch3; значение W является аргументом для подпрограммы.
M3 MOVLW D'150'
MOVWF Sch_out; устанавливаем значение внешнего счетчика.
M_out; метка внешнего счетчика.
MOVLW D’255';
MOVWF Sch_in; устанавливаем значение внутреннего счетчика.
M_in; метка внутреннего счетчика.
DECF Sch_in, F; уменьшаем значение счетчика Sch_in на 1.
BTFSS STATUS, Z; если Sch_in обнулился (Z=1), пропускаем GOTO.
GOTO M_in; срабатывает только при Z=0.
DECF Sch_out, F; уменьшаем значение счетчика Sch_out на 1,
BTFSS STATUS, Z; если Sch_out обнулился (Z=1), пропускаем GOTO.
GOTO M_out; срабатывает только при Z=0.
DECF Sch3, F; уменьшаем значение счетчика Sch3 на 1,
BTFSS STATUS, Z; если Sch3 обнулился (Z=1), пропускаем GOTO.
GOTO M3; инструкция срабатывает только при Z=0.
RETURN; конец подпрограммы Timer.
END; конец текста всей программы.
3.2 Задания и исходные данные
Разработайте программу, включающую и выключающую оборудование на заданное время, согласно варианту задания из таблицы 3.1. Измените предыдущую программу вашего проекта.
Т а б л и ц а 3.1 – Варианты заданий
Вариант |
Биты подключения
S1,
D1,
D2 |
Время работы, сек |
Вариант |
Биты подключения
S1,
D1,
D2 |
Время работы, сек |
||||
S1 |
D1 |
D2 |
S1 |
D1 |
D2 |
||||
1 |
1, 2, 3, 4, 5 |
5 |
6 |
3 |
6 |
6, 7, 0, 1, 2 |
6 |
6 |
4 |
2 |
2, 3, 4, 5, 6 |
6 |
7 |
4 |
7 |
7, 0, 1, 2, 3 |
7 |
7 |
5 |
3 |
3, 4, 5, 6, 7 |
7 |
6 |
5 |
8 |
0 ,1 ,2 ,3, 4 |
8 |
6 |
6 |
4 |
4, 5, 6, 7, 0 |
8 |
5 |
6 |
9 |
1, 3, 5, 7, 0 |
9 |
5 |
7 |
5 |
5, 6, 7, 0, 1 |
9 |
7 |
7 |
10 |
2, 4, 6, 0, 1 |
10 |
6 |
3 |
3.3 Выполнение задания
Создайте окно наблюдения. В него выведете значения всех регистров, имеющихся в программе в необходимом формате.
Выполнение отладки программы. Оставьте только первый вызов подпрограммы Timer, установив аргумент W=2. Остальные вызовы выключите, напечатав перед инструкциями Call символ «;». Установите значения для счетчиков Sch_in и Sch_out равные 2. Введите разработанную программу в микроконтроллер. После отладки программы в пошаговом режиме, восстановите первоначальные значения аргумента W, счетчиков Sch_in и Sch_out и запустите ее в автоматическом режиме. Рассчитайте значение W для заданного времени работы оборудования по варианту методом пропорций, если известно, что при W=20 время задержки равно 1 секунде. Для уточнения времени задержки можно добавить в циклы дополнительные бесполезные инструкции NOP, которые ничего не делают, но требуют время на свое выполнение.
Т а б л и ц а 3.2– Результаты настройки циклов задержки
Вариант |
Оборудование |
Параметры подпрограммы Timer |
|||
Время работы, сек |
Значение счетчиков |
||||
Sch_in |
Sch_out |
Sch3 |
|||
|
S1 |
|
|
|
|
|
D1, D2, L1 |
|
|
|
|
|
D2, L1 |
|
|
|
|
Внимание! Обязательно сохраните подпрограмму Timer в папке «Мои документы», поскольку она будет применяться в следующих работах.
Результаты занесите в таблицу 3.2. Продемонстрируйте работу программы преподавателю.
3.4 Контрольные вопросы
1. Почему создан третий цикл в подпрограмме Timer?
2. Назначение подпрограмм.
3. Цикл, вложенный цикл.
4. Что такое машинный цикл?
5. За сколько машинных циклов выполняется каждая команда в Timer?
6. Почему в Timer выбраны указанные значения Sch_in и Sch_out?
7. Как вызывается подпрограмма на выполнение?
8. Опишите работу инструкции DECF Sch_out, F.
9. Приведите формулу для расчета времени задержки.
10. Как разделяются главная программа и подпрограммы?
11. Какими операторами начинается и заканчивается подпрограмма?
12. Как выполняется отладка подпрограммы Timer?
13. Что является аргументом для подпрограммы Timer?
4 Умножение и деление
Цель работы: изучить алгоритмы выполнения умножения и деления. Научиться сравнивать числа и выполнять ветвление алгоритма.
4.2 Краткие теоретические сведения по теме работы
Инструкции условных переходов BTFSC и BTFSS проверяют состояние заданного бита в любом регистре, см. таблицу 2.2 второй лабораторной работы. Основываясь на этих инструкциях, создают циклические алгоритмы для умножения и деления.
Продолжение или прекращение выполнения цикла часто связывают со сравнением двух чисел: количества заданных циклов и номера выполняемого цикла.
В ассемблере отсутствуют инструкции сравнения чисел. Чтобы определить, какое из чисел больше (меньше), применяют такой алгоритм:
а) Выполняют вычитание чисел. При этом в зависимости от результата, устанавливаются флаги C и Z регистра Status, приведенные в таблице 4.2.
б) Далее применяют инструкции условных переходов.
Т а б л и ц а 4.2 – Регистрация событий в регистре Status при вычитании
Соотношения значений в W и РОН UMENSH |
Значения флагов регистра Status после выполнения вычитания |
|
Флаг Z |
Флаг C |
|
UMENSH-W>0 |
0 –нулевого результата не было |
1 – был перенос из 7 бита W в бит С (при сложении в дополнительном коде) |
UMENSH-W<0 |
0 – нулевого результата не было |
0 – не было переноса из 7 разряда W в бит С (при сложении в дополнительном коде) |
UMENSH-W=0 |
1 – был нулевой результат операции |
1- был перенос из 7 разряда W в бит С (при сложении в дополнительном коде) |
П р и м е ч а н и е – В регистр UMENSH помещается уменьшаемое число |
Умножение можно выполнить последовательным сложением.
Например, 25×10=25+25+25+25+25+25+25+25+25+25=250.
Алгоритм целочисленного деления показан в таблице 4.3 на примере деления 35 на 10. Из алгоритма видно, что, если делитель равен нулю, то программа зациклится. Блок-схема алгоритма представлена на рисунке 4.1.
Умножение на дробное число можно выполнить с точностью до целых с помощью умножения заданного числа на целое число (множитель), и затем деления результата на другое целое число (делитель). Множитель и делитель подбираются на калькуляторе или MSExcel [1, 2, 3, 4].
4.2 Задания и исходные данные
Изучите пример выполнения умножения числа 6 на 0,8. Сначала на калькуляторе подберем целочисленный множитель и целочисленный делитель, таким образом, чтобы получить примерно заданный коэффициент. В данном случае подходят множитель 4 и делитель 5, поскольку 4/5=0,8. Далее умножаем заданное число на четыре, и затем результат делим на пять. Остаток будет определять погрешность проведенных вычислений. Оформим умножение и деление в виде подпрограмм, которые будем применять в дальнейшем.
Таблица 4.3 – Алгоритм целочисленного деления
Цикл |
Частное |
Рабочий регистр |
Действие |
Рабочий регистр |
Значение бита «С» |
С=0? |
Действие |
1 |
1 |
35 |
Rab_peg= Rab_peg- Delitel |
25 |
1 |
Нет |
Повторяем цикл |
2 |
2 |
25 |
15 |
1 |
Нет |
Повторяем цикл |
|
3 |
3 |
15 |
5 |
1 |
Нет |
Повторяем цикл |
|
4 |
4 |
5 |
-5 |
0 |
Да |
Возвращаемся назад на 1 шаг |
|
|
3 |
5 |
|
|
|
|
Остаток=5 |
Результат деления: частное=3, остаток =5, т.е. 35/10=3 (5) |
Фрагменты программы деления и умножения Л4.
Примененные регистры общего назначения показаны на рисунке 4.2. Стандартная настройка микроконтроллера опущена.
; Рабочая часть программы
CLRF PORTC; записать в PORTC нули (потушить светодиоды).
CLRF Delitel; очищаем делитель.
; Умножаем 6×0,8=6×4/5=4(4)
MOVLW D'6'
MOVWF Chislo; заданное число
MOVWF Umn_Chislo; регистр, из подпрограммы Umnozhenie.
MOVLW D'4'
MOVWF Mnozh; множитель.
MOVLW D'5'
CALL Umnozhenie; в результате получим произведение в регистре Pr.
; Подготовка к делению
Movf Pr, W; значение Pr получено в подпрограмме Umnozhenie.
Movwf Delimoe
Movlw D'5'
movwf Delitel; если не дать значение будет деление на ноль.
CALL Delenie
Goto$
Umnozhenie; подпрограмма. Входы Umn_Chislo и Mnozh, выход Pr.
Clrf Pr
Clrf Kol_slag
Sled_slag
Movf Pr, W
Addwf Umn_Chislo, W; добавление очередного слагаемого.
Movwf Pr
Incf Kol_slag, F; отмечаем количество слагаемых.
MOVF Kol_slag, W
XORWF Mnozh, F; маскированием проверяем Kol_slag=Mnozh.
Btfss STATUS, Z
Goto Sled_slag; выполняется только при Z=0.
RETURN
Delenie; подпрограмма. Входы Delimoe и Delitel, выходы Chastnoe и Ostatok.
CLRF Chastnoe
Movf Delimoe, W;
MOVWF Rab_peg; записали Delimoe в рабочий регистр.
MOVF Delitel, W; проверка на нуль.
BTFSC STATUS, Z; защита от деления на нуль.
GOTO NUL; выполняется только при Z=1.
Metka INCF Chastnoe, F; накапливаем частное.
SUBWF Rab_peg, F; вычитаем Rab_peg=Rab_peg-Delitel.
BTFSC STATUS, C; проверяем разность отрицательная?
GOTO Metka; выполняется только при C=1.
; Возврат на один шаг
DECF Chastnoe, F; восстанавливаем частное.
ADDWF Rab_peg, W; восстанавливаем Rab_peg.
MOVWF Ostatok; получаем остаток.
RETURN
NUL MOVLW D'255'; метка завершения программы при делении на ноль.
MOVWF PORTC; сигнализируем о попытке деления на нуль.
END
5.2 Порядок выполнения работы
Задание на лабораторную работу. Напишите программу умножения на дробное число для варианта из таблицы 4.4.
Таблица 4.4– Варианты заданий
Вариант |
Коэффициент |
Число |
Вариант |
Коэффициент |
Число |
1 |
1,33 |
62 |
6 |
6,33 |
12 |
2 |
2,33 |
35 |
7 |
7,33 |
11 |
3 |
3,33 |
22 |
8 |
8,33 |
10 |
4 |
4,33 |
17 |
9 |
9,33 |
9 |
5 |
5,33 |
14 |
10 |
10,33 |
8 |
Рисунок 4.2 – Окно наблюдения |
Создайте окно наблюдения для всех регистров в необходимом формате чисел и приведите в отчете по лабораторной работе. Чтобы быстро получить данные в окне наблюдения запустите составленную программу в автоматическом режиме (кнопка F9). После её выполнения нужно нажать кнопку F5, чтобы установились значения регистров в окне наблюдения. |
Результаты работы запишите в таблицу 4.5
Таблица 4.5 Вариант 11. Результаты умножения на 0,8.
Коэффициент |
Число |
Множитель |
Делитель |
Результат |
Остаток |
Точность |
0,8 |
6 |
4 |
5 |
4 |
4 |
83,3% |
Сохраните программу умножения на дробное число в папке «Мои документы, она будет применяться в следующих работах.
5.2 Контрольные вопросы
1. Поясните команду условного перехода BTFSC STATUS, C.
2. Поясните команду условного перехода DECFSZ R3, F.
3. Расскажите об алгоритме умножения на целое число.
4. Какой логической операцией можно определить равенство чисел?
5. Расскажите об алгоритме деления на целое число.
6. Расскажите об алгоритме умножения на дробное число.
7. Как контролируется отрицательный результат вычитания?
8. Как контролируется нулевой результат вычитания?
9. Какой результат будет при умножении 26 на 10 в регистре МИКРОКОНТРОЛЛЕР?
10. Умножить 4 на 0,8 можно двумя способами: 4×4/5 или 4/5×4. Будут ли результаты одинаковы?
11. Поясните инструкцию условного перехода BTFSS STATUS, Z.
12. Как можно определить равенство чисел?
13. Когда флаги Z и C регистра Status одновременно равны нулю?
14. Как выполняется сравнение чисел?
5 Регулирование расхода газа
Цель работы: закрепление навыков организации условных переходов. Написание программы регулирования расхода газа с помощью исполнительного механизма МЭО вращающего заслонку на трубе.
5.1 Краткие теоретические сведения по теме работы
На производстве газ подается под давлением в технологическую установку. Давление в трубе меняется, но требуется поддерживать постоянный расход газа. Давление газа P, после заслонки измеряется датчиком, и данные пересылаются в МИКРОКОНТРОЛЛЕР. Расход газа (объем) определяется по формуле V=K×SQRT(P). Здесь K коэффициент, зависящий от свойств газа. Чтобы при понижении давления поддержать постоянный расход газа Vраб, необходимо приоткрыть заслонку (направление «Bolshe») на трубопроводе с помощью исполнительного механизма МЭО. Подача импульса на МЭО длится одну – две секунды. При увеличении давления заслонка прикрывается (направление «Menshe»), уменьшая тем самым подачу газа. Эти действия выполняются подачей разно полярных импульсов на МЭО. Через небольшой промежуток времени повторно измеряется давление, и повторяется корректировка подачи газа, тем самым достигается достаточно постоянный расход газа.
Для упрощения вычислений ограничимся целочисленными значениями квадратного корня с некоторым избытком от действительного значения корня. Для вычисления корня применим алгоритм возведения целого числа N в квадрат с помощью ряда:
N2=1+3+5+7+9…Количество слагаемых равно числу N.
Для N=5 получаем 52=1+3+5+7+9=25.
Если задано давление 30, то мы будем накапливать сумму, добавляя слагаемые до тех пор, пока сумма не будет больше 30. То есть целочисленное значение корня примем равным 6. Допустим K=4, тогда расход газа V=6×4=24. Если был задан расход 20, то заслонку следует слегка закрыть направление «Menshe». Если был задан расход 28, то заслонку следует слегка приоткрыть направление «Bolshe» [1, 2, 3, 4].
5.2 Задания и исходные данные
Сигнал для прикрытия заслонки будем подавать на МЭО через нулевой разряд PORTC. Сигнал на увеличения открытия заслонки через первый разряд PORTC. Этот фрагмент оформим в виде подпрограммы. При этом используем особенности кодировки латинских букв «В» и «М» в 0 и 1 разрядах для управления вращением МЭО. Буква «В» имеет 1 в первом разряде, а буква «М» имеет 1 в нулевом разряде.
Фрагменты программы регулирования расхода газа Л5.Стандартная настройка МИКРОКОНТРОЛЛЕР опущена.
; Ввод данных в регистры SHAG, DAVLENIE, FAKT_RASKHOD
MOVLW D'2'
MOVWF SHAG; шаг изменения слагаемых.
MOVLW D'14'
MOVWF TREB_RASKHOD; требуемый расход газа.
MOVLW D'8'; значение давления газа.
MOVWF DAVLENIE; задаем давление газа.
MOVWF CHISLO; для подпрограммы SQRT.
; Рабочая часть программы
CLRF NAPRAV_MEO
CLRF FAKT_RASKHOD
CLRF PORTC
CALL SQRT; вычисляем корень с избытком.
CALL VYCH_OB’EM; вычисляем объем.
CALL MEO; выполняем управлением МЕО.
GOTO$
SQRT; подпрограмма вычисления корня. Вход – CHISLO, выход – KOREN.
MOVLW D'1'
MOVWF SLAGAEMOE; задаем первое слагаемое равное 1.
MOVWF SUM; сумма также равна 1.
MOVWF KOL_SLAG; количество слагаемых также равно 1.
Sled_slag INCF KOL_SLAG, F; отмечаем увеличение количества слагаемых.
MOVF SLAGAEMOE, W
ADDWF SHAG, W; вычисляем значение очередного слагаемого.
MOVWF SLAGAEMOE; запоминаем новое слагаемое.
ADDWF SUM, W; W= SLAGAEMOE+W
MOVWF SUM; запоминаем новую сумму слагаемых.
; Подготовка к следующему циклу
SUBWF CHISLO, W;
BTFSC STATUS, C; определяем, что больше CHISLO или SUM.
GOTO Sled_slag; выполняется только при С=1, повторяя цикл.
MOVF KOL_SLAG, W; при C=0 выходим из цикла.
MOVWF KOREN; фиксируем корень с избытком.
RETURN
VYCH_OB’EM; подпрограмма вычисления объема газа при K=4 V=4×KOREN.
MOVF KOREN , W; вход – KOREN, выход - FAKT_RASKHOD.
MOVWF FAKT_RASKHOD
BCF STATUS, C
RLF FAKT_RASKHOD, F; умножаем на два.
BCF STATUS, C
RLF FAKT_RASKHOD, F; ещё раз умножаем на два.
RETURN
MEO; подпрограмма определения направления "B" или "M" вращения МЭО.
MOVF TREB_RASKHOD, W; требуемый расход пересылаем в W.
SUBWF FAKT_RASKHOD, W; W= Fakt_Raskhod - Treb_Raskhod.
MOVLW b'01001101'; код буквы "М", уменьшаем открытие заслонки.
BTFSS STATUS, C; C = 1?
MOVLW b'01000010'; при C=0, код буквы "В", приоткрываем заслонку.
MOVWF NAPRAV_MEO; запоминаем символ направления вращения.
ANDLW b'00000011'; маской обнуляем ненужные для МЭО разряды.
MOVWF PORTC; пересылаем импульс управления на МЭО.
RETURN
Timer; подпрограмма Timer не приведена.
END
5.3 Порядок выполнения работы
РОН, примененные для хранения данных, показаны на рисунках 5.1 и 5.2. Окна наблюдения приведены при недостаточном и избыточном расходе.
Рисунок 5.1 – Увеличить подачу газа |
Рисунок 5.2 – Уменьшить подачу |
В таблице 5.1 приведены задания на оценку «отлично».
В таблице 5.2 приведены задания на оценку «хорошо».
Таблица 5.1 – Варианты заданий с дробным коэффициентом.
Вари-ант |
Коэф.К |
Давле-ние P1 |
Давле-ние P2 |
Требуемый расход |
Вари-ант |
Коэф.К |
Давл-ение P1 |
Давле-ние P2 |
Требуемый расход |
1 |
1,33 |
8 |
12 |
5 |
6 |
6,33 |
18 |
26 |
35 |
2 |
2,33 |
10 |
22 |
11 |
7 |
7,33 |
20 |
26 |
40 |
3 |
3,33 |
12 |
24 |
15 |
8 |
8,33 |
22 |
26 |
46 |
4 |
4,33 |
14 |
20 |
20 |
9 |
9,33 |
24 |
26 |
51 |
5 |
5,33 |
16 |
18 |
24 |
10 |
10,33 |
26 |
38 |
67 |
П р и м е ч а н и е - Выполнить программу для двух значений давления газа P1 и P2 |
Таблица 5.2 – Варианты заданий для целого K=4.
Вариант |
Давление P1 |
Давление P2 |
Требуемый расход |
Вариант |
Давление P1 |
Давление P2 |
Требуемый расход |
1 |
8 |
12 |
14 |
6 |
18 |
26 |
22 |
2 |
10 |
22 |
18 |
7 |
20 |
26 |
22 |
3 |
12 |
24 |
18 |
8 |
22 |
26 |
22 |
4 |
14 |
20 |
18 |
9 |
24 |
26 |
22 |
5 |
16 |
18 |
18 |
10 |
26 |
38 |
26 |
П р и м е ч а н и е - Выполнить программу для двух значений давления газа P1 и P2 |
Созданный проект выполняется дважды при Р1 и Р2 в автоматическом режиме. Каждый раз при нажатии на кнопку F5 значения регистров в окне устанавливаются. Рисунки окон привести в отчете.
5.4 Контрольные вопросы
1. Назначение подпрограмм.
2. Вызов подпрограммы. Что она передает в главную программу.
3. Где и как записываются подпрограммы?
4. Работа счетчика команд при вызове подпрограммы и ее завершении?
5. Алгоритм возведения целых чисел в квадрат.
6. Как вычисляется приближенное, целочисленное значение корня?
7. Назначение МЭО. Как он работает?
8. В каких случаях флаг Z равен единице при вычитании?
9. В каких случаях флаг С равен единице при вычитании?
10. Когда флаги Z и С регистра Status одновременно равны нулю?
11. Как выполняется сравнение чисел?
12. Как используются кодировки латинских букв «В» и «М»?
6 Программирование клавиатуры
Цель работы: создание программ с вводом данных клавиатурой.
6.1 Краткие теоретические сведения по теме работы
Клавиатура используется в реальных программах для ввода данных, инструкций, для изменения алгоритма вычислений. В лабораторной работе с клавиатуры будем подавать сигнал ’1’ в PORTD, без применения дополнительного источника питания. Сигнал будет обработан микропроцессором и в работу программы будут внесены изменения.
Изучите принципиальную схему подключения пленочной клавиатуры к микроконтроллеру, см. рисунок 6.1. Использование такой схемы подключения продиктовано тем, что все кнопки подключаются к одному регистру порта, имеющему восемь бит.
Разряды RD7, RD6, RD5, RD4 предназначены для подачи сигнала ‘1’. Остальные для приема сигнала. В разряде RD0 по заводской схеме всегда записана «1». На рисунке 6.1 приведена, в качестве примера, монтажная схема подключения кнопки с цифрой «1» к PORTD. Одна клемма кнопки «1» подключена к выводу RD7, а вторая клемма кнопки подключена к выводу RD3. Бит RD7 должен быть запрограммирован на вывод, а бит RD3 - на ввод. Когда кнопка нажата, с бита RD7 проходит сигнал через кнопку «1» на клемму RD3 [1, 2, 3].
Роль кнопок клавиатуры в программе и их расположение: «5» - Кнопка Pusk1 на пульте; «6» - Кнопка Pusk2 по месту; «Shift»- Кнопка Stop1 на пульте; «9» - Кнопка Stop2 по месту. |
|
Рисунок 6.1 – Схема подключения клавиатуры и роль кнопок |
6.2 Задания и исходные данные
Задание на проектирование. В программе автоматизации окрасочной камеры по лабораторной работе №3, предусмотреть запуск камеры для окрашивания каждой детали кнопками «Пуск» и останов камеры кнопками «Стоп» по месту и с пульта оператора.
Дребезг контактов клавиатуры убирается включением подпрограммы Timer на короткое время. Кнопка Stop в данной программе находится в подпрограмме Timer. Выключение оборудования кнопкой здесь возможно, потому что при выполнении программы, она практически все время находится во внутреннем цикле подпрограммы Timer. При других алгоритмах такой вариант выключения невозможен, необходимо предусмотреть прерывание.
Фрагменты программы Л6. Программа пишется на основе лабораторной работой 3. Добавленные команды по сравнению с лабораторной работой 3, выделены курсивом.
; Инструкции для настройки PORTD на ввод/вывод
CLRF TRISC
MOVLW b'00001111'; настраиваем PORTD.
MOVWF TRISD; настраиваем биты 0-3 на ввод, 4-7 на вывод.
BCF STATUS, 5
CLRF PORTC
; Рабочая часть программы
MOVLW B'11110000'
MOVWF PORTD; подаем питание на выводы К4-К7 клавиатуры.
MOVLW B'10000000'
MOVWF PORTC; включаем сигнализацию наличия питания на пульт.
Sled_det BTFSS PORTD, 2; проверяем кнопка Pusk1(2) нажата?
GOTO Sled_det; если кнопка еще не нажата, повторяем проверку.
BSF PORTC, 0; если нажата включаем звуковую сигнализацию S1.
MOVLW d'40'; задаем время работы сигнализации S1.
CALL Timer
MOVLW B'10001110'
MOVWF PORTC; включаем двигатели D1 и D2, сигнализацию L1.
MOVLW d'60'; задаем время работы D1.
CALL Timer
BCF PORTC, 2; выключаем D1, продолжают работать D2, L1 и L2.
MOVLW d'20'; задаем время работы вентилятора и L1.
CALL Timer
MOVLW B'10000000'
MOVWF PORTC; выключаем вентилятор D2 и сигнализацию L1.
MOVLW d’20’; задаем время для замены заготовки.
CALL Timer
GOTO Sled_det; переход на метку Sled_det для нового пуска установки.
GOTO $; разделитель основной программы и подпрограмм.
Timer; в подпрограмме показан только внутренний цикл с кнопками Stop.
M_in; Метка внутреннего счетчика.
BTFSC PORTD, 1; проверяем нажатие кнопки Stop1 или Stop2.
GOTO Stop; если нажата, переход к инструкциям останова камеры.
DECF Sch_in, F; Уменьшаем значение счетчика Sch_in на 1.
BTFSS STATUS, Z; если Sch_in равно нулю (Z=1), пропускаем GOTO.
GOTO M_in; срабатывает только при Z=0.
. . . .
RETURN
Stop CLRF PORTC; останов окрасочной камеры.
END; конец текста всей программы.
6.3 Порядок выполнения работы
Разработайте программу, автоматизации окрасочной камеры, согласно варианту задания из таблицы 6.1.
Т а б л и ц а 6.1 – Варианты заданий
Вариант |
Биты подключения
S1,
D1,
D2 |
Кнопка 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.
7 Автоматизация упаковки. Генерация звука
Цель работы: разработка программы автоматизации упаковочной машины. Генерация прерывистого звука сирены или мигания сигнальной лампочки, установленной возле оборудования
7.1 Краткие теоретические сведения по теме работы
Перед запуском технологического оборудования всегда включается предупреждающая прерывистая звуковая или мигающая световая сигнализация. Это оборудование, как и всё остальное оборудование, подключается к битам PORTC. Согласно временной диаграмме, показанной на рисунке 7.1, одновременно со звуковой сигнализацией S1 горит лампочка L2. Следовательно, на нулевой бит необходимо подавать пульсирующее напряжение, а на первый бит постоянное.
Рисунок 7.1 – Временная диаграмма работы упаковщика
Чтобы не писать дополнительную подпрограмму, пульсирующее напряжение будем создавать, инвертируя нулевой бит PORTC через определённое время во внешнем цикле подпрограммы Timer из третьей лабораторной работы. Это можно выполнить с помощью логической операции Исключительно ИЛИ. В регистре Inver_Bit будем записывать номер инвертируемого бита, поскольку сирена подключена к нулевому биту, то Inver_Bit=h’01’.
Программа должна выполнять следующий алгоритм:
Inver_Bit=h’01’; указываем, что будем инвертировать нулевой бит.
_PORTC= PORTC; запоминаем состояние PORTC в регистре _ PORTC.
W=d’40’; задаём время сигнализации.
Call Timer; вызываем подпрограмму.
PORTC=_ PORTC; возвращаем в PORTC, сохранённое значение.
Inver_Bit=h’00’; запрещаем инвертирование бит PORTC.
Блок – схема изменённой части подпрограммы Timer показана на рисунке 7.2, справа даны пояснения.
|
Здесь W=h’00’ - маска для логической операции XOR. Приравнивая её нулю, предполагаем, что инверсия бит PORTC не нужна.
Проверяем, указаны ли биты для инверсии.
Если инверсия требуется, то изменяем маску, записывая в неё номера инвертируемых бит.
Выполняем логическую операцию маски (W) и PORTC. Если в каком-либо разряде маски записана ‘1’, то этот разряд в PORTC будет инвертирован, остальные разряды в PORTC останутся неизменными.
|
Рисунок 7.2 – Подпрограмма Timer |
7.2 Задания и исходные данные
Задание на автоматизацию упаковочной машины. При подаче напряжения на установку включить лампочку L2 на пульте оператора и предупреждающую звуковую сигнализацию S1 по месту. Через 2 секунды выключить сигнализацию S1 и включить конвейер D1. По конвейеру движутся изоляторы, фотодатчик фиксирует попадание изолятора в коробку. После попадания двух изоляторов включить лампочку L1. После попадания четырех изоляторов включить на две секунды упаковочный механизм D2, заменяющий полную коробку пустой коробкой. Количество упакованных коробок должно быть пересчитано. Фотодатчики имитировать кнопками K5 и K6 клавиатуры.
Т а б л и ц а 7.1 – Назначение битов PORTC и контактов клавиатуры
Регистр PORTC |
Кнопки клавиатуры |
Действия кнопок |
0 разряд - предупреждающая звуковая сигнализация S1 |
5 или 6 |
Фотодатчики |
1 разряд – двигатель конвейера D1 |
|
|
2 разряд – двигатель D2 упаковочного механизма |
|
|
3 разряд – световая сигнализация L1 |
|
|
7 разряд – световая сигнализация работы L2 на пульте оператора |
|
|
Рисунок 7.3 – Окно наблюдения |
В приведенной ниже программе отсутствует кнопка Stop, поскольку при таком алгоритме останов можно выполнить только с помощью прерывания.
7.3 Порядок выполнения работы
Отладка программы. При работе в пошаговом режиме ограничьте работу подпрограммы Timer, оставив только одну действующую команду, записывающую значение W в счетчик Sch3. После отладки программы соедините нулевой бит PORTC с клеммой сирены
На рисунке 7.3 показано окно наблюдения, которое необходимо создать.
Варианты заданий принять из таблицы 7.2.
Т а б л и ц а 7.2 – Варианты заданий
Вариант |
Биты подключения
оборудования |
Вариант |
Биты подключения
оборудования |
1 |
1, 2, 3, 4, 5 |
6 |
6, 7, 0, 1, 2 |
2 |
2, 3, 4, 5, 6 |
7 |
7, 0, 1, 2, 3 |
3 |
3, 4, 5, 6, 7 |
8 |
0 ,1 ,2 ,3, 4 |
4 |
4, 5, 6, 7, 0 |
9 |
1, 3, 5, 7, 0 |
5 |
5, 6, 7, 0, 1 |
10 |
2, 4, 6, 0, 1 |
Фрагменты программы Л7.
include<p16F877.inc>; ниже имена РОН для таймера опущены.
KOL_IZOL EQU h'45'; регистр, для записи количества изоляторов.
KOL_KOROB EQU h'46'; регистр, для хранения количества коробок.
Inver_Bit EQU H'47'; регистр, определяющий инвертируемый бит.
_PORTC EQU H'48'; регистр, для хранения состояния PORTC.
; Стандартные операции настройки МК и клавиатуры опущены.
; Рабочая часть программы
CLRF KOL_KOROB
MOVLW B'10000001'
MOVWF PORTC; включаем сигнализацию L2 на пульт и сирену S1.
Команды для включения прерывистого сигнала сирены.
MOVLW b'00000001'
MOVWF Inver_Bit; задаём бит для инвертирования.
MOVF PORTC, W
MOVWF _PORTC; запоминаем состояние PORTC.
MOVLW d'40'; задаём время работы сирены. При отладке примите d’2’.
CALL Timer
MOVF _PORTC, W
MOVWF PORTC; восстанавливаем состояние PORTC.
CLRF Inver_Bit; выключаем сирену при следующих вызовах п/п Timer.
BCF PORTC, 0; выключаем питание сирены S1.
MOVLW B'10000010'
M1 MOVWF PORTC; включаем транспортер D1, L2 продолжает работать.
CLRF KOL_IZOL
Prov_dat
BTFSS PORTD, 2; проверяем срабатывание датчиков (кнопки "5" и "6").
GOTO Prov_dat
MOVLW D'10'
CALL Timer; убираем дребезг контактов датчиков.
INCF KOL_IZOL, F; фиксируем поступление изолятора в коробку.
MOVLW D'2';
XORWF KOL_IZOL, W; проверяем, поступило два изолятора?
BTFSC STATUS, Z; проверяем Z = 0?
BSF PORTC, 3; только при Z=1, включаем лампочку L1.
MOVLW D'4'; будем проверять поступление четырех изоляторов.
SUBWF KOL_IZOL, W; W=KOL_IZOL-4.
BTFSS STATUS, Z; проверяем Z = 1? (поступили четыре изолятора?)
GOTO Prov_dat; при Z=0, повторяем проверку срабатывания датчика.
MOVLW b'10000110'; только
при Z=1, надо заменить коробку
; (включить D2) и выключить сигнализацию L1.
MOVWF PORTC; пересылаем информацию в PORTC
INCF KOL_KOROB, F; фиксируем заполнение очередной коробки.
MOVLW d'50'; время смены коробок.
CALL Timer
MOVLW b'10000010'; готовимся выключить D2.
GOTO M1;
GOTO$
Timer; Подпрограмма Timer
MOVWF Sch3; W является аргументом для таймера.
; RETURN; команду включить только при наладке программы.
M3 MOVLW D'150'
MOVWF Sch_out; устанавливаем значение внешнего счетчика.
M_out; метка внешнего счетчика.
; Инструкции для генерации звука сирены или мигания
MOVLW b'00000000'; предполагаем, что сирену не надо включать.
MOVF Inver_Bit, F; проверка регистра Inver_Bit на ноль.
BTFSS STATUS, Z; проверяем Z=1?
MOVF Inver_Bit, W; только при Z=0, будем инвертировать бит для S1.
XORWF PORTC, F; маской в PORTC инвертируем бит для сирены.
MOVLW D'255';
MOVWF Sch_in; устанавливаем значение внутреннего счетчика.
M_in; метка внутреннего счетчика. Дальнейшие инструкции Timer опущены.
RETURN; конец подпрограммы.
END; конец текста всей программы.
Покажите работу программы преподавателю.
7.4 Контрольные вопросы
1. Как задаётся время работы подпрограммы Timer.
2. Назначение символа «;» в тексте программы?
3. Порядок отладки программы.
4. Что имитируют кнопки клавиатуры?
5. Как устраняется дребезг контактов?
6. Что такое паразитные наводки?
7. Почему нельзя поместить кнопку Stop подпрограмму Timer?
8. Как имитируется работа аварийных датчиков?
9. Как определяется количество изоляторов равное двум?
10. Как определяется количество изоляторов равное четырем?
11. Как фиксируется заполнение коробки?
8 Перевод чисел из 2-й в 2_10 систему
Цель работы: научиться переводить числа из двоичной системы в двоично-десятичную систему, создание подпрограмм, возвращающих значение в вызвавшую программу.
8.1 Краткие теоретические сведения по теме работы
Как правило, всегда выполняется индикация состояния технологического процесса на пульт оператора в цифровом или символьном виде. Простейший индикатор цифр имеет семь сегментов. Чтобы вывести числа из МК на такой индикатор их необходимо представить в двоично-десятичной системе счислений. В этой системе в одном регистре могут поместиться две десятичные цифры, каждая из которых будет занимать половину байта. От 00000000 до 10011001 в двоичной системе. Таким образом, в регистр можно записать две десятичные цифры и получить числа от 00 до 99 [2].
Подпрограммы, которые мы применяли раньше, имели тип void, т.е. не возвращали никаких значений в вызвавшую их программу. Напишем подпрограмму, результатом работы которой будет передача однобайтного значения в вызвавшую программу для показа на индикаторе какой-либо цифры. Эта подпрограмма обычно используется совместно с цифровым индикатором.
Блок-схема алгоритма перевода частично приведена на рисунке 8.1.
Рисунок 8.1 – Блок-схема
Большинство цифровых индикаторов работают по принципу выборочного включения требуемых сегментов, как показано на рисунке 8.2. Цифрами обозначены разряды порта передающего информацию. Обычно эти сегменты представляют собой светодиоды или электроды элементов на жидких кристаллах.
Рисунок 8.2 – Семи сегментный индикатор
Системное представление нашей подпрограммы приведено на рисунке 8.2,а. Входным сигналом в данном случае является 4-битный двоичный код, находящийся в рабочем регистре W. Выходным значением, также возвращаемым в W, является соответствующий 7-битный код, необходимый для отображения соответствующей цифры (подпрограмма Vyb_Seg). В микроконтроллерах PIC гарвардская архитектура делает невозможным использование значений памяти программ в виде данных. Вместо этого таблицы преобразования реализуются в виде наборов команд retlw, каждая из которых возвращает однобайтную константу, см. подпрограмму Vybor_Seg. Седьмой бит используется для точки.
8.2 Задания и исходные данные
Применяемые символьные имена регистров показаны на рисунке 8.3.
Рисунок 8.3 – Окно наблюдения |
Подпрограмма Vybor_Seg осуществляет выборку строки таблицы, прибавляя число N, передаваемое через рабочий регистр W, к младшему байту счетчика команд (регистр PCL, который расположен по адресу h'02'). Поскольку PCL уже указывает на первую команду retlw с кодом для цифры ‘0’, то после прибавления N он будет указывать на N-ю команду, что нам и требуется. |
Фрагменты программы Л8.
Стандартные инструкции настройки МК и обнуление регистров опущены.
MOVLW b'11101011'; исходное двоичное число.
MOVWF CHISLO
MOVWF Rab_Reg
; Подсчитываем количество сотен
MOVLW D'100'
MOVWF VYCH; вычитаемое при определении количества сотен.
M_SOT INCF K_SOT, F;
SUBWF Rab_Reg, F; Rab_Reg= Rab_Reg-100
BTFSC STATUS, C; проверяем, разность отрицательна (С=0)?
GOTO M_SOT; цикл подсчета количества сотен повторяется при С=1.
ADDWF Rab_Reg, F; был заем, выполняем возврат назад на один шаг.
DECF K_SOT, F ; восстанавливаем количество сотен.
MOVLW D'10'
MOVWF VYCH ; вычитаемое при определении количества десятков.
Подсчёт количества десятков выполняется аналогично подсчету количества сотен. Напишите эту часть программы самостоятельно.
; Находим код для индикации количество единиц
MOVFW Rab_Reg; рабочий регистр содержит единицы после возврата.
MOVWF K_ED; переписываем количество единиц в регистр.
SWAPF K_DES, W; перемещаем десятки в старшие разряды.
ADDWF K_ED, W; добавляем количество единиц в младшие разряды.
MOVWF R_D_ED; регистр теперь содержит десятки и единицы.
MOVF K_ED, W; W- аргумент для подпрограммы Vyb_Seg.
CALL VYBOR_SEG; вызываем подпрограмму с аргументом W.
MOVWF Kod_seg_ed; записываем код для индикации единиц.
; Аналогично найдите коды для индикации десятков и сотен
GOTO $; разделитель главной программы и подпрограмм.
VYBOR_SEG; подпрограмма, возвращающая код для включения сегментов.
addwf PCL, f; получаем новый адрес в PLC=PCL + W
retlw b'00111111'; код для цифры 0. Возвращается при W=0.
retlw b'00000110'; код для цифры 1. Возвращается при W=1.
retlw b'10101101'; код для цифры 2. Возвращается при W=2.
retlw b'01001111'; код для цифры 3. Возвращается при W=3.
retlw b'01100110'; код для цифры 4. Возвращается при W=4.
retlw b'01101101'; код для цифры 5. Возвращается при W=5.
retlw b'01111101'; код для цифры 6. Возвращается при W=6.
retlw b'00000111'; код для цифры 7. Возвращается при W=7.
retlw b'01111111'; код для цифры 8. Возвращается при W=8.
retlw b'01101111'; код для цифры 9. Возвращается при W= 9.
; конец подпрограммы.
END; конец программы.
Задание. Переведите двоичное число в двоично-десятичное число и определите коды для изображения сотен, десятков и единиц на табло.
Т а б л и ц а 8.1 – Варианты заданий
Вариант |
Двоичное число |
Вариант |
Двоичное число |
1 |
11010011 |
6 |
10100110 |
2 |
11110010 |
7 |
10110001 |
3 |
11101001 |
8 |
10111100 |
4 |
10010000 |
9 |
11000111 |
5 |
10011011 |
10 |
11010010 |
Из рисунка 8.3 видно, что заданное двоичное число b'11101011' содержит 2 сотни, 3 десятка и 5 единиц, то есть равно 235 в десятичной системе счисления. Это число и будет светиться на табло.
8.4 Контрольные вопросы
1. Назначение 2-10 системы счисления.
2. Сколько бит занимает 2-10 число?
3. Какое максимальное 2-10 число можно записать в регистр?
4. Как формируются цифры в индикаторе?
5. Назначение команды addwf PCL, f?
6. Что вернёт в вызывающую программу подпрограмма VYBOR_SEG, если при её вызове W=h’06’?
7. С какой целью в программе применена команда Swap?
8. Объясните алгоритм нахождения сотен.
9. Какое назначение регистра R_D_ED?
10. Как определяется, что получилась отрицательная разность?
11. Как определяется, что получился нулевой результат?
12. Назначение регистра PCL?
9 Таймер TMR1
Цель работы: научиться применять встроенный в микроконтроллер таймер-счётчик TRM1 и регистры специального назначения, связанные с его настройкой.
9.1 Краткие теоретические сведения по теме работы
В микроконтроллере существует несколько таймеров-счётчиков. Они применяются для точного измерения интервалов времени, подсчета количества внешних импульсов и прерываний программы. Таймеры-счётчики контролируются регистрами специального назначения [1, 2]. В частности, TRM1 контролируется регистрами специального назначения PIR1, TICON, INTCON, TMR1, TMR1H, TMR1L, описанные в приложении В.
9.2 Задания и исходные данные
Задание на проектирование. Создать подпрограмму, применяющую таймер TMR1, для автоматической окрасочной камеры, описанной в лабораторной работе 3, вместо подпрограммы Timer. Дополнительно следует пересчитывать окрашенные детали.
Временная диаграмма работы камеры показана на рисунке 3.3.
Проработайте блок-схему алгоритма автоматизации работы окрасочной камеры по рисункам 9.1 и 9.2. Ознакомьтесь с фрагментами программы. На её основании создайте программу для своего варианта.
Фрагменты программы Л9. Курсивом отмечены дополнительные команды по сравнению с лабораторной работой 3.
Include <p16F877.inc>; подключаем библиотеку символов.
T_reg EQU h'20'; регистр, определяющий время задержки.
Kol_det EQU h'21'; регистр, хранящий количество окрашенных деталей.
; Настройка МК опущена.
; Настройка таймера TMR1
BSF STATUS, 5
CLRF TRISC
CLRF PIE1; запрещаем периферийные прерывания.
BCF STATUS, 5
Рисунок 9.1 - Блок-схема программы Рисунок 9.2 - Блок-схема п/п Timer2
CLRF T1CON; установка TMR1 в режим ожидания, тактирование TMR1 от внутреннего генератора, значение предделителя частоты 1:1.
CLRF TMR1H; очищаем старший регистр-счетчик TMR1.
CLRF TMR1L; очищаем младший регистр-счетчик TMR1.
CLRF INTCON; запрещаем прерывания от TMR1.
MOVLW b'00110000'; тактирование от внутреннего генератора.
MOVWF T1CON; определяем предделитель частоты равным 1:8.
Рабочая часть программы, совпадающая с программой в лабораторной работе 3, здесь опущена.
GOTO$
Timer2; Подпрограмма Timer заменяется подпрограммой Timer2 с TMR1.
MOVWF T_reg
; Return; для выключения Timer2 при отладке главной программы.
M_T_reg; следующие 4 команды только для отладки в режиме F7.
; MOVLW D'255'; для отладки Timer2.
; MOVWF TMR1H; для отладки Timer2.
; MOVLW D'254'; для отладки Timer2.
; MOVWF TMR1L; для отладки Timer2.
BCF PIR1, TMR1IF; сброс флага переполнения таймера в каждом цикле.
BSF T1CON, TMR1ON; запуск таймера TMR1.
; следующие три строки это циклы уменьшения счетчиков таймера TRM1.
M_ TRM1; метка.
BTFSS PIR1, TMR1IF; проверка флага переполнения таймера.
GOTO M_ TRM1; если флага нет, то цикл TRM1 продолжается.
DECFSZ T_reg, F; уменьшаем число в регистре и проверяем на ноль.
GOTO M_T_reg; (только при Z=0) время не кончилось, повторяем цикл.
RETURN
END
9.3 Порядок выполнения работы
Разработайте программу, включающую и выключающую оборудование на заданное время для окрашивания трех деталей, согласно варианту задания из таблицы 9.1.
Т а б л и ц а 9.1 – Варианты заданий
Вариант |
Биты подключения |
Время работы, сек |
Вариант |
Биты подключения |
Время работы, сек |
||||
S1 |
D1 |
D2 |
S1 |
D1 |
D2 |
||||
1 |
1, 2, 3, 4, 5 |
5 |
6 |
3 |
6 |
6, 7, 0, 1, 2 |
6 |
6 |
4 |
2 |
2, 3, 4, 5, 6 |
6 |
7 |
4 |
7 |
7, 0, 1, 2, 3 |
7 |
7 |
5 |
3 |
3, 4, 5, 6, 7 |
7 |
6 |
5 |
8 |
0 ,1 ,2 ,3, 4 |
8 |
6 |
6 |
4 |
4, 5, 6, 7, 0 |
8 |
5 |
6 |
9 |
1, 3, 5, 7, 0 |
9 |
5 |
7 |
5 |
5, 6, 7, 0, 1 |
9 |
7 |
7 |
10 |
2, 4, 6, 0, 1 |
10 |
6 |
3 |
Результаты занесите в таблицу 9.2.
Т а б л и ц а 9.2– Результаты настройки циклов задержки
Вариант |
Оборудование |
Параметры подпрограммы Timer2 |
|||
Время, сек |
Значение счетчиков |
||||
T_reg |
TMR1H |
TMR1L |
|||
|
S1 |
|
|
|
|
|
D1, D2, L1 |
|
|
|
|
|
D2, L1 |
|
|
|
|
Отладка программы. Оставьте только первый вызов подпрограммы Timer2, установив аргумент W=2. Установите значения для счетчиков приведенные в подпрограмме с пометкой для отладки. Счетчики TMR1 срабатывают не на каждое нажатие кнопки F7, из-за отсутствия синхронизации. После отладки программы в пошаговом режиме, выключите указанные строки и запустите ее в автоматическом режиме. Настройте заданное время работы установки. |
|
Рисунок 9.1 – Окно наблюдения |
9.4 Контрольные вопросы
1. Назначение таймера TMR1.
2. Сколько счетчиков у TMR1?
3. Как устанавливается максимальное время TRM1?
4. Какое максимальное число можно записать в счетчики TMR1.
5. Назначение регистра TICON.
6. Назначение регистра INTCON.
7. Назначение регистра PIR1.
8. Назначение регистра PIE1.
9. Как задается длительность работы Timer2?
10. Назначение предделителя.
11. В каком банке находится регистр PIE1?
12. Когда появляется флаг, сигнализирующий, что TMR1 переполнен?
13. Как запускается TMR1?
14. Назначение регистра T_reg.
15. Какой будет результат в регистре при сложении 255+1?
10 Прерывания
Цель работы: обучение созданию программ для обработки прерываний.
10.1 Краткие теоретические сведения по теме работы
Микроконтроллер обычно программируют так, чтобы он в бесконечном цикле выполнял какую-нибудь работу: вычисления, передача данных, контроль технологического процесса. Однако бывают случаи, когда при возникновении определенного события внешнего или внутреннего, необходимо прервать бесконечный цикл основной (фоновой) программы и выполнить какие-то действия (обработать прерывания) и затем продолжить выполнение фоновой программы с точки ее останова. Следовательно, при продолжении фоновой программы значения регистров W, Status и возможно некоторых других должны быть такими же, как до обработки прерывания. Их необходимо запомнить и восстановить после обработки прерывания.
Фоновая программа в лабораторной работе предназначена для счета высушенных изделий, поступивших по конвейеру. Изделия сушатся нагревателями, подключёнными к PORTC. Прерывания в программе предназначены для учета количества посетителей при прохождении людей через турникет.
Источник внешних прерываний подключается к клемме RB0/INT регистра PORTB. Чтобы произошло прерывание, на эту клемму должен прийти импульс с технологического оборудования и тогда микроконтроллер перезапускается вектором прерывания по адресу h’04’ [1, 2]. В лабораторной работе эта клемма подключается к клемме К3 клавиатуры. Регистр PORTD настраивается таким образом, чтобы при нажатии кнопки клавиатуры, на клемме К3 появился сигнал и имитировал импульс с оборудования.
10.2 Задания и исходные данные
Фрагменты программы Л10 «Обработка прерывания от RB0/INT».
include <p16F877.inc>
SUM EQU h'50'; счетчик, работающий в фоновой программе.
_STATUS EQU h'51'; регистр, для сохранения состояния Status.
EVENT EQU h'52'; счетчик регистрации событий при прерываниях.
_WORK EQU h'53'; регистр, для сохранения состояния аккумулятора.
; Описание счетчиков для подпрограммы Timer опущено.
org 0x000; указание компилятору адреса для записи следующей строки.
GOTO MAIN; вектор сброса записываем по адресу h’000’ ЭППЗУ.
org 0x004; указание компилятору адреса для записи следующей строки.
GOTO PERS_COUNT; вектор записываем по адресу прерывания h’004.
NOP
MAIN NOP; пустая команда для отладчика.
NOP; устанавливаем курсор на команду CLRF STATUS в режиме F7.
CLRF STATUS
BSF STATUS, 5
CLRF TRISC
MOVLW B'00001111'
MOVWF TRISB; настраиваем клемму прерывания RB0 на ввод.
MOVLW B'00001111'
MOVWF TRISD; настраиваем клавиатуру для имитации прерываний.
BCF STATUS, 5
BSF INTCON, INTE; разрешаем внешние прерывания.
BSF INTCON, GIE; разрешаем работу прерываний.
CLRF EVENT; очищаем счетчик событий (посетителей).
MOVLW B'11110001'
MOVWF PORTD; подаем напряжение на выводы клавиатуры.
CLRF SUM; очищаем регистр.
M_FON; метка бесконечного цикла фоновой программы.
MOVLW H'F0'
MOVWF PORTC; сигнализация работы фоновой программы.
INCF SUM, F; периодически увеличиваем регистр SUM.
; следующие четыре команды только для отладки в режиме F7.
; MOVLW D’2’
; XORWF SUM, W
; BTFSC STATUS, Z
; CALL PERS_COUNT; вызываем PERS_COUNT как подпрограмму.
MOVLW D'20'; определяем время задержки свечения светодиодов.
CALL Timer
CLRF PORTC
MOVLW D'20'; определяем время задержки тушения светодиодов.
CALL Timer
GOTO M_FON
GOTO$; конец главной программы.
Timer; подпрограмма задержки времени Timer не приведена.
PERS_COUNT; подпрограмма - обработчик прерывания.
BCF INTCON, INTE; запрещаем внешние прерывания.
MOVWF _WORK; сохраняем значение W в регистре _WORK.
SWAPF STATUS, W
MOVWF _STATUS; сохраняем значение Status.
BCF INTCON, INTF; сбрасываем флаг внешнего прерывания.
INCF EVENT, F; регистрация очередного посетителя.
SWAPF _STATUS, W; восстанавливаем значение Status.
MOVWF STATUS
SWAPF _WORK, F
SWAPF _WORK, W; восстанавливаем значение W.
BSF INTCON, INTE; разрешаем внешние прерывания.
RETFIE; возврат в фоновую программу из обработчика.
END
Работа программы начинается после включения питания или перезапуска микроконтроллера с вектора сброса по адресу h’00’ и согласно записанной там команде GOTO MAIN, управление передается в главную программу. В её начале настраиваются на вход или выход биты регистров PORTB и PORTD. Затем разрешаются внешние прерывания, и работа самих прерываний, устанавливая биты в РСН (INTCON, INTE и INTCON, GIE). После настройки РСН начинается бесконечный цикл фоновой программы.
При кратковременном нажатии на кнопку «1» клавиатуры на клемму RB0 поступает импульс напряжения, он имитирует прохождение посетителя через турникет и формируется флаг-сообщение внешнего прерывания в бите INTF регистра INTCON. По этому флагу работа фоновой программы прерывается, и управление передается на вектор прерываний по адресу h’004’, где находится команда безусловного перехода goto PERS_COUNT на подпрограмму обработчика прерываний.
В обработчике прерываний сразу запрещаем внешние прерывания, чтобы защититься от дребезга контактов кнопки, который может вызвать дополнительные ложные прерывания. Затем сбрасываем флаг - сообщение, что поступил сигнал внешнего прерывания командой BCF INTCON, INTE. Если этого не сделать, прерывания будут выполняться бесконечно, и не будет возврата в фоновую программу. Запоминаем значение регистра W в регистре _WORK и значение регистра Status в регистре _STATUS. Далее выполняется обработка события, в нашем случае увеличивается значение регистра EVENT, контролирующего количество посетителей.
В конце своей работы обработчик восстанавливает значения РСН W и Status, чтобы фоновая программа правильно продолжила свою работу, поскольку значения этих регистров могли измениться при работе обработчика. Восстановление выполняется с помощью команды SWAPF, так как эта команда не влияет на РСН Status. Снова разрешаем работу обработчика прерываний командой BSF INTCON, INTE и возвращаемся в фоновую программу по команде RETFIE.
Отметим, что на одно нажатие кнопки клавиатуры возможно увеличение регистра EVENT более чем на единицу. Это объясняется тем, что проводник, соединяющий вывод клавиатуры и клемму RB0, не экранирован.
Аналогично можно считать консервные банки, продвигающиеся мимо фотоэлектрического датчика. После прохождения, например, 24-х банок обработчик прерываний может остановить конвейер и включить упаковочную машину, запечатывающую консервные банки в коробку.
10.3 Порядок выполнения работы
Напишите программу для варианта из таблицы 10.1. Теоретически рассчитайте время задержки, учитывая, что частота работы микроконтроллера 12 МГц.
Особенности работы с программой:
а) При отладке программы в пошаговом режиме прерывания не происходят, поэтому при отладке программы обработчик прерываний вызываем как обыкновенную подпрограмму. Вызов подпрограммы Timer следует отключить. Обработчик прерываний следует вызывать из главной программы при значении регистра Sum=2. Для этого в фоновой программе требуется включить команды, помеченные символом «точка с запятой», см. листинг программы. После отладки их необходимо выключить.
б) Дребезг контактов кнопки может вызвать дополнительные прерывания. Это устраняется запрещением прерываний в обработчике.
в) Отлаженная программа запускается в автоматическом режиме. После выполнения нескольких прерываний, программа останавливается командой Half. Значения регистров Event, Sum, _Work, W, _Status, Status просматриваются в окне наблюдения и заносятся в таблицу отчёта.
Т а б л и ц а 10.1 – Варианты заданий
Вариант |
Источник прерываний |
Время задержки Timer, с |
Вариант |
Источник прерываний |
Время задержки Timer, с |
1 |
Кнопка ‘1’ |
1 |
6 |
Кнопка ‘6’ |
1 |
2 |
Кнопка ‘2’ |
2 |
7 |
Кнопка ‘7’ |
2 |
3 |
Кнопка ‘3’ |
3 |
8 |
Кнопка ‘8’ |
3 |
4 |
Кнопка ‘4’ |
4 |
9 |
Кнопка ‘Shift’ |
4 |
5 |
Кнопка ‘5’ |
5 |
10 |
Кнопка ‘Enter’ |
5 |
Ввиду того, что клавиатура и проводники на стенде УМК-7 не имеют защитного экрана, следует обязательно во все разряды RD4..RD7 подавать сигнал ‘1’. Кроме того, все выводы клавиатуры необходимо подключить проводниками к выводам регистра PORTD.
Заполните таблицу 10.2 в отчете.
Т а б л и ц а 10.2 – Данные отчета по лабораторной работе
Вариант |
Источник прерываний |
Время задержки Timer, с |
Значение счетчика Sch3 |
Значение счетчика Sch_out |
Значение счетчика Sch_in |
|
|
|
|
|
|
10.4 Контрольные вопросы
1. Как узнать значения регистров Event, Sum, _Work, W, _Status, Status.
2. Можно ли из обработчика прерываний вызывать подпрограмму предназначенную для главной (фоновой) программы.
3. Что такое прерывания?
4. Каким образом включается разрешение прерываний?
5. Назначение флага прерываний?
6. Что такое дребезг контактов? Защита от дребезга.
7. Что такое фоновая программа?
8. По какому адресу расположен вектор прерываний?
9. Что такое вектор сброса?
10. Почему применяется команда SWAPF для сохранения РСН Status?
11. Какие помехи (наводки) существуют в эксперименте, искажающие ожидаемые результат работы программы.
12. С какой целью и где сохраняют значения регистров W и Status.
11 Сложение двухбайтных чисел
Цель работы: обучение созданию программ для сложения двухбайтных чисел в различных системах счислений.
11.1 Краткие теоретические сведения
Сложение чисел применяется при определении каких-либо технологических параметров установки. Проанализировав сумму чисел, вносят соответствующие изменения в управление установкой.
В один байт можно записать числа от 0 до 255. Для некоторых практических задач это недостаточно. Если использовать два байта, то можно записать числа от 0 до 65535. Суммирование чисел можно выполнить, задавая слагаемые в 16-ной или иной системе счисления с помощью алгоритма, известного из курса информатики.
Например, требуется сложить десятичные числа 65284 и 65534. Представим наши числа в 16-ной системе счисления, записав каждое из них в два регистра, см. таблицу 11.1. В лабораторной работе эти байты называются старшим и младшим для каждого слагаемого, например h’23’ и h’22’.
Т а б л и ц а 11.1 – Суммирование чисел в шестнадцатеричном коде
|
Десятичная система |
Шестнадцатеричная система |
||
Слагаемые или регистр SUM_3 |
Старшие байты (регистры) |
Младшие байты (регистры) |
||
1-е слагаемое |
65284 |
h’FF04’ |
S1_S =h’FF’ |
S1_M =h’04’ |
2-е слагаемое |
65534 |
h’FFFE’ |
S2_S =h’FF’ |
S2_M =h’FE’ |
Полученные суммы |
130818 |
SUM_3=h’01’ |
SUM_S=h’FF’ |
SUM_M =h’02’ |
Результат
представим в десятичной системе счисления: h’01FF02’®
®1×164+15×163+15×162+0×161+2×160=65536+61440+3840+0+2=130818.
При сложении, байтов, если сумма более h’FF’(то есть более 255) необходимо предусмотреть добавление единицы в нулевой бит более старшего байта (регистра). Очевидно, что сумма может занимать три байта. Момент переполнения регистра фиксируется в бите С регистра Status, он становится равным единице. Этот факт можно использовать для программного увеличения более старшего регистра на единицу, выполняя, таким образом, арифметический перенос.
С другой стороны можно считать, что в старшем байте представлена целая часть числа, а в младшем байте дробная часть числа. Такое число можно представить как многочлен A=K2×162+ К1×161+K0×160+ K-1/16-1+К-2/16-2.
Сложим дробные десятичные слагаемые 255,017 и 255,991. Переведем в шестнадцатеричную систему отдельно целую и дробную части [2].
Алгоритм перевода целой части числа в 16-ную систему счислений:
Начало алгоритма
Ввести заданное число
Делимое приравнять заданному числу
Пока делимое больше нуля, повторять:
Найти частное и остаток, разделив целочисленно делимое на 16
Запомнить остаток
Делимое приравнять частному
Конец цикла
Конец алгоритма
Пример, переведем 255 в шестнадцатеричную систему счислений:
255:16=15(15)
15:16=0 (15).
Итак, в шестнадцатеричной системе получили 25510=FF16.
Алгоритм перевода дробной части числа в 16-ную систему счислений:
Начало алгоритма
Ввести дробную часть числа
Ввести количество значащих цифр в числе
Умножаемое приравнять введенному числу
Пока умножаемое больше нуля, повторять:
Найти произведение умножаемого на 16
Целую часть произведения записать в результат как 16-ную цифру
Если найдены все цифры, выйти из цикла
Конец цикла
Конец алгоритма
Переведем дробную часть первого слагаемого 0,017 с точностью до трех цифр в шестнадцатеричную систему, а затем округлим. Целые части чисел выделены жирным шрифтом.
0,017×16=0,272; 0,272×16=4,352; 0,352×16=5,63.
Таким образом, 0,01710=0,0416. Третью цифру 5, поскольку она меньше 8, отбрасываем.
Дробная часть второго слагаемого:
0,991×16=15,856; 0,856×16=13,696; 0,696×16=11,136.
Таким образом, 0,99110=0,FDB16.
Округляя полученное значение в шестнадцатеричной системе счислений до двух цифр, получим 0,99110=0,FE16.
В результате работы программы были получены значения, представленные в таблице 11.2.
Т а б л и ц а 11.2 – Суммирование двухбайтных дробных чисел
|
Десятичная система |
Шестнадцатеричная система |
||
Слагаемые или регистр SUM_3 |
Старшие байты (регистры) |
Младшие байты (регистры) |
||
1-е слагаемое |
255,017 |
h’FF,04’ |
S1_S =h’FF’ |
S1_M =h’04’ |
2-е слагаемое |
255,991 |
h’FF,FE’ |
S2_S =h’FF’ |
S2_M =h’FE’ |
Полученные суммы |
511,008 |
SUM_3=h’01’ |
SUM_S=h’FF’ |
SUM_M =h’02’ |
Результат h’01FF,02’, полученный в шестнадцатеричной системе счисления, представим в десятичной форме:
Sum=1×162+15×161+15×160+0×16-1+2×16-2=256+240+15+0+0,0078=511,0078.
Как видим, результаты в обоих случаях совпали с точностью до третьего знака после запятой.
Блок-схема алгоритма сложения двухбайтных чисел показана на рисунке 11.1, в ней предполагается, что слагаемые заданы.
Рисунок 11.1 – блок-схема
11.2 Задания и исходные данные
Применяемые символьные имена регистров показаны на рисунке 11.1 и в таблице 11.1.
Фрагменты программы Л11 сложения двухбайтных чисел. Инструкции по настройке микроконтроллера и объявления переменных опущены.
CLRF SUM_M; очищаем регистры для суммы.
CLRF SUM_S
CLRF SUM_3
; Вводим первое слагаемое
MOVLW h’04’
MOVWF S1_M; младший байт S1_M= h’04’.
MOVLW h’FF’
MOVWF S1_S; старший байт S1_S= h’FF’.
; Вводим второе слагаемое
MOVLW h’FE’
MOVWF S2_M; младший байт S2_M=h’FE’.
MOVLW h'FF'
MOVWF S2_S; старший байт S2_S= h'FF'.
; Сложение младших байтов S1_M и S2_M
MOVF S1_M, W
ADDWF S2_M, W
MOVWF SUM_M
BTFSC STATUS, C; если был перенос, т. е. сумма более 255, то
INCF SUM_S, F; увеличиваем байт только при С=1.
; Сложение старших байтов
MOVF SUM_S, W
ADDWF S1_S, W
BTFSC STATUS, C; был перенос?
INCF SUM_3, F; увеличиваем третий байт суммы только при С=1.
ADDWF S2_S, W
MOVWF SUM_S
BTFSC STATUS, C; был перенос?
INCF SUM_3, W; увеличиваем третий байт суммы только при С=1.
GOTO$
END
11.3 Порядок выполнения работы
Выполните сложение двухбайтных чисел, используя шестнадцатеричную систему счисления по заданиям таблиц 11.3 и 11.4. Результаты занесите в таблицы 11.1 и 11.2.
Т а б л и ц а 11.3 – Варианты заданий для целых десятичных чисел
Вариант |
Число S1 |
Число S2 |
Вариант |
Число S1 |
Число S2 |
1 |
60001 |
10001 |
6 |
65406 |
60006 |
2 |
30002 |
20002 |
7 |
60007 |
10007 |
3 |
40003 |
30003 |
8 |
30008 |
20008 |
4 |
65504 |
40004 |
9 |
40009 |
30009 |
5 |
64505 |
50005 |
10 |
50010 |
40010 |
Т а б л и ц а 11.4 – Варианты заданий для дробных десятичных чисел
Вариант |
Число S1 |
Число S2 |
Вариант |
Число S1 |
Число S2 |
1 |
110,01 |
110,1 |
6 |
160,06 |
160,6 |
2 |
120,02 |
120,2 |
7 |
170,07 |
170,7 |
3 |
130,03 |
130,3 |
8 |
180,08 |
180,8 |
4 |
140,04 |
140,4 |
9 |
190,09 |
190,9 |
5 |
150,05 |
150,5 |
10 |
200,10 |
200,20 |
12.4 Контрольные вопросы
1. Что такое основание системы счисления. Какие они могут быть?
2. Как размещается число большее 255 в памяти МК?
3. Приведите алгоритм перевода чисел из десятичной системы в шестнадцатеричную систему.
4. Приведите алгоритм перевода из шестнадцатеричной системы в десятичную систему.
5. Как определяется необходимость переноса в старшие байты суммы?
6. Как выполняется программно перенос единицы в старшие байты.
7. Сколько регистров необходимо при сложении двухбайтных чисел?
8. Какой результат сложения шестнадцатеричных чисел F+1 и FF+1?
9. Где регистрируется переполнение регистра при сложении чисел?
10. Для чего выполняется суммирование чисел?
11. Можно ли складывать дробные числа?
12. Почему в числе 0,04516 отбросили при округлении цифру 5?
Регистр Status
В таблице А.1 показаны расположение и имена бит регистра Status.
Т а б л и ц а А.1 – Биты регистра Status
Номера бит |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Имена бит |
IRP |
RP1 |
RP0 |
-TO |
-PD |
Z |
DC |
C |
В таблице А.1 приняты следующие имена:
- IRP - бит выбора банка при косвенной адресации (IRP=1 - выбор банков 2 или 3, IRP=0 - выбор банка 0 или 1);
- RP1, RP0 - биты выбора банка при непосредственной адресации (т.е. разряды 5 и 6). Их значения для выбора банков показаны в таблице А.2;
- TO - флаг переполнения сторожевого таймера;
- PD - флаг включения питания;
- Z - флаг нулевого результата. Записывается “1” при нулевом результате арифметической или логической операции;
- DC - флаг десятичного переноса или заема. Записывается “1”, если был перенос из младшего полубайта регистра в старший полубайт, актуально при выполнении команд сложения и вычитания в двоично-десятичной системе;
- C - флаг переноса или заема. Записывается “1”, если был перенос из старшего бита регистра для команд сложения и вычитания. Вычитание выполняется с помощью сложения уменьшаемого и вычитаемого, которое представлено в дополнительном коде.
Т а б л и ц а А.2 – Выбор номера банка при непосредственной адресации
RP1(первый бит номера банка) |
RP0 (нулевой бит номера банка) |
Номер банка (десятичная система) |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
3 |
Примечание. RP1 и RP0 образуют разряды двоичного числа |
К отдельным
битам регистра можно обращаться по имени или по номеру. Инструкция BTFSC STATUS,
Z эквивалентна инструкции
BTFSC STATUS, 2.
Т а б л и ц а А.3 – Значения регистра Status после команды CLRF
IRP |
RP1 |
RP0 |
-TO |
-PD |
Z |
DC |
C |
0 |
0 |
0 |
1 |
1 |
1 |
1 или 0 |
1 или 0 |
Приложение Б
Описание инструкций МК PIC
Константа в инструкциях представлена символом k. В описании инструкций указаны флаги, которые могут измениться при ее выполнении. Параметр d (dest) в инструкциях определяет, в какой регистр записывается результат. Если d=0 или отсутствует, результат сохраняется в регистре W. Если d=1, результат сохраняется в регистре f (от слова file). В программах для параметра d вместо ‘0’ можно писать ‘W’, вместо ‘1’ можно писать ‘f’.
Вместо адреса регистра в программе более удобно писать его символьное имя. Например, если регистр по адресу h’21’ имеет имя R1, тогда инструкция, описанная как ADDWF f, d, в программе может быть записана двумя способами: ADDWF h’21’ , W или ADDWF R1, W.
Директива ORG 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.
Модуль таймера TMR1
TMR1 - 16-разрядный таймер/счетчик, состоящий из двух 8-разрядных регистров (TMR1H и TMR1L), доступных для чтения и записи.
Счет выполняется в спаренных регистрах (TMR1H:TMR1L), инкрементируется их значение от 0000h до FFFFh. При добавлении ещё одной единицы, будет переполнение регистров и в счетчиках будет снова 0000h. При переполнении счетчика устанавливается в '1' бит флага прерывания TMR1IF в регистре PIR1<0>. Само прерывание можно разрешить/запретить установкой/сбросом бита TMR1IE в регистре Р1Е1<0>.
TMR1 может работать в режимах: режим таймера, режим счетчика.
Включается TMR1 установкой бита TMR1ON в ‘1’ (T1CON<0>).
Битом TMR1CS (T1CON<1>) выбирается источник тактовых импульсов.
TMR1 инкрементируется при каждом машинном цикле.
Когда включен генератор тактовых импульсов (T1OSCEN=1), выводы RC1/T1OSI/CCP2 и РС0/T1OSO/TICK1 настроены как входы. Значение битов TRISC<1:0> игнорируется, а чтение данных с этих выводов дает результат '0'.
Управляющие биты TMR1 находятся в регистре T1CON.
Сброс регистров TMR1 (TMR1H, TMR1L). Регистры TMR1H и TMR1L не сбрасываются в 00h при сбросе по включению питания и других видах сброса.
Предделитель TMR1 очищается при записи чисел в регистр TMR1L или TMR1H.
Регистр PIE1 (адрес 8Ch) доступен для чтения и записи, содержит биты разрешения периферийных прерываний. Чтобы разрешить периферийные прерывания необходимо установить в '1' бит PEIE (INTCON<6>).
Регистр INTCON (адрес 0Вh, 8Вh, 10Вh или 18Вh) доступен для чтения и записи, содержит биты разрешений и флаги прерываний: переполнение TMR1; изменения уровня сигнала на выводах PORTB; внешний источник прерываний RB0/INT.
Примечание. Флаги прерываний устанавливаются при возникновении условий прерываний вне зависимости от соответствующих битов разрешения и бита общего разрешения прерываний GIE (INTCON<7>).
Регистр PIR1 доступен для чтения и записи, он содержит флаги прерываний периферийных модулей.
Внимание! Флаги прерываний устанавливаются при возникновении условий прерываний вне зависимости от соответствующих битов разрешения и бита общего разрешения прерываний GIE (INTCON<7>). Программное обеспечение пользователя должно сбрасывать соответствующие флаги при обработке прерываний от периферийных модулей.
Карта памяти МК PIC16877
Список литературы
1. Сайт в Internet www.microchip.ru.
2.
Катцен С. PIC микроконтроллеры. Все, что
необходимо вам знать.
- М.: Додека, 2008.
3. Копесбаева А.А. Тарасов В.М. Элементы и устройства автоматики. Микропроцессорный комплекс. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 050702 – «Автоматизация и управление». - Алматы: АИЭС, 2007.
4. Копесбаева А.А. Микропроцессорные комплексы в системах управления. Учебное пособие. - Алматы: АИЭС, 2010.
5.
Тарасов В.М. Программирование цифровой техники и
микроконтроллеров управления. Конспект лекций для студентов всех форм обучения
специальности 5В070200- «Автоматизация и управление»
- Алматы: АУЭС, 2012.
6. Погребинский М.П. Микропроцессорные системы управления электротехническими установками. - М.: МЭИ, 2003.
7. Кохц Дитер. Измерение, управление с помощью PIC-контроллеров. - Киев. Наукова думка. 2007.
8. Заец Н.И. Радиолюбительские конструкции на PIC. - М.: Солон, 2003.
9. Яценков В.С. Микроконтроллеры Microchip. Практическое руководство. – 2 –е изд. исп. и допол. - М.: Горячая линия – Телеком, 2005.
Содержание
Введение 1 Байтовые и битовые команды. Логика 2 Маскирование. Суммирование массива 3 Автоматизация окрасочной камеры. Подпрограммы 4 Умножение и деление 5 Регулирование расхода газа 6 Программирование клавиатуры 7 Автоматизация упаковки. Генерация звука 8 Перевод чисел из 2-й в 2_10 систему. 9 Таймер TMR1 10 Прерывания 11 Сложение двухбайтных чисел Приложение А. Регистр Status Приложение Б. Описание инструкций микроконтроллера PIC Приложение В. Модуль таймера TMR1 Приложение Г. Карта памяти МК PIC16877 Список литературы |
3 4 8 12 17 21 24 27 32 36 39 43 49 50 53 54 55 |
Св. план 2012 г., поз. 31