Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 3586

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

"поставщиком" необходимой для анализа, исходной информации, но не "панацеей от всех бед".

Все основные "дела" должны "делаться" в мозгах.

Лентяи сразу же "выпадают в осадок", а "выживают" только упертые и въедливые, к которым, вне всякого сомнения, относятся такие люди как Марсель.

В идеале, программист вообще должен обходиться без помощи симулятора, работая только с текстом программы.

Примечание: никаких исправлений в текст программы Rlf.asm и в ее описание я вносить не буду, а иначе уничтожается предмет разбирательств.

"Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

221

15. Введение в принцип построения подпрограммы динамической индикации. Косвенная адресация.

Атеперь, имея некоторый опыт и навыки, давайте разберемся, как осуществить вывод данных на индикацию, используя принцип динамической индикации.

Совершенно понятно, что устройство, в котором реализовано только это, практической ценности не представляет.

Оно представляет ценность только тогда, когда "вмонтировано" в более сложное устройство. Функция – визуальное отображение результата/результатов работы всего устройства. Динамическая индикация организуется тогда, когда линейка состоит из нескольких 7-сегментных индикаторов (знакомест).

Почему, когда речь идет о м/контроллерах, к которым нужно "пристегнуть" несколько 7-сегментных индикаторов, выбирается именно динамический способ индикации, а не "статический", который применялся "на заре" цифровой техники (вспомните про индикаторы, с "кучей" подключенных к ним проводов и "кучей" микросхем, обслуживающих их работу. У меня такая "каракатица" есть. В кладовке лежит. Выбрасывать жалко…)?

Объяснение простое: на эту "старушку", не хватит выводов портов даже достаточно "крутого" м/контроллера.

Аесли и хватит, то "овчинка выделки не стоит", ведь перейдя на динамическую индикацию, можно получить тот же результат, но гораздо более дешевым способом.

8-выводной порт (порты), которым "укомплектована" значительная часть ПИКов (но не все типы), вполне подходит для управления 7-сегментными индикаторами.

PIC16F84A имеет 2 порта.

В порте В, можно использовать все 8 выводов. В порте А, можно использовать 5 выводов.

Порт В, "в полном составе", выделяется под управление сегментами 7-сегментных индикаторов (включая и запятую), а функция последовательной активации знакомест передается в порт А.

Рассмотрим случай организации динамической индикации для линейки 7-сегментных индикаторов, состоящей из 8-ми знакомест.

Подпрограмма динамической индикации, о которой будет рассказано, достаточно универсальна, то есть, она может быть "врезана/встроена" в другие программы. Разрядность можно будет уменьшить (просто) или увеличить (сложнее).

Я об этом расскажу.

Советую Вам как следует разобраться с тем, что Вы прочитаете. Это очень востребовано.

Лично я, так и не встретил хотя бы более-менее внятного объяснения работы подобного рода подпрограммы, не говоря уж о какой-то универсальной "заготовке", рассчитанной на начинающих (и не только).

"Потрошить" подпрограмму динамической индикации будем в 2 этапа:

- на 1-м этапе, сформируем "скелет", - на 2-м этапе, "нарастим на нем мясо".

По идее, при "разборках" с подпрограммами, нужно "отталкиваться" от ее блок - схемы. В данном случае, я совместил текст подпрограммы с ее блок – схемой.

Это позволяет, не "распыляя" внимания, отслеживать и то, и другое, в одном месте (в тексте подпрограммы).

По ходу дела, разберемся с косвенной адресацией, и я расскажу о "хитром" способе записи константы в регистр.

Первый этап

Предмет разбирательства представляет собой текст программы с названием Fsr.asm, в которую "врезана" подпрограмма динамической индикации, обслуживающая линейку из 8-ми 7-сегментных индикаторов с общим катодом.

Это означает то, что внутри линейки, аноды светодиодов всех одноименных секторов запараллелены.

Таким образом, получается 8 "проволочин", которые, через гасящие резисторы, подключаются к 8-ми выводам порта В.

222


8 выводов общих катодов индикаторов подключаются к 8-ми выходам дешифратора 555ИД7 (подробнее об этом ниже).

