- •Глава 1 позиционные системы счисления
- •Глава 2. Формат представления базовых данных
- •2. А положительное, b отрицательное и по абсолютной величине больше, чем а.
- •3. А положительное, b отрицательное и по абсолютной величине меньше, чем а.
- •4. А и в отрицательные.
- •Глава 2. Логические основы piCmicro
- •Элемент не
- •Элемент и
- •Элемент Исключающее или
- •Элемент или
- •Логические элементы в интегральном исполнении
- •Глава 3. Комбинационные устройства
- •Дешифраторы
- •Шифраторы
- •Мультиплексоры
- •Преобразователи кодов.
- •Сумматоры
- •Глава 4. Последовательностные устройства
- •Параллельные регистры
- •Последовательные (сдвиговые) регистры
- •Блок обработки информации алу/рабочий регистр
- •Счетчики импульсов
- •Глава 5. Запоминающие устройства Иерархия запоминающих устройств эвм
- •Иерархическая структура памяти
- •Структурная схема зу
- •Типы оперативных запоминающих устройств
- •Основные параметры запоминающих устройств
- •Микросхемы озу
- •Постоянные запоминающие устройства (пзу)
- •Флэш-память
- •Глава 6. Обработка хранимой программы
- •Режимы адресации
- •Устройство управления
- •Микроконтроллерная система
- •Глава 5. Архитектура микроконтроллера семейства p1c.
- •Регистр слова состояния status
- •Память данных
- •Параллельные порты ввода/вывода
- •Регистр таймера/счетчика tmr0
- •Eeprom память данных eedata, eeadr
- •Специальные регистры w, intcon, option
- •Глава 6. Требования языка ассемблер
- •Операнд
- •Комментарии в программах на ассемблере
- •Метка/Имя
- •Формат кодирования
- •Глава 7. Набор команд pic контроллера
- •Сложение
- •Очистка
- •Команды инкрементирования и декрементирования
- •Бит ориентированные команды
- •Вычитание
- •Глава 8. Логика и организация программ
- •Последовательное выполнение команд
- •Конструкция выбор пути
- •Команды передачи управления. Команда «нет операции»
- •Команда безусловного перехода
- •Команды условного перехода
- •Конструкция цикл
- •Косвенная адресация памяти данных
- •Глава 9. Модульное программирование
- •Временная задержка малой длительности.
- •Метод вложенных циклов
- •Временная задержка длительностью 1с.
- •10. Организация связи с оператором
Конструкция цикл
Последней управляющей конструкцией, которую мы рассмотрим, будет итерация, или цикл. Циклом называется многократное повторение последовательности команд до наступления указанного условия.
Рис. 8.7. Цикл в программе
Команда DECFSZ f,f декрементирует содержимое регистра данных общего назначения (cчетчик) и в случае равенства его содержимого нулю пропускает следующую команду. Типичным примером является подсчет числа проходов цикла.
Пример: формирование на выходе RA0 20 импульсов длительностью 2 мкс.
COUNT EQU 30H ; счетчик цикла
MOVLW D’20’ ; число повторов
MOVWF H’30’ ; в счетчике цикла
LOOP
BSF PORTA,0 ; установить RA0 (1 мкс)
NOP ; 1 мкс
BCF PORTA,0 ; сбросить RA0 (1 мкс)
NOP ; 1 мкс
DECFSZ COUNT,f ; ЕСЛИ содержимое счетчика не ноль
GOTO LOOP ; ТО повторить
….. …. ; ИНАЧЕ выйти из цикла
Команда INCFSZ f,f инкрементирует содержимое регистра данных общего назначения (счетчик). При переходе содержимого через ноль (H’FF’→ H’00’), будет пропущена следующая команда. При замене вычитающего счетчика на суммирующий необходимо изменить и содержимое счетчика цикла на 236 (256-20).
Косвенная адресация памяти данных
Пример 8: Программа очистки группы регистров с использованием косвенной адресации
В программе очистки регистров памяти данных микроконтроллера PIC 1684 стр. 71 было задействовано 68 команд с прямой регистровой адресацией. Теперь посмотрим, как эту же процедуру выполнить с помощью косвенной регистровой адресации.
В микроконтроллерах PIC имеется регистр косвенного адреса INDF, при обращении к которому на шину адреса памяти данных выставляется содержимое индексного регистра FSR. Регистр INDF виртуальный и используется для выставления на шину данных содержимого регистра FSR.
Виртуально этот процесс представлен на Рис. 8.7. Алгоритм работы программы следующий:
Установить индекс FSR на начало массива
Очистить адресуемый регистр данных, указав в качестве адресата регистр данных Н’00’
Инкрементировать FSR
Проверить, не достиг ли индекс конца массива (адрес 4F).Продолжить выполнение программы. Если нет, то перейти к п.2.
Продолжить выполнение программы.
Часть 1 – ARRAY: Индексный регистр FSR инициализируется адресом первого очищаемого регистра памяти 0CH путем записи его адреса в рабочий W (MOVLW H’0C’) с последующим копированием в индексный регистрFSR (MOVWF FSR)
Часть 2 – LOOP: Основная команда очистки массива использует косвенную адресацию, указывая в качестве адресата виртуальный регистр косвенного адреса INDF (CLRF INDF).
Часть 3 При каждом проходе цикла индекс увеличивается на единицу (INCF FSR,f)
Часть 4 Выход из цикла организован путем сравнения индекса (MOVFW FSR) с адресом первого регистра, находящегося за пределом заданного диапазона. Сравнение осуществляется путем вычитания содержимого рабочего регистра из индексного (SUBLW H’50’). Если числа равны, то флаг Z установится, в результате чего команда BTFSS STATUS,Z пропустит следующую за ней команду GOTO LOOP. До наступления этого события команда GOTO будет передавать управление на начало цикла и процесс будет повторяться.
Рис. 8.7. Проход массива
В итоге вариант программы состоит из 8 команд против 68 в линейном варианте, т.е. размер программы уменьшился в 8 раз!!! Однако и время выполнения нашей программы увеличилось в 7 раз из-за различных команд, необходимых для организации цикла.
;*************************************************************************
;CLEAR_ARRAY Программа очистки группы регистров с использованием косвенной адресации
;*************************************************************************
ARRAY
MOVLW H’0C’ ; начальный адрес массива
MOVWF FSR ; копируем в индексный регистр
LOOP
CLRF INDF ; очищаем регистр на который указывает FSR
INCF FSR,f ; адрес следующего регистра
MOVFW FSR ; копируем в W
SUBLW H’50’ ; сравниваем с адресом последнего регистра
BTFSS STATUS,Z ; ЕСЛИ не достиг последнего
GOTO LOOP ; ТО продолжаем
; ИНАЧЕ следующая часть программы
MOTOR_2 Программа управления ротором шагового двигателя с помощью косвенной адресации
В программе управления ротором шагового двигателя стр. 63 было задействовано 37 команд с прямой регистровой адресацией. Теперь посмотрим, как эту же процедуру можно выполнить с помощью косвенной регистровой адресации.
;************************************
; MOTOR_2 Шаговый двигатель
;************************************
;подключение обмоток двигателя к PORTB RB[3:0]
COUNT EQU 10H ; счетчик цикла
STEP EQU 8 ;задаваемый параметр
;================================
; Инициализация------------------------------
MOTOR
BSF STATUS,RP0 ; переход на page 1
MOVLW B'11110000'; константа F0 в W
MOVWF TRISB ; RB[3:0]-выходы
BCF STATUS,RP0 ; возврат на page 0
;====================================
; формирование управляющих сигналов----
S_COD
MOVLW B'00000001'; север
MOVWF 10H ; записать в 10Н
MOVLW B'00001001'; северо-восток
MOVWF 11H ; записать в 11Н
MOVLW B'00001000'; восток
MOVWF 12H
MOVLWB'00001010';юго - восток
MOVWF 13H
MOVLWB'00000010'; юг
MOVWF 14H
MOVLWB'00000110';юго - запад
MOVWF 15H
MOVLWB'00000100'; запад
MOVWF 16H
MOVLWB'00000101';северо - запад
MOVWF 17H
;==============================================
; параметры массива----------------------------------------------
START
MOVLW 10H ; адрес массива
MOVWF FSR ; управляющих сигналов
MOVLW STEP ; число шагов
MOVWF COUNT ; двигателя
;===============================================
; подача сигналов в обмотки двигателя-----------------------
LOOP
MOVF INDF,w ; элемент массива в W
MOVWF PORTB ; вывести в порт В
INCF FSR,f ; следующий адрес
DECFSZ COUNT,f ; ЕСЛИ (COUNT-1) не=0
GOTO LOOP ; ТО продолжить
GOTO START ; ИНАЧЕ начать сначала
;==============================================
END
Код программы состоит из 6 частей:
MOTOR - инициализация порта В – младшая тетрада порта настраивается на выход
S_COD – в памяти данных формируется массив кодов для управления вращением ротора двигателя (MOVLW B'00000001'; север, MOVWF 10H ; записать в 10Н)
START – загружаются параметры массива – его начальный адрес (MOVLW 10H ; MOVWF FSR) и количество элементов (MOVLW STEP; MOVWF COUNT).
LOOP - подача сигналов в обмотки двигателя. Код управления из массива копируется в рабочий регистр W (MOVWF INDF,w) и подается на обмотки шагового двигателя (MOVWF PORTB).
Их последовательная выборка осуществляется инкрементом индексного регистра FSR.
Цикл работы организован командой DECFSZ. ЕСЛИ число шагов в счетчике COUNT не достигло заданного, ТО подача кодов управления на обмотки шагового двигателя продолжается. ИНАЧЕ возврат к п.3 программы.
В итоге вариант программы состоит из 30 команд против 37 в линейном варианте, т.е. размер программы уменьшился незначительно. Выигрыш получился лишь в части подачи кодов в обмотки двигателя, что сделало программу более удобной для чтения.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
Программа любой сложности на любом языке программирования может быть написана при помощи всего трех управляющих структур: линейной, условия и цикла.
В языке ассемблера механизм выбора реализован командами сравнения, условного и безусловного переходов.
Одной из наиболее важных операций является операция сравнения двух чисел. С математической точки зрения это можно сделать при помощи вычитания рабочего регистра w из регистра f.
Команды BTFSS и BTFSC используются для организации операции выбора следующей команды на основе анализа состояний любых битов любом регистров данных, образующих конструкцию ЕСЛИ – ТО.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
Напишите программу вычисления 12 чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13,... (каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду DECFSZ.
Напишите программу сложения массива из 10 чисел. Массив начинается с адреса 20Н.
Как можно с помощью одной команды поменять значение 0 бита любого регистра данных?
Как доработать программу BIN_BCD стр.76 , чтобы результат ее выполнения представлял собой однобайтное значение в формате TENS:UNITS, сохраняемое в регистре 21Н?
Подсказка: используйте команду SWAPF
Доработайте программу BIN_BCD стр.76 для получения трехразрядного BCD числа. Результат сохранить в регистрах 21Н, 22Н, 23Н (сотни, десятки, единицы соответственно).
В качестве фрагмента процедуры тестирования памяти данных в каждый регистр диапазона 0CН…..3FH необходимо занести значение b’01010101’(55H).
В памяти данных, начиная с адреса 20Н, расположен массив из 10 чисел. Проанализировать числа на четность/нечетность и очистить все ячейки, содержащие нечетные числа. Содержимое остальных ячеек оставить без изменений.
8. Напишите программу определения количества нечетных чисел в массиве TITLEX.
9.В памяти данных, начиная с адреса 10Н, расположен массив из 15-ти чисел. Напишите программу для определения чисел равных Х.
10.В телевизионном шоу имеется 8 участников, разделенных на две команды: А и В. У каждого участника есть кнопка, формирующая при нажатии сигнал лог. 1. Состояние эитх кнопок можно одновременно считать с порта В микроконтроллера. Кнопки команды А подключены к младшим разрядам порта.
Напишите процедуру, которая будет:
oпределять момент ответа на вопрос (нажата любая из кнопок);
oпределять ответившую команду (если команда А, то регистр 20Н сбрасывается, если команда В, то устанавливается);
oпределять, кто из членов команды нажал на кнопку (номер участника записывается в регистр 21Н).
11.Какую операцию выполняют следующие команды над байтом данных, находящимся в рабочем регистре?
ADDWF FILE,W; SUBWF FILE,W
12.Одним из простейших методов шифрования данных является изменение порядка битов. Например, b’10111100’ →b’00111101’. Написать программу, выполняющую эту операцию над сообщением ‘Hello friends!’, находящееся в памяти данных микроконтроллера.
Подсказка: для шифрования используйте команды сдвига
