Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 3650
Скачиваний: 3
команд задержки.
Эта группа команд есть не что иное, как стандартная ПП задержки без "врезок", на основе простейшего, однобайтного счетчика.
Это мы уже разбирали ранее, так что остановлюсь только на особенностях.
Команда movlw обращается к константе не напрямую, а через ее название, "прописанное" в "шапке" "программы".
Регистр Temp последний раз задействовался в группе команд вывода символов на индикацию.
При этом, свою функцию он исполнил, и на момент начала группы команд задержки, он является "свободным как ветер в поле".
Араз это так, то его можно повторно задействовать, но уже для записи в него (через регистр W) константы Const1, что и сделано.
Подобного рода многофункциональность я называю совмещением функций ("Фигаро здесь, Фигаро там").
С регистрами Index или Count подобные "манипуляции проделывать" нельзя, так как любой из них, в течение бОльшей части цикла динамической индикации, выполняет одну функцию и поэтому, "со свободой у них проблемы".
Изменяя величину константы Const1 (это делается в "шапке"), можно "грубо" регулировать время отработки одного цикла малого кольца индикации, а соответственно, и большого тоже. Вопрос: "Можно ли не присваивать константе названия Const1 (а также и Const2), а указать ее числовое значение в команде movlw ..."?
Ответ: конечно же можно.
В этом случае, нужно убрать, из "шапки", соответствующие "прописки". Идем дальше.
Следующие несколько групп команд я пропускаю по причине того, что их работа была рассмотрена на 1-м этапе.
Если необходимо сформировать калиброванный интервал времени, в состав которого входит интервал времени отработки полного цикла динамической индикации, то числовое значение константы Const1 нужно подобрать таким образом, чтобы интервал времени отработки полного цикла динамической индикации был немного меньше требуемой величины калиброванного интервала времени ("грубая доводка").
После этого, с помощью дополнительной задержки (осуществляется подбор числового значения ее константы/констант), нужно точно "довести" суммарный интервал времени отработки полного цикла динамической индикации, этой задержки и "сопутствующих" команд, до требуемой величины калиброванного интервала времени ("точная доводка").
"Точная доводка" осуществляется сразу же после окончания полного цикла динамической индикации.
Посмотрите в текст программы.
По своей "конструкции", группа команд "точной доводки" - практически то же самое, что и группа команд "грубой доводки".
На момент начала "точной доводки", регистр Temp "свободен", и по этой причине, он в очередной раз задействуется.
Если возможны допуски, и в связи с этим, точной калибровки не требуется, то группу команд "точной доводки" можно исключить из текста программы.
После выхода рабочей точки программы из ПП динамической индикации, один из 7-сегментных индикаторов линейки будет находиться в активном состоянии, вплоть до начала следующего цикла динамической индикации.
Хотя практического (визуального) выигрыша в "гашении" этого 7-сегментного индикатора и нет, но "для порядка", его лучше погасить, установив все защелки порта В в 0.
Аможно и не "гасить". Как говорится, дело хозяйское.
Вданном случае, ПП динамической индикации оформлена в виде универсальной "заготовки", "врезанной" в некую программу, составные части которой представлены в виде строк из точек.
Обратите внимание на несколько строк из точек, которые расположены после последней команды группы команд гашения активного разряда линейки.
Вэтом "месте" должно формироваться двоичное число, десятичное значение которого и будет индицироваться в линейке из 8-ми 7-сегментных индикаторов.
Если в линейке 8 знакомест, то необходимо сформировать 4-байтное двоичное число
240
(если 7 знакомест, то 3-байтное. Почему? Об этом говорилось ранее).
Вданном, "учебно-тренировочном" случае, не имеет значения, каким именно образом сформировано 4-байтное двоичное число.
Вариантов его формирования может быть множество.
Их выбор зависит от функционального предназначения разрабатываемого устройства и выбранного способа его аппаратной и программной реализации.
Количество "рабочих" знакомест линейки можно изменить.
Если требуется количество знакомест меньшее, чем 8, то в группе команд Увеличение на 1 содержимого счетчика ..., нужно заменить число .08 на число десятичных разрядов, которое требуется (.07, .06, ...).
Например, конструируется устройство с использованием 4-х знакомест. Заменяем .08 на .04.
После этого, в группе команд установки запятой, нужно заменить пятерку на тот номер знакоместа, в котором нужно выставить запятую и определиться с времязадающими константами X, Const1 и Const2.
Вэтом случае, строки с "пропиской" регистров LED4 ... LED7, из "шапки" программы, нужно удалить (не используются).
Если запятую выставлять не нужно, то все команды группы команд установки запятой и первую команду группы команд вывода десятичной цифры на индикацию (вместе с названием метки No_Dot), можно удалить.
Вэтом случае, возврат (из ПП TABLE) будет происходить на команду movwf PortB.
Если 8-ми знакомест мало и их количество нужно увеличить, то принцип тот же самый, за исключением того, что в этом случае, потребуется наращивание разрядности адресного кода (управление дешифратором) с трех до четырех (нужен еще один вывод порта), замена дешифратора 555ИД7 на дешифратор (с "бегающим" нулем), имеющий 4 адресных входа и более 8-ми выходов, увеличение числа LEDов, корректировка "байтности" и т.д.
С этой универсальной "заготовкой" вполне можно работать, но "для полного счастья", не хватает "разборок" с ПП преобразования двоичных чисел в двоично-десятичные (ПП Bin2_10) Об этой ПП будет рассказано в следующем разделе.
Дополнительно
Вобучающих целях, группа команд работы с содержимым регистра Index программы Fsr.asm (начинается с команды incf Index,F, а заканчивается командой goto CYCLE) предоставлена в том виде, в котором Вы видите ее в программе Fsr.asm.
Вней "фигурирует" восьмерка, которая "бросается в глаза". Так удобнее.
Но можно "зайти и с другого бока".
При переходе от числа 7 к числу 8, бит №3 изменяет свое состояние с 0 на 1, а во всех остальных случаях (от 0 до 7 включительно), он имеет значение 0.
Вот за это и можно "зацепиться". Получается такая компактная группа команд:
incf Index,F btfss Index,3 goto CYCLE
которой смело можно заменить соответствующую группу команд программы Fsr.asm. Это называется многовариантностью.
Люди пытливого склада ума найдут в этом много интересного.
А это картинка, поясняющая принцип динамической индикации (используется линейка из восьми 7-сегментных индикаторов с общим катодом):
241
242
16. Преобразование двоичных чисел в двоично-десятичные. Окончательное формирование текста подпрограммы динамической индикации.
Работа подпрограммы преобразования двоичных чисел в двоично-десятичные достаточно сложна для понимания, и скорее всего, для начинающих, детальный "разбор этих полетов" будет связан с немалыми трудностями.
Сдругой стороны, "разборки" с ней, хотя бы, на уровне общих понятий, абсолютно необходимы, так как если нужно визуально отобразить числа в десятичном виде, то без этой подпрограммы просто не обойтись.
Если я "выдам на гора" готовую подпрограмму, то она будет подобна "бесплатному сыру" ("расплата" наступит при первом же затруднении), а если "уйду в детали", то с непривычки, может получиться "перенапряг и отбитие почек".
То есть, необходим разумный компромисс. Так и сделаю.
А заодно, "попутно" разберемся с некоторыми "новенькими штучками" и приобретем полезные навыки.
ПП преобразования двоичных чисел в двоично-десятичные (далее, для краткости, просто "ПП преобразований чисел") входит в состав некой условной программы Bin2_10.asm, в которой ПП преобразований чисел работает в комплексе с ПП динамической индикации, а обе они, в свою очередь, "органически вписаны" в программу, реализующую некое измерительное устройство.
Результаты измерений выводятся на индикацию в линейку из 8-ми 7-сегментных индикаторов.
По большому счету, в данном случае, неважно, что именно измеряется.
Главное - чтобы на каждом "витке" полного цикла "программы", к моменту "влёта" рабочей точки программы в ПП преобразований чисел, тем или иным способом, было бы сформировано 4-байтное двоичное число.
Сним и будет работать ПП преобразований чисел, а после этого, ПП динамической индикации.
Файл программы называется Bin2_10.asm (находится в папке "Тексты программ").
Она выглядит так:
;********************************************************************************
;ГРУППА ПОДРПРОГРАММ ПРЕОБРАЗОВАНИЯ ДВОИЧНЫХ ЧИСЕЛ
; В ДВОИЧНО-ДЕСЯТИЧНЫЕ
; (для случая преобразования 4-байтных двоичных чисел в 8-разрядные десятичные).
;******************************************************************************** ; "ШАПКА ПРОГРАММЫ"
;******************************************************************************** ; Bin2_10.asm Универсальная группа подпрограмм преобразования 4-байтных
; |
двоичных чисел в 8-разрядные десятичные числа. |
; |
............................................................. |
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
Indf |
equ |
00h |
; Регистр Indf. |
||
Status |
equ |
03h |
; |
Регистр |
Status. |
FSR |
equ |
04h |
; |
Регистр |
FSR. |
;............................................................. |
|||||
;............................................................. |
|||||
;================================================================================
; Определение названия и положения регистров общего назначения.
;================================================================================
LED0 |
equ |
10h |
; Регистр хранения результатов преобразований |
|
; 1-го двоично-десятичного разряда. |
||||
LED1 |
equ |
11h |
; ------- |
2-го ------------------------- |
LED2 |
equ |
12h |
; ------- |
3-го ------------------------- |
LED3 |
equ |
13h |
; ------- |
4-го ------------------------- |
LED4 |
equ |
14h |
; ------- |
5-го ------------------------- |
243
LED5 |
equ |
15h |
; ------- |
6-го ------------------------- |
LED6 |
equ |
16h |
; ------- |
7-го ------------------------- |
LED7 |
equ |
17h |
; ------- |
8-го ------------------------- |
Count |
equ |
0Dh |
; Счетчик проходов. |
|
Mem |
equ |
1Fh |
; Регистр оперативной памяти. |
|
TimerL |
equ |
1Bh |
; Регистр младшего разряда 4-байтного |
|
; двоичного числа. |
||||
TimerM |
equ |
1Ch |
; Регистр среднего разряда 4-байтного |
|
; двоичного числа. |
||||
TimerH |
equ |
1Dh |
; Регистр старшего разряда 4-байтного |
|
; двоичного числа. |
||||
TimerHH |
equ |
1Eh |
; Регистр самого старшего разряда 4-байтного |
|
; двоичного числа. |
||||
;.............................................................
;.............................................................
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W |
equ |
0 |
; |
Результат |
направить |
в |
аккумулятор. |
F |
equ |
1 |
; |
Результат |
направить |
в |
регистр. |
;================================================================================
; Присваивание битам названий.
;================================================================================
C equ 0 ; Флаг переноса-заёма.
;.............................................................
;.............................................................
;================================================================================
org |
0 |
; |
Начать выполнение программы |
goto |
START |
; |
с подпрограммы START. |
;********************************************************************************
;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ
;********************************************************************************
START |
..................................... |
|||
; |
..................................... |
|||
NEW |
call |
Bin2_10 |
; |
Условный переход в ПП Bin2_10 |
; |
Адрес следующей команды закладывается в стек |
|||
; |
..................................... |
; .....................................
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;ГРУППА ПОДПРОГРАММ 8-РАЗРЯДНОЙ ДИНАМИЧЕСКОЙ ИНДИКАЦИИ без ПП TABLE
;(то, что было рассмотрено ранее).
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;.... .....................................
; |
..................................... |
;.... |
..................................... |
; |
..................................... |
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ГРУППА ПОДПРОГРАММ ФОРМИРОВАНИЯ 4-БАЙТНОГО ДВОИЧНОГО ЧИСЛА.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;.... |
..................................... |
; |
..................................... |
;.... |
..................................... |
; |
..................................... |
; |
..................................... |
; К этому моменту 4-байтное двоичное |
число (в регистре |
|||
; TimerL/TimerM/TimerH/TimerHH) должно быть сформировано |
для последующей |
|||
; обработки его в группе подпрограмм |
преобразования 4-байтных двоичных чисел |
|||
; в 8-разрядные десятичные числа. |
||||
goto |
NEW |
; |
Безусловный переход |
на метку NEW |
; |
подпрограммы START, |
то есть, начало нового |
||
; |
полного цикла "программы". |
|||
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
244