Файл: Самоучитель по программированию 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