Некоммерческое акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра инженерной кибернетики
ПРОГРАММНЫЕ СРЕДСТВА МИКРОПРОЦЕССОРНЫХ КОНТРОЛЛЕРОВ УПРАВЛЕНИЯ В ЗАДАЧАХ АВТОМАТИЗАЦИИ
Методические указания к лабораторным работам
для магистрантов всех форм обучения специальности
6М070200 – Автоматизация и управление
Алматы 2011
СОСТАВИТЕЛЬ: А.А.Копесбаева Программные средства микропроцессорных контроллеров управления в задачах автоматизации. Методические указания к лабораторным работам для магистрантов всех форм обучения специальностей 6М070200 – Автоматизация и управление - Алматы: АУЭС, 2011 - 49 с.
Настоящие методические указания включают в себя методические рекомендации и примеры выполнения задач по программированию в лабораторных работах по дисциплине «Программные средства микропроцессорных контроллеров управления в задачах автоматизации» в рамках дисциплин по выбору магистрантов специализации «Автоматизация и управление».
Методические указания предназначены для студентов всех форм обучения специальностей 6М070200 – Автоматизация и управление.
Ил. 3, табл. 2, прилож. 3 , библиогр. – 15 назв.
Рецензент: канд.техн.наук, профессор Ибраева Л.К.
Печатается по плану издания некоммерческого акционерного общества «Алматинский университет энергетики и связи» на 2011 г.
©НАО «Алматинский университет энергетики и связи», 2011 г.
Лабораторная работа № 1. Программирование клавиатуры и организация ввода-вывода
Цель работы: обучение программированию ввода с клавиатуры, привитие навыков расчета временных характеристик программ микроконтроллеров, организации условных переходов, инициализации портов для вывода информации на дисплей.
1.1 Задание к лабораторной работе
1) Изучите схему подключения клавиатуры, изображенную на лицевой панели стенда. Здесь в виде контакта изображена кнопка клавиатуры. Обратите внимание, что одна клемма кнопки клавиатуры предназначена для ввода, а вторая для вывода сигнала.
2) Предполагая, что на третий вход канала порта RD3 подключается клавиша «1», а выход клавиши «1» подключается для инициализации к выходному биту RD7 контроллера, разработайте программу зажигания светодиода при нажатии клавиши «1». Светодиод подключите к биту RC7 (см. программу 1.1). Он остается включенным до тех пор, пока, нажата клавиша клавиатуры.
Программа 1.1
include <p16F877.inc>
;Начало программы
org 00h ;выполнение программы начинается с 0-го адреса
nop ;nop - пустая команда, должна быть первой, так
nop ;как она необходима для работы отладчика
nop
org 05h ;начало кода с адреса 5 в шестнадцатеричном (h)
;формате
START
CLRF STATUS
BSF STATUS,RP0 ;назначить 1-ый банк
MOVLW B'00001000' ;3-ий разряд порта Д
MOVWF TRISD ;вход, а остальные выходы
CLRF TRISC ;порт С выход
CLRF STATUS ;назначить 0-ой банк
CLRF PORTD ;очистить порт Д и С
CLRF PORTC
MOVLW B'10000000' ;подать 1 на 7-ой выход
MOVWF PORTD ;порта Д
LOOP
CLRF PORTC ;очистить порт С
LOOP1
BTFSS PORTD, 3 ;когда 1 появится на 3-ем
GOTO LOOP ;входе пропустить эту команду
MOVLW B'10000000' ;зажечь 7-ой светодиод в
MOVWF PORTC ;порте С
GOTO LOOP1 ;повторить опрос клавиши до
END ;нового перезапуска
4) Переработайте программу 1.1 так, что клавишей «1» светодиод включается и остается включенным, а при нажатии клавиши «5» отключается до нового включения ( программа 1.2).
5) Запрограммируйте четыре светодиода на включении при нажатии клавиш с 1-го по 3-ий соответствующих номеров светодиода (программа 1.3) и отключении при нажатии клавиш с 5-ой по 7-ую.
6) Изучите временные диаграммы команд CALL, RETLW.
7) Изучите программу 1.4 задержки за счет организации циклов, определите, при каком числе, записанном в регистрах KOL,ZAD,ZAD1, будет максимальная и минимальная задержка.
Программа 1.4
include <p16F877.inc>
;Описание регистров ОЗУ
KOL EQU H'0020' ;
ZAD EQU H'0021' ;
ZAD1 EQU H'0022' ;
;Начало программы
org 0 ;выполнение программы начинается с 0-го адреса
nop ;nop - пустая команда, должна быть первой, так
nop ;как она необходима для работы отладчика
nop
org 05h
START
CLRF STATUS
BSF STATUS, RP0 ; Выбираем банк 1
CLRF TRISC ;инициализировать порт С,как выход
CLRF STATUS ; выбрать 0 банк
MOVLW H'FF' ; количество повторений мигания
MOVWF KOL ;
LOOP
CLRF PORTC ; очистить порт С-потушить светодиоды
CALL LOOP1 ; вызвать п.п. задержки
MOVLW B'11111111' ;
MOVWF PORTC ; зажечь светодиоды
CALL LOOP1 ; задержка
DECFSZ KOL,F ;уменьшить количество повторений цикла
;если 0, то пропустить следующую
GOTO LOOP ;если не ноль, то повторить цикл
GOTO $ ;закончить до нового перезапуска
END
;подпрограмма задержки
LOOP1
MOVLW B'11111111' ;
MOVWF ZAD ; установить время задержки в ячейку ZAD
MOVLW B'11111111' ;
MOVWF ZAD1 ; установить время задержки в ячейку ZAD1
LOOP2
NOP
LOOP3
DECFSZ ZAD1,F;
GOTO LOOP3;
DECFSZ ZAD,F ;
GOTO LOOP2;
RETURN ;
END
Пояснения: в результате выполнения программы светодиоды будут мигать 256 раз, а затем останутся в зажженном состоянии.
8) Изучите, как в программе 1.4 использовался стек. Определите максимальное время задержки при частоте тактового генератора 12 Мгц.
9) Изучите команды возврата из подпрограммы по условию RETLW k, RETFIE. Пусть в рабочем регистре содержится смещение от начала таблицы данных. Тогда получить нужный элемент можно следующей процедурой:
Программа 1.5 (фрагмент)
MOVLW 02h ;задать смещение
CALL SHOSYM ;вызвать подпрограмму
MOVWF DATAPORT ;вывести элемент таблицы в порт В
GOTO $ ;зациклится навсегда
SHOWSYM
ADDWF PC ;вычислить смещение в таблице
RETLW 0Aah ;1-ый элемент таблицы
RETLW 0BBh ;2-ый элемент таблицы
RETLW 0CCh ;3-ый элемент таблицы
Результат таблицы 10111011. Используйте этот фрагмент для реализации вывода результирующей таблицы на светодиоды при определенных сигналах с клавиатуры ( см. программу 1.5).
10) Изучите следующие характеристики ЖКИ типа MT-16S2D. Модуль позволяет отображать 2 строки по 26 символов в каждой. Символы отображаются в матрице 5х8 точек. Между символами имеются интервалы шириной в одну отображаемую точку. Каждому отображаемому символу соответствует его код в ячейке ОЗУ модуля. Модуль содержит два вида памяти – кодов отображаемых символов и пользовательского знакогенератора, а также логику для управления ЖК панелью. Символы английского алфавита выводятся на индикатор как обычные символьные константы в виде ‘simvol’, а для вывода русского алфавита используйте таблицу 1.1.
Пример программирования индикатора приведен в программе 1.6.
Таблица 1.1
Программа 1.6
;============================================
; Программа управления индикатором
;============================================
include <p16f877.inc>
;============================================
; Символы задержки
;============================================
SIMVOL EQU H'0020'
SIMVOLL EQU H'0021'
SIM EQU H'0022'
;====================================================
; Расчет частоты работы индикатора и переменные настройки индикатора
;====================================================
Dev_Freq EQU D'12000000'; Базовая частота микроконтроллера 12 MHz
LCD_INIT_DELAY EQU (HIGH ((( Dev_Freq / 4 ) * D'46' / D'10000' ) / 3 ) ) + 1
MSD EQU H'0030 '; Временный регистр, старшие цифры кода
; для преобразования BIN в BCD
LSD EQU H'0031' ; Временный регистр, младшие цифры кода
CHAR EQU H'0032';Временный регистр, для вывода символа на LCD
LCD_DATA EQU PORTC
LCD_DATA_TRIS EQU TRISC
LCD_CNTL EQU PORTE
E EQU 1 ; Разрешение обращения к модулю
RRW EQU 0 ; Выбор режима чтение/запись
RS EQU 2 ; бит выбора режима данные/команда
; настройка LCD
DISP_ON EQU 0x00C ; вкл. дисплея
DISP_ON_C EQU 0x00E; вкл. дисплей, курсор в исх. положение
DISP_ON_B EQU 0x00F;вкл. дисплей, курсор в исх. положение,
;вкл.мигание курсора
DISP_OFF EQU 0x008 ; выкл. дисплея
CLR_DISP EQU 0x001 ; очистка дисплея
ENTRY_INC EQU 0x006 ;
ENTRY_INC_S EQU 0x007 ;
ENTRY_DEC EQU 0x004 ;
ENTRY_DEC_S EQU 0x005 ;
DD_RAM_ADDR EQU 0x080 ; читать 7-bit адрес
DD_RAM_UL EQU 0x080 ; перемещение влево курсора;
;============================================
; Начало кода
;========================
org 0000h ; начать программу с 0-го адреса памяти программ
nop
GOTO START
;===========================================================
; Начало исполняемого кода 100h
;===========================================================
org 0100h
START
CLRF STATUS ; назначение 0-го банка
CLRF INTCON ; Запретить все прерывания
CLRF PIR1
BSF STATUS,RP0
MOVLW 0x00
MOVWF OPTION_REG
CLRF PIE1
MOVLW 0xFF
MOVWF ADCON1
BCF STATUS,RP0
;===========================================================
; Инициализация портов
;===========================================================
CLRF PORTC
CLRF PORTE
BSF STATUS, RP0 ; выбор 1-го банка
CLRF TRISC ; настройка порта С на выход
CLRF TRISE ; настройка порта Д на выход
BCF STATUS, RP0 ; выбор 0-го банка
;===========================================================
; Начальная настройка индикатора
;===========================================================
CLRF LCD_CNTL ; обнулить порт управления
DISPLAY_INIT
MOVLW 0x038 ; Выбираем 8-ми битный интерфейс
MOVWF LCD_DATA
BSF LCD_CNTL, E ; передать команду
BCF LCD_CNTL, E
LCD_DELAY
MOVLW LCD_INIT_DELAY; загрузка значений регистр MSD и LSD
MOVWF MSD ; знач.регистра LCD_INIT_DELAY задается в библ.
CLRF LSD ; "lm032l.h" в зависимости от тактовой чатоты мк.
LOOP2
DECFSZ LSD, F; время для инициал. = MSD * ((3 * 256) + 3) * Tcy
GOTO LOOP2
DECFSZ MSD, F
END_LCD_DELAY
GOTO LOOP2
CMD_SEQ
MOVLW 0X038
MOVWF LCD_DATA ; команда - 8-битный интерфейс
BSF LCD_CNTL, E ; передать команду
BCF LCD_CNTL, E
;=====================================================
; Начальные установки индикаторов
;=====================================================
MOVLW DISP_ON
CALL SEND_CMD
MOVLW CLR_DISP
CALL SEND_CMD
MOVLW ENTRY_INC
CALL SEND_CMD
MOVLW DD_RAM_ADDR
CALL SEND_CMD
;=====================================================
; Основная программа
;=====================================================
LOOP_NEW
CALL ST1 ;вывод первой бегущей стоки
MOVLW H'00AA'
CALL ZAD ; Задержка
CALL CLRF_LCD ; очистить индикатор
CALL ST2 ;вывод второй бегущей строки
MOVLW H'00AA'
CALL ZAD ; задержка
CALL CLRF_LCD ; очистить индикатор
GOTO LOOP_NEW ;повторить основную программу
;=====================================================
; Вывод бегущей строки "HALLO THE STUDENT"
;=====================================================
ST1
MOVLW 'H'
CALL SEND_CHAR
MOVLW 'A'
CALL SEND_CHAR
MOVLW 'L'
CALL SEND_CHAR
MOVLW 'L'
CALL SEND_CHAR
MOVLW 'O'
CALL SEND_CHAR
MOVLW B'11000000'
CALL SEND_CMD
MOVLW 'T'
CALL SEND_CHAR
MOVLW 'H'
CALL SEND_CHAR
MOVLW 'E'
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW 'S'
CALL SEND_CHAR
MOVLW 'T'
CALL SEND_CHAR
MOVLW 'U'
CALL SEND_CHAR
MOVLW 'D'
CALL SEND_CHAR
MOVLW 'E'
CALL SEND_CHAR
MOVLW 'N'
CALL SEND_CHAR
MOVLW 'T'
CALL SEND_CHAR
RETURN
;=====================================================
; Вывод бегущей строки "Здравствуй студент"
;=====================================================
ST2
MOVLW H'00A4'
CALL SEND_CHAR
MOVLW H'00E0'
CALL SEND_CHAR
MOVLW 'P'
CALL SEND_CHAR
MOVLW 'A'
CALL SEND_CHAR
MOVLW 'B'
CALL SEND_CHAR
MOVLW 'C'
CALL SEND_CHAR
MOVLW 'T'
CALL SEND_CHAR
MOVLW 'B'
CALL SEND_CHAR
MOVLW H'00A9'
CALL SEND_CHAR
MOVLW H'00A6'
CALL SEND_CHAR
MOVLW B'11000000'
CALL SEND_CMD
MOVLW 'C'
CALL SEND_CHAR
MOVLW 'T'
CALL SEND_CHAR
MOVLW H'00A9'
CALL SEND_CHAR
MOVLW H'00E0'
CALL SEND_CHAR
MOVLW 'E'
CALL SEND_CHAR
MOVLW 'H'
CALL SEND_CHAR
MOVLW 'T'
CALL SEND_CHAR
RETURN
;=====================================================
; Подпрограмма задержки (три вложенных цикла)
;=====================================================
ZAD
MOVWF SIMVOLL
PAU
MOVLW H'000F'
MOVWF SIMVOL
PAUZ
MOVLW H'00FF'
MOVWF SIM
PAUZA
DECFSZ SIM,F
GOTO PAUZA
DECFSZ SIMVOL,F
GOTO PAUZ
DECFSZ SIMVOLL,F
GOTO PAU
RETURN
;=====================================================
; Подпрограмма очистки индикатора
;=====================================================
CLRF_LCD
MOVLW CLR_DISP
CALL SEND_CMD
MOVLW ENTRY_INC
CALL SEND_CMD
MOVLW DD_RAM_ADDR
CALL SEND_CMD
RETURN
;=====================================================
; Подпрограмма вывода символа на индикатор
;=====================================================
SEND_CHAR
MOVWF CHAR ; загрузка символа в регистр CHAR
MOVLW H'000F'
CALL ZAD ; Задержка
MOVF CHAR, w
MOVWF LCD_DATA ; послать символ на индикатор
BCF LCD_CNTL, RRW; перевести индикатор в режим чтение
BSF LCD_CNTL, RS ; установить индикатор в режим данных
BSF LCD_CNTL, E ; начало передачи данных
BCF LCD_CNTL, E
RETURN
;=====================================================
; подпрограмма подачи команд на индикатор ;=====================================================
SEND_CMD
MOVWF CHAR ; сохранить команду в регистре CHAR
MOVLW H'000F'
CALL ZAD ; задержка
MOVF CHAR, w
MOVWF LCD_DATA ; послать команду на индикатор
BCF LCD_CNTL, RRW; перевести индикатор в режим чтения
BCF LCD_CNTL, RS ; установить индикатор в режим команд
BSF LCD_CNTL, E ; начало передачи данных
BCF LCD_CNTL, E
RETURN
;=====================================================
end
Рисунок 1.1
11) Сделайте анализ приведенной программы, определите, каков будет результат её выполнения. При этом подключайте индикатор к контроллеру в порядке, указанном на рисунке 1.1.
12) Напишите программу решения следующей задачи: при нажатии клавиши «5» на экран выводится строка «Здравствуй студент», а при отключенной клавише «5» - строка «Hallo student» ( программа 1.7).
Лабораторная работа № 2. Таймерные функции
Цель работы: изучение понятия таймеров микропроцессора, возможностей и режимов работы шестнадцатиразрядного таймера TMR1.
2.1 Задание к лабораторной работе
1) Изучите поле сторожевого таймера WDT регистра STATUS и флаг прерывания по переполнению тайм аута –TOIF регистра INTCON, разряды регистров TMRO-TMR2.
2) Напишите программу 2.1 организации задержки за счет таймерных функций процессора при использовании TMR1.
Программа 2.1
;описание регистров
include<p16F877.inc>
;Начало
org 0 ;выполнение программы начинается с 0-го адреса.
nop ;пустая команда используется для
nop ;работы отладчика
nop
org 05h ;начать с адреса 5
START
CLRF STATUS
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISC
CLRF STATUS
CLRF T1CON ; Остановить TMR1, тактирование от внутреннего
; генератора, пределитель частоты =1:1
CLRF TMR1H ;очистить старший байт таймера
CLRF TMR1L ;очистить младший байт таймера
CLRF INTCON ; Запретить прерывания от TMR1
BSF STATUS,RP0
CLRF PIE1 ; Запретить периферийные прерывания
BCF STATUS,RP0
CLRF PIR1 ; Обнулить флаг периферийных прерываний
MOVLW 0X30; Тактирование от внутреннего
MOVWF T1CON; генератора, пределитель частоты =1:8
BSF T1CON,TMR1ON; Старт TMR1
T1_OFF
BTFSS PIR1,TMR1IF; до тех пор, пока не установится
GOTO T1_OFF ;флаг переполнения таймера зациклить
MOVLW H'FF' ;когда флаг переполнения установится
MOVWF PORTC ;зажечь светодиоды
BCF PIR1,TMR1IF ;обнулить флаг переполнения таймера
BSF T1CON,TMR1ON ; Старт TMR1
T2_OFF
BTFSS PIR1,TMR1IF
GOTO T2_OFF
CLRF PORTC ;потушить светодиоды
BCF PIR1,TMR1IF ;обнулить флаг переполнения таймера
GOTO START ;повторить сначала
END
В результате выполнения этого задания магистрант должен приобрести навыки расчета конкретных временных значений по характеристикам микроконтроллера. Если коротко охарактеризовать работу таймера, то это накопление импульсов тактового генератора. Это накопление происходит до тех пор, пока не переполнятся два 8-разрядных регистра таймера TMR1 (TMR1H и TMR1L), то есть один 16 –разрядного регистр. Понятно, что это переполнение произойдет, когда в регистр поступит 216 импульсов (65536). Частота, с которой поступают импульсы, определяется частотой тактового генератора (12 Мгц), а также значением предделителя частоты (1:8). Накопление времени происходит каждый машинный цикл, который состоит из 4-х тактов тактового генератора. При таких данных период поступления импульсов составляет Т= [1/(12*10-6)]*8*4 = 2,67 мкс. Тогда максимальное время до установки флага переполнения: tmax=2,67x65536x10-6 =0,18 c, значит, частота миганий светодиодов (или частота выходных импульсов) fmin=1/0,18= 5,56 Гц, tmin=2,67x10-6 с, значит, частота миганий светодиодов (или частота выходных импульсов) fmax=(1/2,67)x106= 375 KГц. Большее, чем 0,18 секунд, время формируем за счет организации вложенных циклов или простым повторением циклов опроса таймера. Формирование времени осуществляется накоплением импульсов от начального значения регистров TMR1H и TMR1L до переполнения таймера.
3) Напишите программы организации зажигания светодиодов на 5 с и нового их включения через 10 с. Предусмотрите удобный для вас контроль выполнения программы по состоянию светодиодов. Процедуры задержек можно оформить в виде подпрограмм ( программа 2.2).
4) Разработайте программу работы светофора, который через каждые 10 с выдает попеременно сообщения «STOY» и «IDI». В качестве светофора используйте ЖКИ ( программа 2.3).
5) Разработайте такую программу, в результате выполнения которой на 10 с включается звуковая сигнализация, а на следующие 10 с включаются светодиоды (программа 2.4). При этом учтите, что частота работы звукового генератора должна быть в диапазоне слышимости от 20 до 15 000 Гц. Звуковой генератор подключен к портуС-7-му каналу, а светодиоды к остальным каналам порта С.
Лабораторная работа № 3. Двоично-десятичное преобразование
Цель работы: изучение принципов преобразования двоичных кодов в двоично-десятичные, приобретение навыков использования подпрограмм преобразования.
1. Задание к лабораторной работе
1) Изучите принцип преобразования двоичного кода в двоично-десятичное значение [1,2,3] и алгоритм (см. рисунок 3.1).
Рисунок 3.1 – Блок-схема алгоритма двоично-десятичного преобразования
2) Наберите программу 3.1 преобразования восьмиразрядного кода в двоично-десятичное значение, исследуйте результат её выполнения.
3) Наберите программу 3.2 преобразования шестнадцатиразрядного кода в двоично-десятичное значение, исследуйте результат её выполнения.
4) Используя программы 3.1 и 3.2, разработайте программы вывода результатов на индикаторы.
Программа 3.1
;8-RAZRAD
;преобразование двоичного значения в ВСD
LSD EQU H'20';младшая цифра
MSD EQU H'21';старшая цифра результата
org H'00'
GOTO MAIN
BINBCD
CLRF MSD
MOVWF LSD
GT
MOVLW D'10'
SUBWF LSD,0 ;вычесть 10
BTFSS STATUS,C
GOTO OVER ;если <10 прекратить
MOVWF LSD ;если больше 10 записать остаток в LSD
INCF MSD,1 ;+1 в MSD
GOTO GT ;повторить
OVER
RETLW 0 ;возврат в основную программу с 0 в аккумуляторе
;контрольная программа, преобразовать H'63', получиться 99
MAIN
MOVLW H'63'
CALL BINBCD
GOTO $
END
Программа 3.2
;Преобразование 16-RAZRAD двоичных кодов ы двоично-десятичное
;результат 5-ти разрядное десятичное число
;исходное число в регистрах H_BYTE и L_BYTE
COUNT EQU H'62';счетчик разрядов
TEMP EQU H'63';временный регистр хранения
R0 EQU H'64';старшие две цифры результата
R1 EQU H'65' ;средние две цифры результата
R2 EQU H'66' ;младшие две цифры результата
H_BYTE EQU H'67' ;старший байт исходного числа
L_BYTE EQU H'68' ;младший байт исходного числа
ORG H'00'
GOTO MAIN
B2_BCD
BCF STATUS,C
MOVLW D'16'
MOVWF COUNT
CLRF R0
CLRF R1
CLRF R2
LOOP16
RLF L_BYTE,1
RLF H_BYTE,1
RLF R2,1
RLF R1,1
RLF R0,1
DECFSZ COUNT,1
GOTO ADJDEC
RETLW 0
ADJDEC MOVLW R2
MOVWF FSR
CALL ADJBCD
MOVLW R1
MOVWF FSR
CALL ADJBCD
MOVLW R0
MOVWF FSR
CALL ADJBCD
GOTO LOOP16
ADJBCD MOVLW H'03'
ADDWF INDF,0
MOVWF TEMP
BTFSC TEMP,3
MOVWF INDF
MOVLW H'30'
ADDWF INDF,0
MOVWF TEMP
BTFSC TEMP,7
MOVWF INDF
RETLW 0
; Тестовая программа. Результат R0,R1,R2=65,55,35
MAIN
MOVLW H'FF'
MOVWF H_BYTE;задаем двоичное FFFF (16 бит)
MOVWF L_BYTE
CALL B2_BCD
GOTO $
END
5) Изучите программы умножения чисел в двоичном коде по следующей программе 3.3.
Программа 3.3
;беззнаковое умножение 8-разрядных чисел
MN1 EQU H'20' ;МНОЖИМОЕ
MN2 EQU H'21' ;МНОЖИТЕЛЬ
H_BYTE EQU H'22' ;старший байт результата
L_BYTE EQU H'23' ;младший байт результата
COUNT EQU H'24' ;счетчик разрядов
START
MOVLW 0FF ;контрольная константа = 255
MOVWF MN2 ;записать в множимое
MOVLW 0FF ;контрольная константа = 255
MOVWF MN1 ;записать в множитель
CALL UMN ;перейти на подпрограмму умножения
GOTO $
;
UMN
CLRF STATUS
MOVLW D'08'
MOVWF COUNT ;загрузить количество разрядов
CLRF H_BYTE ;очистить регистры результата
CLRF L_BYTE
MOVF MN1,0 ;множимое в аккумулятор
BCF STATUS,C;очистить бит переполнения
CYC
RRF MN2,1 ;сдвиг множителя вправо
BTFSC STATUS,C;если не было переполнения пропустить
ADDWF H_BYTE,1;иначе сложить MN1+MN2
RRF H_BYTE,1;сдвиг вправо стврший байт результата
RRF L_BYTE,1;сдвиг вправо младший байт результата
DECFSZ COUNT,1 ;если все 8 бит опрошены пропустить
GOTO CYC ;иначе повторить цикл
RETLW 0 ;возврат из подпрограммы с 0 в аккумуляторе
END
6) Изучите программу деления чисел в двоичном коде по программе 3.4. Комментарии к программе помогут вам в этом.
Программа 3.4
;деление 16-разрядных чисел
; АССВ(16 БИТ)/АССА(16 БИТ)=АССВ(16 БИТ)
;остаток помещается в АССС(16 бит)
;SIGNED определяет версию деления-
;SIGNED=1 - для версии деления со знаком
;SIGNED=0 - для версии деления без знака
; деление с двойной точностью (16 бит/16 бит=16 бит) b=b/a+c
; предварительно надо убедиться, что делимое больше, чем делитель
ACCAL0 EQU H'20'
ACCAHI EQU H'21'
ACCBL0 EQU H'22'
ACCBHI EQU H'23'
ACCCL0 EQU H'24'
ACCCHI EQU H'25'
ACCDL0 EQU H'26'
ACCDHI EQU H'27'
TEMP EQU H'28'
SIGN EQU H'29'
SIGNED EQU H'01'
ORG H'00'
GOTO MAIN
D_DIVS
BTFSC SIGNED,0;если версия деления без знака,
;пропустить следующую команду
CALL S_SIGN ;если со знаком перейти на
;определение знака результата
;
CALL SETUP ;к подпрограмме записи делимого
; во временный регистр АССD
CLRF ACCCHI ;очистить регистр остатка
CLRF ACCCL0
DLOOP
BCF STATUS,C;очистить бит переполнения
RLF ACCDL0,1;сдвиг влево делимого
RLF ACCDHI,1
RLF ACCCL0,1;сдвиг влево остатка
RLF ACCCHI,1
MOVF ACCAHI,0;делитель в аккумулятор
SUBWF ACCCHI,0;вычесть из остатка делитель,проверяем а>c?
BTFSS STATUS,Z;если a=c пропустить следующую команду
GOTO NOCHK ;перейти к подпрограмме деления
MOVF ACCAL0,0
SUBWF ACCCL0,0;вычесть из остатка делитель для сташего байта
NOCHK
BTFSS STATUS,C; если с>а, пропустить следующую команду
GOTO NOGO ;перейти к порограмме деления
MOVF ACCAL0,0;
SUBWF ACCCL0,1;выч из остатка делитель для младшего байта (с-а)=с
BTFSS STATUS,C;
DECF ACCCHI,1
MOVF ACCAHI,0
SUBWF ACCCHI,1
BSF STATUS,C; уст. бит переноса и сдвигаем в младший разряд
NOGO
RLF ACCBL0,1
RLF ACCBHI,1
DECFSZ TEMP,1 ;организация цикла по всем 16-ти разрядам
GOTO DLOOP
BTFSC SIGNED,0;если без знаковое деление
;пропустить следующую команду
BTFSS SIGN,7 ;если знаковое деление проверить
;знак отрицательный?
RETLW 0 ;"нет", то возврат с 0 в аккумуляторе
GOTO NEG_A ;"да", то перейти на изменение знака
;подпрограмма установки начальных условий
SETUP
MOVLW D'16' ;количество битов 16
MOVWF TEMP
MOVF ACCBHI,0;переписать делимое в регистр D
MOVWF ACCDHI
MOVF ACCBL0,0
MOVWF ACCDL0
CLRF ACCBHI ;очистить регистр В для результата (частного)
CLRF ACCBL0
RETLW 0
;подпрограмма изменения знака -а=а
NEG_A
COMF ACCAL0,1
INCF ACCAL0,1
BTFSC STATUS,Z
DECF ACCAHI,1
COMF ACCAHI,1
RETLW 0
;подпрограмма деления со знаком
S_SIGN
MOVF ACCAHI,0
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7;если "-" меняем знак байта А0СВ
GOTO CHEK_A
COMF ACCBL0,1;меняем знак
INCF ACCBL0,1
BTFSC STATUS,Z
DECF ACCBHI,1
COMF ACCBHI,1
CHEK_A
BTFSS ACCAHI,7;если "-" то меняем знак байта АССА
RETLW 0
GOTO NEG_A
;тестовая программа
MAIN
MOVLW H'80'
MOVWF ACCAHI ;загрузка "-2" ACCA
MOVLW H'02'
MOVWF ACCAL0
MOVLW H'00'
MOVWF ACCBHI
MOVLW H'08'
MOVWF ACCBL0 ;загрузка "8" в АССВ
CALL D_DIVS ;перейти к подпрограмме деления
GOTO $
END
7) Разработайте программы представления результатов умножения и деления в двоично-десятичном виде (программа 3.5).
Лабораторная работа №4. Аналогово-цифровое преобразование
Цель работы: изучение принципов аналогово-цифрового преобразования в микропроцессорных средствах, приобретение навыков сбора схемы с аналоговыми сигналами, приобретение навыков подключения аналоговых датчиков в задачах автоматизации.
1 Задание к лабораторной работе
1) Изучите схему центрального процессора PICF877 [1,2,4], обратите внимание на то, что к этому контроллеру подключаются аналоговые сигналы на напряжение от 0 до 5 Вольт.
2) Изучите принципы аналого-цифрового преобразования [5 стр.173].
3) Изучите программу инициализации аналогового входа (программа 4.1) микроконтроллера для подключения аналоговых датчиков систем автоматизации.
Программа 4.1 (фрагмент)
; Код примера инициализации A/D преобразователя.
BSF STATUS, RP0 ; Выбираем Bank1
CLRF ADCON1 ; Все входы АЦП аналоговые
BСF PIE1, ADIE ; Запретить прерывание от АЦП
BCF STATUS, RP0 ; Выбираем Bank0
MOVLW 0xC1 ; Внутренний RC генератор, АЦП включен,
MOVWF ADCON0 ;преобразования выполняются по 0-му каналу
; (AN0)
BCF PIR1,ADIF ; Отчистить флаг окончания A/D
;преобразования
BСF INTCON,PEIE ; Запретить периферийные прерывания
BSF INTCON, GIE ; Запретить все прерывания
; Необходимо время для осуществления выборки
BSF ADCON0, GO ; Старт АЦП
; Производится опрос бита (ADIF) окончания A/D преобразования
AD_WAIT
BTFSS PIR1, ADIF
GOTO AD_WAIT
; A/D преобразование закончено
BCF PIR1, ADIF
……………….
; Продолжение программы
4) Дополните программу 4.1 выводом аналогового сигнала на индикатор (см. программу 4.2).
Программа 4.2
; Begin
R0L EQU 0x20 ; младший регистр
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
;начало кода программы
ORG 0x0000 ; начать с 0-го адреса
BCF PCLATH,3 ;назначение 0-ой страницы памяти программ
BCF PCLATH,4
GOTO L0002 ;перейти к основной программе
ORG 0x0004 ; при наличии прерываний
RETFIE ;возврат с разрешением нового прерывания
L0002:
; 1:Определяет ADC_CLOCK=3 'если не выполняется перемен. времени 3
; 2:Определяет ADC_SAMPLEUS =10 'если не вып. переменная времени 20
; 3: Опред LCD_BITS=8'разрешение 4 и 8 – битных линий интерфейса
; 4: Определяет LCD_DREG = PORTB
; 5: Определяет LCD_DBIT=0'0 или 4 для 4-бит интерфейса, игнорируется ;для 8-битного интерфейса
; 6: Определяет LCD_RSREG = PORTD
; 7: Определяет LCD_RSBIT = 1
; 8: Определяет LCD_EREG = PORTD
; 9: Определяет LCD_EBIT = 3
; 10: Определяет LCD_RWREG = PORTD 'запрет на 0
; 11: Определяет LCD_RWBIT = 2 'запрет на 0
; 12: Определяет LCD_COMMANDUS = 2000 'продолжительность вывода ; ;команды LCDCMDOUT, предельное значение 5000
; 13: Определяет LCD_DATAUS = 50 'задержка LCDOUT, по значению 100
; 14: Определяет LCD_INITMS = 2 'задержка по LCDINIT, по значению 100
;15: 'переменная для отображения реальных величин в режиме симулляции
; 16:
; 17: Матрица «an0» как цифровое слово
; адрес переменной 'an0' 0x2C
an0 EQU 0x2C
; 18:
; 19: TRISA = 0xff 'установка всех каналов PORTA аналоговыми входами
BSF STATUS,RP0
MOVLW 0xFF
MOVWF 0x05
BCF STATUS,RP0
; 20: ADCON1 = 0 'установка PORTA все аналоговые входа
BSF STATUS,RP0
CLRF 0x1F
BCF STATUS,RP0
; 21: начальные установки LCD модуля; курсор мигает
BCF 0x08,3
BCF 0x08,1
BCF 0x08,2
BSF STATUS,RP0
BCF 0x08,3
BCF 0x08,1
BCF 0x08,2
CLRF 0x06
BCF STATUS,RP0
MOVLW 0x02
MOVWF R0L
MOVLW 0x00
MOVWF R0H
CALL W001
MOVLW 0x33
CALL LC02
MOVLW 0x33
CALL LC02
MOVLW 0x33
CALL LC02
MOVLW 0x38
CALL LC02
MOVLW 0x0D
CALL LC02
MOVLW 0x01
CALL LC02
; 22:
; 23: loop:
L0001:
; 24: 0-ой аналоговый вход an0
BSF STATUS,RP0
BSF ADCON1,ADFM
MOVLW 0x00
BCF STATUS,RP0
MOVWF R0L
CALL A001
BSF STATUS,RP0
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF 0x2C
MOVF ADRESH,W
MOVWF 0x2D
; 25: очистка дисплея
MOVLW 0x01
CALL LC02
; 26: Lcdout "Analog input AN0" '- вывод текста в первую строку
MOVLW 0x41
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x61
CALL LC01
MOVLW 0x6C
CALL LC01
MOVLW 0x6F
CALL LC01
MOVLW 0x67
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x69
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x70
CALL LC01
MOVLW 0x75
CALL LC01
MOVLW 0x74
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x41
CALL LC01
MOVLW 0x4E
CALL LC01
MOVLW 0x30
CALL LC01
; 27: Lcdcmdout LcdLine2Home 'set cursor at the beginning of line 2
MOVLW 0xC0
CALL LC02
; 28: Lcdout "Value: ", #an0 'formatted text for line 2
MOVLW 0x56
CALL LC01
MOVLW 0x61
CALL LC01
MOVLW 0x6C
CALL LC01
MOVLW 0x75
CALL LC01
MOVLW 0x65
CALL LC01
MOVLW 0x3A
CALL LC01
MOVLW 0x20
CALL LC01
MOVF 0x2C,W
MOVWF R2L
MOVF 0x2D,W
MOVWF R2H
CALL LC21
; 29: Ожидание вывода переменной
MOVLW 0x01
MOVWF R0L
CLRF R0H
CALL W001
; 30: Повторить сначала
GOTO L0001
; конец программы
L0003: GOTO L0003
; Цикл обработки
D001: MOVLW 0x10
MOVWF R3L
CLRF R2H
CLRF R2L
D002: RLF R0H,W
RLF R2L,F
RLF R2H,F
MOVF R1L,W
SUBWF R2L,F
MOVF R1H,W
BTFSS STATUS,C
INCFSZ R1H,W
SUBWF R2H,F
BTFSC STATUS,C
GOTO D003
MOVF R1L,W
ADDWF R2L,F
MOVF R1H,W
BTFSC STATUS,C
INCFSZ R1H,W
ADDWF R2H,F
BCF STATUS,C
D003: RLF R0L,F
RLF R0H,F
DECFSZ R3L,F
GOTO D002
MOVF R0L,W
RETURN
; Следующий цикл
W001: MOVF R0L,F
BTFSC STATUS,Z
GOTO W002
CALL W003
DECF R0L,F
NOP
NOP
NOP
NOP
NOP
GOTO W001
W002: MOVF R0H,F
BTFSC STATUS,Z
RETURN
CALL W003
DECF R0H,F
DECF R0L,F
GOTO W001
W003: MOVLW 0x0C
MOVWF R2H
W004: DECFSZ R2H,F
GOTO W004
NOP
NOP
MOVLW 0x12
MOVWF R1L
W005: DECFSZ R1L,F
GOTO W006
CALL W007
CALL W007
NOP
NOP
RETURN
W006: CALL W007
GOTO W005
W007: MOVLW 0x0D
MOVWF R2L
W008: DECFSZ R2L,F
GOTO W008
NOP
RETURN
; Следующий цикл – формирование байта аргумента
X001: MOVLW 0x0A
SUBWF R4L,F
BTFSS STATUS,C
RETURN
GOTO X002
X002: MOVLW 0x06
SUBWF R4L,F
BTFSS STATUS,C
RETURN
GOTO X002
; Следующий цикл – Слово аргумента
Y001: MOVLW 0x10
SUBWF R4L,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF R4H,F
BTFSS STATUS,C
RETURN
GOTO Y002
Y002: MOVLW 0x0A
SUBWF R4L,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF R4H,F
BTFSS STATUS,C
RETURN
GOTO Y002
; АЦП преобразование
A001: RLF R0L,F
RLF R0L,F
RLF R0L,F
MOVLW 0x38
ANDWF R0L,F
MOVLW 0xC1
IORWF R0L,W
MOVWF ADCON0
MOVLW 0x0A
MOVWF R4L
CALL X001
BSF ADCON0,GO
A002: BTFSC ADCON0,GO
GOTO A002
BCF PIR1,ADIF
BCF ADCON0,ADON
RETURN
; Цикл обработки выводов монитора
LC01: BSF 0x08,1
BCF 0x08,2
MOVWF 0x06
BSF 0x08,3
NOP
BCF 0x08,3
MOVLW 0x32
MOVWF R4L
CALL X001
RETURN
; Цикл обработки команд на монитор
LC02: BCF 0x08,1
BCF 0x08,2
MOVWF 0x06
BSF 0x08,3
NOP
BCF 0x08,3
MOVLW 0xD0
MOVWF R4L
MOVLW 0x07
MOVWF R4H
CALL Y001
RETURN
; Цикл десятичного преобразования
LC21: BSF R3H,7
MOVLW 0x27
MOVWF R1H
MOVLW 0x10
CALL LC22
MOVLW 0x03
MOVWF R1H
MOVLW 0xE8
CALL LC22
CLRF R1H
MOVLW 0x64
CALL LC22
CLRF R1H
MOVLW 0x0A
CALL LC22
MOVF R2L,W
GOTO LC23
LC22: MOVWF R1L
MOVF R2H,W
MOVWF R0H
MOVF R2L,W
MOVWF R0L
CALL D001
MOVF R0L,W
BTFSS STATUS,Z
BCF R3H,7
BTFSC R3H,7
RETURN
LC23: ADDLW 0x30
CALL LC01
RETURN
; Конец листинга программы
END
2 Указания к схемотехническому обеспечению лабораторной работы
Соберите схему подключения на аналоговый вход AN0 сигнала с источника аналогового сигнала (см. рисунок 4.1).
Рисунок 4.1 - Схема подключения аналогового сигнала
Лабораторная работа № 5. Изучение способов и режимов прерывания
Цель работы: обучение способам организации прерываний как вариант обмена данными в системе автоматизации, инициализация различных видов прерываний, организация логического управления в задачах автоматизации с использованием прерывания.
5.1 Задание для домашней подготовки
1) Изучите режимы следующих видов прерываний [1,2,4]:
- внешнее прерывание RB0/int;
- прерывание по завершению аналого-цифрового преобразования;
- прерывание по переполнению таймера.
2) Изучите разряды регистров OPTION , INTCON, регистров прерывания PIR1, PIR2 и регистров разрешения прерывания PIE1,PIE2, изменяющие свои флаги в режиме прерывания.
3) Изучите карту памяти, обратив внимание на то, что вектор прерывания находится по адресу 04 h.
4) Изучите программу организации прерывания по завершению аналого-цифрового преобразования (см. программу 5.1), аналогично организуются прерывания от внешнего сигнала и по переполнению таймера.
Программа 5.1
include <p16F877.inc>
org 0x000
nop
RESET GOTO START
org 0x004
;======================================================
; Вектор прерываний находится по адресу 4h
;======================================================
;
; Здесь вставьте код обработки прерывания(й)
;
;======================================================
; Начало исполняемого кода с адреса 100h
;======================================================
ORG 100h
START
; Исправленный код из программы 5.1
end
5.2 Задание к лабораторной работе
1) Соберите схему для приёма аналогового сигнала на рисунке 4.1.
2) Запишите программу 5.1. Дополните программу окнами для наблюдения за состоянием регистров OPTION и INTCON, PIR1, PIR2, PIE1, PIE2, откомпеллируйте программу и запустите её. Исследуйте выполнение программы. Определите, как используются разряды перечисленных регистров для организации аналого-цифрового преобразования (АЦП). Как устанавливается, как очищается флаг переполнения по АЦП и как этот флаг используется для организации аналого-цифрового преобразования?
3) Соберите схему соединения микроконтроллера с клавиатурой, подключив одну из клавиш к выводу RB0 (внешнее прерывание происходит по изменению состояния на выводе микроконтроллера RB0). Предусмотрите в программе событие по прерыванию, например включение звукового генератора или событие включение светодиода. Проверьте работу микроконтроллера по прерыванию. Какие внешние факторы реальной системы автоматизации должны вызывать прерывание и при каких из них срабатывает звуковая или световая сигнализации. Приведите примеры систем, изобразите электрическую схему и алгоритм работы такой системы.
4) Запишите программу 5.2 (видоизменив программу 5.1. для обработки внешнего прерывания) Дополните программу окнами для наблюдения за состоянием регистров OPTION и INTCON, TNR2CON,. PIR1, PIR2, PIE1, PIE2, откомпеллируйте программу запустите. Исследуйте её выполнение, подавая с клавиатуры значения, которые приведут к прерыванию. Сопоставьте Ваши результаты с программными единицами в приложении 1.
Лабораторная работа № 6. Программирование арифметического сложения и вычитания много байтовых слов
Цель работы: Изучение способов обработки много байтовых слов, изучение алгоритма арифметического сложения много байтовых слов, приобретение навыков формирование системы цифровой индикации в системах автоматизации.
6.1 Задание для домашней подготовки
1) Изучите различные коды чисел с фиксированной запятой: прямой код, дополнительный код, числа в двоично-десятичном коде [5].
2) Изучите алгоритм сложения данных с получением много байтового результата [1,2,4].
3) Составьте программу сложения двух слагаемых с выводом двух байтового результата на индикацию в шестнадцатеричном коде на семисегментный индикатор (программа 6.1).
4) Дополните программу 6.1 включением звукового генератора при выходе результата сложения за пределы двух байт (программа 6.2).
5) Составьте программу вычитания с выводом результата вычитания в шестнадцатеричном виде на семисегментный индикатор (программа 6.3).
6) Дополните программу 6.3 включением светодиодов при отрицательном результате вычитания (программа 6.4).
6.2 Задание к лабораторной работе
1) На входе микроконтроллера подключены два аналоговых сигнала с датчиков расхода жидкости. Необходимо организовать вывод на цифровой жидкокристаллический экран суммарный расход двух датчиков. Соберите схему, подключив к микроконтроллеру: индикатор, клавиатуру, звуковую сигнализацию. Изобразите электрическую схему подключения всех элементов.
2) Запишите программу 6.1. Предполагая, что два слагаемых это цифровые коды аналоговых сигналов датчиков расхода, исследуйте выполнения по домашнему заданию при задании слагаемых до значения FF.
3) Запишите программу 6.2, для этого отредактируйте предыдущую. Предполагая, что два слагаемых это цифровые коды аналоговых сигналов датчиков расхода, исследуйте выполнения по домашнему заданию при задании слагаемых до значения FF. Звуковая сигнализация используется для контроля правильности выполнения сложения.
4) На входе микроконтроллера подключены два аналоговых сигнала с датчиков расхода жидкости. Необходимо организовать вывод на цифровой жидкокристаллический экран разницу показаний двух датчиков. Соберите схему, подключив к микроконтроллеру: индикатор, клавиатуру, звуковую сигнализацию. Изобразите электрическую схему подключения всех элементов. Запишите и выполните программу 6.3, задавая на входе различные цифровые коды аналоговых датчиков, и обязательно исследуйте результат выполнения программы при задании вычитаемого больше уменьшаемого.
5) Запишите и выполните программу 6.4, наблюдая результат по индикатору. Звуковая сигнализация срабатывает при отрицательном значении результата, то есть расход жидкости второго датчика больше первого. Сравните Ваши результаты с программами в приложении 2.
Лабораторная работа № 7. Программирование арифметического умножения и деления много байтовых слов
Цель работы: изучение алгоритма арифметического умножения много байтовых слов, закрепление навыков преобразования много байтовых слов и организации подпрограмм, закрепление навыков сбора схем и программирования.
7.1 Задание для домашней подготовки
1) Изучите алгоритм умножения данных с получением двух байтового результата [1,2,4].
2) Составьте программу умножения двух чисел с выводом двух байтового результата на индикацию в десятичном виде (программа 7.1).
3) Дополните программу 7.1 включением светодиодов при выходе результата умножения за пределы двух байт (программа 7.2).
4) Напишите программу деления двух чисел с выводом на индикацию (программа 7.3).
5) Дополните программу деления вводом данных с клавиатуры и выходом в режим прерывания при делении на 0 (программа 7.4).
7.2 Задание к лабораторной работе
1) Организуйте умножение цифрового кода аналогового значения датчика на коэффициент нормирования. Запишите программу 7.1, отладьте её и исследуйте при различных данных, обязательно при числах FF.
2) Организуйте умножение цифрового кода аналогового значения датчика на коэффициент нормирования с сигнализацией ошибки вычисление из-за превышения сетки цифровых значений. Запишите программу 7.2, исследуйте её выполнение при тех же данных.
3) Организуйте вычисление коэффициента нормирования аналогового датчика при различных пределах измеряемых и нормируемых значений. Запишите программу 7.3, исследуйте её выполнение при различных данных.
4) Организуйте вычисление коэффициента нормирования аналогового датчика при различных пределах измеряемых и нормируемых значений. Исследуйте последовательно результат выполнения программы 7.4, задавая различные варианты данных: положительные числа, отрицательные числа и деление на ноль. Сравните результаты с программами в приложении 3.
Лабораторная работа № 8. Программирование математических функций
Цель работы: изучение алгоритмов формирования подпрограмм для вычисления математических функций, приобретение навыков программирования функций математической обработки сигналов на микроконтроллерах.
8.1.1 Задание для домашней подготовки
1) Изучите следующие рекомендации по программированию стандартных математических функций. Функции sin x, cos x, ln x можно вычислить, воспользовавшись их разложением в ряд:
|
Число членов ряда определяется из условия получения требуемой точности.
Для вычисления функции Öх с точностью до целых чисел можно применить алгоритм, основанный на том, что квадрат числа можно определить сложением последовательно нечетных чисел (см. таблицу 8.1).
Таблица 8.1
Число |
Сумма нечетных чисел |
Результат |
1 |
1 |
1 |
2 |
1+3 |
22 |
3 |
1+3+5 |
32 |
4 |
1+3+5+7 |
42 |
5 |
1+3+5+7+9 |
52 |
Исходя из приведенных примеров видно, что какое число необходимо возвести в квадрат, такое же количество последовательных нечетных чисел начиная с 1 необходимо сложить.
2) По заданию преподавателя составьте программу вычисления одной из перечисленных функций, используя подпрограммы (программа 8.1). Ввод организуйте с клавиатуры, а вывод на индикацию. Продумайте схему клеммных соединений на стенде. Составьте схему схемных соединений.
3) Изучите другой метод вычисления стандартных функций – вычисление с помощью таблиц по программе 8.2. Эта программа предназначена для вычисления квадрата числа. Число формируется по адресу.
Программа 8.2
SQ: MOVLW k ;задать константу, которую нужно
;возвести в квадрат
CALL SQTB ;вызвать п.п. вычисления квадрата
MOVWF PORTC ;записать результат п.п. в порт С
GOTO $ ;
SQTB: ADDWF PC ;вычислить адрес константы
RETLW 000h ; квадрат 00
RETLW 001h ; квадрат 01
RETLW 004h ; квадрат 02
RETLW 009h ; квадрат 03
RETLW 010h ; квадрат 04
RETLW 019h ; квадрат 05
RETLW 024h ; квадрат 06
RETLW 031h ; квадрат 07
RETLW 040h ; квадрат 08
RETLW 081h ; квадрат 09
RETLW 064h ; квадрат 0A
8.2 Задание к лабораторной работе
1) Соберите схему выполнения программы, подключив для ввода клавиатуру, а для вывода индикатор.
2) Запишите программу 8.1 из домашней подготовки, отладьте программу, используя пошаговый режим работы, используйте окна наблюдения.
3) Для той функции, что и в предыдущем задании составьте таблицу вычислений, запишите её как подпрограмму, напишите основную программу, исследуйте выполнение программы для тех же данных, оцените точность реализованных в программе 8.1 алгоритмов.
Список литературы
1. Тавернье К. PIC- микроконтроллеры. Практика применения: Пер. с фр.-М.:ДМК Пресс,2003. -272 с.:ил.(Серия «Справочник»).
2. PIC1.HTML файл на сайте microchip.ru
3. М.С.Голубцов, А.В. Кириченкова. Микроконтроллеры AVR:от простого к сложному. Изд. 2-ое испр. и доп. – М.:СОЛОН-Пресс,2004.304 с. – (Серия «Библиотека инженера»)
4. Микроконтроллер PIC 16X7XX. Под ред. С.К. Корякина-Черняка, М.:ДОДЭКА, 2005г.
5. Цифровая и вычислительная техника: Учебник для вузов/Э.В Евреинов, Ю.Т. Бутыльский, И.А.Мамзелев и др.; Под ред.Э.В.Евреинов. – М.:Радио и связь, 1991. – 464 с.:ил.
6. Петров И.В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования / Под ред. Проф. В.П. Дьяконова.-М.:СОЛОН-Пресс, 2004. – 256 с.:ил. – (Серия «Библиотека инженера»).
7. А.А.Копесбаева Микропроцессорные комплексы в системах управления. Учебное пособие /Алматы, АИЭС, 2010 г. 121с.
8. Э.Парр. Программируемые контроллеры: руководство для инженера. – М.:БИНОМ. Лаборатория знаний, 2007. – 516 с.:ил
9. Сайт http://www.intuit.ru/- электронный учебник «Архитектура микропроцессорных устройств», Гуров Л.
10. А.А.Копесбаева Микропроцессорные средства и программно-технические комплексы. Методические указания к лабораторным работам (для студентов специальности 36.03 Автоматизация технологических процессов и слушателей ФПК) – АИЭС, Алматы 2001 год.
11. А.А.Копесбаева, А.Б.Файзулина, А.А.Рябцев. Микропроцессорные средства и программно-технические комплексы. Методические указания к выполнению лабораторных и семестровых работ (для студентов специальности 36.03 Автоматизация технологических процессов), Часть 2 – АИЭС, Алматы 2001 год.
12. Микропроцессорные средства в системах управления./ Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 050702 – Автоматизация и управление. Копесбаева А.А., Ибрашева А.Т., Алматы, АИЭС, 2008. - 46 с.
13. А.А.Копесбаева Микропроцессорные комплексы в системах управления. Конспект лекций для студентов всех форм обучения специальностей 050702 – Автоматизация и управление – Алматы .:АИЭС, 2009 – 47 с.
14. А.А.Копесбаева Программно-технические комплексы в системах управления. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальностей 050702 – Автоматизация и управление – Алматы .:АИЭС, 2009 – 45
15. Сайт www.telesys.ru/electronics/
Приложение 1
;******************************************************************
; Retr_1.asm ВАРИАНТ С ПРЕРЫВАНИЯМИ
; Сканер для ретранслятора VERTEX-7000VXR.
;******************************************************************
; Позволяет перевести VERTEX-7000VXR и другие подобные ретрансляторы ;из режима односторонней ретрансляции в режим двухсторонней ;ретрансляции без потери качества работы.
;******************************************************************
; Используется микроконтроллер PIC16F84A. Частота кварца 4000кГц.
;******************************************************************
LIST p=16F84a ; Используется PIC16F84A.
__CONFIG 03FF5H ; WDT включен, бит защиты не установлен.
;===========================================================
; Определение положения регистров специального назначения.
;===========================================================
OptionR equ 01h ; Option - банк1
Status equ 03h ; Регистр Status
PortB equ 06h ; Порт B
TrisB equ 06h ; Tris B - Банк1
IntCon equ 0Bh ; Регистр IntCon
;=========================================================
; Определение названия и положения регистров общего назначения.
;=========================================================
Trigg equ 0Ch ; Переключатель направления ретрансляции.
W_Temp equ 0Eh ; Регистр сохранения содержимого W в
; прерываниях.
Stat_Temp equ 0Fh ; Регистр сохранения содержимого STATUS в
; прерываниях.
SecH equ 1Eh ; Старший байт счетчика времени сканирования.
SecL equ 1Fh ; Младший байт счетчика времени сканирования.
SecH_1 equ 1Ch ; Старший байт счетчика защитного интервала
; времени.
SecL_1 equ 1Dh ; Младший байт счетчика защитного интервала
; времени.
SecH_2 equ 1Ah ; Старший байт счетчика задержки рабочей точки
; программы в прерывании.
SecL_2 equ 1Bh ; Младший байт счетчика задержки рабочей точки
; программы в прерывании.
;=========================================================
; Определение места размещения результатов операций.
;=========================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;=========================================================
; Определение положения флагов и бита выбора банка в регистре STATUS.
;=========================================================
RP0 equ 5 ; Бит выбора банка.
;=========================================================
; Точка входа в программу.
;=========================================================
;141
org 0 ; Начать выполнение программы с нулевого
goto START ; адреса PC.
;========================================================
; Точка входа в прерывание.
;=======================================================
org 4 ; Назначение вектора прерывания (назначается,
; если в программе используются прерывания).
;======================================================
; Объем программы: 63 слова в памяти программ.
;**************************************************************
;**************************************************************
; НАЧАЛО ПРЕРЫВАНИЯ.
;=======================================================
; Сохранение содержимого регистров STATUS и W в ОЗУ.
;--------------------------------------------------------------------------------
INT movwf W_Temp ; Скопировать содержимое регистра W
; в регистр W_Temp.
movf Status,W ; Скопировать содержимое регистра Status
; в регистр W.
movwf Stat_Temp ; Скопировать содержимое регистра W
; в регистр Stat_Temp.
;--------------------------------------------------------------------------------
; Проверка наличия несущей (опрос клавиатуры).
;--------------------------------------------------------------------------------
CYCLE btfsc PortB,0 ; Проверка состояния нулевого бита
; регистра PortB.
goto EndInt ; Если он =1 (несущей нет), то уход
; в ПП выхода из прерывания.
; Если он =0 (несущая есть), то программа
; исполняется далее.
;--------------------------------------------------------------------------------
; Формирование времени одного цикла задержки рабочей точки программы в ;прерывании
;--------------------------------------------------------------------------------
movlw .250 ; Закладка константы .250 в регистр W.
movwf SecH_2 ; Копирование .250 из регистра W
; в регистр SecH_2.
movlw .120 ; Закладка константы .120 в регистр W.
movwf SecL_2 ; Копирование .120 из регистра W
; в регистр SecL_2.
PAUSE_2 clrwdt ; Сброс WDT.
decfsz SecL_2,F ; Декремент содержимого младшего разряда
; счетчика SecL_2.
goto PAUSE_2 ; Если результат декремента не =0, то переход
; в ПП PAUSE_2.
incfsz SecH_2,F ; Если результат декремента =0, то инкремент
; старшего разряда счетчика SecH_2.
goto PAUSE_2 ; Если результат инкремента не=0, то переход
; в ПП PAUSE_2.
goto CYCLE ; Если результат инкремента =0, то переход на
; следующий цикл задержки рабочей точки
; программы в прерывании.
;===================================================
; Восстановление содержимого регистров STATUS и W с последующим ;выходом из прерывания.
;--------------------------------------------------------------------------------
EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.
movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp
; в регистр W.
movwf Status ; Скопировать содержимое регистра W
; в регистр Status.
swapf W_Temp,F ; Поменять местами старший и младший полубайты
; регистра W_Temp с сохранением результата
; операции в нем же.
swapf W_Temp,W ; Поменять местами старший и младший полубайты
; регистра W_Temp с сохранением результата 142
; операции в регистре W.
retfie ; Возврат из прерывания по стеку.
;**************************************************************
; КОНЕЦ ПРЕРЫВАНИЯ
;**************************************************************
;**************************************************************
; СКАНИРОВАНИЕ
;**************************************************************
; Подготовительные операции.
;--------------------------------------------------------------------------------
START clrf IntCon ; Запретить все прерывания.
clrwdt ; Сбросить сторожевой таймер WDT.
bsf Status,RP0 ; Установить банк 1.
movlw .1 ; RB0 работает на вход,
movwf TrisB ; остальные - на выход.
movlw .0 ; Включить подтягивающие резисторы порта В.
movwf OptionR ; На входе INT прерывания - по заднему фронту.
bcf Status,RP0 ; Установить банк 0.
;--------------------------------------------------------------------------------
; Выбор направления ретрансляции.
;--------------------------------------------------------------------------------
TRIGGER btfsc Trigg,0 ; Проверка значения нулевого бита
; регистра Trigg.
goto Metka148 ; Если это значение =1, то переход
; на метку Metka148.
; Если это значение =0, то программа
; исполняется далее.
movlw .251 ; Закладка константы .251 (1111 1011)
; в регистр W.
movwf PortB ; Копирование .251 из регистра W
; в регистр PortB (выбор прямого направления
; ретрансляции: ПРМ-X, ПРД-Y).
goto Metka_1 ; Безусловный переход на метку Metka_1.
Metka148 movlw .255 ; Закладка константы .255 (1111 1111)
; в регистр W.
movwf PortB ; Копирование .255 из регистра W
; в регистр PortB (выбор обратного направления
; ретрансляции: ПРМ-Y, ПРД-X).
;--------------------------------------------------------------------------------
; Формирование защитного интервала времени (ожидание окончания ;переходных процессов, возникающих при смене направлений ретрансляции) ;равного, примерно, 60 мс.
;--------------------------------------------------------------------------------
Metka_1 movlw .197 ; Закладка в регистр W константы .197
movwf SecH_1 ; Копирование константы .197 из регистра W
; в регистр SecH_1.
movlw .121 ; Закладка в регистр W константы .121
movwf SecL_1 ; Копирование константы .121 из регистра W
; в регистр SecL_1.
PAUSE_D clrwdt ; Сброс WDT.
decfsz SecL_1,F ; Декремент содержимого младшего разряда
; счетчика SecL_1.
goto PAUSE_D ; Если результат декремента не =0,
; то переход в ПП PAUSE_D.
incfsz SecH_1,F ; Если результат декремента =0, то инкремент
; старшего разряда счетчика SecH_1.
goto PAUSE_D ; Если результат инкремента не=0,
; то переход в ПП PAUSE_D.
; Если результат инкремента =0, то программа
; исполняется далее.
;=====================================================
; Формирование интервала времени сканирования.
;=====================================================
movlw .245 ; Закладка константы .245 в регистр W.
movwf SecH ; Копирование .245 из регистра W 143
; в регистр SecH.
movlw .255 ; Закладка константы .255 в регистр W.
movwf SecL ; Копирование .255 из регистра W
; в регистр SecL.
;--------------------------------------------------------------------------------
; Разрешение прерываний INT.
;--------------------------------------------------------------------------------
movlw .144 ; Закладка константы .144 в регистр W.
movwf IntCon ; Копирование .144 (1001 0000) из регистра W
; в регистр IntCon
; (разрешение прерываний по входу INT).
;--------------------------------------------------------------------------------
PAUSE clrwdt ; Сброс WDT.
decfsz SecL,F ; Декремент содержимого младшего разряда
; счетчика SecL.
goto PAUSE ; Если результат декремента не=0,
; то переход в ПП PAUSE.
incfsz SecH,F ; Если результат декремента =0, то инкремент
; старшего разряда счетчика SecH.
goto PAUSE ; Если результат инкремента не=0,
; то переход в ПП PAUSE.
; Если результат инкремента =0,
; то программа исполняется далее.
;--------------------------------------------------------------------------------
; Изменение направления ретрансляции.
;--------------------------------------------------------------------------------
clrf IntCon ; Запрет всех прерываний.
incf Trigg,F ; Увеличение на 1 (инкремент) содержимого
; переключателя направления ретрансляции.
goto START ; Переход на новый цикл сканирования.
;*********************************************************
End
;*********************************************************
;Программа организации прерывания по входу RB0
;*******************************************************************
; Begin
R0L EQU 0xC
R0H EQU 0xD
R1L EQU 0xE
R1H EQU 0xF
R2L EQU 0x10
R2H EQU 0x11
R3L EQU 0x12
R3H EQU 0x13
R4L EQU 0x14
R4H EQU 0x15
R5L EQU 0x16
R5H EQU 0x17
W_TEMP EQU 0x4F
STATUS_TEMP EQU 0x4E
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
CALL L0002
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
L0001:
; 1: TRISA = 0x00 'set all PORTA pins as outputs
BSF STATUS,RP0
CLRF 0x05
BCF STATUS,RP0
; 2: PORTA = 0xff 'make all PORTA pins high
MOVLW 0xFF
MOVWF 0x05
; 3: INTCON.INTE = 1 'enable RB0/INT interrupts
BSF 0x0B,4
; 4: INTCON.GIE = 1 'enable all un-masked interrupts
BSF 0x0B,7
; 5: End
L0003: GOTO L0003
; 6:
; 7: On Interrupt 'interrupt routine
L0002:
; 8: PORTA = PORTA - 1 'decrement the value on PORTA
MOVLW 0x01
SUBWF 0x05,W
MOVWF 0x05
; 9: INTCON.INTF = 0 'enable new RB0/INT interrupts
BCF 0x0B,1
; 10: Resume
RETURN
; End of program
L0004: GOTO L0004
; End of listing
END
Приложение 2
;****************************************************************************
;Сложение и вычитание с двойной точностью
;*****************************************************************************
;Сложение: АССb (16 бит)+АССа (16 бит) =АССb (16 бит)
;(А) Первый операнд помещается в байты АССаL0 и АССаHI (16 бит)
;(В) Второй операнд помещается в байты АССbL0 и АССbHI (16 бит)
;(C) Вызов D_add
;(D) Результат помещается в байты АССbL0 и АССbHI (16 бит)
;Показатели
;размер памяти: 07
;Количество циклов: 08
;*****************************************************************************
;Вычитание: АССb (16 бит)-АССа (16 бит) =АССb (16 бит)
;(А) Первый операнд помещается в байты АССаL0 и АССаHI (16 бит)
;(В) Второй операнд помещается в байты АССbL0 и АССbHI (16 бит)
;(C) Вызов D_add
;(D) Результат помещается в байты АССbL0 и АССbHI (16 бит)
;Показатели
;размер памяти: 14
;Количество циклов: 17
;****************************************************************************
ACCaL0 EQU H’20’
ACCaHI EQU H’21’
ACCbL0 EQU H’22’
ACCbHI EQU H’23’
;
include <p16f877.inc>
org 0x00h
;****************************************************************************
;Вычитание с двойной точностью (ACCb – ACCa =ACCb)
D_sub call neg_A; инверсия знака байта АССа, затем сложение
;****************************************************************************
;Сложение с двойной точностью (АССb+ACCa=ACCb)
D_add MOVF ACCaL0,0
ADDWF ACCbL0,1 ;прибавление младшего байта
BTFSC STATUS,C;добавление переноса
INCF ACCbHI
MOVF ACCaHI,0
ADDWF ACCbHI,1 ;прибавление старшего байта
RETLW 0
;
neg_a COMF ACCaL0 ;Меняем знак байта АССа(-АССа=АССа)
INCF ACCaL0
BTFSC STATUS,Z
DECF ACCaHI
COMF ACCaHI
RETLW 0
;*****************************************************************************
;Тестовая программа
;*****************************************************************************
;Загрузка констант в АССа и АССb для тестирования
loadAB MOVLW 1
MOVWF ACCaHI
MOVLW 0FF
MOVWF ACCaL0
MOVLW 07F
MOVWF ACCbHI
MOVLW 0FF
MOVWF ACCbL0
RETLW 0
main NOP
CALL loadAB ;ACCb+ACCa=ACCb
CALL D_add ;ACCb=81FE
CALL loadAB ;ACCb-ACCa=ACCb
CALL D_sub ;ACCb=7E00
GOTO main
END
Приложение 3
;беззнаковое умножение 8-разрядных чисел
MN1 EQU H'20' ;МНОЖИМОЕ
MN2 EQU H'21' ;МНОЖИТЕЛЬ
H_BYTE EQU H'22' ;старший байт результата
L_BYTE EQU H'23' ;младший байт результата
COUNT EQU H'24' ;счетчик разрядов
START
MOVLW 0FF ;контрольная константа = 255
MOVWF MN2 ;записать в множимое
MOVLW 0FF ;контрольная константа = 255
MOVWF MN1 ;записать в множитель
CALL UMN ;перейти на подпрограмму умножения
GOTO $
;
UMN
CLRF STATUS
MOVLW D'08'
MOVWF COUNT ;загрузить количество разрядов
CLRF H_BYTE ;очистить регистры результата
CLRF L_BYTE
MOVF MN1,0 ;множимое в аккумулятор
BCF STATUS,C;очистить бит переполнения
CYC
RRF MN2,1 ;сдвиг множителя вправо
BTFSC STATUS,C;если не было переполнения пропустить
ADDWF H_BYTE,1;иначе сложить MN1+MN2
RRF H_BYTE,1;сдвиг вправо стврший байт результата
RRF L_BYTE,1;сдвиг вправо младший байт результата
DECFSZ COUNT,1 ;если все 8 бит опрошены пропустить
GOTO CYC ;иначе повторить цикл
RETLW 0 ;возврат из подпрограммы с 0 в аккумуляторе
END
;деление 16-разрядных чисел
; АССВ(16 БИТ)/АССА(16 БИТ)=АССВ(16 БИТ)
;остаток помещается в АССС(16 бит)
;SIGNED определяет версию деления-
;SIGNED=1 - для версии деления со знаком
;SIGNED=0 - для версии деления без знака
; деление с двойной точностью (16 бит/16 бит=16 бит) b=b/a+c
; предварительно надо убедиться, что делимое больше, чем делитель
ACCAL0 EQU H'20'
ACCAHI EQU H'21'
ACCBL0 EQU H'22'
ACCBHI EQU H'23'
ACCCL0 EQU H'24'
ACCCHI EQU H'25'
ACCDL0 EQU H'26'
ACCDHI EQU H'27'
TEMP EQU H'28'
SIGN EQU H'29'
SIGNED EQU H'01'
ORG H'00'
GOTO MAIN
D_DIVS
BTFSC SIGNED,0;если дел без зн, пропустить следующую команду
CALL S_SIGN;если со зн. перейти на определение знака результата
;
CALL SETUP;к подпр записи делимого во временный регистр АССD
CLRF ACCCHI ;очистить регистр остатка
CLRF ACCCL0
DLOOP BCF STATUS,C;очистить бит переполнения
RLF ACCDL0,1;сдвиг влево делимого
RLF ACCDHI,1
RLF ACCCL0,1;сдвиг влево остатка
RLF ACCCHI,1
MOVF ACCAHI,0;делитель в аккумулятор
SUBWF ACCCHI,0;вычесть из остатка делитель,проверяем а>c?
BTFSS STATUS,Z;если a=c пропустить следующую команду
GOTO NOCHK ;перейти к подпрограмме деления
MOVF ACCAL0,0
SUBWF ACCCL0,0;вычесть из остатка делитель для сташего байта
NOCHK BTFSS STATUS,C; если с>а, пропустить следующую команду
GOTO NOGO ;перейти к порограмме деления
MOVF ACCAL0,0;
SUBWF ACCCL0,1;выч из остатка делитель для младшего байта (с-а)=с
BTFSS STATUS,C;
DECF ACCCHI,1
MOVF ACCAHI,0
SUBWF ACCCHI,1
BSF STATUS,C; устанавливаем бит переноса и сдвигаем в младший разряд
NOGO RLF ACCBL0,1
RLF ACCBHI,1
DECFSZ TEMP,1 ;организация цикла по всем 16-ти разрядам
GOTO DLOOP
BTFSC SIGNED,0;если беззнак деление пропустить следующую команду
BTFSS SIGN,7;если знаковое деление проверить знак отрицательный?
RETLW 0 ;"нет", то возврат с 0 в аккумуляторе
GOTO NEG_A ;"да", то перейти на изменение знака
;подпрограмма установки начальных условий
SETUP
MOVLW D'16' ;количество битов 16
MOVWF TEMP
MOVF ACCBHI,0;переписать делимое в регистр D
MOVWF ACCDHI
MOVF ACCBL0,0
MOVWF ACCDL0
CLRF ACCBHI ;очистить регистр В для результата (частного)
CLRF ACCBL0
RETLW 0
;подпрограмма изменения знака -а=а
NEG_A COMF ACCAL0,1
INCF ACCAL0,1
BTFSC STATUS,Z
DECF ACCAHI,1
COMF ACCAHI,1
RETLW 0
;подпрограмма деления со знаком
S_SIGN MOVF ACCAHI,0
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7;если "-" меняем знак байта А0СВ
GOTO CHEK_A
COMF ACCBL0,1;меняем знак
INCF ACCBL0,1
BTFSC STATUS,Z
DECF ACCBHI,1
COMF ACCBHI,1
CHEK_A BTFSS ACCAHI,7;если "-" то меняем знак байта АССА
RETLW 0
GOTO NEG_A
;тестовая программа
MAIN
MOVLW H'80'
MOVWF ACCAHI ;загрузка "-2" ACCA
MOVLW H'02'
MOVWF ACCAL0
MOVLW H'00'
MOVWF ACCBHI
MOVLW H'08'
MOVWF ACCBL0 ;загрузка "8" в АССВ
CALL D_DIVS ;перейти к подпрограмме деления
GOTO $
END
Содержание
Лабораторная работа 1 3
Лабораторная работа 2 13
Лабораторная работа 3 15
Лабораторная работа 4 21
Лабораторная работа 5 31
Лабораторная работа 6 32
Лабораторная работа 7 33
Лабораторная работа 8 34
Список литературы 36
Приложение 1 38
Приложение 2 44
Приложение 3 46
Сводный план 2011 г., поз. 23