Регистр
|
Описание
|
STATUS
|
В регистре STATUS содержатся флаги состояния АЛУ, флаги причины сброса микроконтроллера
и биты управления банками памяти данных.
|
FSR
|
Регистр адреса при косвенной адресации
|
INDF
|
Обращение к регистру, адрес которого записан в FSR (не
физический регистр)
|
WREG
|
Регистр, в котором хранится один из операндов при выполнении
операции АЛУ.
|
TEMP
|
Переменная для количества циклов повтора
|
RANDOM
|
Переменная для хранения псевдослучайного числа
|
MAX
|
Переменная для хранения максимального элемента массива
|
3. Разработка алгоритма
Алгоритмы выполнения основной программы и макросов представлены на
рисунках 1, 2.
Основная блок схема состоит из ряда подпрограмм, блок схемы которых так
же представлены на рисунках ниже.
1. Макросы BANK0
- BANK3 изменяют значения битов RP0 и RP1 регистра STATUS,
тем самым позволяют короткими командами перемещаться по всем четырем банкам.
2. Макрос RND, алгоритм которого представлен на рисунке 2, выполняет
генерацию псевдослучайного числа и записывает его в переменную RANDOM. Исходное число, с которым
производит операции генерирования макрос RND находится по адресу 0Х21, т.е. первый элемент
массива. Так как после окончания заполнения массива, используемые ячейки не
подвергаются очищению, поэтому первый его элемент каждый новый цикл заполнения
получается разным. Следует учесть, что ячейки после заполнения не очищаются
лишь в реально работающем микроконтроллере, а при симуляции программы в MPLab-е, при каждом новом запуске ячейки
могут содержать значение 0X00.Это
говорит о том, что эффект псевдослучайного массива будет виден на собранном
устройстве.
. В основной программе, алгоритм которой представлен на рисунке 1,
выполняется автоматическое заполнение массива, псевдослучайными числами, путем
преобразования каждого последующего элемента макросом RND. Для автоматического заполнения применяется косвенная
адресация. Количество заполняемых ячеек соответствует числу, которое находится
в переменной ТЕМР. Данная переменная содержит значение, загружаемое в счетчик,
и при достижении нуля заполнение массива прекращается.
. Далее выполняется поиск элемента в массиве с максимальным
значением. Изначально за максимальный элемент принимаем первый и записываем его
в переменную MAX. Далее сравниваем значение MAX с последующим элементом путем
арифметической команды вычитания. Если он оказывается больше значения MAX, то его переписываем в эту же
переменную MAX, если же значение следующего числа
меньше текущего максимального, то переменную МАХ оставляем без изменения.
Сравнение продолжается столько же раз, сколько элементов находится в массиве.
Количество операций сравнения также отсчитывается счетчиком, в который
загружено число из переменной ТЕМР.
. Под конец выполнения программы в ячейке 0Х20 (адрес дан по
заданию) находится максимальный элемент массива.
Рисунок 1 - Блок схема основной программы
Рисунок 2 - Блок схема макроса RND
4. Разработка программного аналога
В этом разделе, имея необходимый алгоритм и среду программирования,
напишем код программы.
4.1 Листинг программы
Листинг программы представлен в кодах языка Assambler.
#include <p16f877.inc>EQU 0x60 ; определим EQU 0x61 ;
местоположение
MAX EQU 0X20 ; всех переменных
ORG h'0000' ;
ORG h'0004' ;
MOVLW
0X21 ; положим в аккумулятор 0Х21
MOVLW
0XA4 ; положим в аккумулятор 0ХA4 INDF ; положим в ячейку 0Х21
значение 0ХА4
MOVF 0X21,W ; копируем значение 0Х21 ячейки в аккумулятор
MOVWF RANDOM ; положим
это значение в переменную RANDOM
;**********************************************************
; МАКРОСЫ ВЫБОРА БАНКОВ ПАМЯТИ
;**********************************************************
BANK0 MACRO ; выбор нулевого банка
BCF STATUS,RP0
BCF STATUS,RP1MACRO ; выбор первого банкаSTATUS,RP0STATUS,RP1MACRO
; выбор второго
банкаSTATUS,RP0STATUS,RP1MACRO
; выбор третьего банкаSTATUS,RP0STATUS,RP1
;**********************************************************
; НАХОЖДЕНИЕ СЛУЧАЙНОГО ЗНАЧЕНИЯ
;**********************************************************
RND MACRO ; выполнить
макрос RND
RLF RANDOM,W ; сдвиг переменной RANDOM на разряд влево
RLF RANDOM,W ; сдвиг переменной RANDOM на разряд влево
BTFSC RANDOM,4 ;
проверим бит 4 регистра RANDOM
на 0 значение
XORLW
1 ; побитное искл-или аккумулятора и 1
BTFSC RANDOM,5 ;
проверим бит 5 регистра RANDOM
на 0 значение
XORLW
1 ; побитное искл-или аккумулятора и 1
BTFSC RANDOM,3 ;
проверим бит 3 регистра RANDOM
на 0 значение
XORLW
1 ; побитное искл-или аккумулятора и 1
MOVWF RANDOM ; значение
аккумулятора в регистр RANDOM
ENDM
; выйти из макроса
;**********************************************************
; ЗАПОЛНЕНИЕ МАССИВА А СЛУЧАЙНЫМИ ЧИСЛАМИ
;**********************************************************
START
; начало программы
BANK0
; выбор нулевого банка
MOVLW
0X1F; поместим в аккумулятор количество повторов заполнения
MOVWF TEMP ; 0X0F в регистр TEMP
MOVLW
0X21 ; поместим в аккумулятор адрес
первой ячейки
MOVWF FSR ; укажем адрес
первой ячейки в регистре FSR
M1: ;
метка M1
RND ;
выполним макрос RND
MOVF RANDOM ; поместим
случайное число в аккумулятор
MOVWF INDF ; поместим
это число в ячейку с адресом из регистра FSR
INCF FSR ; увеличим
значение адреса на 1
DECFSZ TEMP ; вычитаем 1
от регистра TEMP и проверим на
GOTO M1 ; если TEMP>0 перейдем на метку M1
;**********************************************************
; ПОИСК МАКСИМАЛЬНОГО ЗНАЧЕНИЯ
;**********************************************************
MOVLW
0X21 ; положим в аккумулятор адрес
первой ячейки
MOVWF FSR ; запишем его
в FSR
MOVF INDF,W ; прочтем значение из ячейки по
адресу FSR
MOVWF MAX ; положим
значение из ячейки в переменную MAX
MOVLW
0X20 ; положим в аккумулятор количество
проверяемых ячеек
MOVWF TEMP ; запишем в
переменную TEMP
M2 ;
метка M2
DECFSZ TEMP ; вычитаем 1
от регистра TEMP и проверим на 0
GOTO M4 ; переход на
метку М4
GOTO M3 ; переход на
метку М3
M4 ;
метка M2
INCF FSR ; перенход на
следующую ячейку
MOVF INDF,W ; положим значение INDF в аккумулятор
SUBWF MAX, W ; отнимем от максимального значения
BTFSC STATUS, C ; проверим что больше
GOTO M2 ; переход на
метку М2
MOVF INDF,W ; копируем текущую ячейку косвенной
адресации в аккумулятор
MOVWF MAX ; положим это
значение в переменную MAX
GOTO M2 ; если TEMP>0 перейдем на метку M2
M3 ;
метка M3
;**********************************************************
; КОНЕЦ ПРОГРАММЫ
;**********************************************************
END
4.2 Отладка программы
На рисунке 3 показано окно процесса и результата компилирования
полученной программы. Как видно синтаксис языка Assembler не нарушен, следовательно, ошибок
компилятором не обнаружено.
Полученные предупреждения (Warning[203])
говорят о некорректном расставлении табуляций в программном коде. Однако на
качество выполнения самой программы это никак не влияет.
Рисунок 3 - Результат компилирования написанной
программы
Рисунок 4 - Заполнение ячеек с 0Х21 по 0Х3F
На рисунке 4 можно увидеть, что массив случайных чисел находится в
соответствии с заданием в ячейках, начиная с адреса 0Х21 по 0Х3F, в ячейке с
адресом 0Х20 находится максимальное значение массива.
Заключение
В процессе выполнения данного курсового проекта была решена
распространенная задача нахождения максимального значения из массива
псевдослучайных чисел с n-ным
количеством элементов. Данная задача часто встречается в процессе автоматизации
и требует минимум затрат времени и ресурсов микроконтроллера.
Результатом процесса программирования является законченная программа, не
нуждающаяся в какой-либо оптимизации, корректировке, отладке или исправлении.
Применение в языке Assembler MPASM таких конструкций, как например
макросы, позволило значительно сократить объем используемой памяти, причем
настолько, что можно применить данную программу не только с микроконтроллером PIC16F877, но и с МК более низшего порядка.
В ходе процесса программирования были получены навыки использования
большинства команд, применяемых для микроконтроллеров PIC 16-ого семейства (всего 35 инструкций). Был выведен
новый, не схожий со стандартными, метод нахождения максимального значения из
массива, использующий минимум операций и вычислительного ресурса МК. Также был
изучен принцип работы макросов, условных и безусловных переходов, работа с
байт-ориентированными и бит-ориентированными командами. Курсовой проект
позволил в который раз убедиться в наилучшей совместимости микроконтроллера
фирмы Микрочип, и программной среды для разработки ПО для МК, созданной этой же
фирмой.
Ассемблер MPASM хорош тем,
что готовую программу можно легко внедрить как составляющую другой программы,
единственное что требуется, это соответствие имен переменных, и выделение
неиспользуемой памяти для нее.
Применить полученную программу можно во множестве устройств автоматизации
промышленных, развлекательных объектов, в сфере услуг и обслуживания населения.
Особенно часто программы такой структуры применяются в игровых автоматах и
игрушках.
Нам, студентам специальности Автоматизация и Управление, как будущим
специалистам в сфере программирования микроконтроллеров, просто необходимо без
каких-либо проблем и затруднений решать задачи подобного уровня сложности,
особенно на языках низкого уровня, в которых преобладает непосредственная
работа с памятью, а также легко внедрять подобные, уже готовые листинги в более
объемные программы.
программа регистр макрос assembler
Список использованных источников:
1. Техническая документация по PIC16F877X, OOO «Микро-Чип», Москва 2002 год.
. УМКДП по дисциплине «МПК в СУ» специальности 5B070200, 5B071800.
. Справочник по PIC микроконтроллерам М. Предко 2004г.
. Микропроцессорные системы. Учебное пособие для вузов В.
Куприянов, О. Грушвицкий