Файл программы называется Fsr.asm (находится в папке "Тексты программ").

Это выглядит так:

;********************************************************************************

;ПРИМЕР ОРГАНИЗАЦИИ ДИНАМИЧЕСКОЙ ИНДИКАЦИИ С ИСПОЛЬЗОВАНИЕМ

;КОСВЕННОЙ АДРЕСАЦИИ ПРИ ОБРАЩЕНИИ К ТАБЛИЦЕ ДАННЫХ.

;********************************************************************************

;

"ШАПКА ПРОГРАММЫ"

;******************************************************************************** ; Fsr.asm Универсальная группа подпрограмм 8-разрядной динамической индикации

;.............................................................

;================================================================================

; Определение положения регистров специального назначения.

;================================================================================

Indf

equ

00h

; Регистр INDF.

PC

equ

02h

; Регистр счетчика команд.

Status

equ

03h

; Регистр Status.

FSR

equ

04h

; Регистр FSR.

;.............................................................

;.............................................................

;================================================================================

; Определение названия и положения регистров общего назначения.

;================================================================================

LED0

equ

10h

; Регистр 1-го 7-сегментного индикатора.

LED1

equ

11h

; -------

2-го -------------------------

LED2

equ

12h

; -------

3-го -------------------------

LED3

equ

13h

; -------

4-го -------------------------

LED4

equ

14h

; -------

5-го -------------------------

LED5

equ

15h

; -------

6-го -------------------------

LED6

equ

16h

; -------

7-го -------------------------

LED7

equ

17h

; -------

8-го -------------------------

Index

equ

0Ch

; Регистр счетчика количества

; малых колец индикации.

Count

equ

0Dh

; Регистр счетчика количества

; больших колец индикации.

;.............................................................

;.............................................................

;================================================================================

; Определение места размещения результатов операций.

;================================================================================

W

equ

0

;

Результат

направить

в

аккумулятор.

F

equ

1

;

Результат

направить

в

регистр.

;================================================================================

; Присваивание битам названий.

;================================================================================

Z equ 2 ; Флаг нулевого результата.

;.............................................................

;.............................................................

;================================================================================

org

0

;

Начать выполнение программы

goto

START

;

с подпрограммы START.

;********************************************************************************

;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ

;******************************************************************************** ; Подготовительные операции.

;--------------------------------------------------------------------------------

223


START ......................................

......................................

;--------------------------------------------------------------------------------

; Группа подпрограмм преобразования двоичных чисел в двоично-десятичные.

;--------------------------------------------------------------------------------

Bin2_10 ......................................

......................................

....... ......................................

......................................

....... ......................................

......................................

На данный момент, регистры LED0 ... LED7 заполнены двоично-десятичными числами,

которые необходимо вывести на индикацию (отобразить) в линейку из 8-ми

7-сегментных индикаторов.

На момент начала группы подпрограмм динамической индикации, все прерывания должны

быть запрещены, выводы 8-разрядного порта, к которому подключена линейка должны

быть настроены на работу "на выход", работа должна происходить в нулевом банке.

;--------------------------------------------------------------------------------

;Подготовка счетчика количества малых колец индикации Index к началу полного

;цикла динамической индикации.

;--------------------------------------------------------------------------------

clrf

Index

;

Сброс

в 0 содержимого

счетчика

;

малых

колец индикации

Index.

;--------------------------------------------------------------------------------

;Предварительная закладка количества больших колец индикации, которое нужно

;"пройти" за один полный цикл динамической индикации в регистр Count.

;--------------------------------------------------------------------------------

movlw

X

; Запись константы

X (количество больших

; колец индикации,

задается программистом)

; в регистр W.

movwf

Count

; Копирование содержимого регистра W в

; регистр счетчика

количества больших колец

; индикации Count.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;Использование косвенной адресации при работе с таблицей данных.

;================================================================================

;Подготовка к косвенной адресации: запись в регистр W адреса регистра младшего

;разряда линейки 7-сегментных индикаторов ("привязка" к 7-сегментному

;индикатору, с активации которого начинается полный цикл первого большого

;кольца индикации).

;

--------------------------------------------------------------------------------

CYCLE

movlw

LED0

; Запись в регистр W адреса регистра LED0.

addwf

Index,W

; Увеличение адреса регистра LED0 на величину

; числа, записанного в регистре счетчика

; количества малых колец индикации Index,

; c сохранением результата в регистре W.

;--------------------------------------------------------------------------------

; Косвенная

адресация.

;--------------------------------------------------------------------------------

movwf

FSR

; Копирование содержимого регистра W

; в регистр FSR.

movf

Indf,W

; Копирование содержимого регистра с адресом,

; записанным в регистре FSR, в регистр W.

call

TABLE

; Условный переход (адрес следующей команды

; закладывается в стек) в ПП TABLE.

;---

> Возврат по стеку из ПП TABLE.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; Группа команд установки запятой.

;--------------------------------------------------------------------------------

.......................

.......................

;--------------------------------------------------------------------------------

; Группа команд формирования адресного кода управления дешифратором.

;--------------------------------------------------------------------------------

.......................

.......................

224


;--------------------------------------------------------------------------------

; Группа команд вывода десятичной цифры на индикацию (в порт).

;--------------------------------------------------------------------------------

.....

.......................

Начало визуального отображения цифры в

.......................

одном из 7-сегментных индикаторов (зависит

.......................

от адресного кода управления дешифратором).

;--------------------------------------------------------------------------------

;Группа команд задержки, определяющей время нахождения одного 7-сегментного

;индикатора в активном состоянии (определяющей время прохождения малого кольца

;индикации).

;--------------------------------------------------------------------------------

.....

.......................

.......................

;--------------------------------------------------------------------------------

; Увеличение на 1 содержимого счетчика количества малых колец индикации Index с

; последующей проверкой

результата инкремента на

равенство (или нет) числу .08.

;--------------------------------------------------------------------------------

incf

Index,F

; Увеличение

на 1 содержимого регистра Index

; с сохранением результата в нем же.

movlw

.08

; Запись в регистр W константы .08.

bcf

Status,Z

; Сброс флага нулевого результата Z.

subwf

Index,W

; Вычесть из

содержимого регистра Index

; содержимое

регистра W, с сохранением

; результата

в регистре W.

btfss

Status,Z

; Результат операции вычитания равен

; или нет нулю?

goto

CYCLE

; Если не =0

(в регистре Index - число не

;равное 8), то переход к циклу активизации

;следующего по старшинству 7-сегментного

;индикатора (переход на новое малое кольцо

;индикации, то есть, в ПП CYCLE).

;Если =0 (в регистре Index - число равное

;8), то программа исполняется далее.

;--------------------------------------------------------------------------------

;Начало перехода на новое большое кольцо индикации после того, как

;последовательно активизируются все 8 7-сегментных индикатора линейки

;(после прохождения 8-ми малых колец индикации).

;--------------------------------------------------------------------------------

nop

;

Выравнивающий NOP.

clrf

Index

;

Сброс в 0 содержимого регистра Index.

;--------------------------------------------------------------------------------

; Уменьшение на 1 содержимого счетчика количества больших колец индикации Count.

;--------------------------------------------------------------------------------

decfsz

Count,F

; Декремент содержимого счетчика количества

; больших колец индикации Count,

; с сохранением результата в нем же.

goto

CYCLE

; Если

результат декремента не=0, то переход

; в ПП

CYCLE

; (переход на новое большое кольцо индикации)

; Если

результат декремента =0, то программа

; исполняется далее (переход на новый полный

; цикл

динамической индикации).

nop

; Выравнивающий NOP.

;--------------------------------------------------------------------------------

; Группы подпрограмм и команд, осуществляющие различные операции.

;--------------------------------------------------------------------------------

........................................

........................................

........................................

........................................

........................................

........................................

На данный момент, регистры LED0 ... LED7 заполнены двоичными числами, которые, в дальнейшем, нужно преобразовать в двоично-десятичные и сохранить их все в тех же регистрах LED0 ... LED7.

225