Author: Фрунзе А.В.
Tags: блоки обработки данных процессоры компьютерные технологии электротехника математика радиолюбителям серия программируемые системы издательский дом додэка 21
ISBN: 978-5-94120-141-9
Year: 2008
СЕРИЯ
/ОАЭКА
vvww.dodeca.ru
ПРОГРАММИРУЕМЫЕ СИСТЕМЫ
Микроконтроллеры?
Это же просто!
Том 4
Компакт-диск
внутри
Фрунзе А.В.
СЕРИЯ
ПРОГРАММИРУЕМЫЕ СИСТЕМЫ
А. В. Фрунзе
МИКРОКОНТРОЛЛЕРЫ?
ЭТО ЖЕ ПРОСТО!
ОДЭКА
Москва
Издательский дом «Додэка-ХХ1»
2008
УДК 004.312.46
ББК 32.973.26-04
Ф93 Фрунзе А. В. Микроконтроллеры? Это же просто! Т 4 (+CD). —
М.: Додэка-ХХ1, 2008. — 464 с.: ил. (Серия «Программируемые
системы»).
ISBN 978-5-94120-141-9
В четвёртом томе книги «Микроконтроллеры? Это же просто!» излагаются
базовые понятия двоичной арифметики с плавающей точкой — основы матема-
тического обеспечения работы современных микроконтроллеров. Особое внима-
ние уделено использованию арифметики с плавающей точкой в программах вы-
числения элементарных функций.
Кроме того, в книге содержатся примеры аппаратной и программной реали-
зации ряда полезных устройств и приборов. Их изучение поможет глубже понять
функциональные возможности и типовые приёмы программирования микрокон-
троллеров.
На прилагаемом компакт-диске помещены тексты всех приведённых про-
грамм, а также полезная справочная информация по электронным компонентам,
схемам и протоколам, о которых идёт речь в книге.
Для студентов технических вузов и широкого круга радиолюбителей, делаю-
щих первые шаги в освоении микроконтроллеров.
УДК 004.312.46
ББК 32.973.26-04
Все права защищены. Никакая часть этого издания не может быть воспроизведена в любой
форме или любыми средствами, электронными или механическими, включая фотографирова-
ние, ксерокопирование или иные средства копирования или сохранения информации, без
письменного разрешения издательства.
ISBN 978-5-94120-141-9
© Додэка-XXI, 2008
® Серия «Программируемые системы»
Оглавление
Список используемых сокращений...........................................5
Глава 1. Арифметика с плавающей точкой ..................................6
1.1. Общие сведения о представлении чисел..............................6
1.2. Программы арифметики с плавающей точкой .........................20
1.3. Программы преобразования чисел с плавающей точкой ...............64
1.4. Программы вычисления элементарных функций........................88
1.5. ПИД-регулятор на МК с использованием программ АПТ.............. 138
1.6. Краткие выводы ................................................ 175
Глава 2. 1001-е зарядное устройство................................... 177
2.1. Описание устройства............................................ 177
2.2. Наладка устройства ............................................ 194
2.3. Экспериментальное исследование устройства ......................201
2.4. Программа для микроконтроллера зарядного устройства.............211
2.5. Краткие выводы .................................................297
Глава 3. Вольтметр постоянного тока на ADUC824 ....................... 301
3.1. Микроконвертеры от Analog Devices...............................301
3.2. Микроконвертер ADUC824 ........................................ 305
3.3. Принципиальная схема и работа устройства........................305
3.4. Программирование микроконвертера ...............................308
3.5. Запись программы пользователя в микроконвертер ADUC824 ........ 335
3.6. Исследование 24-битного АЦП микроконвертера ADUC824 ........... 338
3.7. Цифровой вольтметр на ADUC824 ................................. 355
3.8. Краткие выводы .................................................372
Глава 4. Встроенная в микроконтроллер флэш-память данных...............375
4.1. Вступление......................................................375
4.2. Флэш-память данных микроконвертера ADuC824 от Analog Devices....377
4.3. Флэш-память данных микроконтроллера AT89S8252 фирмы ATMEL.......381
-3-
Оглавление
4.4. Пример использования флэш-памяти данных МК AT89S8252
фирмы ATMEL ........................................................383
4.5. Краткие выводы .................................................397
Глава 5. Использование внешней флэш-памяти данных......................399
5.1. Шина 12С........................................................399
5.2. Микросхема АТ24С64А.............................................410
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А.............418
5.4. Краткие выводы .................................................432
Глава 6. Простая клавиатура на основе микроконтроллера.................433
6.1. Аппаратная реализация простой клавиатуры .......................433
6.2. Программное обеспечение работы клавиатуры ......................437
6.3. Усовершенствование схемы клавиатуры ............................442
Приложение. Программирование микроконтроллеров AT89S51, AT89S52,
AT89S8252 фирмы ATMEL..................................................445
Краткий глоссарий......................................................448
Список литературы......................................................449
Предметный указатель...................................................450
О диске................................................................453
Список используемых сокращений
LSB — Least Significant Bit (младший значащий бит)
MSB — Most Significant Bit (старший значащий бит)
Акк. —аккумулятор
ЛОТ — арифметика ограниченной точности
АПТ — арифметика с плавающей точкой
Apr. — аргумент
АФТ — арифметика с фиксированной точкой
Дв. — двоичный
Дес. — десятичный
ДЛ — делитель
ДМ — делимое
КТЦ — контрольно-тренировочный цикл
Ман. — мантисса
МК — микроконтроллер
МлБ — младший байт
ММ — множимое
МН — множитель
Пор. —порядок
ПР — произведение
ПТ — плавающая точка
Разр. — разряд
Per. — регистр
Сл. — слагаемое
СрБ — средний байт
СтБ — старший байт
ФТ — фиксированная точка
Ч — частное
ЭО — экранная область
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ
ТОЧКОЙ
1.1. Общие сведения о представлении чисел
1.1.1. Свойства позиционных систем счисления
Прежде чем приступить к рассмотрению программ, реализующих
арифметику с плавающей точкой (наряду с этим термином в вычисли-
тельной математике и технике используется термин-синоним «фиксиро-
ванная запятая»), необходимо ознакомиться с некоторыми общими све-
дениями о форматах представления двоичных и десятичных, целых и
дробных, знаковых и беззнаковых чисел. Также полезно вспомнить мето-
ды, алгоритмы и программы выполнения арифметических операций над
множеством этих чисел, обеспечивающие заданную точность и диапазон
вычислений при определенных затратах памяти и времени работы микро-
контроллера.
Изображение чисел в любой позиционной системе счисления с натураль-
ным основанием R(R> 1) базируется на представлении их в виде произве-
дения целочисленной степени Rm основания R на полином от этого основа-
ния:
п
Ar = +Rm^aiR'' t (1.1)
i = 1
где {0,1,...,A- 1} — цифры Я-ичной системы счисления (А-ичные
цифры);
п — количество разрядов (разрядность), используе-
мых для представления числа;
Rm — характеристика числа, причём показатель
/ие{...,-2,-1,0, +1,4-2,...};
RmR~l — Rm~l — позиционный вес i-го разряда числа.
-6-
1.1. Общие сведения о представлении чисел
В десятичной системе (R = 10) для представления чисел используются
цифры 67z е (0, 1 ...9), в двоичной (Я = 2) — цифры 67/ е (0, 1), в шестнадцате-
ричной (R = 16) — цифры 67/g (0, 1...9, А, В, С, D, Е, F), где прописным ла-
тинским буквам A...F эквивалентны соответственно числа 10... 15 в десяти-
чной системе.
Если т = const, то формула (1.1) определяет представление числа AR в
форме с фиксированной точкой. Это означает, что позиция, в которой точка
фиксируется между разрядами числа, отделяя целую часть от дробной и
определяя вес соответствующих разрядов, постоянна в процессе вычисле-
ний для всего множества используемых чисел и зависит от заранее уста-
новленного значения т. Если т < 0, то формула (1.1) представляет дробные
числа (правильные дроби), если т>п — целые числа, если 0<т <п — сме-
шанные числа (неправильные дроби). Обычно для чисел с фиксированной
точкой значение т ограничено 0 < т < п, т. е. позиция точки в числе выби-
рается в рамках п разрядов, отведённых для изображения цифровой части
числа.
Рис. 1.1. Форматы двоичных чисел с фиксированной точкой:
а) дробные числа; б) смешанные числа; в) целые числа.
На Рис. 1.1 приведены форматы двоичных (R = 2) чисел с фиксирован-
ной точкой: при т = 0 (а), при т = 1 (б) и при т—п (в). Далее ограничимся
рассмотрением только целых и дробных чисел, поскольку действия над
смешанными числами могут быть сведены к отдельным операциям над их
целыми и дробными частями. Дробные числа, в отличие от целых, будем
рассматривать как числа с фиксированной точкой в узком смысле этого
термина, и для их обозначения в формулах и программах будем использо-
вать букву «ф».
В микроконтроллерах основой представления чисел является двоичная
система счисления.
— 7 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1.1.2. Представление целых и дробных двоичных чисел
Рассмотрим представление дробных и целых двоичных чисел.
При R= 2, т = 0 формула (1.1) имеет вид
п
А2ф = ±^ai'2~‘ = (1-2)
/= 1
где 2_/ — вес /-го двоичного бита0;
az g {0,1} — двоичные цифры.
Формула (1.2) определяет дробные двоичные числа со знаком. Левая её
часть даёт развернутую форму записи числа в виде полинома, а правая —
свёрнутую форму записи в виде последовательности цифр (коэффициентов
полинома). Для изображения знака числа S (от лат. Signum — знак) отво-
дится дополнительный знаковый бит (нулевой — с весом 2°), а точка фик-
сируется перед старшим (первым — с весом 2-1) цифровым битом числа
(см. Рис. 1.1а). Если заранее известно, что множество используемых чисел
не содержит отрицательных, в формате числа бит знака можно опустить.
Такие числа называют беззнаковыми. В 7?-битной сетке дробных беззнако-
вых чисел может быть точно представлено 2" различных, в том числе Т — 1
ненулевых, чисел, удовлетворяющих неравенству
^2ф(тт) " 2 - ^2ф - ^2ф(тах) “
где Л2ф(тщ)~ минимальное (ненулевое),
^2ф(тах) — максимальное из представимых чисел.
В свёрнутой форме записи эти числа изображаются в виде
^2ф(т1й) — 0.00...01 И ^2ф(тах) — 0.11... 11.
В случае R = 2, т = п формула (1.1) преобразуется к виду
п п-1
А2 = ±^az.2w-z = ±^fez-2Z = ±bn_x...bxb„ (1.4)
/ = i / = о
где bi = an_ijui^ всех i = 0, 1,..., п — 1;
ah bi g {0, 1} — двоичные цифры.
Перекодировка индексов в формуле (1.4) даёт удобочитаемое соответс-
твие веса бита 2! индексу его цифры. Формула (1.4) определяет целые
° В данной книге в тех случаях, когда речь идёт о представлении двоичных чисел, вместо
термина «разряд» используется термин «бит». — Примеч. науч. ред.
-8-
1.1. Общие сведения о представлении чисел
двоичные числа со знаком. Под знак отводится дополнительный (п + 1)-й
бит с весом 2W, а точка фиксируется после младшего (нулевого — с весом
2°) цифрового бита числа (Рис. Lie). Для беззнаковых целых чисел бит
знака S опускается. В «-битной сетке целых беззнаковых чисел, как и для
дробных, может быть представлено множество 2п целых, в том числе 2п — 1
ненулевых, чисел, удовлетворяющих неравенству
Л(пип)=2°= 1<Л2<Л2(тахГ 2"-1. (1.5)
В свёрнутой форме эти числа изображаются такими же последователь-
ностями цифр, как и дробные числа, отличаясь лишь положением точки:
^2ф(т1п) ~ 00...01 И /42ф(П1ах) — 11... 11.
В формулах (1.2)...(1.5) двоичные числа представлены в виде полинома,
коэффициенты которого выражены двоичными цифрами, а основание —
десятичным числом, т. е. цифрой 2. Учитывая, что в любой позиционной
системе счисления её основание однозначно представляется с помощью
цифр этой системы в виде 10Л (по определению R = (R - 1) + 1, а такая
операция даёт нуль в младшем разряде и единицу переноса в старшем раз-
ряде), формулы (1.2)...(1.5) можно обобщить на случай любой позицион-
ной системы:
п
ЛЛф = ±2Й/1ОЛ> 10л"^Илф1 S 1- (16)
/•= 1
п = 1
AR = ±^ai X^ <L7>
/ = 0
где обозначение модуля введено для знаковых чисел, а неравенства спра-
ведливы для всех ненулевых значений представляемых чисел.
Формула (1.6) определяет свойства дробных, а формула (1.7) — целых
чисел с основанием 10Л. Эти формулы полезны, в частности, при рассмот-
рении чисел в десятичной и шестнадцатеричной системах счисления, ши-
роко используемых в микроконтроллерах наряду с двоичной системой.
1.1.3. Смешанные системы счисления
Для представления в микроконтроллерах систем счисления с основа-
нием R = 10 и R = 16 используются смешанные системы счисления, в кото-
рых каждая цифра Я-ичной системы изображается цифрами другой, Q-ич-
ной (Q < R), в частности двоичной системы. Такая смешанная система на-
-9-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
зывается Q—Я-ичной. Для записи Я-ичной цифры отводится одно и то же
количество 0-ичных разрядов, минимально необходимое для представле-
ния любой /?-ичной цифры.
В двоично-десятичной системе каждая десятичная цифра кодируется
тетрадой двоичных цифр, причём между десятью (из возможных 24= 16)
двоичными числами и десятичными цифрами устанавливается взаимно
однозначное соответствие. Возможны различные варианты установления
этого соответствия, порождающие различные двоично-десятичные коды с
теми или иными свойствами. В программах настоящей книги использует-
ся один из наиболее распространенных кодов — код с естественными веса-
ми «8421», в котором десятичные цифры кодируются их естественными
двоичными эквивалентами: (0 — 0000), (1 — 0001), ..., (9 — 1001). Этот код
преимущественно применяется для ввода/вывода данных (при преобразо-
ваниях из двоичной системы в двоично-десятичную и наоборот), но может
использоваться и непосредственно при обработке данных.
В частном случае смешанных систем, когда R=zQk (к — целое), напри-
мер R = 16, Q = 2 (к = 4), запись числа в 7?-ичной системе является сокра-
щенной записью представления этого числа в 0-ичной системе: цифра
шестнадцатеричной системы заменяет значение четырёх цифр двоичной
системы, что упрощает описание представлений двоичных чисел. Эта сме-
шанная система широко используется в программах, приведённых в дан-
ной книге.
Известно, что арифметические операции над числами в любой пози-
ционной системе счисления выполняются по тем же правилам, что и в де-
сятичной арифметике, поскольку все они основываются на общих прави-
лах выполнения операций над соответствующими полиномами. При этом
используются те таблицы сложения (вычитания) и умножения, которые
имеют место в конкретной системе счисления. В частности, для двоичной
системы действуют правила:
0 + 0 = 0,
0+1 = 1,
1+0=1,
1 + 1 = 10,
0-0 = 0,
1-0 = 1,
1-1=0,
10- 1 = 1,
0x0 = 0,
0x1=0,
1x0 = 0,
1x1 = 1.
Эти правила не содержат операции деления двоичных цифр, посколь-
ку её выполнение, в отличие от других операций, не может быть сведено к
действиям над отдельными цифрами. Напомним, что при сложении в дво-
ичной системе счисления двух единиц происходит перенос в следующий,
более старший бит, а при вычитании единицы из нуля происходит заём в
данный бит из более старшего бита, в результате чего данный бит устанав-
ливается в единицу.
-10-
1.1. Общие сведения о представлении чисел
1.1.4. Представление знаковых чисел.
Дополнительный и прямой код
При выполнении арифметических операций возникает проблема
идентификации отрицательных чисел. Как отмечалось выше, для изобра-
жения знака двоичных знаковых чисел отводится специальный знаковый
бит S. Изображение знака «+» в этом бите принято кодировать для двоич-
ных чисел цифрой 0, а знака «—» — цифрой 1. При этом изображение чис-
ла со знаком содержит только двоичные цифры, но само число подразуме-
вается состоящим из двух частей: знаковой и цифровой.
Если цифровая часть положительных и отрицательных чисел содер-
жит всегда абсолютную величину числа, то такой способ представления
знаковых чисел называют прямым кодом. Обработка чисел, представлен-
ных в прямом коде, требует отдельных операций над цифровой и знако-
вой частями, альтернативного выполнения операций сложения и вычи-
тания, приводит к появлению двух представлений нуля: +0 и —0 (напри-
мер, для дробных чисел +0 = 0.00...00; —0 = 1.00...00). Эти недостатки
прямого кода не позволяют использовать его при обработке данных, и он
находит применение преимущественно в операциях ввода/вывода (хотя
известны примеры использования его в микроЭВМ для основного пред-
ставления знаковых чисел). В микроконтроллерах для обработки знако-
вых чисел используются в основном дополнительные коды (в качестве
промежуточных — также и обратные коды).
Рассмотрим определения и свойства этих кодов. Пусть знаковое число
с фиксированной точкой содержит п + 1 Я-ичных разрядов, причём край-
ний левый разряд в формате числа — разряд знака, в котором «+» закоди-
рован цифрой 0, а «—» — цифрой R — 1 (1 — для двоичной, 9 — для десяти-
чной, F — для шестнадцатеричной системы счисления). Тогда дополни-
тельный код числа определяется выражением
К
МЛ]д
если Ar > 0;
если AR < 0,
(1.8)
где Г — граница числа, причём для дробных чисел Г = Ю1^ (Г = 2 для R = 2,
Г= 10 для R = 10 и Г = 16 для R = 16), а для целых чисел Г = 10^+1 (Г = 2w+I
для R = 2, Г= 10w+1 для R^ 10 и Г= 16л+1 для R = 16). Иными словами, в
дополнительном коде запись положительного числа идентична его записи
в прямом коде, а запись отрицательного числа представляет собой резуль-
тат операции вычитания модуля числа AR из границы: Г — |ЛЛ|.
Поскольку граница Г представляет собой фиксированную степень,
легко показать, что указанная операция вычитания сводится к поразряд-
ной операции дополнения каждой цифры числа до старшей цифры систе-
-11-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
мы счисления (поиску взаимно обратной цифры ah такой, что at + а, = R— 1)
и суммированию полученного обратного кода с единицей младшего разря-
да числа, т. е. с величиной 10 д'* для дробных и 10д =1 для целых чисел.
Например, для десятичной дроби 0.1234 её отрицательный эквивалент в
дополнительном коде имеет вид 9.8765 + 0.0001 — 9.8766. Для проверки
правильности преобразования сложим эти числа: 0.1234 + 9.8766 =
= 10.0000. Результат равен границе десятичной дроби. Поскольку формат
чисел содержит 5 разрядов (один знаковый и 4 цифровых), полученная
при сложении чисел единица переноса выходит за рамки формата, и ис-
тинный результат равен 0.0000, что подтверждает правильность преобразо-
вания отрицательного числа в дополнительный код. Аналогичные дейс-
твия используются для обратного перевода дополнительного кода отрица-
тельного числа в прямой код, т. е. для получения модуля числа.
Смысл использования дополнительного кода заключается в том, что,
во-первых, арифметические операции вычитания и сложения чисел в до-
полнительных кодах сводятся к операции алгебраического суммирования
(вычитание заменяется сложением уменьшаемого с дополнительным ко-
дом вычитаемого); во-вторых, обработка знаковой и цифровой частей чи-
сел при сложении производится по одним и тем же правилам, причём пра-
вильный знак результата формируется автоматически. Заметим, что в до-
полнительном коде, в отличие от прямого и обратного кодов, существует
единственное представление нуля (для дробных чисел 0 — 0.00...00), но
вместе с тем имеется и одно особое отрицательное число вида 1.0...00, ко-
торое является своим собственным дополнением, т. е. это число не имеет
дополнительного к нему положительного числа. Поэтому в дополнитель-
ных кодах область представления положительных и отрицательных чисел
оказывается несимметричной относительно нуля.
1.1.5. Понятие об арифметике ограниченной точности.
Переполнение и антипереполнение
В микроконтроллерах, как и в любых других технических устройствах,
выполняющих автоматические вычисления, количество битов (разрядов)
л, отводимых для представления чисел, ограниченно и фиксированно.
Этот факт наряду с использованием для представления чисел двоичной
системы приводит к существенным отличиям машинной арифметики от
обычной арифметики, реализуемой при помощи карандаша и бумаги (та-
кую арифметику принято именовать арифметикой неограниченных ресур-
сов). Назовем числа, представляемые в фиксированной разрядной сетке,
числами с ограниченной точностью, а машинную арифметику — арифмети-
кой ограниченной точности (АОТ). Эти термины подчеркивают принципи-
-12-
1.1. Общие сведения о представлении чисел
альную особенность машинной арифметики, которую программист посто-
янно должен иметь в виду.
Рассмотрим основные свойства АОТ. Как следует из формул (1.6), (1.7),
числа |ЛА| > ЛЛ(тах) и |ЯЛ| < yl^min) нельзя представить в л-разрядном форма-
те, поскольку представляемые числа принадлежат множеству, или диапазо-
ну, {[-Л(тах)> -ЛД(т>п)1, 0, [+/>/г(тт)> +^Л(тах)]}> СМ. Рис. 1.2а. Для ДВОИЧНЫХ
дробных и целых чисел эти крайние (пограничные) значения ненулевых
представимых чисел определены формулами (1.3) и (1.5), см. Рис. 1.26, в.
Если при выполнении арифметической операции появляется число
И/?1 > ^Я(тах), это приводит к переполнению л-битного формата числа и,
как правило, к ошибочному представлению результата операции (ошибка
переполнения). Наоборот, если при выполнении операции возникает такое
ненулевое число, что |Лд| < это приводит к антипереполнению (по-
тере значности) формата и соответственно к ошибке антипереполнения,
при которой все ненулевые числа AR е {—+Лг(тт)} приходится пред-
ставлять в виде нуля. Любое число из указанного интервала называют ма-
шинным нулем.
а) -^Я(тах) _^Я(т!п) Q +^Я(т1П) +^Я(тах)
б) -(1-2~п) -2~п 0 +2~п +(1-2~п)
—1-111111111II—•—IIIIIIIIIIII—-
в) -(2"-1) -1 о +1 +(2л-1)
—I-H-IHI-HI111-----•----IIIIIIIIIIII—-
Рис. 1.2. Размещение чисел ограниченной точности на числовой оси:
а) 7?-ичные числа; б) двоичные дробные числа; в) двоичные целые числа.
Появление ошибок переполнения и машинного нуля в АОТ нарушает
ряд аксиом, истинных в арифметике точных чисел, в частности ассоциа-
тивный (а + (Ь — с) = (а + Ь) — с) и дистрибутивный (а х (Ь — с) = а х Ь ~
— ахс) законы, что можно показать на примерах. Пусть дробные беззнако-
вые десятичные числа имеют в 4-разрядном формате значения а = 0.2000,
Ь = 0.9000 и с = 0.8999. Тогда вычисление левой части выражения ассоциа-
тивного закона даёт значение 0.2000 + (0.9000 - 0.8999) = 0.2001, а при вы-
числении правой части возникает переполнение: (а + Ь) = 0.2000 +
+ 0.9000 > 0.9999. Аналогично при вычислении правой части выражения дис-
трибутивного закона получаем значение 0.2000 х 0.9000 - 0.2000 х 0.8999 =
= 0.1800 -0.1799 = 0.0001, а при вычислении левой части возникает машин-
ный нуль: а х (Ь - с) = 0.2000 х (0.9000 - 0.8999) = 0.2000 х 0.0001 < 0.0001.
Поскольку значения правых и левых частей выражений не совпадают,
-13-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
данные законы нарушаются, и, следовательно, в АОТ для получения
правильного результата вычислений имеет значение порядок операций,
позволяющий избежать ошибок переполнения и машинного нуля.
Заметим, что порядок операций оказывает влияние и на точность
результата. Выявление ошибок переполнения и антипереполнения
является задачей, которую программисту (и только ему!) необходимо
решать при разработке своих арифметических программ.
Диапазон [ЛЛ(т|П), ЛЛ(таХ)] точного представления в АОТ ненулевых
дробных Я-ичных чисел имеет дискретный характер, т. е. в пределах этого
диапазона точно представляется лишь то множество Rn— 1 чисел, в Я-ич-
ной записи которых отличные от нуля цифры содержатся только в первых
п после точки разрядах (остальные дополнительные разряды, если предпо-
ложить их существование, будут содержать нули). На практике приходится
представлять в «-разрядном формате любые дробные числа из указанного
диапазона, в том числе и те (а их большинство), разряды которых, выходя-
щие за рамки принятого формата, содержат ненулевые Я-ичные цифры.
Например, десятичная дробь 0.1 в двоичном формате представляется бес-
конечной периодической двоичной дробью 0.0(0011). При записи этой
дроби в ограниченном формате приходится отбрасывать ряд ненулевых
цифр и тем самым представлять её как приближённое число с ограничен-
ной точностью.
Числа с ограниченной точностью порождаются не только в процессе
их начального представления в ограниченном формате, создающем пог-
решность представления, но и при выполнении арифметических опера-
ций над точными или приближёнными исходными числами. Так, напри-
мер, в арифметике целых чисел, не имеющей погрешности представления
исходных чисел, операция деления порождает неправильные дроби (гово-
рят, что множество целых чисел незамкнуто относительно операции деле-
ния), которые в формате целых чисел записываются приближённо целыми
числами ограниченной точности. Аналогичные погрешности операций
могут иметь место при умножении и делении дробных чисел.
1.1.6. Округление чисел
Как погрешности представления, так и погрешности операций имеют
одну природу, связанную с округлением чисел. Поэтому рассмотрим пра-
вила округления чисел и величины, характеризующие точность округлён-
ных чисел. Округление точного числа A*R, содержащего п + к (к = 1,2, ...)
А-ичных разрядов, заключается в ограничении его формата п разрядами.
При выполнении этой операции желательно обеспечить наибольшую бли-
зость округлённого числа AR (число в формате п) к округляемому числу AR
(число в формате п + к).
-14-
1.1. Общие сведения о представлении чисел
На практике обычно используют два способа округления: отбрасыва-
ние и симметричное округление. Способ отбрасывания определяется для
дробных и целых Л-ичных чисел формулами (1.6) и (1.7). Согласно этому
способу дополнительные к разрядов округляемого числа A*R просто исклю-
чаются из формата без какой-либо коррекции части числа в разрядах п.
Симметричное округление определяется следующими выражениями соот-
ветственно для дробных и целых А-ичных чисел:
п
±'^аГ 10я'’
п
если ап+ । <R/2;
10д' + Юд", если an+l> R/2;
(1.9)
Ar ~
п- 1
±^^••10^, если a_{<R/2;
/ = о
п- 1
• IO}? + 1, если а_{ > R/2.
/ = 0
(1.10)
При симметричном округлении значение первой из отбрасываемых
цифр округляемого числа A*R используется для решения вопроса о коррек-
ции части числа в оставшихся разрядах п. На практике способ симметрич-
ного округления для случая ап+х = R/2 (A~i = R/2) иногда дополняют пра-
вилом Гаусса, в соответствии с которым коррекция оставшейся части числа
производится, если цифра ап (aQ) — чётная. Оценим точностные характе-
ристики методов округления: абсолютную и относительную ошибки (пог-
решности).
Определим абсолютную ошибку округления 6AR как разность значений
округляемого A*R и округлённого AR чисел, а относительную ошибку округ-
ления §Ar как модуль отношения абсолютной ошибки к значению округля-
емого числа:
~ Ar~Ar> Mr ~ ^Ar/Ar^ (1.11)
Поскольку в большинстве случаев точное значение округляемого чис-
ла Ar неизвестно (например, число получено с погрешностью в процессе
измерения является иррациональным и т. п.), то неизвестны и точные ве-
личины ошибок в выражениях (1.11). Однако почти всегда имеется воз-
-15-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
можность оценить граничные (предельные) значения ошибок. Определим
граничную абсолютную Дг и относительную 8Г ошибки округления следую-
щим образом:
|ДЛЯ|<ДГ;8Г = Аг/|Лл|. (1.12)
Замена |Л\| из формулы (1.11) на |ЛЛ| в выражении (1.12) не вносит су-
щественной погрешности в значение 8Г, если Дг « |Лд|. На практике ис-
пользуют по возможности минимальное значение граничной ошибки Дг В
тех случаях, когда известна точная величина ошибки ДЛЛ, она одновремен-
но принимается и в качестве граничной. Очевидно, что граничная абсо-
лютная ошибка любых Я-ичных чисел, представленных в ^-разрядном
формате, имеет значения Дг = 10“^ и Дг = 1 соответственно для дробных и
целых чисел при способе округления с отбрасыванием и Дг= 10~д /2 и
Дг = 1/2 соответственно для дробных и целых чисел при симметричном ок-
руглении.
Способ отбрасывания порождает всегда округлённые числа «с недо-
статком», т. е. числа с положительной абсолютной ошибкой, поэтому этот
способ называют ещё несимметричным округлением. Симметричный же
способ, в зависимости от значения первой отбрасываемой цифры, порож-
дает как числа «с недостатком», так и числа «с избытком» (числа с отрица-
тельной абсолютной ошибкой), что, как правило, приводит в процессе
многочисленных округлений при вычислениях к компенсации ошибок и по-
вышению точности результата. Процессу компенсации ошибок способс-
твует и вышеупомянутое правило Гаусса (оно основывается на предпосыл-
ке о равновероятности чётных и нечётных чисел). Способ симметричного
округления применяется преимущественно в программах, выполняющих
арифметическую обработку.
В арифметике с фиксированной точкой все числа представляются с оди-
наковой граничной абсолютной ошибкой. Величина же граничной отно-
сительной ошибки зависит от модуля округлённого числа и возрастает от
максимального числа к минимальному:
0-13)
2~”<8г2<1, (1.14)
где 5Г, бг2 — ошибки А-ичных и двоичных чисел, использующих правило
округления с отбрасыванием.
Из выражений (1.13), (1.14) следует, что малые числа, близкие к ма-
шинному нулю, могут иметь высокую относительную ошибку (до 100% при
округлении с отбрасыванием и до 50% при симметричном округлении),
-16~
1.1. Общие сведения о представлении чисел
т. е. обладать низкой точностью. Если такие числа участвуют в промежу-
точных вычислениях, точность результата будет того же порядка. Поэто-
му при программировании вычислений важно обеспечить требуемую точ-
ность как для исходных чисел, так и для промежуточных результатов. Это
достигается правильным выбором порядка операций и значности чисел.
1.1.7. Значность числа
Программисту для уяснения путей достижения требуемой точности
вычислений необходимо иметь представление о том, что такое значность
числа. Значность определяет не общее количество цифр в изображении
числа, а только количество значащих цифр, т. е. всех верных цифр числа,
кроме нулей, стоящих слева в изображении числа. Например, числа 12.3;
0.123; 0.000123 имеют по три значащие цифры. Цифры в записи прибли-
жённого числа принято считать верными, если граничная абсолютная
ошибка представления этого числа не превосходит половины единицы
(иногда целой единицы) его младшего разряда. Очевидно, что в силу этого
определения все цифры округлённого числа (при точном округляемом
числе) являются верными, хотя фактически могут не совпадать с соответс-
твующими цифрами точного числа. Например, при симметричном округле-
нии точного числа 0.17997 до четырёх цифр округлённое число имеет зна-
чение 0.1800, не совпадающее с точным в трёх разрядах, но тем не менее
имеющее все верные цифры.
Значность чисел определяет граничную относительную ошибку их пред-
ставления: чем выше значность, тем меньше эта ошибка и, следовательно,
тем выше точность числа. Точному числу на числовой оси соответствует
точка, а округлённому — интервал чисел. На Рис. 1.3 показаны интервалы
0.05 < 0.1 < 0.15 и 0.095 < 0.10 < 0.105 округлённых чисел 0.1 и 0.01 соот-
ветственно с одной и двумя значащими цифрами. Чем выше значность,
тем уже интервал неопределенности и тем ближе округлённое число к точ-
ному.
0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16
I I I I I II I I I I I I I I
----------------------J 0.01 --
-----------------0.1------------------
Рис. 1.3. Интервалы округлённых чисел различной значности на числовой оси.
Заметим, что в арифметике с фиксированной точкой (АФТ), в отличие от
арифметики с плавающей точкой (об этом будет сказано далее), повыше-
ние значности приводит одновременно к существенному увеличению диа-
— 17 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
пазона представимых чисел, т. е. точность и диапазон чисел оказываются
тесно связанными друг с другом. Повышение значности в 8-битных мик-
роконтроллерах достигается, как правило, побайтным увеличением фор-
мата чисел (8, 16, 24 двоичных битов и т. д.), поскольку байт — 8-битное
двоичное слово — является структурной единицей, требующей минималь-
ных программных затрат для обработки (доступ же к отдельным битам
байта связан с усложнением обработки). Программы сложения, вычита-
ния, умножения и деления, рассматривавшиеся в томе 3 настоящего изда-
ния, оперируют с данными различного формата, что позволяет выбрать ту
или иную программу в зависимости от требуемых точности вычислений и
диапазона представления чисел.
При использовании арифметики с фиксированной точкой для выпол-
нения сложных вычислений (последовательностей арифметических опе-
раций) возникает необходимость расчёта масштабов, обеспечивающих
значения модулей исходных промежуточных и результирующих чисел в
пределах заданного диапазона их представлений. В данной книге для вы-
числений сложных выражений (см. ниже) применяется арифметика с пла-
вающей точкой, поэтому здесь вопросы расчёта масштабов не рассматри-
ваются.
1.1.8. Граничные абсолютные ошибки в арифметических
операциях с числами ограниченной точности
Операции сложения и вычитания точных чисел не вносят погрешнос-
ти в результат. Свойства этих операций для чисел ограниченной точности
определяются следующим правилом:
граничная абсолютная ошибка суммы или разности чисел не превы-
шает сумму граничных ошибок представления слагаемых:
±Х,. <£дд.>.
(1.15)
Это правило учитывает наихудший случай распределения ошибок ок-
ругления слагаемых: когда ошибки независимы и одного знака. При зна-
чительном числе слагаемых, полученных методом симметричного округ-
ления, происходит взаимная компенсация ошибок разного знака, и истин-
ная абсолютная ошибка суммы (разности) лишь в исключительных
случаях близка к граничной.
Граничная относительная ошибка суммы слагаемых одного знака нахо-
дится между наименьшей и наибольшей из граничных относительных
ошибок слагаемых, с учётом формулы (1.12):
-18-
1.1. Общие сведения о представлении чисел
к
[WW5r YXi -[W^ax-
(1.16)
Иными словами, точность суммы не уступает точности слагаемых
(вследствие компенсации ошибок сумма оказывается обычно точнее сла-
гаемых).
В отличие от суммы разность чисел ограниченной точности может
быть менее точной, чем уменьшаемое и вычитаемое. Потеря точности осо-
бенно велика в том случае, когда уменьшаемое и вычитаемое близки по аб-
солютной величине. Такое вычитание приводит к резкому снижению
значности результата и, следовательно, к возрастанию граничной относи-
тельной ошибки разности. При организации вычислений необходимо ли-
бо избегать вычитания близких чисел, либо брать исходные числа с доста-
точно высокой точностью, обеспечивающей при вычитании необходимую
точность результата.
Умножение точных «-разрядных чисел даёт точное 2«-разрядное про-
изведение. Погрешность этой операции для чисел ограниченной точности
определяется следующим правилом:
граничная относительная ошибка произведения приблизительно
равна сумме граничных относительных ошибок представления
сомножителей:
(L17)
где Xi — сомножители.
Из формулы (1.17) следует, что результат умножения чисел ограничен-
ной точности (будь это целые или дробные числа) не может иметь больше
значащих цифр, чем их имеет наименее точный сомножитель. Очевидно,
что при умножении «-разрядных чисел ограниченной точности произве-
дение является также «-разрядным числом, причём если значность каждо-
го из двух сомножителей равна «, то в произведении предпоследняя
Цифра — (« — 1)-я для дробного и 2-я для целого числа — безусловно вер-
на, а последняя не вполне точна (сомнительна). При увеличении количес-
тва сомножителей пропорционально растет граничная относительная
ошибка произведения и уменьшается его значность.
Деление — операция, обратная умножению: нахождение одного из
сомножителей (частного) по произведению (делимому) и второму сомно-
жителю (делителю). С другой стороны, операцию деления можно рассмат-
ривать как умножение делимого на величину, обратную делителю. В связи
-19-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
с этим для чисел ограниченной точности граничная относительная ошибка
деления определяется выражением (1.17), и, следовательно, значность
частного не может быть больше значности наименее точного из делимых
чисел. Очевидно, что если делимое и делитель представляются //-разряд-
ными дробными числами, то частное также не должно содержать более п
разрядов.
Произведение точных целых //-разрядных чисел имеет разрядность 2п.
Поэтому при делении таких чисел примем разрядности делимого и делите-
ля 2п и п соответственно. Как отмечалось выше, множество целых чисел
незамкнуто относительно операции деления, поэтому частное может быть
не только точным целым числом, но и конечной или бесконечной дробью
(правильной или неправильной), т. е. числом ограниченной точности. В свя-
зи с этим разрядность частного при делении целых чисел определяется не-
обходимой точностью его вычисления и может превышать разрядность де-
лимого или делителя. На практике деление целых чисел выполняется как
деление с остатком'.
находят целое неполное точное частное (его произведение с делите-
лем даёт целое число, не превышающее делимое) и целый остаток,
т. е. разность между делимым и произведением неполного частного
на делитель. Разрядность неполного частного не превосходит раз-
рядности делимого, а разрядность остатка — разрядности делителя
(остаток по абсолютной величине всегда меньше делителя).
Таким образом, для чисел ограниченной точности проблема потери
значности является весьма серьёзной. Если при вычислениях используют-
ся числа с фиксированной точкой, то задача прогнозирования всех возмож-
ных случаев потери значности может превратиться для программиста в
превалирующую и гораздо более сложную, чем собственно написание
программного кода, реализующего требуемую последовательность ариф-
метических операций. Это зачастую серьёзно ограничивает круг задач, ре-
шаемых с помощью микроконтроллеров.
1.2. Программы арифметики с плавающей точкой
1.2.1. Общие сведения
Обработка числовых данных в форме с плавающей точкой считалась до
недавнего времени нетипичной для микроконтроллерных систем. Однако
расширение областей использования микроконтроллеров, в частности со-
здание микроконтроллерных информационно-измерительных систем и
распределенных сетей сбора данных, потребовало существенного увеличе-
ния диапазона обрабатываемых чисел при сохранении их ограниченной
-20-
1.2. Программы арифметики с плавающей точкой
значности, определяемой точностью датчиков первичной информации. В
этих условиях применение арифметики с фиксированной точкой приво-
дит к резкому увеличению разрядности чисел, росту затрат памяти и вре-
мени выполнения программ, что снижает в целом производительность и
экономичность микроконтроллерных систем.
Кроме того, с увеличением разрядности чисел с фиксированной точ-
кой и усложнением алгоритмов обработки возрастает неопределенность
прогнозирования вычислений и затрудняется их предварительное масшта-
бирование, призванное гарантировать корректность и требуемую точность
результатов. Эти проблемы снимает арифметика с плавающей точкой
(АПТ), поскольку она обеспечивает раздельное представление диапазона и
точности чисел (порядка и мантиссы) и реализует их автоматическое мас-
штабирование в процессе вычислений.
В данном разделе рассматриваются особенности представления чисел
в форме с плавающей точкой, а также алгоритмы и программы сложения,
умножения и деления двоичных чисел в дополнительных кодах с плаваю-
щей точкой в трёхбайтном формате (обычной точности).
Числа с плавающей точкой имеют следующую общую форму представ-
ления с учётом выражений (1.1) и (1.6):
= А"'ЯАф, от = var, (1.18)
где Rm — характеристика А-ичного числа AR\
т — целочисленный порядок т е. {О, ±1, ±2,..., ?итах), т. е. \т\ < ттах;
ЛЛф — мантисса числа AR — правильная дробь, определяемая выраже-
ниями
/ = 1
(1.19)
< |ЛЛф| < 1 - или ЯЛф = О,
где at е {0, 1, ..., R - 1} — А-ичные цифры. В мантиссе точка фиксирована
перед её старшим цифровым разрядом, но фактическое положение точки в
представлении числа определяется независимо от мантиссы порядком т и
изменяется, т. е. «плавает», в зависимости от его величины и знака.
Существует много вариантов представления конкретного числа в фор-
ме с плавающей точкой. Например, смешанное число 12.34 можно пред-
ставить в следующем виде: 102х0.1234; 103х0.01234; 104х0.001234 и т. п. На
практике один из вариантов представления выбирают в качестве стандарт-
ного. Если мантисса удовлетворяет условию
-21-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Я-’<|/1Аф|<1, (1.20)
то такую мантиссу и число с плавающей точкой называют нормализованны-
ми. Признаком нормализованное™ абсолютной величины числа является
наличие в старшем цифровом разряде мантиссы ненулевой цифры, т. е.
а{ * 0. Все остальные числа, не удовлетворяющие условию (1.20), называют
ненормализованными. Так, в рассмотренном выше примере первый вари-
ант представления числа с плавающей точкой определяет нормализован-
ное, а другие — ненормализованные числа. Преимущества нормализован-
ных чисел заключаются в том, что они, во-первых, определяются
единственным образом и, во-вторых, обеспечивают максимально возмож-
ную точность представления чисел в выбранном и-разрядном формате,
поскольку не тратят его разряды на изображение незначащих нулей.
В нормализованном виде можно представить, вообще говоря, любое
число, отличное от нуля. Для представления нуля в форме с плавающей
точкой на практике используют несколько вариантов:
1. АЛф = 0,т — произвольно;
2. Лдф — произвольно, т — wmin;
3. AR^ = 0, /т? = 0;
4. ЯЛф = 0, т = rnmin, где rnmin = -датах.
Чаще всего применяются варианты третий и четвёртый.
Машинное представление формата чисел с плавающей точкой, в отли-
чие от формата чисел с фиксированной точкой, содержит, помимо разряда
знака SMn п разрядов цифровой части числа — мантиссы, дополнительно
бит знака Sn и к цифровых битов порядка (Рис. 1.4). В соответствии с этим
представлением и учётом формулы (1.7) порядок т числа AR определяется
выражениями
к- 1
т = ±^b^V<\m\<Rk-\ = ттт, (1.21)
/ = 0
где bi е. {0, 1,..., R — 1} — А-ичные цифры порядка.
Оценим с учётом выражений (1.18)...(1.21) диапазон представления чи-
сел с плавающей точкой:
Rm--R-l= HA|min < |ЛЛ| < |ИА|тах = Rm™ V-R-n), (1.22)
где значение H/?lmin справедливо для нормализованных чисел (в случае не-
нормализованных чисел H/?lmin = A"Wmax “ п)-
Из неравенств (1.20)...(1.22) следует, что диапазон нормализованных чи-
сел практически не зависит от разрядности мантиссы, а определяется в ос-
— 22 —
1.2. Программы арифметики с плавающей точкой
новном величиной основания системы счисления и разрядностью порядка.
Размещение диапазона чисел с плавающей точкой на числовой оси анало-
гично размещению чисел с фиксированной точкой (см. Рис. 1.2я). При появ-
лении в процессе вычислений чисел, не принадлежащих диапазону, возни-
кают, как и для чисел с фиксированной точкой, ошибки переполнения
Ил1 > И/?1тах и антипереполнения (машинного нуля) |ЛЛ| < И/dmin, которые для
чисел с плавающей точкой выражаются как одноимённые ошибки поряд-
ка: т > tnmax ит< mmia.
(k+1)разрядов (п+1)разрядов
Rk Rk~1 R1 RO ro r-1 r-2 r-п
S п Ьк-1 bl b0 Зм а1 а2 ап
Порядок m Мантисса Арф
Рис. 1.4. Формат А-ичного числа с плавающей точкой.
Точность представления чисел с плавающей точкой определяется теми
же общими формулами (1.12), что и для чисел с фиксированной точкой.
Граничная абсолютная ошибка Дг этих чисел, в отличие от чисел с фиксиро-
ванной точкой, непостоянна и зависит не только от разрядности мантиссы
и метода её округления, но и от величины порядка: Дг = Rm х R~n — для не-
симметричного и Дг — Rm х 0.5 х R~n — для симметричного округления (1.9).
Значение этой ошибки (для несимметричного округления) находится в
диапазоне
Величина граничной относительной ошибки с учётом формулы (1.13)
определяется выражением
П у ЛЭ
-----------~ Л < ог <--------г = К
Rm(l-R~n) Rm • R
(1.23)
где Rm х R~n — граничная абсолютная ошибка числа с плавающей точкой
(при данном порядке т); Rmx R~[ и Rfn(\ — R~n) — соответственно мини-
мальное и максимальное абсолютные значения числа при нормализован-
ной мантиссе.
Из неравенства (1.23) следует, что граничная относительная ошибка
представления чисел с плавающей точкой не зависит от величины поряд-
ка, определяется разрядностью мантиссы и практически одинакова для
любых чисел, как малых, так и больших. Заметим, что этот вывод справед-
-23-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
лив только для нормализованных чисел. Для ненормализованных чисел гра-
ничная относительная ошибка может достигать 100%. Сопоставление диа-
пазона и точности чисел подтверждает заключение, что в формате числа с
плавающей точкой диапазон и точность чисел отделены друг от друга: раз-
рядность мантиссы определяет точность представления чисел, а разряд-
ность порядка — их диапазон.
Арифметические операции над числами с плавающей точкой выполня-
ют действия как над мантиссами, так и над порядками, причём те и другие
представлены в виде знаковых чисел в соответствии с формулами (1.19) и
(1.21). Операции над порядками (сложение, вычитание, сравнение) сущес-
твенно упрощаются, если вместо их знакового представления (например, в
дополнительном коде) использовать беззнаковое представление в виде не-
отрицательных чисел или так называемое представление со смещённым по-
рядком, применяемое в ряде ЭВМ:
т = m + Rk, (1.24)
СМ
где т — несмещённый порядок в дополнительном коде;
Rk — смещение;
л?с.м — смещённый порядок.
Диапазон представления порядка т, с учётом выражений (1.21), равен
-Rk<m <Rk-\. Корректируя этот диапазон согласно формуле (1.24), по-
лучаем неравенство 0 < /исм < 2Rk— 1, гарантирующее, что /исм — всегда не-
отрицательное число, представляемое теми же k + 1 разрядами, что и не-
смещённый порядоктскцифровыми и одним знаковым разрядами. Схе-
ма соответствия несмещённого и смещённого порядков для двоичных
чисел (R = 2) приведена на Рис. 1.5. Очевидно важное свойство смещён-
ных порядков, используемое при их сравнении: если т{>т2, то всегда
^1см — ^2см-
—2к=10...00 -2^=11...11 00...00 20=00...01 2к-1=01...11 т
------Hllllll III----------1-------lllllllll III----------
00.. .00 01. ..11 10...00 10...01 11...11 rnCM
Рис. 1.5. Схема соответствия несмещённого т и смещённого тсм порядков.
На практике существует большое разнообразие представлений чисел с
плавающей точкой, определяемое, во-первых, выбором различных систем
счисления: двоичной (R — 2) и двоично-смешанных (Q = 8, 10, 16); во-вто-
рых, различными способами кодирования знаковых чисел мантиссы и по-
рядка: прямым, обратным, дополнительным или кодом со смещением; в-
-24-
1.2. Программы арифметики с плавающей точкой
третьих, различными разрядностью формата и размещением порядка,
мантиссы и их знаков относительно друг друга в формате числа. Напри-
мер, в когда-то весьма распространенной системе ЕС ЭВМ для представ-
ления короткого формата числа с плавающей точкой отводились 32 бита,
из которых 25 использовались для представления шестнадцатеричной
мантиссы в прямом коде (6 шестнадцатеричных разрядов), а 7 — для пред-
ставления шестнадцатеричной характеристики со смещённым двоичным
порядком (смещение + 64). В данной книге используется представление
двоичных чисел с плавающей точкой со смещённым порядком и мантиссой
в дополнительном коде, причём числа имеют трёхбайтный формат обычной
точности (Рис. 1.6а).
7 6 5 4 3 2 1 О
SM Порядок (+40Н) । । । । । ।
Мантисса ( СтБ) 1 । । । 1 । ।
Мантисса (МлБ) 1 1 1 1 1 1 1
^ 7 6 5 4 32 1 О
Порядок (+80Н)
» । । । » »
SM । Мантисса (СтБ) ,
Мантисса (СрБ)
___I____I__I___I___I___I___I___
Мантисса (МлБ)
___11______I___। »___l_j_____
Рис. 1.6. Форматы двоичных чисел с плавающей точкой.
Рассмотрим его более подробно. На Рис. 1.6а над рамкой формата про-
ставлены номера двоичных битов байта. Число хранится в памяти микро-
контроллерной системы в виде последовательности трёх байтов, разме-
щённых в порядке возрастания адресов памяти. Первый байт числа в стар-
шем бите содержит знак мантиссы 5М и смещённый порядок (смещение
равно 6410 = 4016), а два остальных байта — старший байт (СтБ) и младший
байт (МлБ) мантиссы. Сокращенно формат запишем в виде (8,16). Погра-
ничные значения чисел этого формата указаны в Табл. 1.1.
Диапазон представления абсолютных величин ненулевых чисел имеет
вид
-25-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0.27 • 1019 < И| < 0.92 • 1019. (1.25)
Граничная относительная ошибка такого представления, согласно фор-
муле (1.23), не превышает величины
8Г< 2~16+1 ®0.3 • 10~4. (1.26)
Таблица 1.1. Пограничные числа формата (8,16)
А Л16 "4ю
/Лсм ^1бф т 7wio . А z ^Юф "4ю
"^"4тах 7F FFFF +3F +263(1 - 2~16) +0.92-1019
—А ™тах FF 0001 +3F -263(1 -2~16) —0.92-10’9
"F^min 00 8000 -40 +2“64- 2-1 +0.27-10"19
“"4 min 80 8000 -40 2~б4.2~1 —0.27-10-'9
Заметим, что неравенства (1.25) и (1.26) получены для нормализованных
чисел, округлённых несимметричным способом при их представлении в п-
разрядном (п = 16) формате мантиссы. В случае симметричного округления
(1.9) величина 5Г уменьшается в 2 раза. Для обеспечения эквивалентной
точности и диапазона в случае чисел с фиксированной точкой потребова-
лась бы разрядность, в 6 раз большая.
На Рис. 1.6£для сравнения показан используемый иногда четырёхбай-
тный формат двоичного числа повышенной точности с плавающей точ-
кой. Первый байт содержит значение смещённого порядка (смещение
128io = 8016), а три остальных — СтБ, СрБ (средний байт) и МлБ мантиссы,
причём в старшем бите СтБ мантиссы указывается знак мантиссы. Погра-
ничные значения чисел формата (8, 24) указаны в Табл. 1.2.
Таблица 1.2. Пограничные числа формата (8,24)
А "416 "4ю
/Лсм "41бф т L Лоф "4io
"^"4щах FF 7FFFFF +7F +2|27(1 — 2“23) +0.17-1039
—^тах FF 800001 +7F —2127(1 — 2—23) —0.17-1039
"^min 00 400000 -80 +2-128-2-‘ + 1.4-10-39
-^min 00 СООООО -80 _2~128.2“1 —1.4-10-39
-26-
1.2. Программы арифметики с плавающей точкой
Граничная относительная ошибка представления (8, 24) не превышает
5 < 2"31+1 ~ 0.9-10-9. Таким образом, данный формат существенно расши-
ряет диапазон и точность обрабатываемых чисел. Отметим, что в боль-
шинстве приложений арифметики с плавающей точкой нет необходимос-
ти в использовании формата повышенной точности, поскольку точность
исходной информации в микропроцессорных системах зачастую ограни-
чена классом точности первичных датчиков на уровне 0.1...0.05%, а такая
ошибка значительно выше, чем ошибки представления чисел в формате
(8, 16) в соответствии с формулой (1.26). Использование формата повы-
шенной точности связано с дополнительными затратами памяти и време-
ни работы микроконтроллера и целесообразно для задач, требующих по-
вышенной точности обработки или большего диапазона представления
чисел.
Числа с плавающей точкой являются числами ограниченной точности.
Поэтому для арифметики с плавающей точкой справедливы все свойства
АОТ, рассмотренные в разд. 1.1. Условимся в дальнейшем изображать ну-
левое число с плавающей точкой в виде нулевой мантиссы Я2ф = 0 и мини-
мального порядка т = wmin. Поскольку порядок имеет смещение, то, оче-
ВИДНО, /Исм(тт) = 0-
1.2.2. Сложение и вычитание двоичных чисел
Ранее было отмечено, что сложение чисел с фиксированной точкой —
точная операция, поскольку она не использует округление результата и не
вносит в него какую-либо дополнительную погрешность, кроме погреш-
ностей слагаемых. Если слагаемые точны, то точна и сумма. Если
слагаемые — числа ограниченной точности, то точность суммы определя-
ется выражениями (1.15) и (1.16).
В отличие от этого, сложение чисел с плавающей точкой является в об-
щем случае неточной операцией, вносящей дополнительную погрешность
в результат. Поэтому сумма чисел с плавающей точкой даже при точных
слагаемых будет числом ограниченной точности. Операцию вычитания чи-
сел с плавающей точкой, представленных в дополнительных кодах, можно
свести к операции сложения уменьшаемого с дополнительным кодом вы-
читаемого. Поэтому в дальнейшем обсудим операцию алгебраического
сложения (она производит сложение и вычитание чисел в зависимости от
знаков слагаемых).
Рассмотрим сложение х + у) двоичных чисел с плавающей точкой',
х = и у = 2ту- Y. Если порядки слагаемых равны (тх = ту), то мантиссы
X и Y можно непосредственно сложить, поскольку фактическое положе-
ние точки в обоих слагаемых одинаково, т. е. слагаемые совмещены бита-
ми мантисс с одинаковыми весами.
-27-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
В общем случае, когда числа имеют различные порядки (тхФ ту), не-
посредственно складывать мантиссы нельзя, поскольку фактические по-
ложения точки для каждого из слагаемых не совпадают друг с другом, т. е.
слагаемые совмещены разрядами мантисс с несовпадающими весами. По-
этому необходимо предварительно преобразовать слагаемое с меньшим
порядком: увеличить его порядок до значения большего порядка и соот-
ветствующим образом уменьшить значение его мантиссы, чтобы в целом
сохранить значение числа. Эту операцию называют выравниванием поряд-
ков. При её выполнении прежде всего определяется разность порядков
Ат — тх — ту.
Увеличение порядка слагаемого с меньшим порядком, например у,
равносильно умножению у х 2^. Тогда уменьшение мантиссы Y эквива-
лентно делению Y/l^m (или умножению Ух 2~Aw), что обеспечивается де-
нормализацией мантиссы (сдвигом мантиссы) У вправо на Ат битов. С учё-
том этого процесс сложения чисел с плавающей точкой можно определить
следующими выражениями:
rn т„ ni
Z = 2 х-А"+2 у- Y = 2 z Z'= 2 Z \
Х+ У- 2 если Ат > 0;
У+ X- если Ат < 0;
Х+ У, если Ат = 0;
m'z = max(тх, ту);
{Zr; m’z, если Z' < 1;
Z' • 2-1; m'z + 1, если Z' > 1,
(1-27)
(1.28)
(1.29)
где Ат ~ тх - ту.
Формула (1.28) определяет процесс выравнивания порядков и алгебра-
ического суммирования мантисс с равными порядками по правилам ариф-
метики с фиксированной точкой. При сложении мантисс возможны две
ситуации: переполнение суммы и отсутствие переполнения. В первом слу-
чае необходимо устранить переполнение путём сдвига мантиссы вправо на
один бит (делением на 2) и соответствующим увеличением на 1 порядка
суммы. Эту операцию называют нормализацией вправо. Во втором случае
необходимость в нормализации вправо отпадает. Формула (1.29) отражает
действия на этапе нормализации вправо.
При сложении близких по величине чисел с разными знаками возмож-
но уменьшение значности мантиссы суммы, т. е. появление в левых (стар-
ших) битах формата мантиссы незначащих нулей. В этом случае необходи-
— 28 —
1.2. Программы арифметики с плавающей точкой
мо нормализовать мантиссу согласно условию (1.20). Эта операция, назы-
ваемая нормализацией влево, заключается в сдвиге мантиссы влево на г
(г< п) битов (умножении мантиссы на 2) и соответствующем уменьшении
порядка суммы:
f Z'; т\, если 2“! < |Z| < 1;
Z, wz=s ' (1.30)
I Z • 2r; m'z - г, если |Z| < 2~l,
где r — число старших нулевых битов мантиссы суммы. При программной
реализации нормализации влево величина г, как правило, не определяет-
ся, а сдвиги влево и коррекция порядка производятся до тех пор (при не-
нулевой мантиссе), пока не будет выполнено условие (1.20).
При реализации алгоритмов, описываемых формулами (1.27)...(1.30),
возможно возникновение особых ситуаций, которые должны выявляться
программными средствами:
1. При выравнивании порядков возможен случай, когда \т > п, т. е. раз-
ность порядков слагаемых превышает разрядность цифровой части ман-
тиссы. Очевидно, что при такой денормализации мантиссы меньшего сла-
гаемого она полностью выходит за рамки формата, т. е. становится равной
нулю. В этом случае результат равен большему слагаемому и нет необходи-
мости выполнять сложение.
2. При сложении равных чисел с разными знаками мантисса суммы
равна нулю. Такая нулевая мантисса не может быть нормализована и в
этом случае порядок суммы также обнуляется.
3. При нормализации вправо мантиссы суммы возможно переполне-
ние порядка суммы: mz = mz 4- 1 > wmax, а при нормализации влево — ан-
типереполнение порядка суммы: т = т z — r< тт^.
Появление таких ошибок свидетельствует о неправильном выборе
формата с точки зрения представления диапазона чисел в конкретном вы-
числительном процессе. Такие ошибки следует обязательно выявлять, и в
случае переполнения необходимо прекратить процесс вычислений с выво-
дом той или иной диагностики произошедшего.
Оценим точность операции сложения чисел с плавающей точкой. Эта
точность ограничивается округлением чисел при их сдвигах за рамки ос-
новного формата при денормализации мантиссы меньшего слагаемого,
нормализации суммы вправо и влево, а также при обнулении результата в
случае антипереполнения порядка. Основная погрешность возникает в
процессе денормализации мантиссы, поскольку при последующей нормали-
зации суммы вправо эта первоначальная погрешность может только умень-
шиться, а при нормализации суммы влево погрешность можно вообще ус-
транить, если сохранить хотя бы два первых выдвинутых бита денормали-
-29-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
зованной мантиссы и использовать их при нормализации суммы влево
(незначащие нули могут появиться лишь при вычитании близких чисел с
Aw<2). Ошибку обнуления результата при антипереполнении порядка
учитывать не будем, считая, что либо эта ошибка в процессе вычислений не
возникает, либо процесс вычислений останавливается при её появлении.
Если бы при сложении нормализованной мантиссы большего слагае-
мого с денормализованной мантиссой меньшего слагаемого в соответс-
твии с формулой (1.28) использовались все п + Ат битов слагаемых, то
сумма была бы точным числом (при условии, что точны слагаемые). Одна-
ко выдвинутые за рамки п-битного формата денормализованные биты
мантиссы меньшего слагаемого не участвуют в сложении, т. е. сумма обра-
зуется путём округления. Очевидно, что в случае отбрасывания Aw битов
граничная абсолютная ошибка округления мантиссы суммы не превышает
величины 2-л, а граничная относительная ошибка округления суммы (в на-
ихудшем случае отсутствия переполнения суммы и при минимальном зна-
чении её нормализованной мантиссы) равна
X (— Лг.окр(*) _ 2 z • 2 _ ~-п+1 /1 а 1 \
5г.окР(г) - —- ——т - 2 • (1.31)
^min 2 z • 2
Исходные слагаемые являются числами ограниченной точности, гра-
ничные относительные ошибки представления которых определяются не-
равенством (1.23). Согласно формуле (1.14) граничная относительная
ошибка суммы не превосходит ошибки наименее точного слагаемого. Од-
нако округление суммы увеличивает эту ошибку на величину, вычислен-
ную по формуле (1.31), т. е. в 2 раза, и сумма становится менее точной, чем
слагаемые. Ошибку округления можно уменьшить, если использовать пра-
вило симметричного округления (1.9).
Ниже приведена подпрограмма сложения чисел с плавающей точкой
SDPZ3, реализующая рассмотренный алгоритм сложения для трёхбай-
тного формата представления чисел с плавающей точкой.
Подпрограмма сложения чисел с плавающей точкой SDPZ3
0001 0000 АСС . EQU 0E0H
0002 0000 в . EQU 0F0H
0003 0000 АСС.1 . EQU 0Е1Н
0004 0000 АСС.З . EQU ОЕЗН
0005 0000 АСС. 7 . EQU 0Е7Н
0006 0000 PSW.5 . EQU 0D5H
0007 0000
0008 0000 . ORG ООООН
0009 0000 7
-30-
1.2. Программы арифметики с плавающей точкой
оою ООН 0А90 0А90 .ORG 0А90Н
0012 0А90 SDPZ3:
0013 0А90 /Подпрограмма сложения 3-байтных
0014 0А90 /двоичных чисел с плавающей точкой
0015 0А90 /в дополнительном коде формата
0016 0А90 ; (8,16)=(Пор, Ман), где байт порядка
0017 0А90 /содержит бит знака мантиссы и
0018 0А90 /целочисленный двоичный порядок
0019 0А90 /со смещением +4ОН, а два байта
0020 0А90 /мантиссы (СтБ и МлБ) - двоичное
0021 0А90 /дробное нормализованное число в
0022 0А90 /дополнительном коде.
0023 0А90 /
0024 0А90 /Входные параметры: R1 - адрес
0025 0А90 /слагаемого 1, R0 - адрес слагаемо-
0026 0А90 ; го 2 .
0027 0А90 /
0028 0А90 /Выходные параметры: R1 - адрес
0029 0А90 /суммы (сумма на месте слагаемого
0030 0А90 /1). CY=1 - признак переполнения
0031 0А90 /или антипереполнения порядка
0032 0А90 /суммы.
0033 0А90 /
0034 0А90 /Используются все регистры, кроме
0035 0А90 /В, R0, R1. Глубина стека - 2 байта.
0036 0А90 ;
0037 0А90 ;
0038 0А90 ;
0039 0А90 /
0040 0А90 /
0041 0А90 /
0042 0А90 /Проверка слагаемого 2 (сл2) на нуль.
0043 0А90 Е6 MOV A,@R0
0044 0А91 08 INC R0
0045 0А92 46 ORL A,@R0
0046 0А93 08 INC R0
0047 0А94 46 ORL A,@R0 ;A = 0, если сл2 = 0
0048 0А95 18 DEC R0
0049 0А96 18 DEC R0 /Восстановление R0.
0050 0А97 60 17 JZ LOOP1 /Если сл2 = 0.
0051 0А99 /Проверка слагаемого 1 (сл1) на нуль.
0052 0А99 Е7 MOV A,@R1
0053 0А9А 09 INC R1
0054 0А9В 47 ORL A,@R1
0055 0А9С 09 INC R1
-31
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0056 0A9D 47 ORL A,@R1 ;A = 0, если сл1 - 0.
0057 0А9Е 19 DEC R1
0058 0A9F 19 DEC R1 ;Восстановление R1.
0059 0AA0 70 10 JNZ PERI ;Если сл1 о 0.
0060 0АА2 ;Перемещение сл2 на место сл1.
0061 0АА2 Е6 MOV A,@R0
0062 ОААЗ F7 MOV @R1,A
0063 0АА4 08 INC R0
0064 0АА5 09 INC R1
0065 0АА6 Е6 MOV A,@R0
0066 0АА7 F7 MOV @R1,A
0067 0АА8 08 INC R0
0068 0АА9 09 INC R1
0069 0AAA Е6 MOV Az@R0
0070 0AAB F7 MOV @R1,A
0071 ОААС 18 DEC R0
0072 0AAD 18 DEC R0
0073 ОААЕ 19 DEC R1
0074 0AAF 19 DEC R1 /Восстановление R0 и R1.
0075 ОАВО L00P1:
0076 ОАВО СЗ CLR C ;CY = 0, адрес результата в R1
0077 0АВ1 22 RET
0078 0АВ2 PERI:
0079 0АВ2 /Установка признака обмена
0080 0АВ2 ;адресами слагаемых PSW.5 в 0.
0081 0АВ2 С2 D5 CLR PSW.5
0082 0АВ4 ;Оба слагаемых не нуль.
0083 0АВ4 ;Получение модифицированных
0084 0АВ4 ;кодов знаков слагаемых в стек:
0085 0АВ4 /00 = " + ", i: [ - " _"
0086 0АВ4 Е7 MOV A,@R1
0087 0АВ5 54 80 ANL A,#80H ;Выделение знака сл1.
0088 0АВ7 А2 Е7 MOV C,ACC.7
0089 0АВ9 23 RL A
0090 ОАВА 33 RLC A
0091 ОАВВ СО ЕО PUSH ACC /Код сл1.
0092 OABD Е6 MOV A,@R0
0093 ОАВЕ 54 80 ANL A,#80H ;Выделение знака сл2.
0094 ОАСО А2 Е7 MOV C,ACC.7
0095 0АС2 23 RL A
0096 ОАСЗ 33 RLC A
0097 0АС4 СО ЕО PUSH ACC ;Код сл2.
0098 0АС6 ;Определение разности порядков.
0099 0АС6 Е6 MOV Az@R0 /А - пор2.
0100 0АС7 54 7F ANL A,#7FH /Исключение знака.
0101 0АС9 FB MOV R3 ,A /R3 - пор2.
-32-
1.2. Программы арифметики с плавающей точкой
0102 0ACA Е7 MOV AZ@R1 /А - nopl.
оюз ОАСВ 54 7F ANL A,#7FH /Исключение знака.
0104 0ACD СЗ CLR С
0105 ОАСЕ 9В SUBB A,R3 /А = nopl - пор2.
0106 0ACF 60 ЗВ JZ PER2 /Если nopl = пор2.
0107 0AD1 50 09 JNC PER3 /Если nopl > пор2.
0108 0AD3 F4 CPL А /Дополнение при пор2 > nopl
0109 0AD4 04 INC А /А=1 nopl - пор21.
01Ю 0AD5 FE MOV R6ZA /Сохранили А в R6.
01Н 0AD6 /Обмен адресами слагаемых: сл2 на сл1.
0112 0AD6 Е8 MOV AzR0
0113 0AD7 С9 ХСН AZR1
0114 0AD8 F8 MOV R0,A
0115 0AD9 D2 D5 SETB PSW.5 /Установка признака обмена.
0116 0ADB ЕЕ MOV AZR6 /Восстановление А из R6.
0117 0ADC PER3:
0118 0ADC /Проверка величины разности порядков: <16?
0119 OADC FE MOV R6ZA /Сохранили А в R6.
0120 0ADD СЗ CLR C
0121 0ADE 94 10 SUBB Az#16
0122 ОАЕО 20 Е7 ОС JB ACC.7,PER4
0123 ОАЕЗ /Если разность < 16.
0124 ОАЕЗ DO ЕО POP ACC
0125 0АЕ5 DO ЕО POP ACC /Баланс стека.
0126 0АЕ7 СЗ CLR C /СУ=0.
0127 0АЕ8 30 D5 03 JNB PSW.5ZPER31
0128 ОАЕВ /Если не было обмена.
0129 ОАЕВ Е8 MOV AzR0
0130 ОАЕС С9 XCH AZR1
0131 OAED F8 MOV R0z A /Обмен регистров R0 и R1.
0132 ОАЕЕ PER31:
0133 ОАЕЕ 22 RET
0134 0AEF PER4:
0135 0AEF /Загрузка сл2 в регистры и
0136 0AEF /денормализация мантиссы сл2.
0137 0AEF ЕЕ MOV A,R6 /Восстановление А из R6.
0138 0AF0
0139 0AF0 /DMAN2:
0140 0AF0 /Подпрограмма денормализации
0141 0AF0 /двухбайтной мантиссы числа с пла-
0142 0AF0 /вающей точкой. Входные пара-
0143 0AF0 /метры: А - разность порядков Nz
0144 0AF0 /определяющая величину денорма-
0145 0AF0 /лизации (N<16), R0 - адрес числа
0146 0AF0 /с плавающей точкой. Выходные
0147 0AF0 ;параметры:R3, R2 - денормализо-
-33-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0148 0AF0 ;ванная мантисса, R5 - выдвинутые
0149 0AF0 ;биты мантиссы. Не используются
0150 0AF0 ;регистры В, RO, Rl, R6
0151 0AF0
0152 0AF0 ;Загрузка слагаемого в регистры
0153 0AF0 ;R7,R3,R2.
0154 0AF0 FC MOV R4,A ;R4 = A = N = величина
0155 0AF1 ,-нормализации мантиссы.
0156 0AF1 08 INC RO
0157 0AF2 Е6 MOV A,@R0
0158 0AF3 FB MOV R3, A ;R3 - СтБ Ман.
0159 0AF4 08 INC RO
0160 0AF5 Е6 MOV A,@R0
0161 0AF6 FA MOV R2,A ;R2 - МлБ Ман.
0162 0AF7 18 DEC RO
0163 0AF8 18 DEC RO ;Заодно и восстановили R0
0164 0AF9 Е6 MOV A,@R0 ;А - Пор.
0165 OAFA FF MOV R7,A ;R7 - Пор.
0166 OAFB 7D 00 MOV R5,#0
0167 0AFD ;Сдвиг мантиссы R3, R2, R5 вправо на N битов.
0168 0AFD LOOP2:
0169 OAFD EF MOV A,R7 ;А - Пор.
0170 0AFE 33 RLC A ;CY - Знак мантиссы.
0171 0AFF ЕВ MOV A, R3
0172 0В00 13 RRC A
0173 0В01 FB MOV R3,A
0174 0В02 ЕА MOV A,R2
0175 0В03 13 RRC A
0176 0В04 FA MOV R2,A
0177 0В05 ED MOV A,R5
0178 0В06 13 RRC A
0179 0В07 FD MOV R5,A
0180 0В08 DC F3 DJNZ R4,LOOP2
0181 0B0A ;Зацикливание.
0182 0B0A ;END DMAN2.
0183 0B0A
0184 0B0A 80 ОА SJMP PER5
0185 ОВОС PER2:
0186 ОВОС ;Загрузка сл2 в регистры R3, R2, R5 - 0.
0187 ОВОС 08 INC R0
0188 OBOD Е6 MOV A,@R0
0189 OBOE FB MOV R3,A ;R3 - СтБ Ман.
0190 OBOF 08 INC R0
0191 0В10 E6 MOV A,@R0
0192 0B11 FA MOV R2,A ;R2 - МлБ Ман.
0193 0B12 18 DEC R0
-34-
1.2. Программы арифметики с плавающей точкой
0194 0В13 18 DEC R0 /Восстановили R0.
0195 0В14 7D 00 MOV R5,#0
0196 0В16 PER5:
0197 0В16 /Сложение мантисс.
0198 0В16 09 INC R1
0199 0В17 09 INC R1 /Адрес МлБ Ман1.
0200 0В18 Е7 MOV AZ@R1
0201 0В19 2А ADD A,R2
0202 0В1А FA MOV R2,A
0203 0В1В 19 DEC R1
0204 0В1С Е7 MOV AZ@R1
0205 0B1D ЗВ ADDC A,R3
0206 0В1Е FB MOV R3 ,A /R3,R2 - Сумма мантисс.
0207 0B1F 19 DEC R1 /Восстановили R1.
0208 0В20 /Анализ суммы на переполнение
0209 0В20 ;по модифицированным кодам.
0210 0В20 DO Е0 POP ACC /А - код знака сл2.
0211 0В22 FE MOV R6,A
0212 0В23 DO Е0 POP ACC /А - код знака сл1.
0213 0В25 ЗЕ ADDC AZR6 /Сложение знаков и переноса
0214 0В26 54 03 ANL Az#3 /Выделение кода знака суммы
0215 0В28 FE MOV R6ZA /Сохранение знаков.
0216 0В29 А2 Е1 MOV CzACC.l /СУ - знак суммы.
0217 0В2В Е7 MOV AZ@R1 /А - nopl со знаком сл1.
0218 0В2С 92 Е7 MOV ACC.7ZC /А - nopl со знаком суммы.
0219 0В2Е 30 D5 03 JNB PSW.5ZSL1
0220 0В31 /Если не было обмена.
0221 0В31 F6 MOV @R0zA
0222 0В32 80 01 SJMP SL2
0223 0В34 SL1:
0224 0В34 F7 MOV @R1ZA
0225 0В35 SL2:
0226 0В35 ЕЕ MOV AZR6 /Восстановление знаков.
0227 0В3 6
0228 0В36 ;JB PSW .0,PER8
0229 0В36 /Если переполнение:
0230 0В36 /01 или 10.
0231 0В36
0232 0В36 /Это аналог JB PSW.0zPER8 для глупого отладчика.
0233 0В36 В4 01 02 CJNE AZ#1ZPER51
0234 0В39 80 45 SJMP PER8
0235 ОВЗВ PER51:
0236 ОВЗВ В4 02 02 CJNE AZ#2ZPER52
0237 ОВЗЕ 80 40 SJMP PER8
0238 0В40 PER52:
0239 0В40
-35-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0240 0В40
0241 0В40 /Анализ особого случая переполнения
0242 0В40 ;для кода знаков 11.
0243 0В40 СЗ CLR С
0244 0В41 94 03 SUBB А,#3
0245 0В43 70 04 JNZ PER6 ;Если не код 3.
0246 0В45 ЕВ MOV A,R3
0247 0В46 4А ORL A,R2
0248 0В47 60 36 JZ PER7 /Если мантисса равна нулю.
0249 0В49 PER6:
0250 0В49 /Нормализация мантиссы влево.
0251 0В49 /
0252 0В49 /NMAN2:
0253 0В49 /Подпрограмма нормализации
0254 0В49 /двухбайтной мантиссы числа с
0255 0В49 /плавающей точкой. Входные пара-
0256 0В49 ;метры: R3, R2 - нормализуемая
0257 0В49 /мантисса, R5 - младшие биты
0258 0В49 /денормализованной мантиссы.
0259 0В49 /R1 - адрес порядка. Выходные
0260 0В49 /параметры: R3, R2 - нормализован-
0261 0В49 ная мантисса, R5 - дополнительные
0262 0В49 /младшие биты мантиссы, CY = 1 -
0263 0В49 /признак антипереполнения порядка.
0264 0В49 /Используются все регистры, кроме
0265 0В49 /В, R0, Rl, R4, R6, R7.
0266 0В49 /
0267 0В49 /Проверка мантиссы на нуль.
0268 0В49 ЕВ MOV A,R3 /А - СтБ Ман.
0269 0В4А 4А ORL A,R2
0270 0В4В 70 0А JNZ LOOP5 /Если мантисса не равна нулю
0271 0B4D 30 D5 03 JNB PSW.5,SL3
0272 0В50 /Если не было обмена.
0273 0В50 F6 MOV @R0,A
0274 0В51 80 01 SJMP LOOP3
0275 0В53 SL3:
0276 0В53 F7 MOV @R1,A /Обнуление порядка.
0277 0В54 LOOP3:
0278 0В54 СЗ CLR C ,-CY = 0
0279 0В55 LOOP4:
0280 0В55 80 24 SJMP LOOP6
0281 0В57 /Проверка явно нормализованной мантиссы:
0282 0В57 /знаковый и старший бит различны ?
0283 0В57 /
0284 0В57 LOOP5:
0285 0В57 ЕВ MOV A,R3 /А - СтБ Ман.
-36-
1.2. Программы арифметики с плавающей точкой
0286 0В58 67 XRL AZ@R1
0287 0В59 20 Е7 F8 JB ACC.7,LOOP3
0288 0В5С /Если явная нормализация.
0289 0В5С /Проверка неявно
0290 0В5С .•нормализованной мантиссы.
0291 0В5С ЕВ MOV A,R3
0292 0B5D 54 7F ANL AZ#7FH /Исключение старшего бита.
0293 0B5F 4А ORL AZR2
0294 0В60 СЗ CLR C /СУ = 0.
0295 0В61 60 18 JZ LOOP6 /Если неявная нормализация.
0296 0В63 /Нормализация мантиссы:
0297 0В63 /сдвиг влево в R3, R2Z R5.
0298 0В63 ED MOV A,R5
0299 0В64 33 RLC A
0300 0В65 FD MOV R5, к
0301 0В66 ЕА MOV A,R2
0302 0В67 33 RLC A
0303 0В68 FA MOV R2,A
0304 0В69 ЕВ MOV A,R3
0305 0В6А 33 RLC A
0306 0В6В FB MOV R3,A /Мантисса R5Z R2, R3 сдвинута
0307 0В6С /влево.
0308 0В6С /Проверка порядка на антипереполнение
0309 0В6С /его коррекция.
0310 0В6С Е7 MOV AZ@R1 /А - порядок.
0311 0B6D 54 7F ANL A,#7FH /Исключение знака.
0312 0B6F D3 SETB C /СУ = 1.
0313 0В70 60 09 JZ LOOP6 /Если порядок минимален.
0314 0В72 30 D5 03 JNB PSW.5.SL4
0315 0В75 /Если не было обмена.
0316 0В75 16 DEC @R0
0317 0В76 80 DF SJMP LOOP5
0318 0В78 SL4:
0319 0В78 17 DEC @R1
0320 0В79 80 DC SJMP LOOP5 /Зацикливание.
0321 0В7В /END NMAN2.
0322 0В7В /
0323 0В7В LOOP6:
0324 0В7В 50 IE JNC PER9 /Нет антипереполнения.
0325 0B7D 80 42 SJMP PER10 /Антипереполнение порядка.
0326 0B7F /Переполнение:
0327 0B7F /нормализация мантиссы вправо.
0328 0B7F PER7:
0329 0B7F ЕЕ MOV A,R6 /Восстановить признаки.
0330 0В80 PER8:
0331 0В80 13 RRC A /СУ - бит переполнения.
37-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0332 0В81
0333 0В81 /PMAN21:
0334 0В81 /Подпрограмма устранения пере-
0335 0681 /полнения двухбайтной мантиссы
0336 0В81 /числа с плавающей точкой.
0337 0В81 /Входные параметры: R3, R2 -
0338 0В81 /мантисса, R5 - дополнительные
0339 0В81 /младшие биты мантиссы, CY -
0340 0В81 /бит переполнения, R1 - адрес
0341 0В81 /порядка. Выходные параметры:
0342 0В81 /R3,R2 - нормализованная мантисса,
0343 0В81 ;CY = 1 - признак переполнения
0344 0В81 /порядка. Используются регистры А,
0345 0В81 /R2, R3, R5.
0346 0В81
0347 0В81 /Сдвиг вправо мантиссы R3, R2, R5 с учётом CY.
0348 0В81 ЕВ MOV A,R3
0349 0В82 13 RRC А
0350 0В83 FB MOV R3,A
0351 0B84 EA MOV A,R2
0352 0B85 13 RRC A
0353 0B86 FA MOV R2,A
0354 0B87 ED MOV A,R5
0355 0B88 13 RRC A
0356 0B89 FD MOV R5,A
0357 0B8A /Проверка порядка на
0358 0B8A /переполнение и его коррекция.
0359 0В8А Е7 MOV A,@R1 /А - Порядок.
0360 0В8В F4 CPL А
0361 0В8С 54 7F ANL A,#7FH /Исключение знака.
0362 0В8Е D3 SETB С /CY = 1.
0363 0B8F 60 EA JZ LOOP6 /Если порядок максимален
0364 0В91 СЗ CLR С /CY = 0.
0365 0В92 30 D5 03 JNB PSW.5,SL5
0366 0В95 /Если не было обмена.
0367 0В95 06 INC @R0
0368 0В96 80 ЕЗ SJMP LOOP6
0369 0В98 SL5:
0370 0В98 07 INC @R1
0371 0В99 80 Е0 SJMP LOOP6
0372 0В9В /END PMAN2.
0373 0B9B
0374 0B9B PER9:
0375 0B9B /Округление результата. Нормализация мантиссы.
0376 0В9В ED MOV A,R5
0377 0В9С 30 Е7 22 JNB ACC.7,PER10
-38-
1.2. Программы арифметики с плавающей точкой
0378 0B9F /Если коррекция равна нулю
0379 0B9F ЕА MOV А, R2
0380 0BA0 24 01 ADD А,#1
0381 0ВА2 FA MOV R2 , А
0382 ОВАЗ ЕВ MOV A,R3
0383 0ВА4 34 00 ADDC А,#0
0384 0ВА6 FB MOV R3 , А
0385 0ВА7 50 18 JNC PER10
0386 0ВА9 /
0387 0ВА9 ;PMAN2:
0388 0ВА9 /Подпрограмма устранения пере-
0389 0ВА9 полнения двухбайтной мантиссы
0390 0ВА9 /числа с плавающей точкой.
0391 0ВА9 /Входные параметры: R3, R2 -
0392 0ВА9 /мантисса, R5 - дополнительные
0393 0ВА9 /младшие биты мантиссы, CY -
0394 0ВА9 /бит переполнения, R1 - адрес
0395 0ВА9 /порядка. Выходные параметры:
0396 0ВА9 /R3,R2 - нормализованная мантисса,
0397 0ВА9 /СУ = 1 - признак переполнения
0398 0ВА9 /порядка. Используются регистры А,
0399 0ВА9 / R2, R3, R5.
0400 0ВА9 /
0401 0ВА9 /Сдвиг вправо мантиссы R3, R2, R5 с учётом СУ.
0402 0ВА9 ЕВ MOV A,R3
0403 0BAA 13 RRC А
0404 0BAB FB MOV R3,A
0405 ОВАС ЕА MOV A,R2
0406 0BAD 13 RRC A
0407 ОВАЕ FA MOV R2, A
0408 OBAF ED MOV A,R5
0409 ОВВО 13 RRC A
0410 0ВВ1 FD MOV R5,A
0411 0ВВ2 /Проверка порядка на
0412 0ВВ2 /переполнение и его коррекция.
0413 0ВВ2 Е7 MOV A,@R1 /А - Порядок.
0414 ОВВЗ F4 CPL А
0415 0ВВ4 54 7F ANL A,#7FH /Исключение знака.
0416 0ВВ6 D3 SETB С ;СУ=1.
0417 0ВВ7 60 08 JZ PER10 /Если порядок максимален.
0418 0ВВ9 СЗ CLR С /СУ = 0.
0419 ОВВА 30 D5 03 JNB PSW.5,SL6
0420 0BBD /Если не было обмена.
0421 0BBD 06 INC @R0
0422 ОВВЕ 80 01 SJMP PER10
0423 ОВСО SL6:
-39-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0424 0BC0 07 INC @R1
0425 0ВС1 /END
PMAN2.
0426 0ВС1 /
0427 0ВС1 PER10:
0428 0ВС1 /Запись результата в память.
0429 0ВС1 30 D5 03 JNB PSW.5,PER101
0430 0ВС4 /Если не было обмена.
0431 0ВС4 Е8 MOV A,R0
0432 0ВС5 С9 ХСН A,R1
0433 0ВС6 F8 MOV R0,А /Обмен регистров R0 и R1.
0434 0ВС7 PER101:
0435 0ВС7
0436 0ВС7 09 INC R1
0437 0ВС8 ЕВ MOV A,R3
0438 0ВС9 F7 MOV @R1,A
0439 ОВСА 09 INC R1
0440 0BCB ЕА MOV A,R2
0441 0BCC F7 MOV @R1,A
0442 0BCD 19 DEC R1
0443 ОВСЕ 19 DEC R1 /Восстановление R1.
0444 0BCF 22 RET /CY = 1, если ошибка порядка
0445 0BD0 /END SDPZ3.
0446 0BD0 /
При сложении мантисс в дополнительных кодах необходимо выявлять
переполнение суммы. В рассмотренных в предыдущем томе данной книги
программах сложения с этой целью выполнялся анализ знаков слагаемых
и суммы. Другой способ обнаружения переполнения, используемый в дан-
ной программе, заключается в применении так называемого модифициро-
ванного дополнительного кода. В таком коде для представления знака ис-
пользуются два бита: плюс кодируется как 00, а минус — как 11. Дублиро-
вание знака позволяет автоматически фиксировать переполнение: код 01
определяет переполнение положительной суммы, а код 10 — отрицатель-
ной. Исключением из этого правила является случай суммирования до-
полнительных кодов двух отрицательных чисел, таких, что [А]д + [У]д=
= 11.0...0, т. е. [%+ У] = 1 — переполнение.
Непосредственно сложение начинается с проверки слагаемых на нуль.
Если второе слагаемое (адрес первой из трёх ячеек памяти, в которых оно
хранится, находится в регистре R0, т. е. осуществляется косвенная адреса-
ция) равно нулю, то сложение на этом и заканчивается — сумма равна пер-
вому слагаемому (адрес первой из трёх ячеек памяти, в которых оно хра-
нится, находится в регистре R1). Причём сумма «занимает место» первого
слагаемого (по окончании операции сложения в регистре R1 находится ад-
— 40 —
1.2. Программы арифметики с плавающей точкой
рес первой из трёх ячеек памяти, в которых хранится сумма). Если нуле-
вым является первое слагаемое, то второе (ненулевое) слагаемое перепи-
сывается в ячейки памяти, в которых находилось первое слагаемое, а за-
тем, как и в предыдущем случае, содержимое этих ячеек памяти
рассматривается как результат операции сложения (сумма).
Сложение ненулевых слагаемых начинается с формирования модифи-
цированных кодов знаков слагаемых и их запоминания с целью последую-
щего анализа после выполнения сложения. Далее программа определяет
разность порядков: её абсолютную величину и знак. Если порядок первого
слагаемого оказывается меньше порядка второго, слагаемые меняются
местами, и бит PSW5 (индикатор обмена) устанавливается в 1.
Вычисленная разность порядков проверяется на предельное значение:
Д/л < п = 16? При А/и> 16 нет необходимости продолжать программу, так
как результат совпадает со слагаемым, находящимся на месте первого. В
противном случае производится загрузка меньшего слагаемого из памяти в
регистры R4, R3 и R2 микроконтроллера, и фрагмент программы DMAN2
выполняет, если необходимо, денормализацию его мантиссы. Отметим
ещё то, что фрагмент DMAN2 сохраняет последние сдвинутые биты мантис-
сы с целью их использования при округлении суммы.
Сложение мантисс какими-либо особенностями не отличается. После
сложения выполняется анализ суммы на переполнение. Коды 01 и 10 явля-
ются признаком переполнения мантиссы, и устраняется оно фрагментом
PMAN21 — мантисса сдвигается на бит вправо, а порядок увеличивается
на 1. При этом в случае переполнения или антипереполнения порядка ус-
танавливается бит CY.
Если код равен 11, то переполнению мантиссы соответствует её нуле-
вое значение, возникшее при сложении отрицательных мантисс вида
8000Н. Это переполнение также устраняется фрагментом PMAN21.
Код 00, или же 11, при ненулевой мантиссе означает, что мантисса сум-
мы не переполнена, и далее осуществляются заключительные операции.
Если представленная мантисса нормализована явно (старший бит мантис-
сы равен 1) или неявно (когда она принадлежит отрицательному числу и
после перевода в дополнительный код окажется явно нормализованной),
то следующей операцией будет её округление. Возможное в ходе округле-
ния переполнение устраняется фрагментом PMAN2, аналогичным PMAN21.
Если мантисса не нормализована, то фрагмент NMAN2 осуществляет требу-
емую нормализацию, после чего происходит переход на вышеупомянутое
округление.
В завершение мантисса переписывается из регистров в память, и вос-
станавливается начальное состояние регистров R0 и R1 (в случае, если их
содержимое обменивалось, индикацией чего является наличие логической
1 вбите PSW.5).
-41-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Отметим, что реализованное в программе симметричное округление
мантиссы по первой отбрасываемой цифре эффективно лишь при сло-
жении чисел с одинаковыми знаками, поскольку только в этом случае
знак отбрасываемой цифры совпадает со знаком суммы, и, следователь-
но, округление выполняется верно, иначе ошибка симметричного округ-
ления превысит ошибку несимметричного округления. Если такая ситуа-
ция нежелательна с точки зрения использования программы в системе,
можно либо усложнить процесс симметричного округления в програм-
ме, введя анализ знака ошибки, либо упростить программу, исключив
это округление.
Таблица 1.3. Числа с плавающей точкой в формате (8, 16)
Положительные числа Отрицательные числа
^16 ^10 ^10 ^16
408000 0.5 -0.5 С08000
418000 1 -1 С18000
41С000 1.5 -1.5 С14000
428000 2 —2 С28000
42А000 2.5 -2.5 С26000
42С000 3 -3 С24000
42Е000 3.5 -3.5 С22000
438000 4 —4 С38000
439000 4.5 -4.5 С37000
43А000 5 -5 С36000
1.2.3. Умножение двоичных чисел
Умножение — двоичных нормализованных чисел с плавающей точ-
кой х = 2тх-Х, у = 2ту- Yопределяется выражениями
т' т,
2=2 -Z-2y-K=2 -Z' = 2 -Z, (132)
Z, m'z, если Z > 2-1;
Z' • 21, m'z - 1, если Z < 2~!
(1.33)
где Z' = X У; m\ = mx + my.
В соответствии с формулами (1.32), (1.33) умножение выполняется в
три этапа:
-42-
1.2. Программы арифметики с плавающей точкой
1. Определяется порядок произведения путём алгебраического сложе-
ния порядков сомножителей.
2. Вычисляется мантисса произведения путём перемножения мантисс
сомножителей по правилам арифметики с фиксированной точкой.
3. Производится, если необходимо, нормализация произведения влево.
Поскольку минимальные значения нормализованных мантисс сом-
ножителей равны 2-1, минимальное значение произведения составляет
(2-1 х 2"1) = 2-2, и нормализация требует не более одного сдвига произве-
дения влево, что отражает формула (1.33). При алгебраическом суммиро-
вании порядков сомножителей и нормализации влево возможны перепол-
нение и антипереполнение порядка произведения, что необходимо выяв-
лять программными средствами. При вычислении порядка произведения
в случае смещённых порядков сомножителей тхсм и тусм сумма последних
равна тх см + ту см = тх + 2k + ту + 2к — (тх + ту + 2к) + 2к и отличается от
правильного смещённого порядка произведения на величину 2к. Поэтому
вычисление смещённого порядка произведения выполняется по формуле
^хсм + ~ 2 г см* (1-^4)
Граничная относительная ошибка произведения чисел с плавающей
точкой определяется так же, как и для чисел с фиксированной точкой, по
выражению (1.16) при условии отсутствия переполнения и антиперепол-
нения порядка произведения.
Ниже приведена подпрограмма умножения чисел с плавающей точкой
UDPZ3, реализующая рассмотренный алгоритм умножения для трёхбайт-
ного формата чисел с плавающей точкой.
При ненулевых сомножителях подпрограмма вычисляет порядок и
мантиссу произведения и, если необходимо, выполняет нормализацию
числа. Заканчивается умножение записью результата в память. При пере-
полнении или антипереполнении порядка произведения устанавливается
признак (флаг) переноса CY= 1, что сигнализирует о некорректности вы-
числений.
Эта подпрограмма использует симметричный способ округления произ-
ведения, что определяет и соответствующую ему относительную ошибку.
Подпрограмма умножения чисел с плавающей точкой UDPZ3
0447 0BD0
0448 0BD0 UDPZ3:
0449 0BD0 ;Подпрограмма умножения 3-байтных
0450 0BD0 /двоичных чисел с плавающей точкой
0451 0BD0 ;в дополнительном коде формата
0452 0BD0 ;(8,16)=(Пор, Ман), где байт порядка
-43-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0453 0BD0 /содержит бит знака мантиссы и
0454 0BD0 /целочисленный двоичный порядок
0455 0BD0 /со смещением +4ОН, а два байта
0456 0BD0 /мантиссы (СтБ и МлБ) - двоичное
0457 0BD0 /дробное нормализованное число в
0458 0BD0 /дополнительном коде.
0459 0BD0 /
0460 0BD0 /Входные параметры: R0 - адрес
0461 0BD0 /множимого, R1 - адрес множителя.
0462 0BD0 /
0463 0BD0 /Выходные параметры: R0 - адрес
0464 0BD0 /ПР (ПР на месте множимого). R1 -
0465 0BD0 /адрес множителя, CY = 1 - признак
0466 0BD0 /переполнения или антипереполнения
0467 0BD0 /порядка произведения.
0468 0BD0 /
0469 0BD0 /Используются все регистры, кроме
0470 0BD0 /В, R0, R1. Глубина стека - 0 байт.
0471 0BD0 /
0472 0BD0 /
0473 0BD0 /
0474 0BD0 /
0475 0BD0 /
0476 0BD0 /
0477 0BD0 СЗ CLR С /Для нормального выхода
0478 0BD1 Е6 MOV A,@R0
0479 0BD2 08 INC R0
0480 0BD3 46 ORL A,@R0
0481 0BD4 08 INC R0
0482 0BD5 46 ORL A,@R0
0483 0BD6 18 DEC R0
0484 0BD7 18 DEC R0 /Восстановили R0.
0485 0BD8 70 01 JNZ ULOOP2 /Если MMoO.
0486 0BDA ULOOP1:
0487 0BDA 22 RET /Если MM = 0, CY = 0.
0488 0BDB ULOOP2:
0489 OBDB Е7 MOV A,@R1
0490 0BDC 09 INC R1
0491 0BDD 47 ORL A,@R1
0492 0BDE 09 INC R1
0493 0BDF 47 ORL A,@R1
0494 0BE0 19 DEC R1
0495 0ВЕ1 19 DEC R1 /Восстановили R1.
0496 0ВЕ2 70 08 JNZ UPER1 /Если MH <> 0.
0497 0ВЕ4 F6 MOV @R0,A
0498 0ВЕ5 08 INC R0
44-
1.2. Программы арифметики с плавающей точкой
0499 0ВЕ6 F6 MOV @R0,A
0500 0ВЕ7 08 INC R0
0501 0ВЕ8 F6 MOV @R0,A ; Обнулили ПР(бывшее ММ).
0502 0ВЕ9 18 DEC R0
0503 ОВЕА 18 DEC R0 ; восстановили R0.
0504 ОВЕВ 22 RET :Если МН = 0,CY = 0.
0505 ОВЕС UPER1:
0506 ОВЕС Е6 MOV A,@R0 ; - байт Пор ММ.
0507 0BED 67 XRL A,@R1 ; :@R1 - байт Пор МН.
0508 ОВЕЕ 54 80 ANL A,#80H ; вставить знак произведения.
0509 0BF0 FF MOV R7,A ; :R7 - знак произведения.
0510 0BF1 Е6 MOV A,@R0 ; :А - байт Пор ММ.
0511 0BF2 54 7F ANL A,#7FH ; IИсключение знака.
0512 0BF4 FE MOV R6,A ; :Сохранили Пор ММ в R6.
0513 0BF5 Е7 MOV A,@R1 ; ;А - байт Пор МН.
0514 0BF6 54 7F ANL A,#7FH ;
0515 0BF8 94 40 SUBB A,#40H ; Исключение смещения +4ОН.
0516 0BFA 2Е ADD A,R6 ; А = Пор ММ + Пор МН.
0517 0BFB 30 Е7 02 JNB ACC.7,ULOOP3
0518 0BFE Если Пор ПР О.К.
0519 0BFE D3 SETB C ; CY = 1.
0520 0BFF 22 RET Если переполнение Пор ПР,СУ = 1
0521 осоо ULOOP3:
0522 осоо 4F ORL A,R7 ; •Вставка знака в байт Пор.
0523 0С01 FF MOV R7,A ; R7 - байт Пор ПР.
0524 0С02 Е6 MOV A,@R0 ; А - байт Пор ММ.
0525 0С03 30 Е7 ОЕ JNB ACC.7,UPER2
0526 0С06 Если ММ > 0.
0527 0С06 08 INC R0
0528 0С07 08 INC R0
0529 0С08 Е6 MOV A,@R0
0530 0С09 F4 CPL A
0531 0C0A 24 01 ADD A,#l
0532 ОСОС F6 MOV @R0,A
0533 0C0D 18 DEC R0
0534 ОСОЕ Е6 MOV A,@R0
0535 0C0F F4 CPL A
0536 ОСЮ 34 00 ADDC Az#0
0537 0С12 F6 MOV (BRO, A ; Дополнили ММ.
0538 0С13 18 DEC RO ; Восстановили R0.
0539 0С14 UPER2:
0540 0С14 Е7 MOV A,@R1 ; А - байт Пор МН.
0541 0С15 09 INC R1
0542 0С16 09 INC R1
0543 0С17 20 Е7 08 JB ACC.7,ULOOP4
0544 0С1А ;Если МН < 0.
-45-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0545 0С1А Е7 MOV A,@R1
0546 0С1В FC MOV R4,A
0547 0С1С 19 DEC R1
0548 0C1D Е7 MOV A,@R1
0549 0С1Е FD MOV R5,A /Загрузили MH в R5,R4.
0550 0C1F 19 DEC R1 /Восстановили R1.
0551 0С20 80 ОС SJMP UPER3
0552 0С22 ULOOP4:
0553 0С22 Е7 MOV A,@R1
0554 0С23 F4 CPL A
0555 0С24 24 01 ADD A,#l
0556 0С26 FC MOV R4,A
0557 0С27 19 DEC R1
0558 0С28 Е7 MOV A,@R1
0559 0С29 F4 CPL A
0560 0С2А 34 00 ADDC A,#0
0561 0С2С FD MOV R5,A /Дополнили и загрузили
0562 0C2D /МН в R5,R4.
0563 0C2D 19 DEC R1 /Восстановили R1.
0564 0С2Е UPER3:
0565 0С2Е 08 INC R0 /Это для быстроты и удобства
0566 0C2F 7В 00 MOV R3 ДО
0567 0С31 7А 00 MOV R2,#0 /Обнулили ст. биты ПР.
0568 ОСЗЗ 7Е 10 MOV R6,#16 /Счётчик сдвигов.
0569 0С35 UCYCLE1:
0570 0С35 СЗ CLR С
0571 0С36 ЕА MOV A,R2
0572 0С37 33 RLC А
0573 0С38 FA MOV R2,A
0574 0С39 ЕВ MOV A,R3
0575 ОСЗА 33 RLC А
0576 ОСЗВ FB MOV R3 ,А
0577 ОСЗС ЕС MOV A,R4
0578 0C3D 33 RLC А
0579 ОСЗЕ FC MOV R4,A
0580 0C3F ED MOV A,R5
0581 0С40 33 RLC А
0582 0С41 FD MOV R5,A /Сдвинули влево ПР.
0583 0С42 50 0Е JNC UPER4 ;Если ст. бит МН = 0.
0584 0С44 08 INC R0
0585 0С45 Е6 MOV A,@R0
0586 0С46 2А ADD A,R2
0587 0С47 FA MOV R2,A
0588 0С48 18 DEC R0
0589 0С49 Е6 MOV A,@R0
0590 0С4А ЗВ ADDC A,R3
— 46 —
1.2. Программы арифметики с плавающей точкой
0591 0С4В FB MOV R3 , A
0592 0С4С 50 04 JNC UPER4 /Если нет заема.
0593 0С4Е ЕС MOV A,R4
0594 0C4F 34 00 ADDC Az#0
0595 0С51 FC MOV R4, A /Сложили ПР с МН.
0596 0С52 UPER4:
0597 0С52 DE Е1 DJNZ R6,UCYCLE1 ;Зацикливание.
0598 0С54 UPER41:
0599 0С54 18 DEC R0 /Восстановили R0.
0600 0С55 ЕВ MOV A,R3
0601 0С56 30 Е7 08 JNB ACC.7,UPER5
0602 0С59 /Не нужно округлять.
0603 0С59 ЕС MOV A,R4
0604 0С5А 24 01 ADD A,#l
0605 0С5С FC MOV R4, A
0606 0C5D ED MOV A,R5
0607 0С5Е 34 00 ADDC АД0
0608 0С60 FD MOV R5,A /Округлили ПР.
0609 0С61 UPER5:
0610 0С61 EF MOV A,R7
0611 0С62 30 Е7 0А JNB ACC.7,UPER6
0612 0С65 /Не нужно дополнять ПР.
0613 0С65 ЕС MOV A,R4
0614 0С66 F4 CPL A
0615 0С67 24 01 ADD A,#l
0616 0С69 FC MOV R4,A
0617 0С6А ED MOV AZR5
0618 0С6В F4 CPL A
0619 0С6С 34 00 ADDC A,#0
0620 0С6Е FD MOV R5,A /Дополнили ПР.
0621 0C6F UPER6:
0622 0C6F ED MOV A,R5
0623 0С70 4С ORL A,R4
0624 0С71 70 03 JNZ UCYCLE2 /Если Ман о 0.
0625 0С73 FF MOV R7 z A /Обнуление Пор.
0626 0С74 80 1В SJMP UPER7
0627 0С76 UCYCLE2
0628 0С76 ED MOV A,R5
0629 0С77 6F XRL AZR7
0630 0С78 СЗ CLR C
0631 0С79 20 Е7 15 JB ACC.7ZUPER7
0632 0С7С /Если явная нормализацияZCY
0633 0С7С ED MOV AZR5
0634 0C7D 54 7F ANL AZ#7FH /Исключение старшего бита.
0'635 0C7F 4С ORL AZR4
0636 0С80 60 0F JZ UPER7 /Если неявная нормализация.
-47-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0637 0С82 ЕС MOV A,R4
0638 0С83 33 RLC A
0639 0С84 FC MOV R4,A
0640 0С85 ED MOV A,R5
0641 0С86 33 RLC A
0642 0С87 FD MOV R5,A /Ман сдвинута влево.
0643 0С88 EF MOV A,R7 /А - Пор ПР.
0644 0С89 54 7F ANL A,#7FH /Исключение знака.
0645 0С8В D3 SETB С ;CY = 1.
0646 0С8С 60 03 JZ UPER7 /Если Пор - min.
0647 0С8Е 1F DEC R7
0648 0C8F 80 Е5 SJMP UCYCLE2 /Зацикливание.
0649 0С91 /ПР нормализовано.
0650 0С91 UPER7:
0651 0С91 50 01 JNC ULOOP5 /Если Пор О.К.
0652 0С93 22 RET /Если ошибка Пор,СУ = 1
0653 0С94 ULOOP5:
0654 0С94 EF MOV A,R7
0655 0С95 F6 MOV @R0,A
0656 0С96 08 INC R0
0657 0С97 ED MOV A,R5
0658 0С98 F6 MOV @R0,A
0659 0С99 08 INC R0
0660 0С9А ЕС MOV A,R4
0661 0С9В F6 MOV @R0,A /ПР записано.
0662 0С9С 18 DEC R0
0663 0C9D 18 DEC R0 /Восстанавливаем R0.
0664 0С9Е 22 RET /Успешный выход,CY = 0.
0665 0C9F /END UDPZ3.
0666 0C9F
Непосредственно умножение начинается с проверки сомножителей на
нуль. Если нулевым является множимое (адрес первой из трёх ячеек памя-
ти, в которых оно расположено, хранится в регистре R0, т. е. осуществля-
ется косвенная адресация), то умножение на этом и заканчивается — произ-
ведение равно множимому (т. е. нулю). Если нулевым является множитель
(адрес первой из трёх ячеек памяти, в которых он расположен, хранится в
регистре R1), то произведение (адрес первой из трёх ячеек памяти, в кото-
рых оно расположено, будет храниться в регистре R0) обнуляется, и опера-
ция умножения на этом завершается.
Умножение ненулевых сомножителей начинается с формирования зна-
ка произведения и сохранения его в регистре R7. Далее в соответствии с
формулой (1.34) вычисляется порядок произведения. Полученный порядок
проверяется на переполнение, и, если он после вычисления превышает
127, осуществляется аварийный выход из подпрограммы, при этом уста-
-48-
1.2. Программы арифметики с плавающей точкой
навливается флаг CY = 1. Если порядок произведения не превышает 127,
то он объединяется с полученным выше знаком произведения и сохраня-
ется до завершения перемножения мантисс сомножителей.
Поскольку мантиссы являются числами со знаком, то перед их пере-
множением нужно получить их модули, т. е. отрицательный сомножитель
(или сомножители, если они оба отрицательны) должен быть преобразо-
ван в дополнительный код (см. подразд. 1.1.4). Затем множитель загружает-
ся в регистры R5 и R4.
Собственно умножение (между метками UPER3 и UPER41) осущест-
вляется по вычислительной схеме 3 (см. подпрограмму MUL16C из третьего
тома данной книги). После завершения умножения произведение округ-
ляется, и если знак произведения отрицателен, то оно преобразуется в до-
полнительный код. Если необходима нормализация произведения, то она
осуществляется фрагментом программы между метками UCYCLE2 и
UPER7. И наконец, мантисса переписывается из регистров в память.
Приведённая подпрограмма умножения чисел трёхбайтного формата с
плавающей точкой практически аналогична относительно медленной под-
программе целочисленного умножения (MUL16C из третьего тома, для вы-
полнения которой требуется от 400 до 500 тактов микроконтроллера 8051,
или от 400 до 500 мкс при тактовой частоте 12 МГц). Между тем в 3-м томе
описана и в 6...7 раз более быстрая программа MUL16M, базирующаяся на
использовании ассемблерной инструкции MUL АВ. Резонно предполо-
жить, что если перемножение мантисс будет осуществляться программой,
аналогичной MUL16M, то скорость выполнения программы UDPZ3 возрас-
тет в несколько раз. Ниже приведена подпрограмма UDPZ3F, которая ис-
пользует алгоритм быстрого умножения, и скорость её выполнения замет-
но выше, 4eMyUDPZ3.
Подпрограмма UDPZ3F
0453 0BC0
0454 0BC0 UDPZ3F:
0455 овсо /Подпрограмма умножения 3-байтных
0456 овсо /двоичных чисел с плавающей точкой
0457 ОВСО /в дополнительном коде формата
0458 овсо ;(8,16)=(Пор,Ман), где байт порядка
0459 овсо /содержит бит знака мантиссы и
0460 овсо /целочисленный двоичный порядок
0461 овсо /со смещением +4ОН, а два байта
0462 овсо /мантиссы (СтБ и МлБ) - двоичное
0463 овсо /дробное нормализованное число в
0464 овсо /дополнительном коде.
0465 овсо
-49-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0466 ОВСО ;Входные параметры: R0 - адрес
0467 ОВСО /множимого, R1 - адрес множителя.
0468 ОВСО
0469 ОВСО /Выходные параметры: R0 - адрес
0470 ОВСО /ПР (ПР на месте множимого). R1 -
0471 ОВСО /адрес множителя, CY = 1 - признак
0472 ОВСО /переполнения или антипереполнения
0473 ОВСО /порядка произведения.
0474 ОВСО
0475 ОВСО /Используются все регистры, кроме
0476 ОВСО /RO, R1. Глубина стека - 2 байта.
0477 ОВСО /
0478 ОВСО /
0479 ОВСО /
0480 ОВСО /
0481 ОВСО /
0482 ОВСО /
0483 ОВСО сз CLR С /Для нормального выхода
0484 0ВС1 Е6 MOV A,@R0
0485 0ВС2 08 INC R0
0486 ОВСЗ 46 ORL A,@R0
0487 0ВС4 08 INC R0
0488 0ВС5 46 ORL A,@R0
0489 0ВС6 18 DEC R0
0490 0ВС7 18 DEC R0 /Восстановили R0.
0491 0ВС8 70 01 JNZ ULOOP2 /Если ММ о 0.
0492 ОВСА ULOOP1:
0493 ОВСА 22 RET /Если ММ = 0, CY = 0.
0494 ОВСВ ULOOP2:
0495 ОВСВ Е7 MOV A,@R1
0496 ОВСС 09 INC R1
0497 0BCD 47 ORL A,@R1
0498 ОВСЕ 09 INC R1
0499 ОВСЕ 47 ORL A,@R1
0500 0BD0 19 DEC R1
0501 0BD1 19 DEC R1 /Восстановили R1.
0502 0BD2 70 08 JNZ UPER1 /Если МН о 0.
0503 0BD4 F6 MOV @R0,A
0504 0BD5 08 INC R0
0505 0BD6 F6 MOV @R0,A
0506 0BD7 08 INC R0
0507 0BD8 F6 MOV @R0,A /Обнулили ПР(бывшее ММ)
0508 0BD9 18 DEC R0
0509 0BDA 18 DEC R0 /Восстановили R0.
0510 0BDB 22 RET /Если МН = 0, CY = 0.
0511 0BDC UPER1:
-50-
1.2. Программы арифметики с плавающей точкой
0512 OBDC Е6 MOV A,ORO ;A - байт Пор ММ.
0513 0BDD 67 XRL A,@R1 ;OR1 - байт Пор МН.
0514 0BDE 54 80 ANL A,#80H /Оставить знак произведения.
0515 0BE0 FF MOV R7,A / R7 - знак произведения.
0516 0ВЕ1 Е6 MOV A,ORO /А - байт Пор ММ.
0517 0ВЕ2 54 7F ANL A,#7FH /Исключение знака.
0518 0ВЕ4 FE MOV R6,A /Сохранили Пор ММ в R6.
0519 0ВЕ5 Е7 MOV A,@R1 /А - байт Пор МН.
0520 0ВЕ6 54 7F ANL A,#7FH /
0521 0ВЕ8 94 40 SUBB A,#40H /Исключение смещения +4ОН.
0522 0BEA 2Е ADD A,R6 /А = Пор ММ + Пор МН.
0523 0BEB 30 Е7 02 JNB ACC.7,ULOOP3
0524 0BEE /Если Пор ПР не переполнен.
0525 ОВЕЕ D3 SETB C /CY = 1.
0526 0BEF 22 RET /Если переполнение Пор ПР, CY =
0527 OBFO ULOOP3:
0528 OBFO 4F ORL A,R7 /Вставка знака в байт Пор.
0529 0BF1 FF MOV R7,A ;R7 - байт Пор ПР.
0530 0BF2 Е6 MOV A,ORO /А - байт Пор ММ.
0531 0BF3 30 Е7 0Е JNB ACC.7,UPER2
0532 0BF6 /Если ММ > 0.
0533 0BF6 08 INC R0
0534 0BF7 08 INC R0
0535 0BF8 Е6 MOV A,ORO
0536 0BF9 F4 CPL A
0537 0BFA 24 01 ADD A,#l
0538 OBFC F6 MOV ORO, A
0539 0BFD 18 DEC R0
0540 OBFE Е6 MOV A,ORO
0541 OBFF F4 CPL A
0542 0С00 34 00 ADDC A,#0
0543 0С02 F6 MOV ORO,A /Дополнили ММ.
0544 ОСОЗ 18 DEC R0 /Восстановили R0.
0545 0С04 UPER2:
0546 0С04 Е7 MOV A,QR1 /А - байт Пор МН.
0547 0С05 09 INC R1
0548 0С06 09 INC R1
0549 0С07 20 Е7 08 JB ACC.7,ULOOP4
0550 0C0A /Если МН < 0.
0551 0C0A Е7 MOV A,OR1
0552 ОСОБ FC MOV R4,A
0553 ОСОС 19 DEC R1
0554 OCOD Е7 MOV A,OR1
0555 ОСОБ FD MOV R5,A /Загрузили МН в R5, R4.
0556 0C0F 19 DEC R1 /Восстановили R1.
0557 ОСЮ 80 ОС SJMP UPER3
-51-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0558 0С12 ULOOP4:
0559 0С12 Е7 MOV A,@R1
0560 0С13 F4 CPL A
0561 0С14 24 01 ADD A,#l
0562 0С16 FC MOV R4,A
0563 0С17 19 DEC R1
0564 0С18 Е7 MOV A,@R1
0565 0С19 F4 CPL A
0566 0С1А 34 00 ADDC A,#0
0567 0С1С FD MOV R5,A /Дополнили и загрузили
0568 0C1D /МН в R5, R4.
0569 0C1D 19 DEC R1 ;Восстановили R1.
0570 0С1Е UPER3:
0571 0С1Е EF MOV A,R7
0572 0C1F СО Е0 PUSH ACC /Сохранение знака
0573 0С21 08 INC R0 /Это для быстроты и удобства.
0574 0С22 Е6 MOV A,@R0 /А = «старший байт мантиссы»
0575 0С23 8D F0 MOV B,R5
0576 0С25 АВ F0 MOV R3,B /сохранение вместо PUSH В
0577 0С27 А4 MUL AB
0578 0С28 AF F0 MOV R7,B
0579 0С2А FE MOV R6,A
0580 0С2В /
0581 0С2В 08 INC R0 /указатель на мл. байт мантиссы
0582 0С2С Е6 MOV A,@R0 /А = «мл. байт мантиссы»
0583 0C2D 8С F0 MOV B,R4
0584 0C2F АА F0 MOV R2,B /сохранение вместо PUSH В
0585 0С31 А4 MUL AB
0586 0С32 AD F0 MOV R5,B
0587 0С34 FC MOV R4,A
0588 0С35 /
0589 0С35 18 DEC R0 /указатель на ст. байт мантиссы
0590 0С36 Е6 MOV A,@R0 /вместо MOV A,R3
0591 0С37 8А F0 MOV B,R2 /восстановление вместо POP В
0592 0С39 А4 MUL AB
0593 ОСЗА 2D ADD A,R5
0594 ОСЗВ FD MOV R5,A
0595 ОСЗС ЕЕ MOV A,R6
0596 0C3D 35 F0 ADDC A,B
0597 0C3F FE MOV R6,A
0598 0С40 EF MOV A,R7
0599 0С41 34 00 ADDC A,#0
0600 0С43 FF MOV R7,A
0601 0С44
0602 0С44 08 INC R0 /указатель на мл. байт мантиссы
-52-
1.2. Программы арифметики с плавающей точкой
0603 0С45 Е6 MOV A,@R0 /вместо MOV A,R2
0604 0С46 8В F0 MOV B,R3 /восстановление вместо POP В
0605 0С48 А4 MUL AB
0606 0С49 2D ADD A,R5
0607 0С4А FD MOV R5,A
0608 0С4В ЕЕ MOV A,R6
0609 0С4С 35 F0 ADDC A,B
0610 0С4Е FE MOV R6,A
0611 0C4F EF MOV A,R7
0612 0С50 34 00 ADDC A,#0
0613 0С52 FF MOV R7,A /в R7R6R5R4 - ПР.
0614 0С53
0615 0С53 18 DEC R0
0616 0С54 18 DEC R0 /восстановили указатель
0617 0С55
0618 0С55 ЕС MOV A,R4
0619 0С56 30 Е7 08 JNB ACC.7, ,UPER50
0620 0С59 ЕЕ MOV A,R6
0621 0С5А 24 01 ADD A,#l
0622 0С5С FE MOV R6,A
0623 0C5D EF MOV A,R7
0624 0С5Е 34 00 ADDC Az#0
0625 0С60 FF MOV R7,A /в R7R6R5R4 - округл. ПР.
0626 0С61
0627 0С61 UPER50:
0628 0С61 ЕЕ MOV A,R6
0629 0С62 FC MOV R4,A
0630 0С63 EF MOV A,R7
0631 0С64 FD MOV R5,A /два байта мантиссы в R5R4
0632 0С65 D0 ЕО POP ACC
0633 0С67 FF MOV R7,A /восстановили знак
0634 0С68
0635 0С68 UPER5:
0636 0С68 EF MOV A,R7
0637 0С69 30 Е7 0А JNB ACC.7, ,UPER6
0638 0С6С /Не нужно дополнять ПР.
0639 0С6С ЕС MOV A,R4
0640 0C6D F4 CPL A
0641 0С6Е 24 01 ADD АЛ1
0642 0С70 FC MOV R4,A
0643 0С71 ED MOV A,R5
0644 0С72 F4 CPL A
0645 0С73 34 00 ADDC АЛ0
0646 0С75 FD MOV R5,A /Дополнили ПР.
0647 0С76 UPER6:
-53-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0648 0С76 ED MOV A,R5
0649 0С77 4С ORL A,R4
0650 0С78 70 03 JNZ UCYCLE2 ;Если Ман о 0.
0651 0С7А FF MOV R7,A /Обнуление Пор.
0652 0С7В 80 1В SJMP UPER7
0653 0C7D UCYCLE2:
0654 0C7D ED MOV A,R5
0655 0С7Е 6F XRL A,R7
0656 0C7F СЗ CLR С
0657 0С80 20 Е7 15 JB ACC.7,UPER7
0658 0С83 /Если явная нормализация, CY = 0
0659 0С83 ED MOV A,R5
0660 0С84 54 7F ANL A,#7FH /Исключение старшего бита.
0661 0С86 4С ORL A,R4
0662 0С87 60 0F JZ UPER7 /Если неявная нормализация.
0663 0С89 ЕС MOV A,R4
0664 0С8А 33 RLC А
0665 0С8В FC MOV R4,A
0666 0С8С ED MOV A,R5
0667 0C8D 33 RLC А
0668 0С8Е FD MOV R5,A /Ман сдвинута влево.
0669 0C8F EF MOV A,R7 /А - Пор ПР.
0670 0С90 54 7F ANL A,#7FH /Исключение знака.
0671 0С92 D3 SETB С /CY = 1.
0672 0С93 60 03 JZ UPER7 /Если Пор - min.
0673 0С95 1F DEC R7
0674 0С96 80 Е5 SJMP UCYCLE2 /Зацикливание.
0675 0С98 /ПР нормализовано.
0676 0С98 UPER7:
0677 0С98 50 01 JNC ULOOP5 /Если Пор без ошибки.
0678 0С9А 22 RET /Если ошибка Пор, CY = 1.
0679 0С9В ULOOP5:
0680 0С9В EF MOV A,R7
0681 0С9С F6 MOV @R0,A
0682 0C9D 08 INC R0
0683 0С9Е ED MOV A,R5
0684 0C9F F6 MOV @R0,A
0685 ОСАО 08 INC R0
0686 0СА1 ЕС MOV A,R4
0687 0СА2 F6 MOV @R0,A /ПР записано.
0688 ОСАЗ 18 DEC R0
0689 0СА4 18 DEC R0 /Восстанавливаем R0.
0690 0СА5 22 RET /Успешный выход,CY = 0.
0691 0СА6 /END UDPZ3.
0692 0СА6
-54-
1.2. Программы арифметики с плавающей точкой
У читателя может возникнуть вопрос: почему в рассмотренной нами
первой подпрограмме UDPZ3 использован относительно медленный алго-
ритм умножения? Да и зачем она вообще приведена в книге, если есть бо-
лее быстрая и выполняющая ровно те же функции UDPZ3F? Ответ прост.
Подпрограммы SDPZ3 , UDPZ3 , DDPZ3 были написаны Алексеем Фрун-
зе ещё в 1994 г. по заказу журнала «Радио» в дополнение к циклу о микро-
контроллерах 51-го семейства. За основу были взяты программы для 8080,
описанные в книге А. Л. Гуртовцева и С. В. Гудыменко «Программы для
микропроцессоров». У микропроцессора 8080 программа аппаратного ум-
ножения, аналогичная MUL АВ, отсутствует, и целочисленное умножение
в нем осуществлялось суперпозицией сложений и сдвигов. Поэтому при
переводе программ с языка 8080 на язык х51 и возник вышеупомянутый
относительно медленный алгоритм умножения в нашей UDPZ3.
В 1995—1996 гг. нами было продано несколько десятков дискет, содер-
жавших программный пакет, в который входили подпрограммы SDPZ3,
UDPZ3, DDPZ3 и ряд других. В первые два или три месяца пользователи об-
наружили в программах две незначительные ошибки, которые тогда же и
были устранены. За истекшие с того момента десять лет каких-либо сооб-
щений о других ошибках в этих программах мы не получали, как и не об-
наружили их сами. Поэтому описываемые здесь программы имеют, если
так можно выразиться, достаточно высокий уровень надёжности.
Программа UDPZ3F, отличающаяся OTUDPZ3 только фрагментом, осу-
ществляющим перемножение 16-битных мантисс, подготовлена недавно
специально для настоящего тома. Она протестирована на нескольких де-
сятках примеров, каких-либо отличий в результатах от результатов работы
UDPZ3 не обнаружено. Однако UDPZ3 тестировалась в значительно боль-
шем количестве пользовательских приложений, чем UDPZ3F, поэтому ве-
роятность нахождения какой-либо ошибки в программе UDPZ3 значитель-
но ниже, чем в UDPZ3F. В связи с этим UDPZ3 рассматривается как основ-
ной пример, a UDPZ3F — как дополнительный, с оговоркой, что
тестирование этой программы осуществлялось в меньшем объёме.
Что можно сказать о сравнительном быстродействии рассмотренных
подпрограмм? В конце главы, посвященной программам арифметики с
плавающей точкой, рассматривается в качестве примера цифровая систе-
ма стабилизации температуры на основе микроконтроллера семейства х51,
реализующая ПИД-закон регулирования. Выходной сигнал регулятора
рассчитывается в соответствии с приведённым там соотношением, причём
при расчётах используются числа с плавающей точкой в трёхбайтном фор-
мате, а сложение и умножение осуществляется при помощи только что
рассмотренных подпрограмм. Так вот, помимо относительно коротких
программ преобразования, алгоритм содержит пять операций умножения
и четыре операции сложения. Для тестового примера с ненулевыми сигна-
— 55 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
лами ошибок один цикл расчёта с использованием UDPZ3 имел длитель-
ность 2.83 мс (при этом операции сложения занимали от 140 до 165 тактов
микроконтроллера, умножения — от 405 до 515 тактов). Аналогичный
цикл расчёта с использованием UDPZ3F имел длительность 1.51 мс (при
этом операции сложения по-прежнему занимали от 140 до 165 тактов мик-
роконтроллера, а умножения — от 170 до 175 тактов). В общем можно ска-
зать, что среднее время выполнения сложения двух чисел с плавающей
точкой у стандартного 8051 на частоте 12 МГц составит около 150 мкс. Ум-
ножение с использованием UDPZ3 потребует около 500 мкс, а с использо-
ванием UDPZ3F ~ примерно 175 мкс.
Соответственно при использовании микроконтроллеров х51 со стан-
дартным 12-тактовым ядром на более высоких тактовых частотах время
выполнения этих программ уменьшится пропорционально возрастанию
тактовой частоты. Ещё более высокую скорость выполнения этих про-
грамм продемонстрируют микроконтроллеры с однотактным (RISC-по-
добные) или двухтактным ядром. Так, 33-мегагерцовые RISC-подобные
микроконтроллеры могут выполнять эти программы примерно в 20 раз
быстрее, чем стандартный 12-мегагерцовый 8051. Вот каковы предельные
(с точки зрения быстродействия) возможности описываемых в настоящем
томе программ с плавающей точкой.
1.2.4. Деление двоичных чисел
Деление (z/y = х) двоичных нормализованных чисел с плавающей точкой
Z = 2mz'Z, у = 2W>-У осуществляется в соответствии с выражениями
х (135)
X, тх
X', тх, если X' < 1;
X’ • 2-1, тх + 1, если X' > 1,
(1.36)
где т’х = mz - ту, Х' = Z/У
Деление производится в три этапа:
1. Определяется порядок частного путём вычитания порядка делителя
из порядка делимого.
2. Находится мантисса частного путём деления мантиссы делимого на
мантиссу делителя по правилам арифметики с фиксированной точкой.
3. Производится, если необходимо, нормализация частного вправо.
Диапазон мантиссы частного имеет вид
2~’<
1 - 2~”
Hmin
Hmax
l-^lmax _
l^min
1-2~”
2~‘
<2.
(1.37)
-56-
1.2. Программы арифметики с плавающей точкой
Следовательно, при делении возможны переполнение мантиссы частно-
го (но не потеря значности) и её нормализация вправо в соответствии с
формулой (1.36).
Как и в случае умножения чисел, при делении возможны переполнение
и антипереполнение порядка частного, которые необходимо выявлять. Кро-
ме того, необходимо отслеживать случаи деления на нуль. Вычисление
смещённого порядка частного производится по формуле
^гсм Мусы ^хсм- (1.38)
Граничная относительная ошибка деления чисел с плавающей точкой
определяется, как и для чисел с фиксированной точкой, выражением
(1.18) при условии отсутствия переполнения и антипереполнения порядка
частного.
Подпрограмма DDPZ3 выполняет деление чисел с плавающей точкой в
формате (8,16):
0667 0C9F /
0668 0C9F DDPZ3:
0669 0C9F '•Подпрограмма деления 3-байтных
0670 0C9F /двоичных чисел с плавающей точкой
0671 0C9F /в дополнительном коде формата
0672 0C9F ;[8,16]=[Пор,Ман], где байт порядка
0673 0C9F /содержит бит знака мантиссы и
0674 0C9F /целочисленный двоичный порядок
0675 0C9F /со смещением +40Н, а два байта
0676 0C9F /мантиссы (СтБ и МлБ) - двоичное
0677 0C9F /дробное нормализованное число в
0678 0C9F /дополнительном коде.
0679 0C9F ;
0680 0C9F /Входные параметры: R0 - адрес
0681 0C9F /делителя, R1 - адрес делимого.
0682 0C9F /
0683 0C9F /Выходные параметры: R0 - адрес
0684 0C9F /частного (частное на месте дели-
0685 0C9F /теля). R1 - адрес делимого,
0686 0C9F /CY = 1 - признак переполнения или
0687 0C9F /антипереполнения порядка частного.
0688 0C9F /
0689 0C9F /Используются все регистры, кроме
0690 0C9F /В, R0, R1. Глубина стека - 0 байт.
0691 0C9F ;
0692 0C9F
0693 0C9F
0694 0C9F
0695 0C9F
-57-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0696 0C9F
0697 0C9F D3 SETB C /Для выхода при делении на 0
0698 ОСАО Е6 MOV A, ORO
0699 0СА1 08 INC RO
0700 0СА2 46 ORL A, ORO
0701 ОСАЗ 08 INC RO
0702 0СА4 46 ORL A,ORO
0703 0СА5 18 DEC RO
0704 0СА6 18 DEC RO /Восстановили R0.
0705 0СА7 70 01 JNZ DLOOP2 ;Если ДЛ о 0.
0706 0СА9 DL00P1:
0707 0СА9 22 RET /Если ДЛ = 0, CY = 1.
0708 0CAA DLOOP2:
0709 0CAA СЗ CLR C /Для нормального выхода.
0710 ОСАВ Е7 MOV a,ori
0711 ОСАС 09 INC R1
0712 0CAD 47 ORL A,OR1
0713 ОСАЕ 09 INC R1
0714 0CAF 47 ORL A,OR1
0715 ОСВО 19 DEC R1
0716 0СВ1 19 DEC R1 /Восстановили R1.
0717 0СВ2 70 08 JNZ DPER1 /Если ДМ о 0.
0718 0СВ4 F6 MOV ORO,A
0719 0СВ5 08 INC RO
0720 0СВ6 F6 MOV ORO,A
0721 0СВ7 08 INC RO
0722 0СВ8 F6 MOV ORO,A /Обнулили Ч (бывшее ДЛ).
0723 0СВ9 18 DEC RO
0724 ОСВА 18 DEC RO /Восстановили R0.
0725 ОСВВ 22 RET /Если ДМ = 0, CY = 0.
0726 ОСВС DPER1:
0727 ОСВС Е6 MOV A, ORO /А - байт Пор ДЛ.
0728 0CBD 67 XRL A,QR1 /0R1 - байт Пор ДМ.
0729 ОСВЕ 54 80 ANL A,#80H /Оставить знак частного.
0730 ОССО FF MOV R7,A /R7 - знак частного.
0731 0СС1 Е6 MOV A, ORO /А - байт Пор ДЛ.
0732 0СС2 54 7F ANL A,#7FH /Исключение знака.
0733 0СС4 FE MOV R6,A /Сохранили Пор ДЛ в R6.
0734 0СС5 Е7 MOV A,OR1 /А - байт Пор ДМ.
0735 0СС6 54 7F ANL A,#7FH /Исключение знака.
0736 0СС8 24 40 ADD A,#40H /Учет смещения +4ОН.
0737 ОССА СЗ CLR C /CY = 0.
0738 осев 9Е SUBB A,R6 /А = Пор ДМ - Пор ДЛ.
0739 ОССС 30 Е7 02 JNB ACC.7,DLOOP3
0740 OCCF /Если Пор Ч без переполнения
0741 0CCF D3 SETB C /CY = 1.
-58-
1.2. Программы арифметики с плавающей точкой
0742 0CD0 22 RET ; Если переполнение Пор 4, CY =
0743 0CD1 DLOOP3:
0744 0CD1 4F ORL A,R7 /Вставка знака в байт Пор.
0745 0CD2 FF MOV R7,A ;R7 - байт Пор Ч.
0746 0CD3 DDF17:
0747 0CD3 Е6 MOV A,@R0
0748 0CD4 20 Е7 0Е JB ACC.7,DLD
0749 0CD7 ;Если ДЛ < 0.
0750 0CD7 08 INC R0
0751 0CD8 08 INC R0
0752 0CD9 Е6 MOV A,@R0
0753 0CDA F4 CPL A
0754 0CDB 24 01 ADD Az#l
0755 0CDD F6 MOV @R0zA
0756 0CDE 18 DEC R0
0757 0CDF Е6 MOV Az@R0
0758 0CE0 F4 CPL A
0759 0СЕ1 34 00 ADDC Az#0
0760 ОСЕЗ F6 MOV @R0,A
0761 0СЕ4 18 DEC R0 /Дополнили ДЛ в РПД.
0762 0СЕ5 DLD:
0763 0СЕ5 09 INC R1
0764 0СЕ6 Е7 MOV AZ@R1
0765 0СЕ7 FD MOV R5ZA
0766 0СЕ8 09 INC R1
0767 0СЕ9 Е7 MOV AZ@R1
0768 0CEA FC MOV R4,A
0769 ОСЕВ 19 DEC R1
0770 ОСЕС 19 DEC R1
0771 0CED Е7 MOV A,@R1 /Загрузили ДМ в R5, R4.
0772 ОСЕЕ 30 Е7 ОА JNB ACC.7,DMP
0773 0CF1 /Если ДМ > = 0.
0774 0CF1 ЕС MOV AZR4
0775 0CF2 F4 CPL A
0776 0CF3 24 01 ADD Az#l
0777 0CF5 FC MOV R4,A
0778 0CF6 ED MOV A,R5
0779 0CF7 F4 CPL A
0780 0CF8 34 00 ADDC Az#0
0781 0CFA FD MOV R5ZA /Дополнили ДМ в R5, R4.
0782 0CFB DMP:
0783 0CFB 08 INC R0 /Это для быстроты и удобства.
0784 0CFC
0785 0CFC 08 INC R0
0786 0CFD ЕС MOV AZR4
0787 0CFE 26 ADD Az@R0
-59-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0788 OCFF FC MOV R4,A
0789 D000 18 DEC R0
0790 0D01 ED MOV A,R5
0791 0D02 36 ADDC A,@R0
0792 0D03 FD MOV R5,A ;R5, R4 - Разность ДМ и ДЛ.
0793 0D04 92 D5 MOV PSW.5,C ,-Сохр. признак переполнения
0794 0D06 40 09 JC DPER12 /Если частное > 1.
0795 0D08 СЗ CLR С ;Для вычитания.
0796 0D09 08 INC R0
0797 0D0A ЕС MOV A,R4
0798 0D0B 96 SUBB A,@R0
0799 0D0C FC MOV R4,A
0800 0D0D 18 DEC R0
0801 0D0E ED MOV A,R5
0802 0D0F 96 SUBB A,@R0
0803 0D10 FD MOV R5,A /Восстановили R5, R4 (ДМ).
0804 0D11 DPER12:
0805 0D11 D216A:
0806 0D11 7Е 10 MOV R6,#16 /Счётчик циклов.
0807 0D13 DCYCLE:
0808 0D13 СЗ CLR С
0809 0D14 ЕА MOV A,R2
0810 0D15 33 RLC А
0811 0D16 FA MOV R2,A
0812 0D17 ЕВ MOV A,R3
0813 0D18 33 RLC A
0814 0D19 FB MOV R3,A /Частное сдвинуто влево.
0815 0D1A СЗ CLR С
0816 0D1B ЕС MOV A,R4
0817 0D1C 33 RLC А
0818 0D1D FC MOV R4,A
0819 0D1E ED MOV A,R5
0820 0D1F 33 RLC A
0821 0D20 FD MOV R5,A /Остаток сдвинут влево.
0822 0D21 40 18 JC LP1 /Если переполнение остатка.
0823 0D23 08 INC R0
0824 0D24 ЕС MOV A,R4
0825 0D25 26 ADD a,@R0
0826 0D26 FC MOV R4,A
0827 0D27 18 DEC R0
0828 0D28 ED MOV A,R5
0829 0D29 36 ADDC A,@R0
0830 0D2A FD MOV R5,A
0831 0D2B 50 03 JNC LP2 /Если сумма < 0.
0832 0D2D 0А INC R2 /Сумма> 0, бит частного = 1
0833 0D2E 80 14 SJMP COMP
-60-
1.2. Программы арифметики с плавающей точкой
0834 0D3 0 LP2:
0835 0D30 СЗ CLR C
0836 0D31 08 INC R0
0837 0D32 ЕС MOV A,R4
0838 0D33 96 SUBB A,@R0
0839 0D34 FC MOV R4,A
0840 0D3 5 18 DEC R0
0841 0D36 ED MOV A,R5
0842 0D37 96 SUBB A,@R0
0843 0D3 8 FD MOV R5,A /Восстановление остатка.
0844 0D39 80 09 SJMP COMP
0845 0D3B LP1:
0846 0D3B 08 INC R0
0847 0D3C ЕС MOV A,R4
0848 0D3D 26 ADD A,@R0
0849 0D3E FC MOV R4,A
0850 0D3F 18 DEC R0
0851 0D40 ED MOV A,R5
0852 0D41 36 ADDC A,@R0
0853 0D42 FD MOV R5,A /Формирование остатка.
0854 0D43 0А INC R2 /Бит частного = 1.
0855 0D44 COMP:
0856 0D44 DE CD DJNZ R6,DCYCLE
0857 0D46 ;Зацикливание.
0858 0D46 А2 D5 MOV CZPSW.5 /Восстановили признак
0859 0D48 /переполнения.
0860 0D48 18 DEC R0 /Восстановили R0.
0861 0D49 50 07 JNC DPER3 /Если нет переполнения.
0862 0D4B ЕВ MOV A,R3
0863 0D4C 13 RRC A
0864 0D4D FB MOV R3,A
0865 0D4E ЕА MOV A,R2
0866 0D4F 13 RRC A
0867 0D50 FA MOV R2,A /Частное сдвинуто вправо.
0868 0D51 0Е INC R6 ;R6 = 1 - признак переполнения
0869 0D52 DPER3:
0870 0D52 EF MOV A,R7
0871 0D53 30 Е7 0А JNB ACC.7,END
0872 0D56 /Если частное > = 0.
0873 0D56 ЕА MOV A,R2
0874 0D57 F4 CPL A
0875 0D58 24 01 ADD A,#l
0876 0D5A FA MOV R2,A
0877 0D5B ЕВ MOV A,R3
0878 0D5C F4 CPL A
0879 0D5D 34 00 ADDC A,#0
-61-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0880 0D5F FB MOV R3 ,A /Дополнили частное.
0881 0D60 END:
0882 0D60 ЕЕ MOV A,R6
0883 0D61 13 RRC A /Проявление признака
0884 0D62 /переполнения.
0885 0D62 EF MOV A,R7
0886 0D63 F6 MOV @R0zA /Запись байта Пор.
0887 0D64 50 09 JNC P2 /Если нет переполнения.
0888 0D66 РМА2:
0889 0D66 F4 CPL A
0890 0D67 54 7F ANL A,#7FH /Исключение знака.
0891 0D69 D3 SETB C /СУ = 1.
0892 0D6A 70 01 JNZ PM2E /Пор - шах.
0893 0D6C 22 RET /СУ = 1, Переполнение Пор
0894 0D6D РМ2Е:
0895 0D6D 06 INC @R0
0896 0D6E СЗ CLR C /СУ = 0.
0897 0D6F Р2:
0898 0D6F 08 INC R0
0899 0D70 ЕВ MOV A,R3
0900 0D71 F6 MOV @R0,A
0901 0D72 08 INC R0
0902 0D73 ЕА MOV AZR2
0903 0D74 F6 MOV @R0,A /Мантисса записана.
0904 0D75 18 DEC R0
0905 0D76 18 DEC R0 /Восстановили R0.
0906 0D77 22 RET /СУ = 0, Нет переполнения
0907 0D78 /END DDPZ3.
0908 0D78
Программа начинается с проверки делителя на 0. Если делитель равен
нулю, осуществляется аварийный выход из программы, при этом флаг
CY= 1. Далее проверяется делимое, если оно равно 0, то частное зануляет-
ся, и вновь следует выход из программы, но при этом флаг CY = 0. Затем
формируется знак частного, он сохраняется в R7. После этого в соответс-
твии с формулой (1.38) определяется порядок частного и проверяется на
переполнение/антипереполнение. Если старший бит порядка частного ра-
вен 1, что является признаком аварийной ситуации, то следует выход из
программы, при этом флаг CY = 1. Если порядок частного в пределах до-
пустимого, то знак частного «вставляется» в байт порядка, а затем произ-
водятся операции с мантиссами делимого и делителя.
Непосредственно деление мантиссы делимого на мантиссу делителя
(фрагмент программы между метками D216A и СОМР) производится ана-
логично подпрограмме DIV16 из третьего тома данной книги. Однако в
рассматриваемой здесь подпрограмме есть небольшие отличия от той, ко-
-62-
1.2. Программы арифметики с плавающей точкой
торая описана там. Если делитель отрицателен, то он оставляется без изме-
нений; положительный же делитель преобразуется в отрицательный (пере-
водится в дополнительный код, см. подразд. 1.1.4). Соответственно опера-
ции вычитания при восстановлении остатка заменяются сложением. Ну а
сдвиг частного и остатка влево осуществляется не путём сложения регист-
ров самих с собой, а с использованием ассемблерных команд RLC А. В ос-
тальном же рассматриваемые подпрограммы деления идентичны.
Однако до того, как будет осуществлено деление мантисс, программа
DDPZ3 выполняет ряд операций. Как упоминалось, если делитель отрица-
телен, то он остается без изменений; положительный же делитель преоб-
разуется в отрицательный. С делимым — наоборот: без изменений оно ос-
тается в том случае, когда положительно, а отрицательное делимое преоб-
разуется в дополнительный код. После этого делимое загружается в
регистры R4, R5.
Затем следует сравнение делимого и делителя (точнее, из делимого
вычитается делитель). Если разность положительна, то при делении воз-
никнет переполнение частного. Для его предотвращения в этом случае осу-
ществляется деление разности (делимое - делитель) на делитель, и полу-
ченный результат после завершения операции деления увеличивается
на 1. Признаком такой ситуации является установленный в 1 бит PSW.5.
Возникшее при этом переполнение мантиссы устраняется её сдвигом
вправо с увеличением байта порядка на 1. Затем порядок проверяется на
переполнение. Если оно наступило, следует выход из подпрограммы, при
этом флаг CY = 1.
Если частное отрицательное, то его мантисса преобразуется в дополни-
тельный код. И наконец, результат переписывается из регистров в память.
Время выполнения программы DDPZ3 примерно соответствует време-
ни выполнения UDPZ3.
Приведённые выше программы умножения, деления и сложения чисел
трёхбайтного формата с плавающей точкой самодостаточны, т. е. не ссы-
лаются на какие-либо не входящие в их состав подпрограммы. С другой
стороны, это является их очевидным недостатком — в них имеется некото-
рое количество одинаковых или очень близких по содержанию фрагмен-
тов, не оформленных в подпрограммы. Программы не очень хорошо
структурированы, хотя за счёт большого числа комментариев вполне чита-
бельны.
Причина такого построения этих программ указана выше — они писа-
лись под малоподготовленного пользователя, так, чтобы пользователь
смог бы встроить их в свою программу даже при минимальных навыках
сборки и линковки программ. В целом, судя по отзывам тех, кто восполь-
зовался этими программами десять лет назад, это было достигнуто. Ну а в
настоящий момент оптимизировать эти программы уже не имеет
-63-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
смысла — внесение изменений в давно отлаженные программы чревато
неприятностями. На мой взгляд, целесообразно их использовать именно в
таком виде, в каком они были написаны, а что-то «причёсывать» понадо-
бится лишь в том случае, когда на основе этих программ вам придётся со-
здавать их аналоги для других, отличных от х51, микроконтроллеров.
1.3. Программы преобразования чисел с плавающей
точкой
1.3.1. Общие сведения
Обработка числовых данных в современных микроконтроллерных уст-
ройствах производится с минимальными затратами памяти и времени, т. е.
наиболее экономичным образом. С этой целью упомянутые данные пред-
ставляются в двоичной системе счисления. Однако ввод/вывод исходных
данных и результатов необходимо осуществлять в привычном и удобном
для пользователя десятичном виде, в связи с чем возникает проблема пере-
вода чисел из одной системы счисления в другую. Задача преобразования
различных представлений чисел решается программным путём, что требу-
ет определенных затрат памяти и времени. Если оказывается, что эти за-
траты велики и, кроме того, процессы ввода/вывода существенно преобла-
дают над вычислительными процессами, целесообразно использовать де-
сятичную, точнее, смешанную двоично-десятичную систему счисления и в
процессе обработки данных, исключая тем самым необходимость преоб-
разования форматов чисел и минимизируя общие затраты на ввод/вывод и
вычисления. В общем же случае проблема перевода сохраняется и являет-
ся типичной для микропроцессорных устройств.
В данном разделе рассматриваются алгоритмы и программы преобра-
зования различных форматов беззнаковых дробных чисел с фиксированной
точкой, а также чисел с плавающей точкой из Р-ичной системы счисления
в Р-ичную (и наоборот), в частности, речь пойдет о двоичной и двоично-
десятичной системах. Изложение ограничено, за одним исключением,
беззнаковыми числами, поскольку указанная трансформация любого чис-
ла со знаком сводится к преобразованию его абсолютной величины и при-
своению соответствующего знака результату.
Рассмотрим методы преобразования чисел с фиксированной точкой из
Р-ичной системы в Р-ичную (Р -> Р) и из Р-ичной системы в Р-ичную
(Р -> Р). Для определенности примем, что Р < Р, в частности Р = 2, Р = 10.
Отдельно рассмотрим операции с целыми и дробными числами, пос-
кольку трансформацию в другую систему счисления любого числа можно
свести к независимому переводу его целой и дробной частей.
-64-
1.3. Программы преобразования чисел с плавающей точкой
Один из методов перевода R-+ Р целых и дробных чисел заключается в
непосредственном вычислении Р-ичного значения полинома Р-ичного
числа, в котором Р-ичные цифры и основание 10Л записываются Р-ичными
цифрами, а операции сложения и умножения выполняются по правилам
Р-ичной арифметики:
(1.39)
^яф ” ^aRt ’ ^я “^Рф ~ ’ Я?
7=1 7=0
где ар, и Rp— соответственно эквивалентные цифры aRi и основание 10Л,
записанные в Р-ичной системе. Например, перевод 2 10 для чисел 1101 и
0.1100 имеет вид (102 = 2I0): 1101 = 1-23 + Р22 + 0*2* + Г2° = 8 + 4 + 1 = 13 и
0.1100 = 1-2-1 + Г2-2 + 0-2“3 + 0-2“4 = 0.5 + 0.25 = 0.75. Заметим, что, пос-
кольку Р < Р, цифры в Р-ичной и Р-ичной записях полинома (1.39) совпа-
дают, а это упрощает преобразование чисел. Данный метод в равной мере
применим и для обратного преобразования Р -> Р. Например, перевод
10-> 2 для чисел 13 и 0.75 имеет вид (1010=: Ю102):
1310 = 0001 х (1010)1 + ООН = 11012,
0.75 = 0111 х (1010)-1 + 0101 х (1010)“2 =
= (0.101100...) 4- (0.000011...) = 0.101111....
Пример показывает, что перевод чисел в систему с меньшим основанием
(Р < Р) по методу (1.39) достаточно сложен, особенно для дробных чисел.
На практике метод (1.39) используется в основном для преобразования
Р -> Р целых чисел, причём программирование метода упрощается, если
полином вычислять по схеме Горнера:
АР = (...((0 + ^,! )Р + ал_2)Р +... +aj)P + a0 . (1.40)
В этом случае рассмотренный ранее пример трансформации 2-> 10
числа 11012 имеет вид Л10 = (((0 + 1) х 2 + 1) х 2 + 0) х 2 + 1 = 13.
В основе второго метода перевода целых чисел P-+R лежит идея замены
фактического значения Р-ичного числа эквивалентным Р-ичным полиномом:
Ap-aRn-\ 'R + ••• + аЯ1 +aR0 » (1-41)
где Ар — фактическое значение Р-ичного числа; aRi — подлежащие опреде-
лению цифры эквивалентного Р-ичного числа. При делении обеих частей
— 65 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
этого равенства на основание R системы, в которую совершается перевод,
получаем целочисленное частное AP/R = aR(n_{yRn~2 + ... + aR[ и остаток
aRQ9 который является искомой младшей цифрой эквивалентного Р-ично-
го числа Ar. Продолжая деление частного на основание R, можно найти
очередную цифру aRi числа AR и т. д. Метод описывается рекуррентным
выражением
aRi = 1) ‘Я, (1.42)
где/1р(/+1) = ApJR', ApQ = AR, i = 0, 1,..., п — 1.
Процесс деления в формуле (1.42) заканчивается, как только Лр(/+1) ста-
нет равным нулю. Операции деления и вычитания выполняются по прави-
лам исходной Р-ичной арифметики, и в этой же системе формируются ис-
комые коэффициенты aRi. Например, перевод 10 -> 2 числа 13 имеет вид
л0= 13 - (13/2) х 2 = 1; а{ = 6 - (6/2) х 2 = 0; а2 = 3 - (3/2) х 2 = 1; а3 = 1 -
— (1/2) х 2 = 1 и, следовательно, 1310 = П012. Данный метод применим и
для обратного перевода R Р Например, преобразование 2 -> 10 для чис-
ла 11012 имеет вид aQ = 1101 — (1101/1010) х 1010 = 1101 - 1 х 1010 = 0011;
а{ = 0001 - (0001/1010) х 1010 = 0001 -0х 1010 = 0001. Для окончательной
записи числа необходимо коэффициенты я0, ai изобразить в десятичной
системе: 11012 = 1310.
В основе метода перевода Р R для дробных чисел лежит та же идея
представления Р-ичного числа эквивалентным Р-ичным полиномом, что и
для целых чисел:
= +б7я2'^ + ...+aRnR , (1.43)
где АРф — значение дроби в Р-ичной системе; aRl- — коэффициенты Р-ич-
ного представления, подлежащие определению. Очевидно, что эти коэф-
фициенты можно получить путём последовательного умножения на Р сна-
чала исходного числа АРф, а затем дробной части очередного
произведения, причём целая часть произведения соответствует очередно-
му Р-ичному коэффициенту, записанному в Р-ичной системе. Метод оп-
ределяется рекуррентными выражениями:
aRi = №p(j_!) • Р]; APi = {АР^_!) • Р}; ЛР0 = Акф, i = 1, 2,..., л, (1.44)
где скобки [ ] и {} обозначают соответственно целую и дробную части чис-
ла. Умножение выполняется по правилам Р-ичной арифметики и заканчи-
вается, как только APi станет равным нулю или будет достигнута требуемая
точность R-whqvq представления числа АРф, определяемая количеством
разрядов п. Например, преобразование 10->2 для дроби 0.75 имеет вид
= [0.75 х 2] = [1.5] = 1; а2 = [0.5 х 2] = 1 и, следовательно, 0.7510 = 0.112.
-66-
1.3. Программы преобразования чисел с плавающей точкой
Данный метод, как и предыдущие, применим и для обратного перевода
R -> Р. Например, преобразование 2 -> 10 для дроби 0.112 имеет вид:
а{ = [0.11 х 1010] = [111.1] =0111; а2 = [0.1 х 1010] = [101.0] =0101.
Преобразуя двоичные значения ах и а2 в эквивалентные десятичные, полу-
чим 0.112 = 0.7510.
Заметим, что процесс трансформации дробей в отличие от процесса
трансформации целых чисел, который всегда оканчивается через конеч-
ное число шагов, может быть бесконечным, т. е. представление Р-ичной
дроби в Р-ичной системе (или наоборот) может иметь бесконечное коли-
чество цифр. Поэтому переводы дробей в общем случае выполнимы лишь
приближённо. Число цифр в представлении Р-ичного числа необходимо
определять по условию соответствия его точности исходному Р-ичному
числу: Р~пР — R~nR, откуда
nR = «p/logpP, (1.45)
где пР, nR — количество цифр в изображении Р-ичного и Р-ичного чисел.
На практике используют целую часть выражения (1.45), увеличенную на
единицу. Например, если точность исходного десятичного числа с четырь-
мя значащими цифрами равна 5Г = 0.5 х 1000“1 = 0.05% (при симметричном
округлении), то его двоичное представление той же точности должно содер-
жать п = [4 х (log102)_1] + 1 = [13.3] + 1 = 14 двоичных разрядов (битов).
Для уменьшения погрешности преобразования целесообразно вычислить
также цифру следующего, 15-го разряда, но не сохранять её, а использо-
вать для округления двоичного числа.
Остановимся на методах преобразования чисел с плавающей точкой.
Пусть Ar = RmR-AR^ и АР = PmP‘Ap^ — эквивалентные числа с плавающей
точкой, представленные соответственно в Р-ичной и Р-ичной системах
счисления. Один из методов перевода Р -> Р заключается в предваритель-
ном преобразовании числа с плавающей точкой АР в число с фиксирован-
ной точкой, выделении целой и дробной частей этого числа, переводе их в
соответствии с рассмотренными выше методами в Р-ичную систему и пе-
реходе к числу с плавающей точкой АР. Так, преобразование 10 -> 2 для
числа Л10 = 102-0.1375 имеет вид: Л10 = 13.75; 1310 = 11012; 0.7510 = 0.112;
А2 = 1101.11 и, наконец, А2 = 24-0.110111. Данный метод применим лишь
для значений порядков, соизмеримых с разрядностью мантиссы, в против-
ном случае резко возрастают временные и аппаратные (объём используе-
мой памяти микроконтроллера) затраты на хранение и обработку нулей.
Общий метод преобразования заключается в том, что при переводе
Р~> Р числа АР отдельно преобразуют мантиссу АР$ и характеристику РтР
этого числа, причём каждое из этих чисел в Р-ичной системе формируется
-67-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
как число с плавающей точкой, а затем выполняются их умножение и нор-
мализация с окончательным получением мантиссы AR$ и характеристики
ЯтЛ, т.е. значения числа AR. Так, преобразование 10-> 2 для числа
Л10 = 102-0.1375 имеет вид
1О2о = 27-0.1100102; 0.137510 = 0.00100011... = (0.100011...)-2"2;
(1.46)
А2 = 27-0.110010-2“2 • (0.100011...) = 25-(0.011010...) = 24-(0.11010...).
Заметим, что в данном примере для получения двоичного числа А2 с
точностью числа Л10 надо брать 14 битов мантиссы. Подробности метода
преобразования поясняются далее при рассмотрении конкретных про-
грамм.
1.3.2. Преобразование дробных двоичных чисел в дробные
десятичные
Программам преобразования целых чисел из одной системы счисле-
ния в другую была посвящена вторая глава третьего тома нашей книги
«Микроконтроллеры? Это же просто!». Поэтому здесь мы не будем терять
время на повторное знакомство с уже рассмотренными там алгоритмами и
сразу перейдём к программам, работающим с дробными числами.
Подпрограмма PF16 преобразует двухбайтную двоичную дробь Л2 из
диапазона (0.0000...0.FFFFH) в эквивалентную пятиразрядную десяти-
чную дробь А10 из диапазона (0.00000...0.99999) по формуле (1.44). Моди-
фицируя (1.44) для случая преобразования из двоичной системы в десяти-
чную, получим
+ •••+ арпР~п- (Ь47)
Таким образом, умножив AR$ на Ю10= Ю102 и выделив целую часть
произведения, получим старший коэффициент аР1 в двоичном представле-
нии. Повторив операцию с оставшейся дробной частью, получим второй
коэффициент аР2в двоичном представлении и т. д. Как уже было показано
на примере выше, перевод двоичной дроби 0.112 в десятичное представле-
ние осуществляется в соответствии с этим алгоритмом так:
а, = [0.11 х 1010] = [111.1] = 0111 (выделили целую часть произведения);
а2 = [0.1 х 1010] = [101.0] = 0101 (снова выделили целую часть произведе-
ния, при этом дробная на этом шаге оказалась равной нулю, что свиде-
тельствует о завершении преобразования). Преобразуя двоичные значения
а, = 01112 = 7,о и а2 = 01012 = 510в эквивалентные десятичные, получим
0.112 = 0.75,0.
— 68 —
1.3. Программы преобразования чисел с плавающей точкой
Подпрограмма PF16
1137 0Е39
1138 0Е39
1139 0Е39
1140 0Е39
1141 0Е39
1142 0Е39
1143 0Е39
1144 0Е39
1145 0Е39
1146 0Е39
1147 0Е39
1148 0Е39
1149 0Е39
1150 0Е39
1151 0Е39
1152 0Е39
1153 0Е39
1154 0Е39
1155 0Е39
1156 0Е39
1157 0Е39
1158 0Е39
1159 0Е39
1160 0Е39
1161 0Е39 12 Е 11
1162 ОЕЗС СО Е0
1163 ОЕЗЕ 12 0Е 11
1164 0Е41 СО Е0
1165 0Е43 12 0Е 11
1166 0Е46 СО Е0
1167 0Е48 12 0Е 11
1168 0Е4В СО Е0
1169 0E4D 12 0Е И
1170 0Е50 FE
1171 0Е51 DO Е0
1172 0Е53 С4
1173 0Е54 4Е
1174 0Е55 FE
1175 0Е56 DO Е0
1176 0Е58 FF
1177 0Е59 DO Е0
1178 0Е5В С4
1179 0Е5С 4F
1180 0E5D FF
PF16 :
;Подпрограмма преобразования
/двоичного беззнакового числа с
/фиксированной перед старшим
/битом точкой формата 16 в
/двоично-десятичное число с фикси-
рованной точкой (.Р1Р2РЗР4Р5)
/формата 5x4.
/Входной параметр: R3,R2 - двоичное
/число.
/Выходной параметр: A,R7,R6 -
/эквивалентное двоично-десятичное
/число.
/Используются все регистры.
/Глубина стека - 6 байт.
/Используется подпрограмма
/UFC10.
LCALL UFC10
PUSH ACC
LCALL UFC10
PUSH ACC
LCALL UFC10
PUSH ACC
LCALL UFC10
PUSH ACC
LCALL UFC10
MOV R6,A
POP ACC
SWAP A
ORL A,R6
MOV R6,A
POP ACC
MOV R7,A
POP ACC
SWAP A
ORL A,R7
MOV R7,A
/Сохранение цифры Pl
/Сохранение цифры P2
/Сохранение цифры РЗ
/Сохранение цифры Р4
;R6 - цифра Р5.
;А - цифра Р4.
;R6 - цифры Р5 и Р4.
/R7 - цифра РЗ.
/А - цифра Р2.
/R7 - цифры РЗ и Р2.
-69-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1181 0Е5Е D0 ЕО POP ACC /А - цифра Pl
1182 0Е60 22 RET
1183 0Е61 /END PF16.
1184 0Е61 /
Подпрограмма PF16 выполняет последовательное умножение исход-
ной двоичной дроби на основание десятичной системы и выделение оче-
редной двоично-десятичной цифры с помощью подпрограммы UFC10:
1077 0E11
1078 0E11 UFC10:
1079 0E11 /Подпрограмма умножения двоич-
1080 0E11 /ного беззнакового числа с фикси-
1081 0Е11 ;рованной перед старшим разрядом
1082 0Е11 /точкой формата 16 на основание
1083 0Е11 /десятичной системы: 10.
1084 0Е11
1085 0Е11 /Входной параметр: R3,R2 - число
1086 0Е11 /С ФТ.
1087 0Е11
1088 0Е11 /Выходные параметры: А - целая
1089 0Е11 /часть произведения (двоично-деся-
1090 0Е11 /тичная цифра), R3,R2 - дробная
1091 0Е11 /часть произведения.
1092 0Е11
1093 0Е11 /Используются все регистры.
1094 0Е11
1095 0Е11 7D 00 MOV R5,#0 /Обнуление Ст.байта
1096 0Е13 СЗ CLR С
1097 0Е14 ЕА MOV A,R2
1098 0Е15 33 RLC А
1099 0Е16 FA MOV R2-,A
1100 0E17 FE MOV R6,A
1101 0E18 EB MOV A,R3
1102 0E19 33 RLC A
1103 0E1A FB MOV R3,A
1104 0E1B FF MOV R7,A
1105 0E1C ED MOV A,R5
1106 0E1D 33 RLC A
1107 0E1E FD MOV R5,A
1108 0E1F FC MOV R4,A /R5,R3,R2 умножили на 2,
1109 0E20 /R4,R7,R6 - копия произведения
1110 0E20 75 F0 02 MOV В,#2 /В - счётчик для умножения.
1111 0Е23 PLOOP:
1112 0Е23 ЕА MOV A,R2
1113 0Е24 33 RLC А
1114 0Е25 FA MOV R2,A
1115 0E26 EB MOV A,R3
— 70 —
1.3. Программы преобразования чисел с плавающей точкой
1116 0Е27 33 RLC A
1117 0Е28 FB MOV R3,A
1118 0Е29 ED MOV A,R5
1119 0Е2А 33 RLC A
1120 0Е2В FD MOV R5,A
1121 0Е2С D5 F0 F4 DJNZ B,PLOOP /Зацикливание.
1122 0E2F ;R5,R3,R2 умножено на 8.
1123 0E2F ЕА MOV A,R2
1124 ОЕЗО 2Е ADD A,R6
1125 0Е31 FA MOV R2,A
1126 0Е32 ЕВ MOV A,R3
1127 ОЕЗЗ 3F ADDC A,R7
1128 0Е34 FB MOV R3,A
1129 0Е35 ED MOV A,R5
ИЗО 0Е36 ЗС ADDC A,R4
1131 0Е37 FD MOV R5,A ;R5 (A)ZR3ZR2 - сумма произведе-
1132 0Е38 ний, т.е. исходное число, умно-
1133 0Е38 женное на 10.
1134 0Е38 22 RET
1135 0Е39 ;END UFC10.
1136 0Е39
Подпрограмма UFC10 умножает дробь на 10 по методу 10 = 8 + 2, ис-
пользуя команды сдвига и сложения. Целая часть произведения, т. е. иско-
мая цифра в двоично-десятичном представлении, находится в аккумуля-
торе. После выполнения подпрограммой PF16 очередного умножения
каждая очередная двоично-десятичная цифра сохраняется в стеке, а после
завершения цикла из пяти умножений, т. е. по достижении требуемой точ-
ности преобразований, эти данные извлекаются из стека и упаковываются
в формат результата.
Тестовые данные для подпрограммы PF16 можно взять из Табл. 1.4.
Таблица 1.4. Дробные числа Л16->Л10
Лб Лю
0.8000 0.50000
0.4000 0.25000
0.2000 0.12500
0.1000 0.06250
0.0800 0.03125
0.0400 0.01562
0.0200 0.00781
0.0100 0.00390
0.0080 0.00195
0.0040 0.00097
-71-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1.3.3. Преобразование двоичных чисел с плавающей точкой
в десятичные числа с плавающей точкой
Подпрограмма PDPZ2 преобразует двоичное знаковое число с плаваю-
щей точкой А2 = ±2",М2ф в эквивалентное двоично-десятичное число с
плавающей точкой Л10 = ±Ю'л,о-Л1Оф (Рис. 1.7). Эта программа необходима,
если результаты обработки нужно вывести для считывания оператором,
ибо человек лучше воспринимает числа в десятичной системе счисления,
нежели в двоичной (а тем более дробные или в формате с плавающей точ-
кой).
А2______
sJ т^+40Н)
__ I..L..1—1--1.1
А2ф(СтБ)
__I. 1.1.1.11.1
А2ф(МлБ)
__I_I,.i-J-
Рис. 1.7. Форматы двоичного А2 и десятичного А10 чисел в программе перевода PDPZ2.
Сначала программа проверяет значение преобразуемого числа и в слу-
чае равенства его нулю обнуляет область результата и завершает работу.
Если преобразуемое число отлично от нуля, программа переводит мантис-
су в прямой код и определяет модуль и знак несмещённого порядка. Далее
двоичная мантисса преобразуется при помощи уже рассмотренной выше
подпрограммы PF16 в эквивалентную пятиразрядную двоично-десяти-
чную мантиссу, которая затем сдвигается на один десятичный разряд влево
для выравнивания по границе байта, т. е. старший десятичный разряд ман-
тиссы оказывается в старшей тетраде байта.
Если двоичный несмещённый порядок оказывается равным нулю, пре-
образование числа в целом заканчивается: оно округляется, нормализуется
и записывается в память. При ненулевом порядке,в зависимости от его
знака выполняется либо умножение десятичной мантиссы на двоичную
характеристику подпрограммой UF102 (если знак порядка был «+»), либо
деление десятичной мантиссы на двоичную характеристику подпрограм-
мой DF102 (если знак порядка был «—»).
После умножения или деления десятичной мантиссы на двоичную ха-
рактеристику подпрограмма PDPZ2 осуществляет округление шестизнач-
ной мантиссы до четырёхзначной по симметричному способу, устраняет
— 72 —
1.3. Программы преобразования чисел с плавающей точкой
возможное после округления переполнение мантиссы при помощи под-
программы PMAN6 и записывает результат в память. Тестовые данные для
подпрограммы PDPZ2 можно взять из Табл. 1.5.
Таблица 1.5. Числа с плавающей точкой Я10->Я16
Лю Лю
0.1 000-10° 3DCCCC
0.1200-10° 3DF5C2
0.1800-10° ЗЕВ852
0.1200-101 419999
О.ЮОО-Ю2 449FFF
О.ЮОО-Ю3 47C7FF
О.ЮОО-Ю"5 2D8637
О.ЮОО-Ю"14 0F901D
О.ЮОО-Ю"18 01EC1F
О.ЮОО-Ю18 79В1 АО
Подпрограмма PDPZ2
1452 0F40
1453 0F40 PDPZ2:
1454 0F40 /Подпрограмма преобразования
1455 0F40 ;3-байтного двоичного числа в
1456 0F40 /дополнительном коде с плавающей
1457 0F40 /точкой формата [8, 16]=[Пор, Ман]
1458 0F40 /в 3-байтное двоично-десятичное
1459 0F40 /число с плавающей точкой в прямом
1460 0F40 /коде формата (+-0.P1P2P3P4*1OAN),
1461 0F40 /где байт порядка содержит бит
1462 0F40 /знака мантиссы и целочисленный
1463 0F40 /двоичный порядок со смещением
1464 0F40 /+40Н, а два байта мантиссы - дроб-
1465 0F40 /ное двоичное нормализованное число
1466 0F40 /в дополнительном коде, двоично-
1467 0F40 ;десятичное число содержит байт
1468 0F40 /порядка, в котором старший бит-
1469 0F40 /бит знака числа, 6-й бит - бит
1470 0F40 /знака порядка, а биты с 4-го по
1471 0F40 /0-й - порядок N в двоично-десятич-
1472 0F40 /ной форме, и 2 байта двоично-
1473 0F40 ;десятичной мантиссы.
— 73 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1474 0F40
1475 0F40 /Входные параметры: R0 - адрес
1476 0F40 /двоичного числа,R1 - адрес резуль-
1477 0F40 ,-тата.
1478 0F40
1479 0F40 /Сохраняются регистры R0 и R1.
1480 0F40
1481 0F40 /Используются подпрограммы:
1482 0F40 /UFC10, PF16, UF102, DF102, PMAN6.
1483 0F40
1484 0F40 /Глубина стека - 9 байт.
1485 0F40
1486 0F40
1487 0F40 Е6 MOV A,@R0
1488 0F41 08 INC R0
1489 0F42 46 ORL A,@R0
1490 0F43 08 INC R0
1491 0F44 46 ORL A,@R0
1492 0F45 18 DEC R0
1493 0F46 18 DEC R0 /Восстановили R0.
1494 0F47 70 08 JNZ PPER1 /Если число не равно нулю.
1495 0F49 F7 MOV @R1,A
1496 0F4A 09 INC R1
1497 0F4B F7 MOV @R1,A
1498 0F4C 09 INC R1
1499 0F4D F7 MOV @R1,A /Обнулили результат.
1500 0F4E 19 DEC R1
1501 0F4F 19 DEC R1 /Восстановили R1.
1502 0F50 22 RET
1503 0F51 PPER1:
1504 0F51 08 INC R0
1505 0F52 E6 MOV A,@R0
1506 0F53 FB MOV R3,A
1507 0F54 08 INC R0
1508 0F55 E6 MOV A,@R0
1509 0F56 FA MOV R2,A
1510 0F57 18 DEC R0 /R3,R2 - двоичн. мантисса числа
1511 0F58 18 DEC R0 /Восстановили R0.
1512 0F59 E6 MOV A,@R0
1513 0F5A 30 E7 0A JNB ACC.7,PPER2
1514 0F5D /Если число больше нуля.
1515 0F5D ЕА MOV A,R2
1516 0F5E F4 CPL A
1517 0F5F 24 01 ADD A,#l
1518 0F61 FA MOV R2,A
1519 0F62 EB MOV A,R3
-74-
1.3. Программы преобразования чисел с плавающей точкой
1520 0F63 F4 CPL A
1521 0F64 34 00 ADDC A,#0
1522 0F66 FB MOV R3,A /Мантисса в R3,R2 дополнена.
1523 0F67 PPER2:
1524 0F67 Е6 MOV A,@R0
1525 0F68 54 7F ANL A,#7FH
1526 0F6A СЗ CLR C
1527 0F6B 94 40 SUBB A,#40H /А - порядок числа.
1528 0F6D 20 Е7 04 JB ACC.7,PPER3
1529 0F70 /Если порядок меньше нуля.
1530 0F70 СО Е0 PUSH ACC /Модуль двоичн. порядка в стеке
1531 0F72 80 04 SJMP PPER4
1532 0F74 PPER3:
1533 0F74 F4 CPL A
1534 0F75 04 INC A
1535 0F76 СО Е0 PUSH ACC /Модуль двоичн. порядка в стеке
1536 0F78 PPER4:
1537 0F78 12 0Е 39 LCALLPF16
1538 0F7B FB MOV R3,A /R3,R7,R6 - дес. мантисса.
1539 0F7C ЕВ MOV A,R3
1540 0F7D 54 0F ANL A,#0FH
1541 0F7F С4 SWAP A
1542 0F80 FB MOV R3,A
1543 0F81 EF MOV A,R7
1544 0F82 54 F0 ANL A,#0F0H
1545 0F84 С4 SWAP A
1546 0F85 4В ORL A,R3
1547 0F86 FB MOV R3,A
1548 0F87 EF MOV A,R7
1549 0F88 54 OF ANL A,#0FH
1550 0F8A С4 SWAP A
1551 0F8B FF MOV R7,A
1552 0F8C ЕЕ MOV A,R6
1553 0F8D 54 FO ANL A,#0F0H
1554 0F8F С4 SWAP A
1555 0F90 4F ORL A,R7
1556 0F91 FF MOV R7,A
1557 0F92 ЕЕ MOV A,R6
1558 0F93 54 OF ANL A,#0FH
1559 0F95 С4 SWAP A
1560 0F96 FE MOV R6,A /R3,R7,R6 - нормализованное
1561 0F97 /число.
1562 0F97 D0 ЕО POP ACC /А - модуль двоичн. порядка.
1563 0F99 FD MOV R5,A /Если дв. порядок - 0, то и дес
1564 0F9A 60 12 JZ PPER5 /Если дв. порядок равен нулю.
1565 0F9C FC MOV R4,A /R4 - модуль дв. порядка.
-75-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1566 0F9D Е6 MOV A,@R0
1567 0F9E 54 7F ANL A,#7FH
1568 0FA0 СЗ CLR C
1569 0FA1 94 40 SUBB A,#40H
1570 0FA3 20 Е7 05 JB ACC.7,PPER6
1571 0FA6 /Если дв. порядок меньше нуля.
1572 0FA6 12 0Е 61 LCALLUF102 /Умножили дес. мантиссу.
1573 0FA9 80 03 SJMP PPER5
1574 OFAB PPER6:
1575 0FAB 12 ОЕ 96 LCALLDF102 /Разделили дес. мантиссу.
1576 OFAE PPER5:
1577 0FAE ЕЕ MOV A,R6
1578 0FAF СЗ CLR С
1579 0FB0 94 50 SUBB А,#50Н
1580 0FB2 20 Е7 0F JB ACC.7,PPER7
1581 0FB5 /Если не нужно округлять
1582 0FB5 /мантиссу.
1583 0FB5 EF MOV A,R7
1584 0FB6 24 01 ADD А,#1
1585 0FB8 D4 DA А
1586 0FB9 FF MOV R7,A
1587 0FBA ЕВ MOV A,R3
1588 0FBB 34 00 ADDC А##0
1589 OFBD D4 DA А
1590 OFBE FB MOV R3,A /Округлили мантиссу.
1591 OFBF 50 03 JNC PPER7 /Если нет переполнен, мантиссы
1592 0FC1 12 OF 00 LCALLPMAN6 /Нормализовали мантиссу.
1593 0FC4 PPER7:
1594 0FC4 E6 MOV A,@R0
1595 0FC5 54 80 ANL А,#80Н
1596 0FC7 F7 MOV @R1,A
1597 0FC8 ED MOV A,R5
1598 0FC9 54 80 ANL А,#80Н
1599 OFCB 03 RR А
1600 OFCC 47 ORL a,@ri
1601 OFCD F7 MOV @R1,A
1602 OFCE ED MOV A,R5
1603 OFCF 54 7F ANL A,#7FH
1604 0FD1 47 ORL a,@R1
1605 0FD2 F7 MOV @R1,A
1606 0FD3 09 INC R1
1607 0FD4 EB MOV A,R3
1608 0FD5 F7 MOV @R1,A
1609 0FD6 09 INC R1
1610 0FD7 EF MOV A,R7
1611 0FD8 F7 MOV @R1,A /Результат записан в память.
-76
1.3. Программы преобразования чисел с плавающей точкой
1612 0FD9 19 DEC R1
1613 0FDA 19 DEC R1
1614 0FDB 22 RET
1615 0FDC /END PDPZ2.
1616 0FDC /
;Восстановили R1.
Подпрограмма UF102 выполняет умножение шестиразрядной двоично-
десятичной беззнаковой мантиссы на двоичную характеристику 2^2 - 40Н1 с
формированием двоично-десятичной мантиссы и двоично-десятичного
Порядка. Умножение мантиссы осуществляется методом двоично-десяти-
чного сложения с накоплением. Если при сложении мантиссы самой с со-
бой и последующей десятичной коррекцией результата возникает перепол-
нение, то мантисса сдвигается на 1 десятичный разряд вправо, в старший
десятичный разряд помещается 1, а двоично-десятичный порядок на еди-
ницу увеличивается. Операция повторяется столько раз, каков порядок
двоичной характеристики.
Подпрограмма UF102
1185 0E61
1186 0E61 UF102:
1187 0E61 /Подпрограмма умножения 6-знач-
1188 0E61 ;ного беззнакового двоично-десятич-
1189 0Е61 ;ного числа с фиксированной перед
1190 0Е61 /старшим битом точкой на двоичную
1191 0Е61 /степень формата ,Р1Р2РЗР4Р5Р6*2ЛК=
1192 0Е61 /.R1R2R3R4R5R6*1OAM, где P(I),R(I)-
1193 0Е61 /двоично-десятич. цифра, К - двоич-
1194 0Е61 ,-ный порядок, М - двоично-десятич.
1195 0Е61 /порядок.
1196 0Е61
1197 0Е61 /Входные параметры: R3,R7,R6 -
£198 0Е61 /исходное число, R4 - двоичный
1199 0Е61 /порядок.
1200 0Е61
1201 0Е61 /Выходные параметры: R3,R7,R6 -
£202 0Е61 /результирующее десятичное число,
1203 0Е61 /R5 - десятичный порядок.
1204 0Е61
1205 0Е61 /Используются все регистры, кроме
1206 0Е61 /В, R0, R1.
1207 0Е61
£208 0Е61 7D 00 MOV R5,#0 /Обнуление дес.порядка
1209 0Е63 UFCYCLE:
J.210 0Е63 ЕЕ MOV A,R6
-Т1-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1211 0Е64 2Е ADD A,R6
1212 0Е65 D4 DA A
1213 0Е66 FE MOV R6,A
1214 0Е67 EF MOV A,R7
1215 0Е68 3F ADDC A,R7
1216 0Е69 D4 DA A
1217 0Е6А FF MOV R7ZA
1218 0Е6В ЕВ MOV A,R3
1219 0Е6С ЗВ ADDC A,R3
1220 0E6D D4 DA A
1221 0Е6Е FB MOV R3,A ;R3,R7,R6 умножено на 2
1222 0E6F ;в дес. виде.
1223 0E6F 50 22 JNC UFLP1 ;Если нет переполнения.
1224 0Е71 ЕЕ MOV A,R6
1225 0Е72 54 F0 ANL A,#0F0H
1226 0Е74 С4 SWAP А
1227 0Е75 FE MOV R6,A
1228 0Е76 EF MOV A,R7
1229 0Е77 54 0F ANL A,#0FH
1230 0Е79 С4 SWAP A
1231 0Е7А 4Е ORL A,R6
1232 0Е7В FE MOV R6,A
1233 0Е7С EF MOV A,R7
1234 0E7D 54 F0 ANL A,#0F0H
1235 0E7F С4 SWAP A
1236 0Е80 FF MOV R7,A
1237 0Е81 ЕВ MOV A,R3
1238 0Е82 54 0F ANL A,#0FH
1239 0Е84 С4 SWAP A
1240 0Е85 4F ORL A,R7
1241 0Е86 FF MOV R7,A
1242 0Е87 ЕВ MOV A,R3
1243 0Е88 54 F0 ANL A,#0F0H
1244 0Е8А С4 SWAP A
1245 0Е8В 44 10 ORL A,#10H
1246 0E8D FB MOV R3ZA ;R3ZR7ZR6 сдвинуто на дес ..разряд
1247 0Е8Е ;вправо, его старший дес.
1248 0Е8Е ;разряд установлен в 1.
1249 0Е8Е ED MOV A,R5
1250 0E8F 24 01 ADD А,#1
1251 0Е91 D4 DA А
1252 0Е92 FD MOV R5,A ;Дес. порядок скорректирован.
1253 0Е93 UFLP1:
1254 0Е93 DC СЕ DJNZ R4,UFCYCLE
1255 0Е95 ;Зацикливание.
1256 0Е95 22 RET
-78-
1.3. Программы преобразования чисел с плавающей точкой
1257 0Е96 /END UF102.
1258 0Е96
Подпрограмма PMAN6 в случае переполнения двоично-десятичной ман-
тиссы в программе PDPZ2 сдвигает мантиссу на один десятичный разряд
вправо и должным образом корректирует десятичный порядок. Если знак
порядка «+», то коррекция порядка осуществляется увеличением его на 1 с
последующей десятичной коррекцией результата. При отрицательном по-
рядке он переводится в дополнительный код (вычитается из 100), корректи-
руется как положительный и затем снова переводится в дополнительный
код.
Подпрограмма PMAN6
1375 0F00
1376 0F00 PMAN6:
1377 0F00 /Подпрограмма устранения пере-
1378 0F00 полнения 6-значной беззнаковой
1379 0F00 /двоично-десятичной мантиссы с пла-
1380 0F00 вающей точкой.
1381 0F00 ;
1382 0F00 ;Входные параметры: R3,R7,R6 -
1383 0F00 /десятичная мантисса, R5-десятичный
1384 0F00 /порядок со знаком (модуль порядка
1385 0F00 /меньше 79).
1386 0F00 /
1387 0F00 /Выходные параметры: R3,R7,R6 -
1388 0F00 /нормализованная мантисса, R5 -
1389 0F00 /десятичный порядок со знаком.
1390 0F00 /
1391 0F00 /Сохраняются регистры В, R0, R1,
1392 0F00 / R2, R4.
1393 0F00 /
1394 0F00 ЕЕ MOV A,R6
1395 0F01 54 F0 ANL A,#0F0H
1396 0F03 С4 SWAP A
1397 0F04 FE MOV R6, A
1398 0F05 EF MOV A,R7
1399 0F06 54 0F ANL A,#0FH
1400 0F08 С4 SWAP A
1401 0F09 4Е ORL A,R6
1402 0F0A FE MOV R6,A
1403 0F0B EF MOV A,R7
1404 0F0C 54 F0 ANL A,#0F0H
1405 0F0E С4 SWAP A
1406 0F0F FF MOV R7,A
— 79
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1407 0F10 ЕВ MOV A,R3
1408 0F11 54 0F ANL A,#0FH
1409 0F13 С4 SWAP A
1410 0F14 4F ORL A,R7
1411 0F15 FF MOV R7,A
1412 0F16 ЕВ MOV A,R3
1413 0F17 54 F0 ANL A,#0F0H
1414 0F19 С4 SWAP A
1415 0F1A 44 10 ORL A,#10H
1416 0F1C FB MOV R3,A /R3,R7,R6 сдвинуто на дес.разряд
1417 0F1D /вправо, его старший дес.
1418 0F1D /разряд установлен в 1.
1419 0F1D
1420 0F1D ED MOV A,R5
1421 0F1E 20 Е7 05 JB ACC.7,MINUS
1422 0F21 /Если порядок меньше нуля.
1423 0F21 24 01 ADD А,#1
1424 0F23 D4 DA А
1425 0F24 FD MOV R5,A /Положительный порядок
1426 0F25 /скорректирован.
1427 0F25 22 RET
1428 0F26 MINUS
1429 0F26 54 7F ANL A,#7FH
1430 0F28 FD MOV R5,A
1431 0F29 74 99 MOV А,#99Н
1432 0F2B СЗ CLR С
1433 0F2C 9D SUBB A,R5
1434 0F2D 24 02 ADD А,#2
1435 0F2F D4 DA А
1436 0F30 FD MOV R5,A
1437 0F31 74 99 MOV А,#99Н
1438 0F33 СЗ CLR С
1439 0F34 9D SUBB A,R5
1440 0F35 24 01 ADD А,#1
1441 0F37 D4 DA А
1442 0F38 FD MOV R5,A /Отрицательный порядок
1443 0F39 /скорректирован.
1444 0F39 70 01 JNZ WM /Если порядок не равен нулю.
1445 0F3B 22 RET /Если порядок равен нулю.
1446 0F3C WM:
1447 0F3C 44 80 ORL А,#80Н
1448 0F3E FD MOV R5,A /Знак порядка вставлен.
1449 0F3F 22 RET
1450 0F40 /END PMAN6.
1451 0F40
-80-
1.3. Программы преобразования чисел с плавающей точкой
Деление двоично-десятичной мантиссы на двоичную характеристику
2|m2-40H| ВЫПолняется подпрограммой DF102. Подпрограмма осуществля-
ет деление методом последовательной выборки десятичных цифр делимо-
го, начиная со старшей цифры, и деления их на 2 путём сдвига выбранной
цифры на один двоичный бит (разряд) вправо. При этом формируются де-
сятичная цифра частного и остаток отделения, равный 0 или 1. Этот оста-
ток умножается на Ю10 = 10102 и в сумме со следующей цифрой делимого
служит основой для получения после очередного деления следующей циф-
ры частного. За 6 циклов сдвига формируется 6-разрядное десятичное час-
тное от деления мантиссы на 2 и одноразрядный десятичный остаток. Да-
лее частное нормализуется влево и производится коррекция десятичного
порядка. Этот процесс повторяется 2^ “40Н* раз, после чего деление закан-
чивается.
Подпрограмма DF102
1259 0Е96
1260 0Е96 DF102:
1261 0Е96 ;Подпрограмма деления 6-значного
1262 0Е96 ;беззнакового двоично-десятичного
1263 0Е96 ;числа с фиксированной перед старш.
1264 0Е96 /разрядом точкой на двоичную сте-
1265 0Е96 ;пень формата .Р1Р2РЗР4Р5Р6/2АК =
1266 0Е96 ;.R1R2R3R4R5R6*1OAM, где P(I),R(I)-
1267 0Е96 /двоично-десятич. цифра, К - двоич-
1268 0Е96 /ный порядок, М - двоично-десятич.
1269 0Е96 /порядок.
1270 0Е96
1271 0Е96 /Входные параметры: R3,R7,R6 -
1272 0Е96 /исходное число, R4 - двоичный
1273 0Е96 /порядок.
1274 0Е96
1275 0Е96 /Выходные параметры: R3,R7,R6 -
1276 0Е96 /результирующее десятичное число,
1277 0Е96 ;R5 - десятичный порядок.
1278 0Е96
1279 0Е96 /Используются все регистры, кроме
1280 0Е96 /RO, R1.
1281 0Е96
1282 0Е96 7D 00 MOV R5,#0 /Обнуление дес.порядка.
1283 0Е98 DFCYCLE1:
1284 0Е98 75 F0 06 MOV В,#6 /Счётчик десятичных цифр
1285 0Е9В Е4 CLR А /А=0 - первый остаток.
1286 0Е9С DFCYCLE2:
— 81
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1287 0Е9С FA MOV R2ZA ;R2 - остаток.
1288 0E9D ЕВ MOV A,R3
1289 0Е9Е 54 F0 ANL A,#0F0H
1290 0EA0 С4 SWAP A
1291 0ЕА1 2А ADD A,R2
1292 0ЕА2 FA MOV R2,A ;R2 - цифра + остаток,умноженный
1293 ОЕАЗ ;на 10.
1294 ОЕАЗ ЕВ MOV A,R3
1295 0ЕА4 54 0F ANL A,#0FH
1296 0ЕА6 С4 SWAP A
1297 0ЕА7 FB MOV R3,A
1298 0ЕА8 EF MOV AZR7
1299 0ЕА9 54 F0 ANL A,#0F0H
1300 0EAB С4 SWAP A
1301 ОЕАС 4В ORL A,R3
1302 OEAD FB MOV R3,A
1303 ОЕАЕ EF MOV A,R7
1304 0EAF 54 OF ANL A,#0FH
1305 0ЕВ1 С4 SWAP A
1306 0ЕВ2 FF MOV R7,A
1307 ОЕВЗ ЕЕ MOV A,R6
1308 0ЕВ4 54 F0 ANL Az#0F0H
1309 0ЕВ6 С4 SWAP A
1310 0ЕВ7 4F ORL A,R7
1311 0ЕВ8 FF MOV R7,A
1312 0ЕВ9 ЕЕ MOV AZR6
1313 ОЕВА 54 OF ANL AZ#OFH
1314 ОЕВС С4 SWAP A
1315 OEBD FE MOV R6ZA ;R3ZR7ZR6 сдвинуто на дес.разряд
1316 ОЕВЕ ;влево.
1317 ОЕВЕ ЕА MOV AZR2
1318 0EBF СЗ CLR C
1319 ОЕСО 13 RRC A ;CY - следующий остаток.
1320 0ЕС1 4Е ORL AZR6
1321 0ЕС2 FE MOV R6ZA /Запись цифры частного.
1322 ОЕСЗ Е4 CLR A
1323 0ЕС4 92 ЕЗ MOV ACC.3ZC
1324 0ЕС6 92 Е1 MOV ACC.1,C /А-остаток.умноженный на 10.
1325 0ЕС8 D5 FO D1 DJNZ В,DFCYCLE2
1326 ОЕСВ /Зацикливание.
1327 ОЕСВ ЕВ MOV AZR3
1328 ОЕСС 54 F0 ANL Az#0F0H
1329 ОЕСЕ 70 26 JNZ DFLP1 /Если старшая цифра не равна
нулю.
1330 0ED0 ЕВ MOV AZR3
-82
1.3. Программы преобразования чисел с плавающей точкой
1331 0ED1 54 0F ANL A,#0FH
1332 0ED3 С4 SWAP A
1333 0ED4 FB MOV R3,A
1334 0ED5 EF MOV A,R7
1335 0ED6 54 F0 ANL A,#0F0H
1336 0ED8 С4 SWAP A
1337 0ED9 4В ORL A,R3
1338 OEDA FB MOV R3,A
1339 OEDB EF MOV A,R7
1340 0EDC 54 0F ANL A,#0FH
1341 0EDE С4 SWAP A
1342 OEDF FF MOV R7,A
1343 0EE0 ЕЕ MOV A,R6
1344 0ЕЕ1 54 F0 ANL A,#0F0H
1345 ОЕЕЗ С4 SWAP A
1346 0ЕЕ4 4F ORL A,R7
1347 0ЕЕ5 FF MOV R7,A
1348 0ЕЕ6 ЕЕ MOV A,R6
1349 0ЕЕ7 54 0F ANL A,#0FH
1350 0ЕЕ9 С4 SWAP A
1351 ОЕЕА FE MOV R6,A ;R3,R7,R6 - нормализованное
1352 ОЕЕВ ;число.
1353 ОЕЕВ 50 04 JNC DFLP2 /Если остаток равен нулю.
1354 0EED 74 05 MOV А,#5 ;А - десятичный остаток.
1355 OEEF 4Е ORL A,R6
1356 OEFO FE MOV R6,A /Запись остатка в частное.
1357 0EF1 DFLP2:
1358 0EF1 ED MOV A,R5
1359 0EF2 24 01 ADD А,#1
1360 0EF4 D4 DA А
1361 0EF5 FD MOV R5,А ;Порядок скорректирован.
1362 0EF6 DFLP1:
1363 0EF6 DC АО DJNZ R4,DFCYCLE1
1364 0EF8 /Зацикливание.
1365 0EF8 ED MOV A,R5
1366 0EF9 70 01 JNZ CL /Если дес. порядок меньше нуля.
1367 0EFB 22 RET /Если дес. порядок равен нулю.
1368 0EFC CL:
1369 0EFC 44 80 ORL А,#80Н
1370 OEFE FD MOV R5,A /Знак порядка вставлен.
1371 0EFF 22 RET /Если десятичный порядок меньше
1372 0F00 /нуля.
1373 0F00 /END DF102.
1374 0F00
-83
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1.3.4. Преобразование целых двоичных чисел в двоичные числа
с плавающей точкой
Подпрограмма CDPZ3 преобразует целое двоичное беззнаковое число в
двоичное число с плавающей точкой формата А2 = +2'”: Л2ф. Это необходимо
в том случае, когда исходными данными для расчёта являются сигналы с
тех или иных датчиков, обслуживаемых микроконтроллером.
В большинстве практических случаев разрядность датчиков ограниче-
на шестнадцатью битами, поэтому данная подпрограмма ориентирована
на перевод в форму с плавающей точкой именно 16-битного целого числа.
Если же вы изучите работу CDPZ3, то вам не составит большого труда на-
писать программу и для чисел большей разрядности.
Данный метод преобразования основан на том, что максимальное це-
лое 16-битное число 0FFFFH в форме с плавающей точкой имеет вид:
0FFFFH = 250H 0.FFFFH. Поэтому подпрограмма запоминает максималь-
ный порядок (50Н) и начинает анализ старших битов преобразуемого цело-
го числа. Если старший бит равен 0, то преобразуемое число сдвигается на
1 бит влево, а порядок уменьшается на 1. Операция повторяется до тех пор,
пока в старшем бите мантиссы не окажется 1.
Подпрограмма CDPZ3
1617 0FDC
1618 OFDC CDPZ3:
1619 0FDC /Подпрограмма преобразования
1620 0FDC ;целого двоичного 2-байтного числа
1621 0FDC ;в число с плавающей точкой.
1622 0FDC ;Входные параметры: R0 - адрес МлБ
1623 0FDC /целого числа,R1 - адрес результата.
1624 0FDC /Используются регистры A, PSW, R3,
1625 OFDC /R2.
1626 0FDC
1627 OFDC Е6 MOV A,@R0
1628 OFDD FA MOV R2,A
1629 OFDE 08 INC RO
1630 OFDF E6 MOV A,@R0
1631 0FE0 FB MOV R3,A /Поместили число в R3,R2.
1632 0FE1 18 DEC RO /Восстановили RO.
1633 0FE2 77 50 MOV @Rl,#50H /Помест.нач.порядок в память
1634 0FE4 ЕВ MOV A,R3 /A-СтБ Ман.
1635 0FE5 4А ORL A,R2
1636 0FE6 70 0А JNZ CCONT /Если мантисса не равна нулю
1637 0FE8 F7 MOV @R1,A /Обнуление порядка.
1638 0FE9 CEND:
-84-
1.3. Программы преобразования чисел с плавающей точкой
1639 0FE9 09 INC R1
1640 0FEA ЕВ MOV A,R3
1641 0FEB F7 MOV @R1,A
1642 0FEC 09 INC R1
1643 0FED ЕА MOV A,R2
1644 0FEE F7 MOV @R1,A /Записали мантиссу.
1645 0FEF 19 DEC R1
1646 0FF0 19 DEC R1 /Восстановили Rl.
1647 0FF1 22 RET
1648 0FF2 CCONT:
1649 0FF2 ЕВ MOV A,R3 /А-СтБ Ман.
1650 0FF3 20 Е7 F3 JB ACC.7,CEND
1651 0FF6 /Если число нормализовано.
1652 0FF6 СЗ CLR C
1653 0FF7 ЕА MOV A,R2
1654 0FF8 33 RLC A
1655 0FF9 FA MOV R2,A
1656 0FFA ЕВ MOV A,R3
1657 0FFB 33 RLC A
1658 0FFC FB MOV R3,A /Мантисса R3,R2 сдвинута влево
1659 0FFD 17 DEC @R1 /Уменьшили порядок.
1660 0FFE 80 F2 SJMP CCONT /Зацикливание.
1661 1000 /END CDPZ3.
1662 1000 /
1663 1000 /
1.3.5. Преобразование двоичного числа с плавающей точкой
в целое двоичное число
Подпрограмма UCDPZ3 преобразует положительное двоичное число с
плавающей точкой формата Л2 = +2"’2-Л2ф в целое двоичное 16-битное без-
знаковое число. Это необходимо в том случае, когда выходной сигнал, по-
лученный в результате расчёта, будет использован в системе управления,
основным элементом которой будет управляемый микроконтроллером
цифро-аналоговый преобразователь (ЦАЩ-
В большинстве практических случаев разрядность ЦАП ограничена
12... 14 битами, поэтому данная подпрограмма ориентирована на перевод в
целочисленную форму положительных чисел с плавающей точкой, не пре-
вышающих 250h-0.3FFFH. Переписать программу для чисел большей раз-
рядности не представляет особого труда.
Суть преобразования заключается в том, что мантисса числа сдвигает-
ся вправо (с одновременным увеличением порядка при каждом сдвиге на
1) до тех пор, пока порядок числа не достигнет значения 50Н. Если преоб-
разуемое число не превышает 1, то результат преобразования выбирается
-85-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
равным 1. Если преобразуемое число больше или равно 16384, то результат
преобразования выбирается равным 16383.
Подпрограмма UCDPZ3
1068 0А42
1069 0А42 UCDPZ3:
1070 0А42 /Программа преобразования числа из
1071 0А42 /формы с ПТ в целочисленное двух-
1072 0А42 /байтовое значение с ограничением
1073 0А42 /0001... 16383. Мантисса преобразу-
1074 0А42 /емого числа сдвигается вправо (с
1075 0А42 /одновременным увеличением порядка
1076 0А42 /на 1) до тех пор, пока порядок не
1077 0А42 /достигнет 5ОН.
1078 0А42
1079 0А42 /Входные параметры: R1 - преобра-
1080 0А42 /зуемое число в формате с ПТ.
1081 0А42
1082 0А42 /Выходные параметры: R0 - ко-
1083 0А42 /нечный результат.
1084 0А42
1085 0А42 /Используются регистры A, R5, R4,
1086 0А42 /R0, R1
1087 0А42
1088 0А42 /Глубина стека -2+3=5 байт
1089 0А42
1090 0А42 /R0 и R1 сохраняются.
1091 0А42
1092 0А42
1093 0А42
1094 0А42
1095 0А42
1096 0А42
1097 0А42 /Анализируем знаковый бит, если
1098 0А42 /он = 0, переходим на метку NXT1
1099 0А42 Е7 MOV A,@R1
1100 0А43 54 80 ANL А,#10000000В
1101 0А45 60 0В JZ NXT1
1102 0A47 /Действия для числа <1 (в т.ч. <0)
1103 0А47 NEGAT:
1104 0А47 74 01 MOV А, #01
1105 0А49 F6 MOV @R0,A
1106 0А4А 08 INC R0
1107 0A4B 74 00 MOV A,#0
1108 0A4D F6 MOV ORO,A
-86-
1.3. Программы преобразования чисел с плавающей точкой
1109 0А4Е 18 DEC R0
1110 1111 1112 0A4F 02 0А 0А52 0А52 87 LJMP EUCPZ3 /рез.=0001 /Проверяем порядок преобразуемого числа NXT1:
1113 0А52 Е7 MOV A,@R1
1114 0А53 СЗ CLR С
1115 0А54 94 41 SUBB А,#41Н /сравним с 41Н
1116 1117 0А56 40 EF 0А58 JC NEGAT /при CY = 1, 0<П<1, /переходим на NEGAT
1118 0А58 Е7 MOV A,@R1
1119 0А59 СЗ CLR С
1120 0А5А 94 4F SUBB A,#4FH /сравним c 4FH
1121 1122 1123 1124 1125 0А5С 40 0В 0А5Е 0А5Е 0А5Е 0А5Е JC NXT2 /при CY = 1 /п < 16383, /переходим на NXT2 /Действия для числа, большего 16383 BIG:
1126 0А5Е 74 FF MOV A,#0FFH
1127 0А60 F6 MOV ORO, A
1128 0А61 08 INC R0
1129 0А62 74 3F MOV A,#03FH
ИЗО 0А64 F6 MOV ORO, A
1131 0А65 18 DEC R0
1132 1133 1134 0А66 02 0А 0А69 0А69 87 LJMP EUCPZ3 /рез.= 16383 NXT2:
1135 0А69 09 INC R1
1136 0А6А Е7 MOV A,OR1
1137 0А6В FD MOV R5,A
1138 0А6С 09 INC R1
1139 0A6D Е7 MOV A,OR1
1140 0А6Е FC MOV R4,A /мант, в R5R4
1141 0A6F 19 DEC R1
1142 0А70 19 DEC R1 ,-coxp. R1
1143 1144 1145 1146 1147 1148 1149 1150 0А71 Е7 0А72 0А72 0А72 0А72 0А72 0А72 0А72 MOV A,@R1 /в аккумуляторе - порядок /числа, его значение лежит /между 41 и 47 /Сдвиг мантиссы на 1 бит вправо /с одновременным увеличением порядка /на 1. Действие повторяем до тех пор, /пока порядок не достигнет 5ОН NXT3:
1151 0А72 В4 50 02 CJNE A,#50H,NXT4/= 50Н ?
1152 0А75 80 0А SJMP NXT5 /да, вых.
1153 0А77 СО Е0 NXT4: PUSH ACC
1154 0А79 12 ОА 88 LCALLPOSD /сдвиг
-87-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1155 0А7С D0 ЕО POP ACC
1156 0А7Е 04 INC А /разр.= разр.+1
1157 0A7F 80 F1 SJMP NXT3
1158 0А81 /Запись результата в память
1159 0А81 NXT5:
1160 0А81 ЕС MOV A,R4
1161 0А82 F6 MOV @R0,A /МлБ
1162 0А83 08 INC R0
1163 0А84 ED MOV A,R5
1164 0А85 F6 MOV @R0,А /СтБ
1165 0А86 18 DEC R0 /восст. R0
1166 0А87
1167 0А87 EUCPZ3:
1168 0А87 22 RET
1169 0А88 /Подпрограмма сдвига числа в R5R4
1170 0А88 /на 1 бит вправо
1171 0А88 POSD:
1172 0А88 СЗ CLR C
1173 0А89 ED MOV A,R5
1174 0А8А 13 RRC A
1175 0А8В FD MOV R5,A
1176 0А8С ЕС MOV A,R4
1177 0A8D 13 RRC A
1178 0А8Е FC MOV R4,A
1179 0A8F 22 RET
1180 0А90 /
1181 0А90 /
1182 0А90 /
1183 0А90 9
1184 0А90 9
1.4. Программы вычисления элементарных функций
1.4.1. Общие сведения
Настоящий раздел посвящен применению описанных в предыдущих
разделах арифметических подпрограмм для решения более сложных задач
численной обработки данных, к которым относятся, в частности, задачи
вычисления некоторых основных элементарных функций и факториала.
Существует много различных методов вычисления элементарных функ-
ций, использующих представления их в виде степенных рядов, цепных
дробей, итерационных процессов, разложений по ортогональным много-
членам, рациональных приближений, бесконечных произведений и др.
Применение того или иного метода зависит от ряда условий, в том числе
— 88 —
1.4. Программы вычисления элементарных функций
от требуемой точности, допустимых аппаратных (используемой памяти
микроконтроллера) и временных затрат на выполнение программ. Мы ог-
раничимся основными вопросами вычисления элементарных функций
преимущественно в рамках их наиболее простого и универсального пред-
ставления в виде степенных рядов Тейлора (как исключение, для вычисле-
ния квадратного корня мы будем использовать итерационный метод).
Рассмотрим классификацию элементарных функций. Самые простые
элементарные функции принадлежат к классу целых рациональных функ-
ций, которые в общем виде можно представить полиномом (многочленом)
я-й степени:
п
у = F(x) = '^aix , (1.48)
i = 0
где п — натуральное число или нуль; ah х — действительные числа.
В рамках класса выделяют обычно функции: постоянную у = а; линей-
ную у = ах 4- Ь; квадратичную у = ах2 + Ьх + с, а также функции л-й степе-
ни. Важный частный случай у = х" задает степенную функцию с целочис-
ленным показателем. Данный класс образуется в результате выполнения
конечного числа сложений (вычитаний) и умножений двух простых функ-
ций: постоянной у = а и линейной у —х.
Добавление к классу целых рациональных функций операции деления
полиномов порождает класс дробно-рациональных функций'.
F(r\ апх + ...+Д.Х +л0
У = = —п----------Ц----Е(х) * 0. (1.49)
^(х) bnx + ...+bxx + bQ
В рамках класса выделяют функции: обратной пропорциональности
у = а/х, дробно-линейную у = (ах + b)/(cx + J) и нелинейную дробно-ра-
циональную у — а + Ь/х 4- с/х2. Сложная функция, т. е. вида у = F [у(х)], со-
ставленная из дробно-рациональных функций, также принадлежит к это-
му классу.
Добавление к классу целых или дробно-рациональных функций опера-
ции отыскания обратной функции, те. х=Ф(у) для y = F(x), порождает
класс иррациональных функций. Типичными представителями этого класса
являются функция извлечения корня y=x1/w (обратная для степенной
Функции У=хЛ) и степенная функция с рациональным показателем у =х\
где к = т/п (т, п — взаимно простые числа). Рассмотренные три класса
Функций в целом образуют более широкий класс алгебраических функций.
Функции, не являющиеся алгебраическими, принадлежат к классу
Трансцендентных. К ним относятся: показательная у = а* (я > 0), логариф-
мическая у = 1о&рс, тригонометрические, гиперболические и обратные к ним
-89-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
функции. Перечисленные алгебраические и трансцендентные функции
образуют множество основных элементарных функций — аналитически за-
данных в виде единых формул, использующих конечное число алгебраи-
ческих операций и операций образования сложных функций, причём сами
операции, их число и порядок выполнения не зависят от значений аргу-
мента. Все остальные функции называют неэлементарными. Если функция
неэлементарна, то число операций над аргументом, либо сами операции,
либо те и другие изменяются в зависимости от значения аргумента. При-
мером неэлементарной функции является факториал у =п\ = 1-2-3-...77.
Здесь количество операций зависит от значения аргумента.
Вычисление рациональных и дробно-рациональных алгебраических
функций осуществляется на основе точных аналитических записей этих
функций, определяющих количество, тип и последовательность выполне-
ния арифметических операций. Для минимизации вычислительных ресур-
сов аналитическая запись функции может быть эквивалентно преобразо-
вана, но в любом случае она остается точной в том смысле, что если точно
заданы значения аргумента, точно выполнены арифметические операции,
то гарантированно получается точное значение функции в виде рацио-
нального числа. Аналогичный способ вычисления неприменим в случае
трансцендентных функций, так как их аналитическая запись, например
у = sin х, не позволяет непосредственно вычислять значение функции по
значению аргумента с помощью арифметических операций. Трансценден-
тные функции определяются, как правило, приближённо на основе таб-
лиц соответствующей точности. Программная реализация табличного вы-
числения этих функций очень громоздка, поэтому основной способ их вы-
числения заключается в замене (аппроксимации) исходной
трансцендентной функции некоторой другой, алгебраической функцией,
близкой к исходной по своим значениям в определенном диапазоне изме-
нения аргумента и вычисляемой достаточно экономичным способом с по-
мощью арифметических операций. Рассмотрим этот способ.
Пусть F(x) — точная элементарная функция; S(x) — её приближение
(аппроксимирующая функция) на интервале х е (а, Ь). Заметим, что аппрок-
симация выполняется, как правило, не для всей области определения фун-
кции, а только для сравнительно небольшой её части, что облегчает выбор
подходящей функции S(x). Для вычисления F(x) на ином интервале могут
потребоваться либо другая аппроксимирующая функция, либо специаль-
ные формулы перерасчёта значений функции с одного интервала её зада-
ния на другой интервал. Замена функции F(x) на S(x) порождает ошибку
метода вычисления r(x) = F(x) — S(x). Для оценки точности такого при-
ближения вводят некоторые числовые характеристики ошибки г(х) на ин-
тервале (а, Ь) — нормы функции г(х). В качестве одной из таких норм ис-
пользуют равномерную норму — верхнюю границу, аналогичную гранич-
-90-
1.4. Программы вычисления элементарных функций
ной абсолютной ошибке г(х) < г, где г = max |г(х)| на (а, Ь). Относительная
ошибка метода 5(х) = r(x)/F(x), а граничная 6(х)г = |г/5(х)|.
Элементарные функции принадлежат к классу функций, точно пред-
ставимых степенными рядами:
Г(х) = ^o/x-Xq)', (1.50)
1 = 0
гдех0 — постоянная величина. Выражение (1.50) представляет собой раз-
ложение функции Р(х) в степенной ряд по степеням (х - х0). При х0 = 0 ряд
из выражения (1.50) преобразуется к более простому виду:
Дх) = ^\х1. (1.51)
i = 0
Ряд вида (1.51) всегда сходится при х = 0, т. е. имеет конечный предел
своих частичных сумм. Возможны три случая сходимости этого ряда в дру-
гих точках:
1. Ряд расходится во всех точках, кроме х = 0.
2. Ряд сходится во всех точках.
3. Ряд сходится в одних точках и расходится в других.
Последний вариант наиболее типичен.
В общем случае область сходимости степенного ряда есть некоторый
промежуток — интервал сходимости (-R, R), симметричный относительно
точки х = 0, где R — радиус сходимости. Если ряд сходится во всех точках,
то R = оо; если сходится только в точке х = 0, то R = 0. Для ряда (1.50) ин-
тервал сходимости имеет вид (х0 - R, х0 + R). Элементарные функции
представляются степенными рядами, у которых радиус сходимости отли-
чается от нуля, а сумма тождественно равна данной функции всюду внутри
интервала сходимости.
Согласно известной теореме, если функция разлагается в степенной
ряд, то разложение (1.50) единственно и ряд совпадает с рядом Тейлора,
расположенным по степеням (х - х0):
»/°(х0) ,
Лх) = 2^—— (х“хо) , (1-52)
/• = 0
где /*)(х0) — производная z-го порядка функции F(x) в точке х =х0. В фор-
муле (1.52) коэффициенты я, степенного ряда (1.50) определены через зна-
чения функции F(x) и её производных в начальной точке х — х0. Обрывая
Ряд (1.52) на п-м члене, получаем полином Тейлора Sn(x) п-й степени:
-91-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
ЗД = £^^(х-х0)'\ (1.53)
/ = 0
который позволяет вычислять значения функции F(x) с определённой точ-
ностью, т. е. F(x)« Sn(x). Ошибка метода гя(х) = F(x) — Sn(x), а гп(х) можно
рассматривать как дополнительный член ряда: F(x) = Sn(x) + rw(x).
Если функция F(x) имеет производную (п + 1)-го порядка в некоторой
промежуточной точке С е (х, х0), то дополнительный член можно предста-
вить в виде остаточного члена в форме Лагранжа:
f<n+,)(C) .и+1 .. ...
Г"(Х) = (и+1)!(Х”*о) ’ ( -54)
который позволяет оценивать сходимость ряда и погрешность метода.
Для сходимости ряда Sn(x) при R > 0 в интервале (х0 - R, х0 + R) к фун-
кции F(x) необходимо, чтобы lim гп(х) = 0 при п -> оо в указанном интерва-
ле. При сходимости ряда ошибка гп(х) уменьшается по абсолютному значе-
нию по мере увеличения числа членов. Число членов ряда, обеспечиваю-
щее требуемую точность, существенно зависит от того, как велико
расстояние |х — х0| от начальной точки х0 до точки х. Чем больше это рас-
стояние, тем больше членов ряда приходится брать в расчёт.
В общем случае полином Тейлора (1.53) пригоден для вычисления Г(х)
лишь на ограниченном расстоянии от начальной точки. Поэтому при ис-
пользовании Sn(x) для вычисления конкретной функции необходимо чёт-
ко уяснить ответы на следующие вопросы: пригоден ли Sn(x) для вычисле-
ния Г(х) на данном расстоянии |х — х0| от начальной точки х0 и если приго-
ден, то сколько его членов надо брать для достижения требуемой
точности! Ответы на эти вопросы даёт исследование остаточного члена в
форме Лагранжа. Однако его далеко не всегда удается получить в аналити-
ческом виде. Для знакочередующегося сходящегося ряда оценка остатка
может быть выполнена по признаку Лейбница:
остаток имеет знак своего первого члена, и абсолютная величина
остатка меньше абсолютной величины первого его члена.
В качестве иллюстрации применения полинома Тейлора вычислим по-
казательную функцию у = ё*. Все её производные совпадают с самой функ-
цией: y(w) = ё*.
Примем точку х0 = 0 за начальную. Тогда е° = 1 и y(w) = 1. Следователь-
но, функция (с учётом выражения (1.53)) представляется полиномом Тей-
лора вида
— 92 —
1.4. Программы вычисления элементарных функций
п
х 1 / 1 . 1 , 1 2 , . 1 и /л сг\
е =L^X=1 + PX+2!X+-+^X’ (L55)
7 = 0
Остаточный член в форме Лагранжа имеет вид
<156)
где 0 < с < х; е° = 1 < ес < ех. Определим пригодность выражения (1.55) для
вычисления у = ех в точке х = 1/2. Так как 2 < е < 3, то е1/2 < 2 и ес < 2
(О < с < 1/2). С учётом этого формулу (1.56) можно записать так:
КН <r== 77TTJ 2 =-----—7- <L57>
(и+!)!^ (w+l)!2"
Величина г -> 0 при и -> оо. Следовательно, многочлен (1.55) пригоден
для вычисления у = е1/2 с любой точностью.
Пусть необходимо обеспечить точность суммы до 4-го десятичного
знака, т. е. А = 0.510-4. Подставляя в неравенство (1.57) последовательно
значения п — 1, 2, 3,..., получим следующие значения г:
И = 1/(2! х 2) = 1/4 = 0.25; г2 = 1/(3! х 22) = 1/24 « 0.4-10"1;
г3 = 1/(4! х 23) = 1/192 « 0.5-10-2; г4 = 1/(5! х 24) = 1/1920 « 0.5-10~3;
г5 = 1/(6! х 25) = 1/23040 « 0.4-10“4.
Для обеспечения заданной точности с запасом достаточно взять пер-
вые 6 членов выражения (1.55). Аналогично определим пригодность выраже-
ния (1.55) для вычисления у = ех в точке х = 1. Поскольку 1 = е° < ес < е1 < 3,
то г(х) < г = 3/(п + 1)! и г-> 0 при п -> оо. Значит, и в этой точке возможно
вычисление функции у —ех с любой точностью. Для обеспечения той же
точности А = 0.5-10“4 необходимо взять уже 8 членов. На Рис. 1.8 изображе-
ны графики функции у = ех и её многочленов Тейлора. Из рисунка видно,
что с ростом числа членов аппроксимирующего полинома растёт его «бли-
зость» к исходной функции на большем участке графика.
Полином Тейлора даёт наилучшее приближение вычисляемой функции
в малой окрестности точки х =Хо, но его погрешность быстро возрастает
по мере удаления от этой точки, что требует для обеспечения заданной
точности существенного увеличения числа членов полинома и соответс-
твенно затрат памяти и времени на его программное вычисление. Поэтому
данный метод аппроксимации элементарных функций применим при отно-
сительно невысоких требованиях к точности и диапазону аргументов вы-
-93-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Рис. 1.8. Графики показательной функции и её многочленов Тейлора.
числяемых функций. При более высоких требованиях необходимо исполь-
зовать иные способы приближений функции, в частности наилучшие
(в смысле наименьшей нормы) полиномиальные приближения, обеспечи-
вающие более быструю и равномерную сходимость на заданном интервале,
чем полином Тейлора. Однако рассмотрение этих и других методов выхо-
дит за рамки книги.
Далее будут приведены конкретные алгоритмы и программы вычисле-
ния некоторых основных элементарных функций и факториала. Все вход-
ные, промежуточные и результирующие данные представлены в коротком
формате двоичного числа с плавающей точкой (см. Рис. 1.6а). Программы
используют подпрограммы арифметики с плавающей точкой (АПТ), рас-
смотренные выше.
1.4.2. Обратная пропорциональность
Дробно-рациональная функция обратной пропорциональности у = а/х,
в частности у = 1/х, определена на множестве всех действительных нену-
левых чисел. Поскольку функция является нечётной, её график симметри-
чен относительно начала координат и содержит две ветви, расположенные
в первом и третьем квадрантах декартовых координат, если а > 0, и во вто-
ром и четвёртом квадрантах, если а < 0, Рис. 1.9. График функции пред-
ставляет собой гиперболу, асимптотами которой являются оси координат
хи у.
-94-
1.4. Программы вычисления элементарных функций
Подпрограмма OBRAT вычисляет функцию у = 1/х путём деления еди-
ницы в формате числа с плавающей точкой 110 = 41800016 на значение аргу-
мента:
0135 0760
0136 0760
0137 0760 OBRAT:
0138 0760 /Программа вычисления обратной
0139 0760 /функции у = 1/х
0140 0760 t
0141 0760 /Входные параметры: R0 - аргумент
Q142 0760 /х в трёхбайтном формате с плава-
0143 0760 /ющей точкой ,R1 - трёхбайтный
Q144 0760 /буфер, куда программой заносится
9145 0760 /единица в том же формате.
0146 0760 /
9147 0760 /Выходные параметры: R0 - значе-
0148 0760 ние функции. CY = 1 - признак не-
0149 0760 корректно завершённой операции.
0150 0760 /
6151 0760 /Используются все регистры, а так-
0152 0760 ие шесть байтов оперативной памя-
-95-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0153 0760 ти (адресуемый регистром R1 и
0154 0760 два, следующих за ним, и адресу-
0155 0760 емый регистром R0 и два, следую-
0156 0760 щих за ним.
0157 0760
0158 0760 Глубина стека -2+2=4 байта.
0159 0760
0160 0760 Регистры R0 и R1 сохраняются.
0161 0760
0162 0760
0163 0760
0164 0760
0165 0760
0166 0760
0167 0760 Заносим единицу в ячейки, адресуе-
0168 0760 мые регистром R1
0169 0760 77 41 MOV @R1,#41H
0170 0762 09 INC R1
0171 0763 77 80 MOV @R1,#8OH
0172 0765 09 INC R1
0173 0766 77 00 MOV @Rl,#00H
0174 0768 19 DEC R1
0175 0769 19 DEC R1
0176 07 6А ;Делим единицу на аргумент
0177 076А 12 ОС 9F LCALL DDPZ3
0178 07 6D ; Выход из программы
0179 076D 22 RET
0180 076Е ;
Если операция деления прошла без переполнения или антипереполне-
ния, CY = 0. В противном случае, т. е. если результат ошибочен, бит CY ус-
танавливается в 1. Выявлять подобные ошибки — обязанность програм-
миста, его программа, вызывающая подпрограмму OBRAT, должна контро-
лировать корректность работы последней.
Рассматриваемые ниже программы расчёта функций, как и OBRAT, воз-
вращают CY= 1 при некорректном завершении. Как нетрудно догадаться,
программист, использующий их в своей программе, также должен следить
за состоянием флага CY и предусмотреть прерывание вычислений с выво-
дом какой-то диагностики, чтобы исключить получение заведомо невер-
ных результатов.
Тестовые данные для проверки корректности работы программы вы-
числения обратной функции приведены в Табл. 1.6.
-96-
1.4. Программы вычисления элементарных функций
Таблица 1.6, Тестовые данные для функции у = 1/х
X У= Ух
Лю Ли Лю Ай
0.2468-10-'° 1DD916 0.4052-10+" 6496F1
0.8642-10"5 3090FC 0.1157-10+6 51Е202
0.1379 10-' ЗАЕ1ЕЕ 0.7252-10+2 479109
0.1379-10+| 41В082 0.7252-10° 40В9А5
0.1000-10+'8 79В1 АО О.ЮОО-Ю*16 08В87А
1.4.3. Степенная функция
Рациональная степенная функцияу = хп, п>2 определена на множестве
всех действительных чисел и является чётной либо нечётной соответствен-
но при чётном п=2к или нечётном п = 2к + 1 показателе. График чётной
функции симметричен относительно оси ординат, расположен выше оси
абсцисс и касается её в точке (х, у) = (0,0), Рис. 1.10а. Точка (0,0) считается
точкой w-кратного касания, или /i-кратным нулем: в этой точке функция
имеет минимум. График нечётной функции симметричен относительно на-
чала координат, Рис. 1.100. Точка (0, 0) является точкой перегиба графика.
Графики степенной функции называют параболами п-го порядка, все они
проходят через точки (0, 0) и (1, 1). Графики степенной функции более об-
щего вида у = ах” образуются при а > 0 растяжением ординат, а при а < 0 —
растяжением и зеркальным отображением относительно оси абсцисс.
—97—
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Подпрограмма STEP вычисляет степенную функцию у =хя «в лоб», т. е.
путём л-кратного умножения аргумента х. Использование этого метода
«экономит» оперативную память микроконтроллера, зато существенно
увеличивается время вычислений, особенно при больших значениях п.
0134 0760
0181 076Е
0182 076Е STEP:
0183 076Е /Программа вычисления степенной
0184 076Е /функции у = хлп
0185 076Е
0186 076Е /Входные параметры: R1 - аргумент
0187 076Е /х в трёхбайтном формате с плава-
0188 07 6Е /ющей точкой. В аккумуляторе по-
0189 076Е /рядок степени в виде целого числа
0190 076Е /без знака (напр. для хл2 аккуму-
0191 07 6Е ,-лятор должен быть равен 2).
0192 076Е
0193 076Е /Выходные параметры: R0 - значе-
0194 076Е /ние функции. CY=1 - признак не-
0195 076Е /корректно завершённой операции.
0196 076Е
0197 076Е /Используются все регистры, а так-
0198 07 6Е /же шесть байт оперативной памя-
0199 076Е /ти (адресуемый регистром R1 и
0200 076Е /два, следующих за ним, и адресу-
0201 07 6Е ,-емый регистром R0 и два, следую-
0202 076Е /щих за ним.
0203 076Е
0204 076Е /Глубина стека -3+2=5 байт.
0205 076Е
0206 076Е /Аргумент, R0 и R1 сохраняются.
0207 076Е
0208 07 6Е
0209 076Е
0210 076Е
0211 076Е
0212 076Е
0213 076Е /Проверяем порядок степени на нуль
0214 076Е 70 0В JNZ STEP1 /если не 0
0215 0770 /Если порядок =0, то результат =1
0216 0770 /заносим его в область результата
0217 0770 76 41 MOV @R0,#41H
0218 0772 08 INC R0
-98-
1.4. Программы вычисления элементарных функций
0219 0773 76 80 MOV @R0,#80H
0220 0775 08 INC RO
0221 0776 76 00 MOV @R0,#00H
0222 0778 18 DEC RO
0223 0224 0779 18 077А DEC RO STEP10:
0225 0226 0227 077А 22 077В 077В RET ;выход из прогр ;Если порядок ненулевой, заносим в /область результата аргумент
0228 077В СО ЕО STEP1: PUSH ACC ;сохр.порядок
0229 077D Е7 MOV A,@R1
0230 077Е F6 MOV @R0,A
0231 077F 09 INC R1
0232 0780 08 INC R0
0233 0781 Е7 MOV A,@R1
0234 0782 F6 MOV @R0,A
0235 0783 09 INC R1
0236 0784 08 INC R0
0237 0785 Е7 MOV A,@R1
0238 0786 F6 MOV @R0,A ;арг. в @R0
0239 0787 19 DEC R1
0240 0788 19 DEC R1
0241 0789 18 DEC R0
0242 0243 0244 0245 078А 18 078В 078В 078В DEC R0 ;bocct. per. /Восстановим порядок, уменьшим его /на 1, если результат =0, на выход STEP14:
0246 078В D0 ЕО POP ACC /восст.порядок
0247 078D 14 DEC А
0248 078Е СО ЕО PUSH ACC
0249 0790 70 04 JNZ STEP12
0250 0792 DO ЕО POP ACC /баланс стека
0251 0252 0253 0254 0794 80 Е4 0796 0796 0796 SJMP STEP10 /на выход /В аккумуляторе еще не 0, умножим /результат на аргумент STEP12:
0255 0796 12 ОВ DO LCALLUDPZ3
0256 0799 50 04 JNC STEP13
0257 079В DO ЕО POP ACC /баланс стека
0258 0259 079D 80 DB 079F SJMP STEP10 /авар.выход STEP13:
0260 0261 079F 80 ЕА 07А1 SJMP STEP14 /зацикливаем /
99-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Подпрограмма работает следующим образом. Аргумент в трёхбайтном
формате с плавающей точкой расположен в трёх последовательно распо-
ложенных ячейках памяти, адресуемых регистром R0 (т. е. в регистре со-
держится адрес первой из этих трёх ячеек). Порядок степени — в аккуму-
ляторе, содержимое аккумулятора трактуется как целое беззнаковое число
от 0 до 255. Конечный результат расположен в трёх последовательно рас-
положенных ячейках памяти, адресуемых регистром R1. Как упоминалось
выше, если вычисления прошли без переполнения или антипереполнения,
CY = 0. В противном случае, если результат ошибочен, бит CY устанавли-
вается в 1. Программа, вызывающая STEP, должна контролировать кор-
ректность работы последней и прекращать вычисления, если вызов под-
программы STEP завершился установкой бита CY.
Строго говоря, показатель степенной функции должен быть не меньше
2. Но подпрограмма STEP возвращает корректный результат и при п = 0, и
при п = 1. В первом случае в качестве результата возвращается единица, во
втором, как несложно догадаться, — сам аргумент. Если порядок больше 1,
то программа последовательно умножает накапливаемый результат на ар-
гумент, уменьшая значение показателя на 1 после каждого умножения, и
этот процесс продолжается до тех пор, пока либо не обнулится показатель,
либо не произойдет переполнение или антипереполнение результата. В
последнем случае, как упоминалось, вычисления будут прерваны, и бит
CY будет установлен в единицу.
Тестовые данные для проверки корректности работы программы вы-
числения степенной функции приведены в Табл. 1.7.
Таблица 1.7. Тестовые данные для степенной функции у = Xя
^10 Л16 Лю Лю
21О = 0.1024-104 4В8000 0.1 «0.1000-10-’ 1FDBE0
2“° = 0.1100-Ю13 698000 0.115 = 0.1000 10~14 0F9014
105 = 0.1000-Ю6 51С350 0.5'°« 0.9766-Ю"3 378000
—Ю5 = —0.1000-Ю6 D13CB0 (0.1248)’ = 0.4715-10"6 2BFD2A
Ю,0 = 0.1000-Ю11 629504 (0.9731)12 = 0.7209-10° 40В894
1.4.4. Полином
п
Полином у = -х‘ определён на множестве всех действительных чи-
/=о
сел х, О/ и изображается на графике кривой без особых точек и без асимп-
тот, причём кривая имеет не более п точек пересечения с осью абсцисс, не
более п — 1 экстремумов и не более п — 2 точек перегиба. Конкретный вид
— 100 —
1.4. Программы вычисления элементарных функций
кривой существенно зависит от значений л, tzz и х. Например, если az = 1
для всех /, то графики полиномов любой степени подобны графикам сте-
пенной функции, но с иным размещением относительно начала коорди-
нат и с дополнительной деформацией ординат.
Подпрограмма POLIN вычисляет значение полинома по схеме Горнера
(1.40):
0262 07А1
0263 07А1 POLIN:
0264 07А1 /Программа вычисления полинома
0265 07А1 /АО + А1*х + А2*хЛ2 + ... + Ап*хАп
0266 07А1 ;где коэффициенты полинома хранят-
0267 07А1 ся в оперативной памяти с адреса
0268 07А1 /в регистре R0, вначале Ап в трёх-
0269 07А1 ;байтном формате с плавающей за-
0270 07А1 нятой, за ним Ап-1, и т.д. до АО,
0271 07А1 /первым идет байт порядка, затем
0272 07А1 /СтБ и МлБ мантиссы.
0273 07А1 /
0274 07А1 /Входные параметры: R1 - аргумент
0275 07А1 /х в трёхбайтном формате с плава-
0276 07А1 /ющей точкой , R0 - старший коэф-
0277 07А1 фициент. В аккумуляторе порядок
0278 07А1 /полинома в виде целого числа без
0279 07А1 /знака (напр., для хЛ2+х-1 аккуму-
0280 07А1 ;лятор должен быть равен 2) .
0281 07А1 /
0282 07А1 /Выходные параметры: R1 - аргу-
0283 07А1 мент х (остается неизменным), R0-
0284 07А1 ;конечный результат. CY=1 - приз-
0285 07А1 нак некорректно завершённой опе-
0286 07А1 ;рации.
0287 07А1 /
0288 07А1 /Используются все регистры, а так-
0289 07А1 /же 3*(п+1) байт оперативной памя-
0290 07А1 ,-ти (адресуемый регистром R1 и
0291 07А1 /два, следующих за ним, и адресу-
0292 07А1 емый регистром R0 и (3*п)-1, сле-
0293 07А1 ;дующих за ним, n-порядок полино-
0294 07А1 ма) . Глубина стека - 3+2=5 байт.
0295 07А1 /
0296 07А1 /Регистры R0 и R1 сохраняются.
0297 07А1 9
-101-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0298 07А1
0299 07А1
0300 07А1
0301 07А1
0302 07А1
0303 07А1 /Вначале проверяем порядок полино-
0304 07А1 ;ма на 0, если он =0, то на выход,
0305 07А1 /результат равен АО
0306 07А1 70 01 JNZ POLIN2
0307 07АЗ POLINI:
0308 07АЗ 22 RET /выход
0309 07А4 /Если порядок не 0, сохраним его и
0310 07А4 /умножим коэффициент на аргумент
0311 07А4 POLIN2:
0312 07А4 88 F0 MOV В,R0
0313 07А6 POLIN3:
0314 07А6 05 F0 INC В
0315 07А8 05 F0 INC В
0316 07АА 05 F0 INC В
0317 07АС СО Е0 PUSH ACC /сохраняем порядок
0318 07АЕ 12 0В DO LCALL UDPZ3 /умножаем на аргумент
0319 07В1 50 04 JNC POLIN4
0320 07ВЗ DO Е0 POP ACC /баланс стека
0321 07В5 80 ЕС SJMP POLINI ;аварийн.выход
0322 07В7 /Сложим результат с коэффициентом
0323 07В7 /более низкого порядка
0324 07В7 POLIN4:
0325 07В7 СО F0 PUSH В
0326 07В9 СО 01 PUSH R1
0327 07ВВ DO F0 POP В
0328 07BD DO 01 POP R1
0329 07BF CO 00 PUSH R0
0330 07C1 CO 01 PUSH R1
0331 07C3 DO 00 POP R0
0332 07C5 DO 01 POP R1 /обмен слагаемыми
0333 07C7 CO F0 PUSH В
0334 07C9 12 0A 90 LCALL SDPZ3 /слож.со след.
0335 07CC 50 06 JNC POLIN5 /коэффициент
0336 07CE DO F0 POP В
0337 07D0 DO E0 POP ACC /баланс стека
0338 07D2 80 CF SJMP POLINI ;аварийн.выход
0339 07D4 POLIN5:
0340 07D4 CO 00 PUSH R0
-102-
1.4. Программы вычисления элементарных функций
0341 07D6 СО 01 PUSH R1
0342 07D8 D0 00 POP R0
0343 07DA DO 01 POP R1 ;восст. слагаемых
0344 07DC DO F0 POP В
0345 07DE CO F0 PUSH В
0346 07E0 CO 01 PUSH R1
0347 07E2 DO F0 POP В
0348 07E4 DO 01 POP R1
0349 07E6 ;Восстановим порядок, уменьшив его на
0350 07E6 ;1, если = 0 - на выход, иначе на
0351 07E6 /следующее умножение со сложением
0352 07E6 DO E0 POP АСС
0353 07E8 D5 E0 BB DJNZ АСС,POLIN3 ;зацикливание
0354 07EB 80 B6 SJMP POLINI ;на выход
0355 07 ED
Показатель степени полинома и перед работой программы записывают
в аккумулятор, коэффициенты полинома ап, an_it..., л0 в виде трёхбайтных
чисел с плавающей точкой последовательно размещают в области памяти,
начальный адрес которой задается в регистре R0, а значение аргумента — в
область памяти по адресу, задаваемому в регистре R1. При переполнении
или антипереполнении порядка результата в программе устанавливается
признак (флаг) переноса CY= 1. В этом случае результат ошибочен.
Поскольку к моменту вызова каждой из подпрограмм SDPZ3 и UDPZ3 в
стеке уже находятся две переменные, то при аварийном выходе из подпро-
граммы POLIN (когда CY= 1) перед самим выходом осуществляется извле-
чение переменных из стека для предотвращения сбоев в работе микрокон-
троллера, обусловленных некорректной работой с SP.
Подпрограмма работает следующим образом. Коэффициент полинома
ап расположен в области памяти результата, поэтому если порядок полинома
равен 0, то этот коэффициент и есть конечный результат, работа програм-
мы завершается. Если порядок полинома больше 0, то коэффициент поли-
нома ап умножается на значение аргумента, после чего к нему прибавляется
коэффициент ап_{. Одновременно с этим порядок уменьшается на 1, после
чего происходит проверка: равен ли он 0. Если 0 достигнут, то вычисления
завершаются, если нет, то повторяются действия, описанные в двух послед-
них предложениях, и так до получения нулевого значения порядка.
В регистре В хранится адрес байта порядка коэффициента полинома,
следующего за тем, который был суммирован с результатом. Осуществляе-
мые через стек обмены содержимого регистров В и R1 необходимы для то-
го, чтобы правильно адресовать слагаемые и сомножители без переноса их
самих из одной области памяти в другую (к сожалению, у микроконтрол-
леров семейства х51 косвенное обращение возможно лишь к двум адресам
- ЮЗ -
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
памяти, через R0 и R1, а программе приходится обращаться к трём адре-
сам: туда, где расположен накапливаемый результат, он же один из операн-
дов, к аргументу и к следующему коэффициенту полинома). Соответс-
твенно обмены содержимого регистров R0 и R1 перед сложением необхо-
димы для того, чтобы накапливаемая сумма оставалась на месте, а не
перемещалась по адресу второго операнда (подробнее см. входные и вы-
ходные параметры программ SDPZ3 и UDPZ3).
В качестве тестового примера выполним вычисление полинома
F(x) = аух3 + a2x? + а{х + aQ = 4*3 + Зх2 - 2х + 1. В Табл. 1.8 приведены соот-
ветствующие тестовые данные, а на Рис. 1.11 — график полинома.
Таблица 1.8. Тестовые данные полинома
X У = Р(х)
^10 ^16 ^10 ^16
0 000000 0.1000-10' 418000
0.2 ЗЕСССС 0.7520-10° 40С083
0.4 3FCCCC 0.9360-10° 40EF9D
0.6 40999А 0.1744-10‘ 41DF3B
-0.2 ВЕ3334 0.1488-10* 41ВЕ77
-0.4 BF3334 0.2024-10' 428189
-0.6 СО6666 0.2416-10' 429АА0
- 104
1.4. Программы вычисления элементарных функций
1.4.5. Квадратный корень
Иррациональная функция извлечения квадратного корня у =х-0 5 явля-
ется обратной по отношению к функции возведения в квадрат у ~х2 и оп-
ределена для всех неотрицательных действительных чисел х. График функ-
ции представляет собой монотонно возрастающую кривую, расположен-
ную вдоль оси абсцисс (Рис. 1.12).
Известны различные методы вычисления квадратного корня, основан-
ные на многочленных и рациональных приближениях, разложениях в би-
номиальный ряд и т. п. Чаще всего для вычислений используется итераци-
онная формула Герона (частный случай формулы Ньютона):
y/+1=0.5(yz + x/yz), (1.58)
где i = 0, 1,у0 ~х~°'5 — начальное приближение, значение которого вы-
бирается по условиям: несложность вычисления (константа или линейная
функция) и максимальная близость к искомому значению корня, что поз-
воляет уменьшить число итераций. Обычно это приближение выбирается
на основе эмпирической формулы, зависящей от диапазона изменения ар-
гумента. Так, например, при 0.5 <х < 1 наилучшим приближением счита-
ется у0 ~ 0.5903 х х + 0.4173. В простейшем случае в качестве значения у0
можно использовать непосредственно значение х, т. е. у0 Итерацион-
ный процесс вычисления корня заканчивается, когда значения двух сосед-
них приближений у/ и у/+1 совпадают с требуемой точностью.
Пусть, например, необходимо вычислить с четырьмя значащими циф-
рами у = -728.34 « 5.324. Примем у0 = 5. Тогда у] = 0.5(5 + 28.34/5) « 5.33,
У2 = 0.5(5.33 + 28.34/5.33) « 5.324, у3 = 0.5(5.324 + 28.34/5.324) « 5.324. Так
как у2« Уз, то процесс закончен. Сходимость итерационного процесса хо-
рошая, и в каждом шаге число верных цифр примерно удваивается.
— 105 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Рассмотренный метод реализован в подпрограмме вычисления квад-
ратного корня KKOR:
0909 0D78
0910 0D78 KKOR:
0911 0D78 ;Подпрограмма вычисления
0912 0D78 /квадратного корня у=хл(1/2).
0913 0D78 /
0914 0D78 /Входные параметры: R0 - адрес
0915 0D78 /аргумента х, представленного в
0916 0D78 /форме 3-байтного двоичного в
0917 0D78 /прямом коде числа с плавающей
0918 0D78 /точкой, R1 - адрес результата,
0919 0D78 /за тремя байтами которого следуют
0920 0D78 /3 байта, используемые подпрограм-
0921 0D78 ,-мой для промежуточных вычислений,
0922 0D78 /R3 и R2 - СтБ и МлБ маски
0923 0D78 /точности, определяющей точность
0924 0D78 /вычисления функции у (содержит
0925 0D78 /нули в младших незначащих и еди-
0926 0D78 ницы в старших значащих битах).
0927 0D78 /
0928 0D78 /Выходные параметры: R0 - адрес
0929 0D78 /аргумента х, R1 - адрес кв. корня
0930 0D78 /аргумента, В - кол-во итераций.
0931 0D78 /СУ=1 - признак переполнения или
0932 0D78 /антипереполнения порядка
0933 0D78 /результата.
0934 0D78 /
0935 0D78 /Используются все регистры, кро-
0936 0D78 ,-ме R0, Rl, R2, R3. Глубина стека-
0937 0D78 /7 байт. Используются подпрограм-
0938 0D78 /мы SDPZ3 и DDPZ3.
0939 0D78 /
0940 0D78 /
0941 0D78 /
0942 0D78 /
0943 0D78 /
0944 0D78
0945 0D78 Е6 MOV A, 0R0
0946 0D79 08 INC R0
0947 0D7A 66 XRL A,ORO
0948 0D7B 08 INC R0
0949 0D7C 66 XRL A,ORO
0950 0D7D 18 DEC R0
0951 0D7E 18 DEC R0 /Восстановили R0
106-
1.4. Программы вычисления элементарных функций
0952 0D7F 70 ОС JNZ CONT /Если x не равен 0.
0953 0D81 F7 MOV @R1,A
0954 0D82 09 INC R1
0955 0D83 F7 MOV @R1,A
0956 0D84 09 INC R1
0957 0D85 F7 MOV @R1,A /Обнулили результат.
0958 0D86 19 DEC R1
0959 0D87 19 DEC R1 /Восстановили R1.
0960 0D88 75 F0 01 MOV B,#l /Кол-во итераций.
0961 0D8B СЗ CLR c ;CY=0, ошибок нет
0962 0D8C 22 RET
0963 0D8D CONT:
0964 0D8D ЕА MOV A,R2
0965 0D8E СО ЕО PUSH ACC
0966 0D90 ЕВ MOV A,R3
0967 0D91 СО ЕО PUSH ACC
0968 0D93 Е8 MOV A,R0 /Сохранили в стеке
0969 0D94 СО ЕО PUSH ACC /регистры R2, R3, R0.
0970 0D96 Е6 MOV A,@R0 /Начальное приближение
0971 0D97 14 DEC A /у(0) = х/2.
0972 0D98 F7 MOV @R1,A
0973 0D99 08 INC R0
0974 0D9A 09 INC R1
0975 0D9B Е6 MOV A,@R0
0976 0D9C F7 MOV @R1,A
0977 0D90D 0£ 3 INC R0
0978 0D9E 09 INC R1
0979 0D9F Е6 MOV A,@R0
0980 0DA0 F7 MOV @R1,A
0981 0DA1 19 DEC R1
0982 0DA2 19 DEC R1 /Восстановили R1.
0983 0DA3 75 FO FF MOV B,#0FFH /Счётчик итераций.
0984 0DA6 KCYCLE:
0985 0DA6 05 F0 INC В /Увеличение счётчика.
0986 0DA8 Е9 MOV A,R1
0987 0DA9 F8 MOV R0,A / R0 - адрес у(i).
0988 0DAA 09 INC R1
0989 0DAB 09 INC R1
0990 0DAC 09 INC R1 ;R1 - адрес буфера.
0991 ODAD Е6 MOV A,@R0
0992 ODAE F7 MOV @R1ZA
0993 0DAF 08 INC R0
0994 0DB0 09 INC R1
0995 0DB1 Е6 MOV A, ORO
0996 0DB2 F7 MOV @R1ZA
0997 0DB3 08 INC R0
— 107 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0998 0DB4 09 INC R1
0999 0DB5 E6 MOV A,@R0
1000 0DB6 F7 MOV @R1,A ;y(i) в буфере.
1001 0DB7 08 INC RO /RO - адрес буфера.
1002 0DB8 DO EO POP ACC
1003 0DBA CO EO PUSH ACC /Баланс стека.
1004 ODBC F9 MOV R1,A ;R1 - адрес х.
1005 0DBD 12 ОС 9F LCALL DDPZ3 ;х/у(i) в буфере.
1006 0DC0 40 42 JC L3 /Если переполнение.
1007 0DC2 E8 MOV A,RO
1008 0DC3 F9 MOV R1,A /R1 - адрес буфера.
1009 0DC4 18 DEC RO
1010 0DC5 18 DEC RO
1011 0DC6 18 DEC RO /R0-адрес у(i).
1012 0DC7 12 OA 90 LCALL SDPZ3 /у(i) + x/y(i) в буфере.
1013 0DCA 40 3B JC ERR /Если переполнение.
1014 0DCC 17 DEC @R1 /у(i+1) в буфере.
1015 0DCD E6 MOV A,@R0
1016 0DCE 67 XRL A,@R1
1017 0DCF 70 23 JNZ KMOVE /Если Пор у(i) <> Пор у(i+1)
1018 0DD1 DO EO POP ACC
1019 0DD3 FE MOV R6,A
1020 0DD4 DO EO POP ACC
1021 0DD6 FB MOV R3,A
1022 0DD7 DO EO POP ACC
1023 0DD9 FA MOV R2,A /Восстановили маску точности
1024 ODDA CO EO PUSH ACC
1025 ODDC EB MOV A,R3
1026 ODDD CO EO PUSH ACC
1027 ODDF EE MOV A,R6
1028 ODEO CO EO PUSH ACC /Баланс стека.
1029 0DE2 08 INC RO
1030 0DE3 09 INC R1
1031 0DE4 E6 MOV A,@R0
1032 0DE5 67 XRL A,@R1
1033 0DE6 5B ANL A,R3
1034 0DE7 70 09 JNZ KMOVEB /Если СтБ у(i) о СтБ у(i+1)
1035 0DE9 08 INC RO
1036 ODEA 09 INC R1
1037 ODEB E6 MOV A,@R0
1038 ODEC 67 XRL A,@R1
1039 ODED 5A ANL A,R2
1040 ODEE 60 15 JZ L4 /Если у(i) = у(i+1).
1041 ODFO 18 DEC RO
1042 0DF1 19 DEC R1
1043 0DF2 KMOVEB:
1.4. Программы вычисления элементарных функций
1044 0DF2 18 DEC R0 /R0 - адрес у(i).
1045 0DF3 19 DEC R1 ;R1 - адрес буфера.
1046 0DF4 KMOVE:
1047 0DF4 Е7 MOV A,@R1
1048 0DF5 F6 MOV @R0,A
1049 0DF6 08 INC R0
1050 0DF7 09 INC R1
1051 0DF8 Е7 MOV A,@R1
1052 0DF9 F6 MOV @R0,A
1053 0DFA 08 INC R0
1054 0DFB 09 INC R1
1055 0DFC Е7 MOV A,@R1
1056 0DFD F6 MOV @R0,A ;y (i) = у(i+1) .
1057 0DFE 18 DEC R0
1058 0DFF 18 DEC R0
1059 0Е00 Е8 MOV A,R0
1060 0Е01 F9 MOV R1,A ;R1 - адрес у(i).
1061 0Е02 80 А2 SJMP KCYCLE /Зацикливание.
1062 0Е04 L3:
1063 0Е04 18 DEC R0
1064 0Е05 L4:
1065 0Е05 18 DEC R0
1066 0Е06 18 DEC R0
1067 0Е07 ERR:
1068 0Е07 Е8 MOV A,R0
1069 0Е08 F9 MOV R1,A ;R1 - адрес у(i).
1070 0Е09 DO Е0 POP ACC
1071 0E0B F8 MOV R0,A /R0 - адрес x.
1072 0E0C DO Е0 POP ACC
1073 0E0E DO Е0 POP ACC /Баланс стека.
1074 0Е10 22 RET /СУ=1,Если переполнение
1075 0Е11 /END KKOR.
1076 0Е11
1077 0Е11
Эта программа носит исследовательский характер, поскольку, во-пер-
вых, область значений аргумента неограничена и в качестве начального
приближения выбрано у0 = 0-5х; во-вторых, имеется возможность задавать
в качестве параметра точность вычисления результата (количество знача-
щих цифр) и, в-третьих, можно проверять количество выполненных ите-
раций, зависящее как от требуемой точности вычислений, так и от значе-
ний аргумента. В программе используется дополнительная трёхбайтная
область памяти, расположенная сразу за областью результата, адресуемой
регистром R1. Эта дополнительная область памяти необходима для хране-
ния промежуточных результатов.
-U09-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Программа сравнивает у, и yi+1 в формате с плавающей точкой, причём
сравнение мантисс выполняется лишь в случае равенства порядков чисел.
Сам процесс сравнения мантисс производится с маскированием их млад-
ших битов, что позволяет управлять точностью получения результата и ко-
личеством выполняемых итераций.
В результате выполнения подпрограммы KKOR определяется только
положительный корень из исходного числа. Если необходим отрицатель-
ный корень, результат вычисления нужно умножить на — 1 = С18000.
Тестовые данные для подпрограммы KKOR при маске FFFF приведены
в Табл. 1.9, где к — количество итераций.
Таблица 1.9. Тестовые данные у = х 0 5
X у = >1х к
^10 ^16 ^10 ^16
0.2000-10° ЗЕСССС 0.4472-10" 3FE4F9 5
0.2000-10' 428000 0.1414-10* 41В505 3
0.2000-102 459FFF 0.4472-101 438F1B 4
0.2000-103 48C7FF 0.1414-102 44Е246 6
0.1000-106 51C34F 0.3162-103 499Е19 10
В случае использования маски F000, сохраняющей лишь две старшие
значащие десятичные цифры результата, вычисление, например, у = л/(Х2
требует двух итераций вместо пяти. Заметим, что искомый результат полу-
чается на предпоследней итерации, а последняя итерация лишь контроли-
рует его правильность.
1.4.6. Факториал
Программа FACT вычисляет факториал у = NI табличным методом.
В памяти программ, начиная с метки TABFACT, хранятся значения факто-
риала от 1! до 20! (для большего значения аргумента значение функции
превышает верхний предел представления чисел, см. Табл. 1.1).
Это самый быстрый способ вычислений, к тому же не требующий за-
метных затрат оперативной памяти, которой у микроконтроллеров се-
мейства х51 и без того мало. Но в памяти программ дополнительно прихо-
дится размещать 60-байтную таблицу со значениями функции.
-ПО-
1.4. Программы вычисления элементарных функций
Программа FACT
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
09D9
09D9
09D9 FACT:
09D9
09D9 /Программа вычисления факториала
09D9 /табличным способом. Значения фун-
09D9 ,-кции для аргумента от 1 до 20 за-
09D9 /несены в таблицу, расположенную в
09D9 /конце этой программы. При входе в
09D9 /программу аргумент в виде целого
09D9 /беззнакового числа должен быть в
09D9 /аккумуляторе, по его величине
09D9 /программа найдет в таблице три
09D9 /байта значения функции и поместит
09D9 /их в соответствующие ячейки памя-
09D9 /ти, где должен находиться резуль-
09D9 /тат.
09D9
09D9 /Входные параметры: аккумулятор -
09D9 /должен содержать аргумент от 1 до
09D9 /20.
09D9
09D9 /Выходные параметры: R0 - ко-
09D9 /нечный результат. CY=1 - приз-
09D9 /нак некорректно завершённой опе-
09D9 /рации (аргумент равен 0 или >20).
09D9
09D9
09D9 /Используются регистры А, В, DPTR,
09D9 /R0, и 3 байта оперативной памяти
09D9 /(адресуемой регистром R0 и два,
09D9 /следующих за ним).
09D9
09D9 /Глубина стека - 2 байта.
09D9
09D9 / R0 сохраняется.
09D9
09D9
09D9
09D9
09D9
09D9
09D9
09D9 /Вначале проверим аргумент - он не
09D9 /должен быть равен 0 и не должен
09D9 /быть более 20
09D9 F5 F0 MOV В,А
-111-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1012 09DB 60 26 JZ FACTEND0 ;авар.выход
1013 09DD СЗ CLR C
1014 09DE 94 15 SUBB A,#21
1015 09Е0 50 21 JNC FACTEND0 ;авар.выход
1016 09Е2 ;аргумент в допуске, считаем функцию
1017 09Е2 15 F0 DEC В
1018 09Е4 Е5 F0 MOV А,В
1019 09Е6 25 F0 ADD А,В ;АСС = 2*ACC
1020 09Е8 25 F0 ADD А,В ;АСС = 3*АСС
1021 09ЕА F5 F0 MOV В,А ;сохр. акк.
1022 09ЕС 90 0А 06 MOV DPTR,#TABFACT
1023 09EF 93 MOVC A,@A+DPTR ;байт порядка
1024 09F0 F6 MOV @R0,A
1025 09F1 05 F0 INC В
1026 09F3 08 INC R0
1027 09F4 Е5 F0 MOV А,В
1028 09F6 93 MOVC A,@A+DPTR ;СТБ мантиссы
1029 09F7 F6 MOV @R0,A
1030 09F8 05 F0 INC В
1031 09FA 08 INC R0
1032 09FB Е5 F0 MOV А,В
1033 09FD 93 MOVC A,@A+DPTR ;МлБ мантиссы
1034 09FE F6 MOV @R0,A
1035 09FF 18 DEC R0
1036 0А00 18 DEC R0 ;восст. R0
1037 0А01 СЗ CLR C
1038 0А02 FACTEND
1039 0А02 22 RET ;выход
1040 0А03 FACTEND0:
1041 ОАОЗ D3 SETB C
1042 0А04 80 FC SJMP FACTEND
1043 ОАО 6
1044 ОАО6 TABFACT .EQU $
1045 ОАО 6
1046 0А06 41 80 00.DB 041H, ,080H,000H ;1!=1=418000Н
1047 0А09 42 80 00.DB 042H( ,080H,000H ;2!=2=428000Н
1048 0A0C 43 СО 00.DB 043H, ,0C0H,000H ;3’=6=43С000Н
1049 0A0F 45 СО 00.DB 045H( ,0C0H,000H ;4!=24=45С000Н
1050 0А12 47 F0 00.DB 047H, ,0F0H,000H ;5!=120=47F000H
1051 0А15 4А В4 00.DB 04AH, ,0B4H,000H ;6!=720=4АВ400Н
1052 0А18 4D 9D 80.DB 04DH, ,09DH,080H ;7!=5040=4D9D80H
1053 0А1В 50 9D 80.DB 050H, ,09DH,080H ;8!=4.0320*E+4=509D80H
1054 0А1Е 53 В1 30.DB 053H, ,OB1H,O3OH ;9!=3.6288*Е+5=53В130Н
1055 0А21 56 DD 7C.DB 056H, ,0DDH,07CH ;101=3.6288*E+6=56DD7CH
1056 0А24 5А 98 45.DB 05AH, ,098H,045H ;11!=3.9917*Е+7=5А9845Н
1057 0А27 5D Е4 68.DB 05DH, ,0E4H,068H ;12!=4.7900*E+8=5DE468H
1058 0А2А 61 В9 94.DB 061H, ,0B9H,094H ;13!=6.2270*Е+9=61В994Н
1059 0A2D 65 А2 62.DB 065H, ,0A2H,062H ;14!=8.7178*Е+10=65А262Н
1060 ОАЗО 69 98 3C.DB 069H, ,098H,03CH ;15!=1.3077*Е+12=69983СН
-112-
1.4. Программы вычисления элементарных функций
1061 ОАЗЗ 6D 98 3C.DB 06DH,098Н,ОЗСН /16!=2.0923*E+13=6D983CH
1062 0А36 71 Al C0.DB 071Н,0А1Н,0C0H ;17’=3.5569*Е+14=71А1С0Н
1063 0А39 75 В5 F8.DB 075Н,0В5Н,0F8H ;18!=6.4024*E+15=75B5F8H
1064 ОАЗС 79 D8 18.DB 079Н,0D8H,018Н ;19!=1.2165*E+17=79D819H
1065 0A3F 7Е 87 0E.DB 07ЕН,087Н,00EH /20!=2.4329*Е+18=7Е870ЕН
1066 0А42
1067 0А42
Подпрограмма FACT2, в отличие от FACT, вычисляет факториал у = 7V!
методом последовательного перемножения сомножителей:
0882 09А2 /
0883 09А2
0884 09А2 FACT2:
0885 09А2 /Программа вычисления факториала
0886 09А2 /методом умножениия. Вначале в па-
0887 09А2 /мять результата заносится единица
0888 09А2 /в формате с ПТ, и затем она умно-
0889 09А2 /жается по мере необходимости на
0890 09А2 ;2, 3, ... до тех пор, пока этот
0891 09А2 /множитель, увеличиваемый после
0892 09А2 /каждого умножения на 1, не дости-
0893 09А2 /гнет значения аргумента.
0894 09А2 /
0895 09А2 /Входные параметры: аккумулятор -
0896 09А2 /должен содержать аргумент от 1 до
0897 09А2 /20.
0898 09А2 /
0899 09А2 /Выходные параметры: R0 - ко-
0900 09А2 ,-нечный результат. CY=1 - приз-
0901 09А2 нак некорректно завершённой опе-
0902 09А2 /рации (аргумент равен 0 или >20).
0903 09А2 г
0904 09А2 /Используются все регистры, 9 байт
0905 09А2 /оперативной памяти (адресуемый
0906 09А2 /регистром R1 и два, следующих за
0907 09А2 /ним, и адресуемый регистром R0 и
0908 09А2 /пять, следующих за ним). Глубина
0909 09А2 /стека -2+3=5 байт.
0910 09А2 9
0911 09А2 / R0 и R1 сохраняются.
0912 09А2 /
0913 09А2 9
0914 09А2 9
0915 09А2 9
0916 09А2 9
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0917 09А2
0918 0919 0920 0921 0922 09А2 09А2 /вначале проверим аргумент - он не 09А2 /должен быть равен 0 и не должен 09А2 /быть более 20 09А2 F5 F0 MOV В,А
0923 09А4 60 30 JZ FACT2EN0 /авар.выход
0924 09А6 СЗ CLR С
0925 09А7 94 15 SUBB А,#21
0926 09А9 50 2В JNC FACT2EN0 /авар.выход
0927 0928 09АВ /аргумент в допуске, считаем функцию 09АВ 76 41 MOV @R0,#041H
0929 09AD 08 INC R0
0930 09AE 76 80 MOV @R0,#080H
0931 09B0 08 INC R0
0932 09B1 76 00 MOV @R0,#000H
0933 09B3 18 DEC R0
0934 09B4 18 DEC R0
0935 0936 09B5 09B5 05 F0 INC В
0937 09B7 74 00 MOV A,#0
0938 0939 09B9 FACT20: 09B9 04 INC A
0940 09BA B5 F0 02 CJNE A,B,FACT21
0941 09BD C3 CLR C
0942 0943 09BE FACT2END: 09BE 22 RET
0944 0945 09BF FACT21: 09BF CO E0 PUSH ACC
0946 09C1 08 INC R0
0947 09C2 08 INC R0
0948 09C3 08 INC R0
0949 09C4 F6 MOV @R0,A
0950 09C5 08 INC R0
0951 09C6 76 00 MOV @R0,#0
0952 09C8 18 DEC R0
0953 09C9 12 OF DC LCALL CDPZ3 ; в @R1 - n с ПТ
0954 09CC 18 DEC R0
0955 09CD 18 DEC R0
0956 09CE 18 DEC R0
0957 09CF 12 0B DO LCALL UDPZ3 /@R0 = @RO*@R1
0958 09D2 DO E0 POP ACC
0959 09D4 80 E3 SJMP FACT20
0960 09D6 FACT2EN0:
-114-
1.4. Программы вычисления элементарных функций
0961 09D6 D3 SETB С
0962 09D7 80 Е5 SJMP FACT2END
0963 09D9
0964 09D9
Вторая программа короче, но требует больше оперативной памяти и
выполняется заметно дольше, особенно для больших значений аргумента.
Поэтому здесь она приведена скорее в качестве иллюстрации.
Тестовые данные для программ вычисления факториала приведены в
Табл. 1.10.
Таблица 1.10. Тестовые данные для факториала у = 7V!
N ^10 Л16 N ^10 ^16
1 0.1000 10* 418000 6 0.7200-103 4АВ400
2 0.2000-101 428000 7 0.5040-104 4D9D80
3 0.6000 10' 43С000 8 0.4032-105 509D80
4 0.2400-102 45С000 9 0.3629 106 53В130
5 0.1200-103 47EFFF 10 0.3629-107 56DD7C
1.4.7. Показательная функция
Показательной называется функция вида у = 0х, где а > 0 и а * 1. Функ-
ция определена на всём множестве действительных чисел и принимает
только положительные значения, ограничена снизу, не имеет нулей и экс-
тремумов, выпукла и непрерывна. При а > 1 она монотонно возрастает,
при а < 1 монотонно убывает. График функции расположен выше оси абс-
цисс и пересекает ось ординат в точке у = 1 (Рис. 1.13). Графики функций
у — 0х и у = а~х симметричны относительно оси ординат. Показательную
функцию с основанием а можно свести к показательной функции с нату-
ральным основанием е. Обозначим а = еь (Ь * 0). Тогда у = 0х = (еь)х = еЬх =
= exp(Z>x). Функцию полученного вида называют экспоненциальной или экс-
понентой. Взяв натуральный логарифм от обеих частей последнего равенс-
тва, получим b = In а. Таким образом, вычисление 0х можно свести к вы-
числению exp(Z>x), где b = In а, или к вычислению ехр г, где z = bx. График
функции у = е* расположен между графиками функций у = 2х и у = 3х.
Экспоненциальная функция у = е*, как было показано выше, хорошо
аппроксимируется рядом Тейлора (1.55). Для обеспечения точности при-
ближения порядка 0.5-10-4 на сегменте [—1, +1] достаточно взять первые 8
членов ряда с коэффициентами 1, 1/1! = 1; 1/2! = 0.5; 1/3! = 0.1667;
1/4! = 0.416710-1; 1/5! = 0.8333-10”2; 1/6! = 0.1389-10-2 и 1/7! = 0.1984-10~3.
Этот метод вычисления экспоненты реализует подпрограмма FUNC1:
— 115 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07 ED
07ED
07ED
07ED
07ED
07ED
07ED
07ED
07 ED
07ED
07ED
07 ED
Рис. 1.13. Графики показательной функции.
FUNC1:
/•Программа вычисления функций/
/•представленных в виде полинома
;А0 + А1*х + А2*хл2 + ... + Ап*хлп,
;где коэффициенты полинома хранят-
ся в одной из таблиц в конце
,-программы в трёхбайтном формате
;с плавающей точкой/ начиная со
/•старшего Ап и кончая младшим АО,
,-первым идет байт порядка, затем
;СтБ и МлБ мантиссы.
9
/•Входные параметры: R1 - аргумент
;х в трёхбайтном формате с плава-
ющей точкой, R0 - накапливаемая
;сумма. В аккумуляторе порядок по-
линома в виде целого числа без
;знака (напр. для хА2+х-1 аккуму-
лятор должен быть равен 2), в ре-
гистре DPTR - адрес байта порядка
,-старшего коэффициента полинома.
,-Выходные параметры: R1 - аргу-
мент х (остается неизменным), R0-
-116 -
1.4. Программы вычисления элементарных функций
0381 07ED /конечный результат. CY=1 - приз-
0382 07ED нак некорректно завершённой опе-
0383 07ED ;рации.
0384 07ED ;
0385 07ED /Используются все регистры, 9 байт
0386 07ED /оперативной памяти (адресуемый
0387 07ED /регистром R1 и два, следующих за
0388 07ED /ним, и адресуемый регистром R0 и
0389 07ED /пять, следующих за ней). Глубина
0390 07ED /стека -3+2=5 байт.
0391 07ED
0392 07ED /Аргумент, R0 и R1 сохраняются.
0393 07ED /
0394 07ED /
0395 07ED /
0396 07ED 9
0397 07ED 9
0398 07ED 9
0399 07ED /Вначале занулим накапливаемую сумму и
0400 07ED /вычислим значение указателя В, где будут
0401 07ED /храниться промежуточные результаты
0402 07ED 76 00 MOV @R0,#0 /R0 - накапливаемая сумма
0403 07EF 08 INC R0 /и первое слагаемое.
0404 07F0 76 00 MOV @R0,#0
0405 07F2 08 INC R0
0406 07F3 76 00 MOV @R0,#0
0407 07F5 88 F0 MOV B,R0
0408 07F7 05 F0 INC В /(B)=(R0+3) второе слаг.
0409 07F9 18 DEC R0
0410 07FA 18 DEC R0
0411 07FB /Сохраним порядок полинома в стеке
0412 07FB СО ЕО PUSH АСС /сохр.порядок полинома
0413 07FD /Перенесем в ячейку, на которую указывает В,
0414 07FD /коэффициент полинома из памяти программ
0415 07FD /Для этого обменяем содержимое В и R1
0416 07FD FUNC10:
0417 07FD СО F0 PUSH В
0418 07FF СО 01 PUSH R1
0419 0801 DO F0 POP В
0420 0803 DO 01 POP R1 /обмен указателей
0421 0805 74 00 MOV А,#0 /множит, и слагаемого
0422 0807 93 MOVC A,@A+DPTR /байт порядка
0423 0808 F7 MOV @R1,A
0424 0809 АЗ INC DPTR
0425 080А 09 INC R1
0426 080В 74 00 MOV A,#0
117 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0427 080D 93 MOVC A,@A+DPTR /СтБ мантиссы
0428 080Е F7 MOV @R1,A
0429 080F АЗ INC DPTR
0430 0810 09 INC R1
0431 0811 74 00 MOV A,#0
0432 0813 93 MOVC A,@A+DPTR /МлБ мантиссы
0433 0814 F7 MOV @R1,A
0434 0815 АЗ INC DPTR
0435 0816 19 DEC R1
0436 0817 19 DEC R1 /восстановили R1
0437 0818 /Поменяем порядок слагаемых
0438 0818 СО 00 PUSH R0
0439 081А СО 01 PUSH R1
0440 081С D0 00 POP R0
0441 081Е DO 01 POP R1 /обмен адресов слаг.
0442 0820 СО F0 PUSH В /сохр. в стеке per. В
0443 0822 12 ОА 90 LCALL SDPZ3 /(@R1) = (@R0)+(@Rl)
0444 0825 50 06 JNC FUNC11
0445 0827 DO F0 POP В
0446 0829 DO ЕО POP ACC /баланс стека
0447 082В 80 2А SJMP EFUNI ;авар.выход
0448 082D FUNCI1:
0449 082D DO F0 POP В
0450 082F СО 00 PUSH R0
0451 0831 СО 01 PUSH R1
0452 0833 DO 00 POP R0
0453 0835 DO 01 POP R1 /вернули адреса слаг.
0454 0837 /Восстановим содержимое : В и R1
0455 0837 СО F0 PUSH В
0456 0839 СО 01 PUSH R1
0457 083В DO F0 POP В
0458 083D DO 01 POP R1 /восстановили R1
0459 083F /Восстановим порядок полинома
0460 083F DO ЕО POP ACC /восст. порядок
0461 0841 /Если порядок полинома равен 0, то
0462 0841 /на выход из программы, если нет, то
0463 0841 /умножим на аргумент и сложим со
0464 0841 /следующим коэффициентом полинома,
0465 0841 /затем снова проверим порядок полинома
0466 0841 60 14 JZ EFUN1
0467 0843 14 DEC А
0468 0844 СО ЕО PUSH АСС
0469 0846 /
0470 0846 СО F0 PUSH В
0471 0848 12 ОВ DO LCALL UDPZ3
0472 084В 50 06 JNC FUNC12
—=118 —
1.4. Программы вычисления элементарных функций
0473 084D DO F0 POP В
0474 084F DO ЕО POP ACC /баланс стека
0475 0851 80 04 SJMP EFUNI /авар. выход
0476 0853 FUNC12:
0477 0853 DO FO POP В
0478 0855
0479 0855 80 А6 SJMP FUNCI0 /зацикливаем
0480 0857
0481 0857 /Выход из программы
0482 0857
0483 0857 EFUNI:
0484 0857 22 RET
0485 0858
0486 0858 /Таблицы коэффициентов полиномов функций
0487 0858
0488 0858
0489 0858 /Для экспоненты
0490 0858
0491 0858 ТАВЕХР • EQU $
0492 0858
0493 0858 34 D0 09.DB 034Н,0D0H,009Н / А (7) =0.1984*E-3=34D009H
0494 085В 37 В6 0E.DB 037Н,0В6Н,00EH /А(6)=0.1389*Е-2=37В60ЕН
0495 085Е ЗА 88 87.DB ОЗАН,088Н,087Н / А (5) =0.8333*E-2=3A8887H
0496 0861 ЗС АА AD.DB ОЗСН,0AAH,0ADH / А (4) =0.4167*E-1=3CAAADH
0497 0864 ЗЕ АА B4.DB ОЗЕН,0AAH,0В4Н / А(3 ) =0.1667=ЗЕААВ4Н
0498 0867 40 80 00.DB 040Н,080Н,000Н / А (2)=0.5=4080ООН
0499 086А 41 80 00.DB 041Н,080Н,000Н /А(1)=1=418000Н
0500 086D 41 80 00.DB 041Н,080Н,000Н /А(0)=1=418000Н
0501 0870
0502 0870
0503 0870 /Для синуса обычного
0504 0870
0505 0870 TABSINT . EQU $
0506 0870
0507 0870 В4 2F F7.DB 0В4Н,02FH,0F7H /А(7)=-0.1984*E-3=B42FF7H
0508 0873 00 00 00.DB 000Н,000Н,000Н /А(6)=0=000000Н
0509 0876 ЗА 88 87.DB ОЗАН,088Н,087Н / А (5)=0.8333*E-2=3A8887H
0510 0879 00 00 00.DB 000Н,000Н,000Н /А(4)=0=000000Н
0511 087С BE 55 4C.DB ОВЕН,055Н,04СН / А (3) =-0.1667=ВЕ554СН
0512 087F 00 00 00.DB 000Н,000Н,000Н /А(2)=0=000000Н
0513 0882 41 80 00.DB 041Н,080Н,000Н /А(1)=1=418000Н
0514 0885 00 00 00.DB 000Н,000Н,000Н /А(0)=0=000000Н
0515 0888
0516 0888
0517 0888 /Для косинуса обычного
0518 0888
-119-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0519 0888 TABCOST .EQU $
0520 0888
0521 0888 В7 49 F2 .DB 0B7H,049H,0F2H ;А(6)=-0.1389*E-2=B749F2H
0522 088В 00 00 00 .DB 000H,000H,000H ;А(5)=0=000000Н
0523 088Е ЗС АА AD .DB 03CH,0AAH,0ADH ;А(4)=0.4167*E-1=3CAAADH
0524 0891 00 00 00 .DB 000H,000H,000H ;А(3)=0=000000Н
0525 0894 СО 80 00 .DB 0C0H,080H,000H ;А(2)=-0.5=С08000Н
0526 0897 00 00 00 .DB 000H,000H,000H ;А(1)=0=000000Н
0527 089А 41 80 00 .DB 041H,080H,000H ;А(0)=1=418000Н
0528 089D /
0529 089D
0530 089D ;Для синуса гиперболического
0531 089D 9
0532 089D TABSING .EQU $
0533 089D
0534 089D 34 D0 09 .DB 034H,0D0H,009H ;А(7)=0.1984*E-3=34D009H
0535 08А0 00 00 00 .DB 000H,000H,000H ;А(6)=0=000000Н
0536 08АЗ ЗА 88 87 .DB ОЗАН,088H,087H ;А(5)=0.8333*E-2=3A8887H
0537 08А6 00 00 00 .DB 000H,000H,000H ;А(4)=0=000000Н
0538 08А9 ЗЕ АА B4 .DB 03EH,0AAH,0B4H ; А(3) =0.16'67=ЗЕААВ4Н
0539 08 АС 00 00 00 .DB 000H,000H,000H ;А(2)=0=000000Н
0540 08AF 41 80 00 .DB 041H,080H,000H ;А(1)=1=418000Н
0541 08В2 00 00 00 .DB 000H,000H,000H ;А(0)=0=000000Н
0542 08В5 /
0543 08В5
0544 08В5 ;Для косинуса гиперболического
0545 08В5 9
0546 08В5 TABCOSG .EQU $
0547 08В5
0548 08В5 37 В6 0E .DB 037H,0B6H,00EH ;А(6)=0.1389*Е-2=37В60ЕН
0549 08В8 00 00 00 .DB ооон,ооон,ооон ;А(5)=0=000000Н
0550 08ВВ ЗС АА AD .DB ОЗСН,0AAH,0ADH ;А(4)=0.4167*E-l=3CAAADH
0551 08ВЕ 00 00 00 .DB ооон,ооон,ооон ;А(3)=0=000000Н
0552 08С1 40 80 00 .DB 040Н,080Н,000Н ;А(2)=0.5=408000Н
0553 08С4 00 00 00 .DB ооон,ооон,ооон ;А(1)=0=000000Н
0554 08С7 41 80 00 .DB 041Н,080Н,000Н ;А(0)=1=418000Н
0555 08СА 9
Рассматриваемая программа предназначена для вычисления целого
ряда функций: экспоненциальной, тригонометрических синуса и косинуса
и гиперболических синуса и косинуса. Все эти функции рассчитываются
одинаковым методом, путём определения значения полинома 6, 7-го по-
рядка; различаются лишь коэффициенты их полиномов.
Конечно, для расчёта полиномов можно было бы воспользоваться
описанной выше подпрограммой POLIN. Однако в данном случае её при-
- 120 -
1.4. Программы вычисления элементарных функций
менение не очень желательно. Для программы POLIN необходимо, чтобы
коэффициенты полинома были расположены в оперативной памяти. Не-
трудно посчитать, что расчёт полинома 7-го порядка потребует
3 + 7 х 3 = 24 байта оперативной памяти. А у стандартных микроконтролле-
ров х51, если исключить пространство регистров специальных функций,
всего 96 Б оперативки. И в ней ещё нужно отвести место под стек, который
запросто может потребовать до 32 Б. То есть для расчёта экспоненты (и ря-
да других функций) с использованием подпрограммы POLIN вам придётся
затратить более трети всей имеющейся в вашем распоряжении оператив-
ной памяти. Очевидно то, что это излишняя расточительность.
Программа POLIN применима в случаях, когда коэффициенты поли-
нома получаются путём измерений или из каких-либо расчётов и неизвес-
тны заранее. В случае же расчёта значений экспоненциальной, тригоно-
метрических и гиперболических функций коэффициенты полинома из-
вестны и могут быть размещены в памяти программ в виде «готовых к
употреблению» констант, извлекаемых из программной памяти последо-
вательно, по мере необходимости. Именно так построена программа
FUNC1 — в ней, начиная С меток TABEXP, TABSINT, TABCOST,
TABSING, TABCOSG, хранятся коэффициенты полиномов для соответс-
твующих функций. Расчёт полинома, как и в программе POLIN, ведется по
схеме Горнера (1.40).
Для расчёта показательной функции необходимо поместить в аккумуля-
тор порядок полинома, в рассматриваемом случае — 7, в регистр DPTR —
адрес метки ТАВЕХР и вызвать программу FUNC1. Аргумент должен распо-
лагаться в памяти, адресуемой регистром R1, его значение после вызова
FUNC1 остается неизменным. Результат расчёта находится в памяти, адре-
суемой регистром R0. Как и ранее, флаг переноса CY = 1 — признак некор-
ректно завершённой операции, программа, вызвавшая FUNC1, должна вы-
являть подобную ситуацию и прерывать в этом случае вычисления.
Тестовые данные для подпрограммы вычисления экспоненты приведе-
ны в Табл. 1.11.
Таблица 1.11. Тестовые данные для экспоненты
X У = ех
Л10 Л16 ^10 Л]6
0.1000-10° 3DCCCC 0.110510* 418D76
0.3000-10° 3F999A 0.1350-10* 41АСС9
0.8000-10° 40СССС 0.2226-10* 428Е70
0.1000-10* 418000 0.2718-10* 42ADF9
-0.8000-10° С03334 0.4493-10“ 3FE60C
— 121 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Для вычисления экспоненты на более широком интервале значений ар-
гумента значение х можно представить в виде х = п + z, где п — целая часть
аргумента, a z~ дробная. Тогда вычисление ё* сводится к вычислению ez
на интервале (-1, 1), а также степенной функции ё1«(2.718)".
1.4.8. Тригонометрические функции
Тригонометрические функции определяют трансцендентную зависи-
мость, т. е. зависимость, которая не может быть точно выражена в виде ко-
нечного алгебраического уравнения, между угловыми а и прямоугольны-
ми (х, у) координатами некоторой точки С окружности единичного радиу-
са х1 + у1 1 (см. Рис. 1.14). Ордината точки определяет функцию синуса
у = sin а, абсцисса — функцию косинуса х = cos а, отношение координат
у/х, или, что то же самое, величина отрезка касательной BD, — функцию
тангенса tg а = sin а/cos а, обратное отношение координат х/у, или вели-
чина отрезка касательной FD, — функцию котангенса etg а = cos а/sin а
(на Рис. 4.7 а = 45° и tg 45° = etg 45° = 1). Аналогично тригонометрические
функции определяются для любого угла а, отличающегося от острого угла
а. Аргумент а тригонометрической функции представляет собой действи-
тельное число, которое можно понимать не только как величину централь-
ного угла или длины дуги ВС, но и как площадь сектора круга с углом 2a:
площадь равна 0.5Я2 х 2a = а (на Рис. 1.14 сектор заштрихован). Именно
поэтому тригонометрические функции иногда называют круговыми.
Рис. 1.14. Интерпретация определений тригонометрических функций.
Функции у = sinx и у = cos х определены на всём множестве действи
тельных чисел, но область их значений ограниченна: у е [—1, 1]. Обефунк
-122-
1.4. Программы вычисления элементарных функций
ции являются периодическими с периодом Т = 2л, функция sinx — нечёт-
ная, a cosx — чётная. Графики функций sin х и cos х пересекаются с осью
абсцисс соответственно в точках х = кпих = л/2 + кп и имеют экстремумы
(максимум или минимум) в точках х = л/2 4- кп и х = кп, к = 0, ±1, ±2, ...
(Рис. 1.15л). Функции y = tgx и y = ctgx определены для всех х, кроме
х = л/2 + кп для тангенса и х = кп для котангенса, в которых соответствен-
но cosx и sinx обращаются в нуль. Обе функции периодические с перио-
дом Т= п, нечётные и не ограниченные в области своих значений. Графи-
ки функций tg х и etg х пересекаются с осью абсцисс соответственно в точ-
ках х= л/2 4- кп их = кп (Рис. 1.156, в).
Функция у = sin х разлагается в степенной ряд Тейлора'.
3 5 7 9
sinx=fH+Wli-- (L59)
с радиусом сходимости R = оо. Определим количество членов ряда (1.59),
необходимое при вычислении функции, с точностью jyo четырёх значащих
десятичных цифр, т. е. А = 0.5-10-4,для диапазона аргументах е [-л/4, л/4].
Подставляя в ряд (1.59) значение х = л/4 « 0.7854, найдём, что отбрасыва-
ние члена х7/7! вносит погрешность 0.37-10-4 < А. Поэтому для вычисления
функции у = sin х в заданном диапазоне и с требуемой точностью достаточ-
но взять (с запасом) первые 4 члена ряда (1.59) с коэффициентами: 1/1! = 1;
-1/3! = -0.1667; 1/5! = 0.8333-10"2 и -1/7! = -0.1984-10"3.
Этот метод вычисления синуса аналогичен методу вычисления экспо-
ненты, описанному выше. Здесь нужно поместить в аккумулятор порядок
полинома (в рассматриваемом случае — 7), в регистр DPTR — адрес метки
TABSINT и вызвать программу FUNC1. Аргумент должен располагаться в
памяти, адресуемой регистром R1, его значение после вызова FUNC1 оста-
нется неизменным. Результат расчёта окажется в памяти, адресуемой ре-
гистром R0. Как и ранее, флаг переноса CY = 1 — признак некорректно за-
вершённой операции, программа, вызвавшая FUNC1, должна выявлять по-
добную ситуацию и прерывать в этом случае вычисления.
Для нахождения синуса при значениях аргумента вне диапазона [-л/4,
тс/4] полезны формулы приведения:
sinx = cos(tt/2 — х);
sinх = sin (л - х) = -sin (л 4- х) = -sin (2л - х);
sin х = sin (х 4- к х 2л).
Функция у = cos х разлагается в ряд Тейлора:
2 4 6 8
, X X , X X /1
COSX=1-2!’4!+6!’8! - (L60)
- 123-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
с радиусом сходимости R = оо. Для обеспечения той же точности
вычислений и в том же диапазоне, что и для функций синуса, достаточ-
но взять первые 4 члена ряда (1.60) с коэффициентами: 1; -1/2! = -0.5;
1/4! = 0.4167-10“1 и -1/6! =-0.1389-10"2. По-прежнему для вычислений
используем программу FUNC1. В аккумулятор нужно, как и раньше, по-
местить порядок полинома (в рассматриваемом случае равный 6), а в ре-
гистр DPTR — адрес метки TABCOST.
Для нахождения функции у = cosx при значениях аргумента вне диа-
пазона [—тс/4, тс/4] можно использовать формулы приведения:
cosx = sm(rc/2-x);
cos х — — cos(rc — х) = -cos(rc + х) = cos(2rc — х);
cos х = cos(x + к x 2тс).
Тестовые данные для расчёта тригонометрических синуса и косинуса
приведены в Табл. 1.12 и 1.13.
— 124 —
1.4. Программы вычисления элементарных функций
Таблица 1.12. Меры углов
Градусы Радианы
Лю Лю
45 0.7854-10° 40С910
20 0.3491-10° 3FB2BE
5 0.8727-10"' 3DB2BA
-5 -0.8727-IO"1 BD4D46
-20 -0.3491-10° BF4D42
-45 —0.7854-10° C036F0
Таблица 1.13. Тестовые данные для функций синуса и косинуса
хП у = sinx у = cosx
Лю Л16 Лю Л16
45 0.7071-10° 40В504 0.7071-10’ 40В505
20 0.3420-10° 3FAF22 0.9397-10° 40F08F
•5 0.8716-10-' 3DB280 0.9962-10° 40FF07
-5 - 0.871610-' BD4D80 0.9962-10° 40FF07
-20 —0.3420-10° BF50DE 0.9397-10° 40F08F
-45 -0.7071-10° CO4AFC 0.7071-10° 40В505
Функция у = tg х, как и функции синуса или косинуса, может быть
представлена рядом Тейлора. Однако этот ряд сходится гораздо медленнее,
чем ряды (1.59), (1.60), и, следовательно, требует много членов для обеспе-
чения точности и необходимого диапазона аргумента. Поэтому для вычис-
ления функций у = tg х и у = ctg х целесообразно воспользоваться их опре-
делением посредством функции синуса и косинуса: tgx = sinx/cosx,
ctgx = cosx/sinx. Программы TANT и COTANT вычисляют функции триго-
нометрических тангенса и котангенса на основе этих определений:
0637 0900
0638 0900 TANT:
0639 0900 ;Программа вычисления тангенса,
0640 0900 ;как отношения синуса к косинусу,
0641 0900 /рассчитываемых с помощью программы
0642 0900 /FUNC1. Вначале рассчитывается синус,
0643 0900 /результат сохраняется в стеке.
’0644 0900 /После этого рассчитывается косинус,
0645 0900 /синус пересылается в ячейки,
0646 0900 /адресуемые регистром R1, и затем
0647 0900 /делится на косинус.
-125-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0648 0900
0649 0900 /Входные параметры: R1 - аргумент
0650 0900 ;х в трёхбайтном формате с плава-
0651 0900 /ющей точкой, R0 - трёхбайтный
0652 0900 /буфер для промежуточных вычисле-
0653 0900 ; ний.
0654 0900 /
0655 0900 /Выходные параметры: R0 - ко-
0656 0900 нечный результат. CY=1 - приз-
0657 0900 /нак некорректно завершённой опе-
0658 0900 ;рации.
0659 0900 /
0660 0900 /Используются все регистры, 6 байт
0661 0900 /оперативной памяти (адресуемый
0662 0900 /регистром R1 и два, следующих за
0663 0900 /ним, и адресуемый регистром R0 и
0664 0900 /два, следующих за ним). Глубина
0665 0900 /стека -2+2=4 байта.
0666 0900 /
0667 0900 /R0 и R1 сохраняются.
0668 0900 /
0669 0900 /
0670 0900 /
0671 0900 /
0672 0900 /
0673 0900 /считаем синус и сохраняем его в
0674 0900 /ячейках, адресуемых регистром R0
0675 0900 90 08 70 MOV DPTR,#TABSINT
0676 0903 74 07 MOV А,#7
0677 0905 12 07 ED LCALL FUNCI /в R0 sin x
0678 0908 50 02 JNC TANT10
0679 090А 80 29 SJMP TANT12 /авар.выход
0680 090С /сохраняем в стеке
0681 090С TANT10:
0682 090С Е6 MOV А,@R0 /порядок
0683 090D СО Е0 PUSH ACC
0684 090F 08 INC R0
0685 0910 Е6 MOV A,@R0 /СтБ мантиссы
0686 0911 СО Е0 PUSH ACC
0687 0913 08 INC R0
0688 0914 Е6 MOV A,@R0 /МлБ мантиссы
0689 0915 СО Е0 PUSH ACC
0690 0917 18 DEC R0
0691 0918 18 DEC R0 /восст. R0
0692 0919 /считаем косинус и сохраняем его в
0693 0919 /ячейках, адресуемых регистром R0
-126-
1.4. Программы вычисления элементарных функций
0694 0919 90 08 88 MOV DPTR,hTABCOST
0695 091С 74 06 MOV A,#6
0696 091Е 12 07 ED LCALL FUNCI ;В R0 COS X
0697 0921 50 02 JNC TANT11
0698 0923 80 10 SJMP TANT12 ;авар.выход
0699 0925 /восстанавливаем синус в ячейках,
0700 0925 /адресуемых регистром R1
0701 0925 TANT11:
0702 0925 09 INC R1
0703 0926 09 INC R1
0704 0927 D0 Е0 POP ACC
0705 0929 F7 MOV @R1,A /МлБ мантиссы
0706 092А 19 DEC R1
0707 092В DO Е0 POP ACC
0708 092D F7 MOV @R1,A /СтБ мантиссы
0709 092Е 19 DEC R1
0710 092F DO Е0 POP ACC
0711 0931 F7 MOV @R1,A ;порядок
0712 0932 /деление синуса на косинус
0713 0932 /и завершение
0714 0932 12 ОС 9F LCALL DDPZ3 /@R0:= @Rl:@R0
0715 0935 TANT12:
0716 0935 22 RET
0717 0936
Котангенс считаем аналогично тангенсу, меняется только порядок вы-
числения синуса и косинуса:
Р556 08СА /
057 08СА COTANT:
D558 08СА /Программа вычисления котангенса,
059 08СА /как отношения косинуса к синусу,
060 08СА /рассчитываемых с помощью программы
061 08СА /FUNC1. Вначале рассчитывается косинус,
062 08СА /результат сохраняется в стеке.
063 08СА /После этого рассчитывается синус,
*0564 08СА /косинус пересылается в ячейки,
065 08СА /адресуемые регистром R1, и затем
®5б6 08СА /делится на синус.
Р567 08СА /
J0568 08СА /Входные параметры: R1 - аогумент
069 08СА /х в трёхбайтном формате с плана-
0570 08СА /ющей точкой, R0 - трёхбайтный
0571 08СА /буфер для промежуточных вычисле-
0572 08СА / НИЙ.
0573 08СА /
-127-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0574 08СА /Выходные параметры: R0 - ко-
0575 08СА ,-нечный результат. CY=1 - приз-
0576 08СА нак некорректно завершённой опе-
0577 08СА ;рации.
0578 08СА /
0579 08СА /Используются все регистры, 6 байт
0580 08СА /оперативной памяти (адресуемый
0581 08СА /регистром R1 и два, следующих за
0582 08СА /ним, и адресуемый регистром R0 и
0583 08СА /два, следующих за ним). Глубина
0584 08СА /стека -2+2=4 байта.
0585 08СА /
0586 08СА /R0 и R1 сохраняются.
0587 08СА /
0588 08СА /
0589 08СА /
0590 08СА ;
0591 08СА
0592 08СА /Считаем косинус и сохраняем его в
0593 08СА /ячейках, адресуемых регистром R0
0594 08СА 90 08 88 MOV DPTR,#TABCOST
0595 08CD 74 06 MOV A, #6
0596 08CF 12 07 ED LCALL FUNCI /в R0 COS X
0597 08D2 50 02 JNC CTANT10
0598 08D4 80 29 SJMP CTANT12 /авар.выход
0599 08D6 /сохраняем в стеке
0600 08D6 CTANT10:
0601 08D6 Е6 MOV A,@R0 /порядок
0602 08D7 СО Е0 PUSH ACC
0603 08D9 08 INC R0
0604 08DA Е6 MOV A,@R0 /СтБ мантиссы
0605 08DB СО E0 PUSH ACC
0606 08DD 08 INC R0
0607 08DE Е6 MOV A,@R0 /МлБ мантиссы
0608 08DF СО E0 PUSH ACC
0609 08Е1 18 DEC R0
0610 08Е2 18 DEC R0 /восст. R0
0611 08ЕЗ /считаем синус и сохраняем его в
0612 08ЕЗ /ячейках, адресуемых регистром R0
0613 08ЕЗ 90 08 70 MOV DPTR,#TABSINT
0614 08Е6 74 07 MOV A, #7
0615 08Е8 12 07 ED LCALL FUNCI /В R0 sin X
0616 08ЕВ 50 02 JNC CTANT11
0617 08ED 80 10 SJMP CTANT12 /авар.выход
0618 08EF /восстанавливаем косинус в ячейках,
-128 -
1.4. Программы вычисления элементарных функций
0619 08EF /адресуемых регистром R1
0620 08EF CTANT11:
0621 08EF 09 INC R1
0622 08F0 09 INC R1
0623 08F1 D0 E0 POP ACC
0624 08F3 F7 MOV @R1,A ;МлБ мантиссы
0625 08F4 19 DEC R1
0626 08F5 DO E0 POP ACC
0627 08F7 F7 MOV @R1,A ;СтБ мантиссы
0628 08F8 19 DEC R1
0629 08F9 DO E0 POP ACC
0630 08FB F7 MOV @R1,A /порядок
0631 08FC /деление косинуса на синус
0632 08FC /и завершение
0633 08FC 12 ОС 9F LCALL DDPZ3 /@R0:= @R1:@R0
0634 08FF CTANT12:
0635 08FF 22 RET
0636 0900 /
Для нахождения функций при других значениях аргумента, отличных
от диапазона [—л/4, л/4], полезны формулы приведения:
tgx = ctg(n/2-х);
ctgx = tg(n/2-x);
tgx = -tg (л - x) = tg (л + x) = -tg (л - x);
ctg x = —ctg (л — x) = ctg (л + x) = —ctg (л — x);
tgx = tg(x + Л-л);
ctgx = ctg(x + £-n).
Тестовые данные для программ TANT и COTANT приведены в Табл. 1.14.
Таблица 1.14. Тестовые данные для функций тангенса и котангенса
Xf] y = tgx j^ = ctgx
^10 ^16 Л10 Л]6
45 0.100010* 418000 0.10000-10' 418000
20 0.3640-10° 3FBA5E 0.2747-10' 42AFCE
5 0.8749-10-' 3DB32D 0.1143-102 44B6E1
-5 -0.8749-10-' BD4CD3 —0.1143-102 C44A1F
-20 -0.3640-10° BF45A2 -0.2747-10' C25032
-45 -0.1000-10' C18000 —0.10000-10' Cl 8000
129-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1.4.9. Гиперболические функции
Гиперболические функции, как и тригонометрические, определяют
трансцендентную зависимость между прямоугольными координатами (х,
у) некоторой точки С гиперболы х2 - у2 = 1 (а не окружности х2 + у2 = 1,
как в случае тригонометрических функций), с одной стороны, и аргумен-
том /, представляющим площадь гиперболического сектора, с другой сто-
роны (Рис. 1.16). Ордината точки С определяет гиперболический синус
у = sh /, а её абсцисса — гиперболический косинус у = ch Г, где величина t
представляет площадь гиперболического сектора OCD. Вычислив эту пло-
щадь как разность площадей ху треугольника OCD и криволинейного ин-
теграла 2\ydx, можно определить, например, гиперболический косинус
chZ=(ez+e"z)/2.
Рис. 1.16. Интерпретация определений гиперболических функций.
Гиперболические функции выражаются линейными комбинациями
показательных функций ё* и е~х и их отношениями: sh t = (ez — e-z)/2 и
ch t — (et + e-z)/2. Гиперболические тангенс (thx) и котангенс (cthx) опре-
деляются аналогично одноимённым тригонометрическим функциям как
отношения: th х = sh x/ch х и cth х = ch x/sh х. Функция sh х определена для
всех х, не ограничена в области значений, нечётна и равна нулю в точке
-130-
1.4. Программы вычисления элементарных функций
х = 0. Её график подобен графику нечётной степенной функции. Функция
chx также определена для всех х, изменяется в области значений (1, оо),
чётна и равна единице в точке х = 0. Её график подобен графику чётной
степенной функции. Функция th х определена для всех х, изменяется в
диапазоне (-1, 1), нечётна и равна нулю в точкех= 0. Функция сОгхопреде-
лена для всех ненулевых х, изменяется в области значений (-оо, -1) и (1, +оо),
нечётна.
Функции y = shxny = chx разлагаются в степенной ряд Тейлора'.
3 5 7
shx = A + *. + eL + ?L
1! 3! 5! 7!
(1.61)
(1.62)
2 4 6
C"V ' ' ' Й! '
с радиусом сходимости R = оо. Легко заметить, что разложения гиперболи-
ческих функций отличаются от разложений одноимённых тригонометри-
ческих функций (1.59) и (1.60) только знаками. Поэтому для вычисления
этих функций можно воспользоваться программой FUNC1, задавая в ре-
гистре DPTR соответственно адреса меток TABSING и TABCOSG и порядки
полинома 7 и 6. Для вычисления гиперболических тангенса и котангенса
используются программы TANG и COTANG, отличающиеся от вышеописан-
ных TANT и COTANT лишь тем, что в них сначала определяются не триго-
нометрические, а гиперболические синус и косинус.
0800 096С
0801 096С TANG:
0802 096С /Программа вычисления гиперболи-
0803 096С ческого тангенса как отношения
0804 096С /гиперболических синуса к косину-
0805 096С /су, рассчитываемых с помощью программы
0806 096С /FUNC1. Вначале рассчитывается синус,
0807 096С /результат сохраняется в стеке.
0808 096С /После этого рассчитывается косинус,
0809 096С /синус пересылается в ячейки,
0810 096С /адресуемые регистром R1, и затем
0811 096С /делится на косинус.
0812 096С ;
0813 096С /Входные параметры: R1 - аргумент
0814 096С ;х в трёхбайтном формате с плава-
0815 096С /ющей точкой, R0 - трёхбайтный
0816 096С /буфер для промежуточных вычисле-
0817 096С ; ний.
0818 096С
— 131 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0819 096С /Выходные параметры: R0 - ко-
0820 096С /нечный результат. CY=1 - приз-
0821 096С ;нак некорректно завершённой one-
0822 096С ;рации.
0823 096С /
0824 096С ;Используются все регистры, 6 байт
0825 096С /оперативной : памяти (адресуемый
0826 096С /регистром R1 и два, следующих за
0827 096С /ним, и адресуемый регистром R0 и
0828 096С /два, следующих за ним). Глубина
0829 096С /стека - 2 + : 2=4 байта
0830 096С 9
0831 096С ;R0 и R1 сохраняются.
0832 096С 9
0833 096С 9
0834 096С 9
0835 096С 9
0836 096С 9
0837 096С /рассчитываем синус и сохраняем его в
0838 096С /ячейках, адресуемых регистром R0
0839 096С 90 08 9D MOV DPTR,#TABSING
0840 096F 74 07 MOV А,#7
0841 0971 12 07 ED LCALL FUNC1 /в R0 shin х
0842 0974 50 02 JNC TANG10
0843 0976 80 29 SJMP TANG12 /авар.выход
0844 0978 /сохраняем в < зтеке
0845 0978 TANG10:
0846 0978 Е6 MOV A,@R0 /порядок
0847 0979 СО Е0 PUSH АСС
0848 097В 08 INC R0
0849 097С Е6 MOV A,@R0 /СтБ мантиссы
0850 097D СО Е0 PUSH АСС
0851 097F 08 INC R0
0852 0980 Е6 MOV A,@R0 /МлБ мантиссы
0853 0981 СО Е0 PUSH АСС
0854 0983 18 DEC R0
0855 0984 18 DEC R0 /восст. R0
0856 0985 /рассчитываем косинус и сохраняем его в
0857 0985 /ячейках, адресуемых регистром R0
0858 0985 90 08 В5 MOV DPTR,#TABCOSG
0859 0988 74 06 MOV А,#6
0860 098А 12 07 ED LCALL FUNC1 /в R0 cosh х
0861 098D 50 02 JNC TANG11
0862 098F 80 10 SJMP TANG12 /авар.выход
0863 0991 /восстанавливаем синус в ячейках,
0864 0991 /адресуемых регистром R1
-132
1.4. Программы вычисления элементарных функций
0865 0991 TANG11:
0866 0991 09 INC R1
0867 0992 09 INC R1
0868 0993 D0 E0 POP ACC
0869 0995 F7 MOV @R1,A ;МлБ мантиссы
0870 0996 19 DEC R1
0871 0997 DO E0 POP ACC
0872 0999 F7 MOV @R1,A /СтБ мантиссы
0873 099А 19 DEC R1
0874 099В DO Е0 POP ACC
0875 099D F7 MOV @R1,A ;порядок
0876 099Е /деление синуса на косинус
0877 099Е /и завершение
0878 099Е 12 ОС 9F LCALL DDPZ3 /@R0:= @Rl:@R0
0879 09А1 TANG12:
0880 09А1 22 RET
0881 09А2 /
Гиперболический котангенс считаем аналогично гиперболическому
тангенсу, меняется только порядок вычисления гиперболических синуса и
косинуса:
0718 0936
0719 0936 COTANG:
0720 0936 /Программа вычисления гиперболи-
0721 0936 /ческого котангенса как отношения
0722 0936 /гиперболических косинуса к сину-
0723 0936 /су, рассчитываемых с помощью программы
0724 0936 /FUNC1. Вначале рассчитывается косинус,
0725 0936 /результат сохраняется в стеке.
0726 0936 /После этого рассчитывается синус,
0727 0936 /косинус пересылается в ячейки,
0728 0936 /адресуемые регистром R1, и затем
0729 0936 /делится на синус.
0730 0936 /
0731 0936 /Входные параметры: R1 - аргумент
0732 0936 /х в трёхбайтном формате с плава-
0733 0936 /ющей точкой, R0 - трёхбайтный
0734 0936 /буфер для промежуточных вычисле-
0735 0936 ; ний.
0736 0936 f
0737 0936 /Выходные параметры: R0 - ко-
0738 0936 нечный результат. CY=1 - приз-
0739 0936 нак некорректно завершённой опе-
0740 0936 ;рации.
0741 0936 /
0742 0936 /Используются все регистры, 6 байт
133 -
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
0743 0936 /оперативной памяти (адресуемый
0744 0745 0746 0747 0748 0749 0750 0751 0752 0753 0754 0755 0756 0757 0936 0936 0936 0936 0936 0936 0936 0936 0936 0936 0936 0936 0936 0936 90 08 /регистром R1 и два, следующих за /ним, и адресуемый регистром R0 и /два, следующих за ним). Глубина /стека -2+2=4 байта. ;R0 и R1 сохраняются. / 7 / /рассчитываем косинус и сохраняем его в /ячейках, адресуемых регистром R0 В5 MOV DPTR,ttTABCOSG
0758 0939 74 06 MOV А, #6
0759 093В 12 07 ED LCALL FUNCI /в R0 ch x
0760 093Е 50 02 JNC CTANG10
0761 0940 80 29 SJMP CTANG12 /авар.выход
0762 0763 0764 0942 0942 0942 Е6 /сохраняем в стеке CTANG10: MOV A,@R0 /порядок
0765 0943 СО Е0 PUSH ACC
0766 0945 08 INC R0
0767 0946 Е6 MOV A,@R0 /СтБ мантиссы
0768 0947 СО Е0 PUSH ACC
0769 0949 08 INC R0
0770 094А Е6 MOV A,@R0 /МлБ мантиссы
0771 094В СО ЕО PUSH ACC
0772 094D 18 DEC R0
0773 094Е 18 DEC R0 ,-bocct. R0
0774 0775 0776 094F 094F 094F 90 08 /рассчитываем синус и сохраняем его в /ячейках, адресуемых регистром R0 9D MOV DPTR,ttTABSING
0777 0952 74 07 MOV A,#7
0778 0954 12 07 ED LCALL FUNCI /в R0 sh x
0779 0957 50 02 JNC CTANG11
0780 0959 80 10 SJMP CTANG12 /авар.выход
0781 0782 0783 0784 095В 095В 095В 095В 09 /восстанавливаем косинус в ячейках, /адресуемых регистром R1 CTANG11: INC R1
0785 095С 09 INC R1
0786 095D D0 ЕО POP ACC
0787 095F F7 MOV @R1,A /МлБ мантиссы
0788 0960 19 DEC R1
-134
1.4. Программы вычисления элементарных функций
0789 0961 DO Е0 POP ACC
0790 0963 F7 MOV @R1,A /СтБ мантиссы
0791 0964 19 DEC R1
0792 0965 DO Е0 POP ACC
0793 0967 F7 MOV @R1,A /порядок
0794 0968 /деление косинуса на синус
0795 0968 /и завершение
0796 0968 12 ОС 9F LCALL DDPZ3 ,-@R0: = @Rl:@R0
0797 096В CTANG12:
0798 096В 22 RET
0799 096С /
1.4.10. Логарифм, обратные тригонометрические функции
Логарифм, как и тригонометрические функции, может быть представ-
лен степенным рядом Тейлора'.
1пх = (х-1)-—(х-1)2 +-(х-1)3 - ...,
V ' 2V ' 3V ' (1.63)
| X -11 < 1, X;*0.
Однако этот ряд сходится гораздо медленнее, чем ряды (1.59), (1.60), и,
следовательно, требуется много членов для обеспечения требуемой точ-
ности.
Аналогично обстоит дело и для обратных тригонометрических функций'.
х3 1-Зх5 1-3 -5х7
arcsin х = х +----+------+---------
2-3 2-4-5 2-4-6-7
х х х х
arctg х = х---+----------+ ...,
3 5 7
|х-1|<1.
(1.64)
(1.65)
Остальные обратные тригонометрические функции рассчитываются
через арксинус и арктангенс с использованием относительно простых
формул, которые будут приведены ниже.
Во всех рассматриваемых случаях для обеспечения точности до четы-
рёх значащих десятичных цифр, т. е. А = 0.5-10~4, необходимо взять более
десятка членов рядов (1.63...1.65). Очевидно, что подобные расчётные за-
траты не всегда приемлемы, поэтому ниже будет рассмотрен один из аль-
тернативных методов расчёта этих (и ряда других) функций.
— 135 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1.4.11. Аппроксимация функций многочленами с конечным числом
членов
Рассмотренные в предыдущих разделах разложения функций в степен-
ной ряд Тейлора характеризуются тем, что каждый из этих рядов бесконе-
чен. Для достижения заданной точности вычислений мы берём лишь оп-
ределённое число членов того или иного ряда, отбрасывая остальные, сум-
марный вклад которых меньше допустимой погрешности. При этом в
одном случае нам удаётся обойтись первыми пятью—восемью членами ря-
да, в другом их нужно взять в 2—3 раза больше. Но во всех случаях исход-
ные разложения содержат бесконечное число членов ряда.
Однако для многих функций существуют аппроксимации полиномами,
содержащими конечное число членов. Коэффициенты полиномов подобра-
ны таким образом, что заявленная точность расчётов достигается во всём
диапазоне оговоренных значений аргумента. В настоящем разделе мы рас-
смотрим подобные аппроксимации для логарифмических и обратных три-
гонометрических функций. Эти аппроксимации взяты из [3].
Для аппроксимации логарифмических функций рекомендуется исполь-
зовать следующие соотношения:
1п(1 + х) = а1х + а2х2 +л3х3 + а4х4 + я5х5 + с(х);
|е(х)|<110 ; 0<х<1; (1.66)
ах = 0.99949556; а2 = -0.49190896; а3 = 0.28947478;
а4 =-0.13606275; а5 =0.03215845.
х — 1
1g х = a{t + a3t3 + в (х); t =---;
х + 1
| е (х) | < 6-10 ~4; 1Л/йГ< х < л/ЙГ; <L67)
а, = 0.86304; а3 = 0.36415.
Пересчёт между десятичными и натуральными логарифмами осущест-
вляется по формулам
log10х = = 1°ёю е ’ 1пх = (0.434294...) 1пх; (1.68)
ш10
Inx = In 10 • log10 х = (2.302585...)log10 х. (1.69)
Очевидно, что аналогичные соотношения связывают десятичные и на-
туральные логарифмы с логарифмами по произвольному основанию.
-136-
1.4. Программы вычисления элементарных функций
Для арксинуса и арктангенса возможно использование следующих
формул:
|Е(х)|<5-10-5; 0<х<1; (J 70)
ай =1.5707288; а, = -0.2121144; а2 = 0.0742610;
а3 =-0.0187293.
arctg х = ахх + а3х3 + а5х5 + а7х7 + а9х9 + е(х);
| е(х)|< 1-10 5; -1 <х< 1;
а, =0.9998660; а3 =-0.3302995; а5 =0.1801410;
а7 = -0.0851330; а9 = 0.0208351.
Остальные обратные тригонометрические функции можно найти через
арксинус и арктангенс при помощи соотношений
arccosecx = arcsin^,
arcsec х = arccos^,
arcctgx = arctg ,
n
arcsec x+ arccosecx = —.
2
Программы, осуществляющие расчёт значений функций, рассматри-
ваемых в настоящем разделе, предлагаем написать читателям самостоя-
тельно — приведённой в предыдущих разделах информации для этого
вполне достаточно.
Если указанная выше точность окажется недостаточной, в упомянутом
ранее справочнике [3] можно найти соотношения, обеспечивающие ещё
меньшую погрешность аппроксимации. Естественно, в этом случае поря-
док аппроксимирующих полиномов будет выше, чем у полимов (1.66),
(1.67), (1.69) и (1.70).
Мы рассмотрели полиномиальные аппроксимации для логарифмичес-
ких и обратных тригонометрических функций. Но есть ещё один важный
случай, когда аппроксимация функциональной зависимости полиномом с
конечным числом членов позволяет упростить решение сложной вычис-
лительной задачи.
В практике использования микроконтроллеров у разработчика не-
редко возникает необходимость расчёта функции, аналитическое выраже-
— 137 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
ние которой неизвестно, а есть лишь полтора-два десятка точек её кривой,
полученных экспериментальным путём.
В этом случае одним из вариантов решения проблемы определения
требуемой функции является нахождение коэффициентов аппроксимиру-
ющего её полинома вида
у(х) = я0 + а{*х + а2’Х2 + а3-х? + ... + аух”. (1-72)
Порядок полинома (1.72) должен быть как минимум на единицу ниже
числа экспериментальных точек. Процедура нахождения коэффициентов
полинома носит название полиномиальной регрессии. Она подробно опи-
сана во многих изданиях, в частности в [4], поэтому останавливаться на
программе для PC, реализующей её, мы не будем.
Обычно для гладкой, без резких выбросов, зависимости достаточно ап-
проксимирующего полинома 7...9 порядка, при этом желательно, чтобы
число исходных точек было не менее 12...15. Если полином указанного по-
рядка обеспечивает аппроксимацию экспериментальных точек с приемле-
мой точностью (например, не хуже 0.1...0.3%), то задачу нахождения ана-
литического вида искомой функции с заданной погрешностью можно
считать решённой. Тогда расчёт значений функции можно осуществить
при помощи программы FUNC1, с использованием найденных коэффици-
ентов aQ, а{... ап.
1.5. ПИД-регулятор на МК с использованием
программ АПТ
1.5.1. Общие сведения
В конце главы, посвященной программам арифметики с плавающей
точкой (АПТ), ознакомимся с примером практической реализации
ПИД-регулятора на микроконтроллере, в программе которого использу-
ются рассмотренные выше подпрограммы. Но сначала обсудим некото-
рые основные положения, касающиеся систем автоматического регули-
рования.
Назначение регуляторов состоит в том, чтобы устанавливать и поддер-
живать на заданном уровне FK (задающий параметр) определенную физи-
ческую константу X(регулируемую величину). Для этого регулятор должен
определенным образом противодействовать воздействию возмущений.
Блок-схема простого контура регулирования представлена на
Рис. 1.17. Регулятор влияет на регулируемую величину X с помощью регу-
лирующего воздействия Ктак, чтобы значение рассогласования W— %было
— 138 —
1.5. ПИД-регулятор на МК с использованием программ АЛТ
сование
Рис. 1.17. Блок-схема контура регулирования.
как можно меньшим. Воздействующее на объект регулирования возмуще-
ние формально можно представить как аддитивную помеху Z, аддитивно
накладывающуюся на задающий параметр. Ниже мы будем исходить из
предположения, что регулируемая величина является электрическим на-
пряжением и что объект управляется электрическим способом. Поэтому
можно использовать электронный регулятор.
Простейшим примером такого регулятора служит усилитель, на вход
которого подается отклонение регулируемой величины W—X. Если регу-
лируемая величина Xпревышает заданное значение разность И7- Xста-
новится отрицательной. Благодаря этому значение регулирующего воз-
действия У уменьшается, что компенсирует разность W— X. В установив-
шемся состоянии остаточное рассогласование W— X тем меньше, чем
выше коэффициент усиления AR регулятора. Для линейной системы, пред-
ставленной на Рис. 1.17, справедливы соотношения
Y=Ar(W-X),X = A£Y+Z). (1.73)
Отсюда получаем выражение для определения регулируемой величины X:
X = ArXAs..w +----------Z- (1 -74)
\ + AR*As 1 + Ar*As
Понятно, что способность системы следовать за изменением задающе-
го параметра тем ближе к 1, чем выше коэффициент усиления цепи
dZ
обратной связи:
лу
g = AR*As=——-----. (1.75)
* R s d(W-X)
Переходная характеристика при возмущении — тем ближе к нулю,
dZ
чем больше коэффициент усиления AR регулятора. Однако следует учиты-
- *39 -
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
вать то обстоятельство, что коэффициент усиления цепи обратной связи
нельзя сделать сколь угодно большим, поскольку в этом случае неизбеж-
ный сдвиг фазы в контуре регулирования приведет к возникновению коле-
баний (система самовозбудится). Задача регулирования заключается в том,
чтобы, несмотря на указанные ограничения, обеспечить возможно мень-
шее рассогласование регулирования и хорошую переходную характерис-
тику. С этой целью к линейному усилителю добавляют интегратор и диф-
ференциатор и получают таким образом вместо пропорционального регу-
лятора (П-регулятора) ПИ- или ПИД-регулятор.
П- и ПИ-регуляторы в настоящем обзоре мы рассматривать не
будем — читатели найдут необходимую информацию в [5]. Нас интересует
только ПИД-регулятор.
Блок-схема ПИД-регулятора приведена на Рис. 1.18. На частотах выше
граничной частоты дифференциатора fD устройство ведет себя как диффе-
ренцирующее звено. На частотах ниже граничной частоты интегратора /7
оно ведет себя как интегрирующее звено, а в диапазоне между этими час-
тотами — как линейный усилитель с пренебрежимо малым фазовым сдви-
гом. Диаграмма Боде ПИД-регулятора приведена на Рис. 1.19.
Рис. 1.18. Блок-схема ПИД-регулятора.
На частотах выше fD фазовый сдвиг возрастает вплоть до +90°. Это фа-
зовое опережение обычно используют для того, чтобы частично скомпен-
сировать фазовое отставание, вносимое объектом регулирования на часто-
тах вблизи критической частоты fK. При этом можно получить более высо-
кую, чем для П- или ПИ-регулятора, критическую частоту, благодаря чему
уменьшается длительность переходного процесса.
-140-
1.5. ПИД-регулятор на МК с использованием программ АПТ
Рис. 1.19. Диаграмма Боде ПИД-регулятора.
На частотах ниже fj фазовый сдвиг регулятора падает до значения -90°.
Благодаря этому общее запаздывание в системе «объект-регулятор» умень-
шается. Это даёт возможность установить большой коэффициент усиления
регулятора на низких частотах, в то время как на частотах выше граничной
частоты// максимальная величина коэффициента усиления обусловлива-
ется отсутствием автоколебаний. Переходная характеристика, таким обра-
зом, определяется дифференцирующим звеном, а остаточное рассогласо-
вание стремится к нулю, поскольку
*?т|^=°°. (1.76)
Из анализа блок-схемы регулятора, приведённой на Рис. 1.18, следует,
что комплексный коэффициент усиления ПИД-регулятора определяется
соотношением
AR = Ap+JwtD+-----= Ар
.7 СОТ/
(1.77)
При этом
f = __f — i
Jd 2mD ’ Jl 2tct7 ’
Введём обозначение e = W— X. Тогда для выходного сигнала ПИД-ре-
гулятора можно записать:
U(f) = AP (e(t)+^]e(t)dt + zD^\. (1.78)
< Т/ 0 J
Запишем соотношение (1.78) в конечных разностях, заменив произ-
водную на отношение разности сигналов рассогласования в моменты вре-
мени, разделённые конечным временным интервалом (периодом кванто-
— 141 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
вания), к величине этого интервала, а интеграл — суммой произведений
сигналов рассогласования на величину временного интервала:
и(к) = АР е(к)+— *£е(П*Тк + тй
L /=1 тк
(1.79)
где t = kxTk, к = 1, 2, 3, ... — номер периода квантования, Тк — период
квантования.
В принципе уже этим соотношением можно было бы воспользоваться
для численного расчёта выходного сигнала регулятора. Однако на практи-
ке поступают иначе — находят разность сигналов \и(к) = и(к) — и(к — 1),
определяемых в соответствии с (1.79) для двух моментов времени, разде-
ленных периодом квантования Тк9 и суммируют эти приращения Аи(к). В
результате получается скоростной алгоритм управления, полностью экви-
валентный исходному:
Аи(к) = и(к) - и(к -1) = AFx
Г т т 1 (1.80)
x\e(Jc)-e(k-\)+— е(к) + -^- {е(к)-е(к-\)-(е{к-\)-е(к-2))]\.
I *1 Тк J
Или, приведя подобные члены, получим
и(к) = и(к- 1) + Лр[б/0 х е(к) + хе(к- 1) + d2 х е(к - 2)], (1.81а)
где
4> = 1 + — + ^-, 4=-1-2^, d2=^-. (1.816)
' к * к ' к
Для того чтобы эффект квантования по времени мало сказывался на
динамике системы цифрового регулирования, рекомендуется выбрать пе-
риод квантования из соотношения Г95/15 < Тк< Т95/5, где Г95 — время до-
стижения выходным сигналом уровня 95% от установившегося значения
при подаче на вход объекта ступенчатого сигнала. Если объект первого по-
рядка, то 7*95« т + 3 Т.
Другой подход к выбору величины периода квантования основан на ре-
комендациях американских ученых Зиглера и Николса, согласно которым
Тк = 0.1- Ткр, где Ткр — период критических колебаний объекта управления.
С целью упрощения процедуры настройки цифрового ПИД-регулято-
ра рекомендуется (всё теми же Зиглером и Николсом) выбирать следую-
щие значения отношений при Тк = 0.1 -Ткр:
— = 0.2; — = 1.25- П-82)
Тк
-142-
1.5. ПИД-регулятор на МК с использованием программ АПТ
В этом случае, согласно (1.81), соответствующие коэффициенты будут
равны:
^о = 2.45; ^ = -3.5; б/2=1.25. (1.83)
Таким образом, в нашем алгоритме настраиваемым параметром оста-
ется лишь один коэффициент усиления регулятора AR. Его достаточно прос-
то подобрать экспериментально, так, чтобы декремент затухания в системе
был равен 1/4.
1.5.2. Принципиальная схема устройства
В качестве основного элемента выберем микроконтроллер фирмы
Philips P89LPC915. Выбор обусловлен следующими обстоятельствами.
Этот микроконтроллер с 2-килобайтной флэш-памятью программ от-
носится к семейству LPC второго поколения и характеризуется высоким
быстродействием (в 6 раз более высоким, чем у стандартного микроконт-
роллера х51 при равной тактовой частоте), небольшими габаритами, мини-
мальным числом выводов (всего 14) и удивительно низкой ценой (менее 2
долларов в розницу).
Далее, при его программировании вы можете задать тактирование от
встроенного (не требующего внешних элементов!) RC-генератора с часто-
той около 7.37 МГц. Это означает, что микроконтроллер будет работать
примерно в 3.7 раза быстрее обычного 12-мегагерцового х51. С внешним
кварцевым резонатором этот микроконтроллер может работать на частотах
до 18 МГц (в 9 раз быстрее обычного х51 на 12 МГц!), но, поскольку в дан-
ном примере такая высокая скорость не требуется, лучше использовать
встроенный RC-генератор, сэкономить можно на внешних элементах.
Цепь сброса микроконтроллера не требует внешних элементов (супер-
визора питания или 7?С-цепи), по крайней мере до частоты 12 МГц.
Таким образом, из 14 выводов 12 (за исключением Vss и Vdd) могут быть
задействованы пользователем по своему усмотрению. Правда, надо иметь
в виду, что 3 вывода из этих 12 используются при программировании, поэ-
тому на момент программирования они должны быть отсоединены от
пользовательских цепей.
Микроконтроллер имеет также встроенный счетверённый 8-битный
АЦП последовательного приближения, ЦАП и два аналоговых компарато-
ра, 12С-интерфейс, таймер реального времени, сторожевой таймер, тради-
ционный для Philips второй DPTR, 20-миллиамперные выводы портов, че-
тырёхуровневую систему прерываний и несколько режимов пониженного
энергопотребления. Правда, в нашем примере эти богатейшие возможнос-
ти маленькой 14-выводной микросхемы использованы не будут, но пом-
нить о них разработчику полезно. Как и о том, что выбранный нами конт-
роллер отнюдь не является самым производительным из всего семейства
- 143-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
LPC9xx или самым насыщенным периферией, скорее даже наоборот. Но
при этом — такие возможности!
Принципиальная схема устройства приведена на Рис. 1.20.
Использован внешний 12-битный АЦП ADS7816, хорошо знакомый
читателям по первым томам настоящего издания, и 16-битный ЦАП
AD420 от Analog Devices. Устройство питается от 12 В, для получения 5-
вольтового напряжения используется стандартная микросхема 7805.
Выводы АЦП DA1 и ЦАП DA3 подсоединены к линиям порта Р0 мик-
роконтроллера DD1. Линии порта Р1, три из которых используются при
программировании микросхемы, оставлены незадействованными. Термо-
резистор R2 с отрицательным температурным коэффициентом и номи-
нальным сопротивлением 5.1 кОм включен в нижнее плечо делителя
R1R2, сопротивление резистора верхнего плеча выбрано равным сопро-
тивлению R2 на заданной температуре стабилизации (в данном случае
2.2 кОм).
Объект регулирования — металлическая пластина площадью примерно
50 см2, на которой помимо терморезистора R2 закреплён некий датчик,
температуру которого нужно стабилизировать, и транзистор VT1 (КТ815А).
Резистор R4 в цепи эмиттера используется для контроля тока через тран-
зистор. Терморезистор R2 и транзистор VT1 гальванически изолированы от
пластины и находятся как можно ближе друг к другу. Необходимо также
обеспечить им как можно лучший тепловой контакт с пластиной.
На опорный вход АЦП подаётся напряжение питания Vdd. В данном
случае это допустимо, поскольку пульсации опорного напряжения приво-
дят, благодаря использованию резистивного делителя, к пропорциональ-
ному уменьшению или увеличению сигнала на входе АЦП.
ЦАП DA3 включён по стандартной схеме. Необходимо отметить, что
использование такого ЦАП в данном устройстве нетипично, так как он яв-
ляется не обычным ЦАП, а полнофункциональным устройством преобра-
зования «код-выходной ток» (в данном случае — 0...20 мА). В качестве
цифро-аналогового преобразователя с формирователем сигнала токовой це-
пи ЦАП AD420, по моему мнению, является на сегодняшний день лучшим
из всех производимых в мире изделий подобного назначения, поскольку
заявленную точность преобразования он полностью обеспечивает за счёт
заводской калибровки и не требует использования каких-либо подстроеч-
ных резисторов. При этом микросхема проста и очень многофункциональ-
на. Именно поэтому я и решил использовать её в данном примере, чтобы
подробно описать методы работы с такой замечательной микросхемой,
как AD420.
Дополнительным преимуществом использования AD420 в исполни-
тельной части устройства является предельная простота управления тран-
зистором VT1 — напрямую, без каких-либо согласующих элементов.
-144-
С4 С5
С6
R3
Vdd РО.О Р0.1 Р0.2 CPU Р89 LPC 915 РО.З РОД Р0.5 GND
DD1
OUT
#
7805
DA2
10 нФ 10 нФ 3.3 нФ +12в
+IN
GND
20
7
8
9
2
Е
5
С2
С1
LAT
CLC
DAT
+V
RS1
RS2
#
AD
420
СЗ
Vdd
RFO
RF1
OUT
23
14
7?
18
GND
GND
6
11
DA3
Рис. 1.20. Принципиальная схема ПИД-регулятора на микроконтроллере P89LPC915.
1.5. ПИД-регулятор на МК с использованием программ АПТ
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
1.5.3. Работа устройства
Работа устройства, как и его схема, очень проста. Сопротивления ре-
зисторов делителя R1R2 выбраны так, что при достижении регулируемым
параметром требуемой величины сигнал на входе Ini АЦП будет равен по-
ловине опорного напряжения (или 2048). Поэтому в качестве сигнала рас-
согласования е = W— X (см. выражение (1.78)) примем разность между
сигналом с АЦП и числом 2048 (при этом обе эти величины представлены
в форме с плавающей точкой). Микроконтроллер опрашивает АЦП, рас-
считывает и запоминает значение рассогласования и вычисляет сигнал для
вывода в ЦАП. После вывода в ЦАП реализуется 2-секундная задержка, и
всё повторяется сначала.
Сигнал для вывода в ЦАП рассчитывается в соответствии с соотноше-
нием (1.81) и с учётом (1.83). Период дискретизации, как упоминалось,
выбран равным 2 с. Токовый сигнал программно ограничивается значени-
ем 5 мА, что обеспечивает максимальную мощность нагревательного эле-
мента (которым в данном случае является VT1), равную 2.4 Вт (при усло-
вии, что у VT1 коэффициент усиления рст = 40). Это примерно вдвое вы-
ше, чем мощность, необходимая для нагрева объекта до требуемой
температуры.
1.5.4. Программа для микроконтроллера устройства
Программа, реализующая описанные действия, приведена ниже.
R7 .EQU 7
R6 . EQU 6
R5 . EQU 5
R4 . EQU 4
R3 . EQU 3
R2 . EQU 2
R1 . EQU 1
R0 . EQU 0
АСС . EQU ОЕОН
В . EQU 0F0H
PSW . EQU 0D0H
SP . EQU 81Н
DPL . EQU 82Н
DPH . EQU 83Н
РО . EQU 80Н
Р1 . EQU 90Н
Р2 . EQU 0A0H
РЗ . EQU ОВОН
В.О . EQU 0F0H
В.1 . EQU 0F1H
-146-
1.5. ПИД-регулятор на МК с использованием программ АПТ
В.2 • EQU 0F2H
в.з . EQU 0F3H
В.4 . EQU 0F4H
В.5 . EQU 0F5H
В.6 . EQU 0F6H
В.7 . EQU 0F7H
АСС.О . EQU ОЕОН
АСС.1 . EQU 0Е1Н
АСС.2 . EQU 0Е2Н
АСС.З . EQU ОЕЗН
АСС.4 . EQU 0Е4Н
АСС.5 . EQU 0Е5Н
АСС.6 . EQU 0Е6Н
АСС.7 . EQU 0Е7Н
PSW.1 • EQU 0D0H
PSW.1 . EQU 0D1H
PSW.2 . EQU 0D2H
PSW.3 . EQU 0D3H
PSW.4 . EQU 0D4H
PSW.5 . EQU 0D5H
PSW.6 . EQU 0D6H
PSW.7 • EQU 0D7H
GF0 . EQU PSW.5
РО.О . EQU 080Н
Р0.1 . EQU 081Н
Р0.2 . EQU 082Н
РО.З . EQU 083Н
Р0.4 . EQU 084Н
Р0.5 . EQU 085Н
РО.б . EQU 086Н
РОЛ . EQU 087Н
Р1.0 . EQU 090Н
Р1.1 . EQU 091Н
Р1.2 . EQU 092Н
Р1.3 . EQU 093Н
Р1.4 . EQU 094Н
Р1.5 . EQU 095Н
Р1.6 • EQU 096Н
Р1.7 . EQU 097Н
Р2.0 . EQU ОАОН
Р2.1 . EQU 0А1Н
Р2.2 . EQU 0А2Н
Р2.3 . EQU ОАЗН
Р2.4 . EQU 0А4Н
Р2.5 • EQU 0А5Н
Р2.6 . EQU 0А6Н
-147-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
Р2.7 . EQU 0А7Н
РЗ.О .EQU ОВОН
Р3.1 . EQU 0В1Н
Р3.2 . EQU 0В2Н
РЗ.З . EQU ОВЗН
Р3.4 . EQU 0В4Н
Р3.5 . EQU 0В5Н
РЗ.б . EQU 0В6Н
Р3.7 Р0М1 Р0М2 Р1М1 Р1М2 .EQU .EQU .EQU .EQU .EQU 0В7Н 084Н 085Н 091Н 092Н
CSADC .EQU Р1.7
CLKADC .EQU Р1.5
DATADC .EQU Р1. б
LATDAC0 . EQU Р1.4
CLKDAC0 .EQU Р1.3
DATDAC0 CLKIND1 DATIND1 .EQU .EQU .EQU Р1.2 Р1.1 Р1.0
К .EQU 40Н /КОЭФ. УСИЛ. 1...255 В ВИДЕ ЦЕЛОГО ЧИСЛА
KPZ . EQU 41Н /КОЭФ. УСИЛ. В ФОРМЕ С ПТ
E2PZ .EQU 44Н ;E(i-2) В ФОРМЕ С ПТ
E1PZ . EQU 47Н ;E(i-l) В ФОРМЕ С ПТ
E0PZ . EQU 4АН ;E(i) В ФОРМЕ С ПТ
U1PZ . EQU 4DH ;U(i-l) В ФОРМЕ С ПТ
U0PZ . EQU 50Н ;U(i) В ФОРМЕ С ПТ
ио .EQU 53Н /ВЫХОДНОЙ СИГНАЛ U(i), ДВУХБАЙТНОЕ ЦЕЛОЕ
ADS . EQU 55Н /РЕЗУЛЬТАТ ОЦИФРОВКИ АЦП, ДВУХБАЙТНОЕ ЦЕЛОЕ
OPER1 . EQU 57Н /ТРИ БАЙТА ОЗУ ДЛЯ ОДНОГО ИЗ ОПЕРАНДОВ
OPER2 .EQU БАН /ТРИ БАЙТА ОЗУ ДЛЯ ОДНОГО ИЗ ОПЕРАНДОВ
OPER3 .EQU 5DH /ТРИ БАЙТА ОЗУ ДЛЯ ОДНОГО ИЗ ОПЕРАНДОВ
KU CONST1L CONST1M . EQU . EQU .EQU 05 /ЗНАЧЕНИЕ КОЭФ. УСИЛ. Аг 042Н 09СН
CONST1H CONST2L CONST2M .EQU .EQU .EQU OCDH /CONST1 = 429CCD = 2.45 0С2Н 020Н
CONST2H CONST3L CONST3M .EQU . EQU . EQU 000Н /CONST2 = С22000 = -3.5 041Н 0A0H
-г 148 —
1.5. ПИД-регулятор на МК с использованием программ АПТ
CONST3H .EQU 000H /CONST3 = 41A000 = 1.25
C2048L .EQU OCCH
C2048M .EQU 080H
C2048H .EQU 000H /С2048 = CC8000 = -2048
.ORG 0000Н
SS3:
MOV Р0М1,#0
MOV Р0М2,#0
MOV Р1М1,#0
MOV Р1М2,#0
MOV Pl,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV P0,#0FFH
LJMP SS4
SS31:
LCALL IZMN256
LCALL AD420E
SJMP SS31
/АЛГОРИТМ РАСЧЕТА ВЫХОДНОГО СИГНАЛА ЦИФРОВОГО ПИД-РЕГУЛЯТОРА СЛЕДУЮЩИЙ.
/ВЫХОДНОЙ СИГНАЛ РАССЧИТЫВАЕТСЯ ПО ФОРМУЛЕ
;U(i) = U(i-l) + Kx(CONSTl*E(i) + CONST2*E(i-l) + CONST3*E(i-2)),
/ГДЕ U(i), U(i-l) - ВЫХОДНОЙ СИГНАЛ РЕГУЛЯТОРА В МОМЕНТЫ i И i-1 СООТВЕТСТВЕННО,
/CONST1, CONST2, CONST3 - КОНСТАНТЫ, ОПРЕДЕЛЯЕМЫЕ ПОСТОЯННЫМИ ВРЕМЕНИ
/РЕГУЛЯТОРА И ПЕРИОДОМ ОЦИФРОВКИ/ВЫВОДА СИГНАЛА РЕГУЛИРОВАНИЯ, E(i),
/E(i-l), E(i-2) - СИГНАЛЫ РАССОГЛАСОВАНИЯ (ОШИБКИ) В МОМЕНТЫ i, i-1, i-2
.ORG 0100H
/ЗДЕСЬ КУСОК ПРОГРАММЫ С НАСТРОЙКОЙ ОЗУ
SS4:
MOV R0,#4ОН
MOV Rl,#32
MOV A,#0
SS41:
MOV @R0,A
INC RO
DJNZ R1,SS41
-4 149-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
/ПРЕОБРАЗОВАНИЕ КОЭФ.УСИЛЕНИЯ В ФОРМУ С ПТ
MOV K,#KU
MOV К+1,#0 /ЗНАЧЕНИЕ К ЗАГРУЗИЛИ ДЛЯ ПРЕОБРАЗОВАНИЯ В Ф-МУ С ПТ
MOV R0,#K
MOV R1,#KPZ
LCALL CDPZ3 /К В Ф-МЕ С ПТ В KPZ+0..2
/ОСНОВНОЙ ЦИКЛ
MAINCYCL:
LCALL IZMN256 /ОПРОС АЦП, РЕЗУЛЬТАТ В R5,R4
MOV ADS,R4
MOV ADS+1,R5 /СОХРАНИЛИ РЕЗУЛЬТАТ В ADS+0., .1
MOV MOV MOV E2PZ,ElPz' E2PZ+1,E1PZ+1 E2PZ+2,E1PZ+2 /ПЕРЕСЫЛКА СОДЕРЖИМОГО E1PZ В E2PZ
MOV MOV MOV E1PZ,EOPZ E1PZ+1,EOPZ+1 E1PZ+2,EOPZ+2 /ПЕРЕСЫЛКА СОДЕРЖИМОГО E0PZ В E1PZ
MOV MOV LCALL RO,#ADS R1,#EOPZ CDPZ3 /РЕЗУЛЬТАТ ОЦИФРОВКИ В Ф-МЕ С ПТ В E0PZ+0..2
MOV OPER2,#C2048L
MOV OPER2 + 1ЛС2048М
MOV OPER2+2,ЯС2048Н
MOV RO,#OPER2
MOV R1,#EOPZ
LCALL SDPZ3 /СИГНАЛ ОШИБКИ (РАВНЫЙ РЕЗ.АЦП - 2048) В E0PZ+0..2
MOV OPER1,#CONST1L
MOV OPER1+1,#CONST1M
MOV OPER1+2,#CONST1H
MOV RO,#OPER1
MOV Rl,#E0PZ
LCALL UDPZ3 /BOPER1+0..2 CONSTl*E(i)
MOV OPER2,#CONST2L
MOV OPER2+1,#CONST2M
MOV OPER2+2,#CONST2H
MOV RO,#OPER2
150-
1.5. ПИД-ре1улятор на МК с использованием программ АПТ
MOV LCALL R1,#E1PZ UDPZ3 ;B OPER2+0..2 CONST2*E(i-1)
MOV MOV MOV MOV MOV LCALL OPER3,#CONST3L OPER3+1,#CONST3M OPER3+2,#CONST3H RO,#OPER3 R1,#E2PZ UDPZ3 ;B OPER3+0..2 CONST3*E(i-2)
MOV MOV LCALL MOV MOV LCALL R1,#OPER1 RO, #OPER2 SDPZ3 ;B OPER1 CONSTl*E(i) + CONST2*E(i-1) R1,#OPER1 RO,#OPER3 SDPZ3 ;B 0PER1 CONSTl*E(i) + CONST2*E(i-l) + C0NST3*E(i-2)
MOV MOV LCALL RO,#OPER1 R1,#KPZ UDPZ3 ;B 0PER1 K*(CONSTl*E(i)+CONST2*E(i-l)+CONST3*E(i-2))
MOV MOV MOV UIPZ'UOPZ UIPZ+l'UOPZ+l U1PZ+2,U0PZ+2 /ПЕРЕСЫЛКА СОДЕРЖИМОГО UOPZ В U1PZ
MOV MOV LCALL RO,#OPER1 Rl,#U0PZ SDPZ3 ;B UOPZ U(i-l) + Kx ( )
MOV MOV LCALL RO,#U0 Rl,#U0PZ UPZTOU /ВЫХОДНОЙ СИГНАЛ В U0+0..1 ЦЕЛЫЙ, В ДИАП. 0..16383
MOV MOV LCALL R4,U0 R5,U0+l AD420E /ВЫВОД СИГНАЛА РЕГУЛИРОВАНИЯ В ЦАП
LCALL LCALL LJMP DEL1S DEL1S MAINCYCL
/ПРОГРАММА ПРЕОБРАЗОВАНИЯ ВЫХОДНОГО СИГНАЛА ИЗ ФОРМЫ С ПТ В ЦЕЛОЧИСЛЕННОЕ
'•ДВУХБАЙТНОЕ ЗНАЧЕНИЕ С ПРЕДВАРИТЕЛЬНЫМ ОГРАНИЧЕНИЕМ 0001... 16383
UPZTOU:
ypV
A,
- 151-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
ANL JZ А,#Ю000000В NXT1 /АНАЛИЗИРУЕМ ЗНАКОВЫЙ РАЗРЯД /ЕСЛИ ОН = 0 (ЧИСЛО НЕОТРИЦАТЕЛЬНОЕ), ИДЕМ НА NXT1
NEGAT: /ДЕЙСТВИЯ ДЛЯ ЧИСЛА, МЕНЬШЕГО 1 (ВТ. Ч. <0)
MOV A,#01
MOV @R0,A
INC RO
MOV A,#0
MOV @R0,A
DEC RO
LJMP EUPZTOU /В КАЧЕСТВЕ РЕЗУЛЬТАТА ВЫВОДИМ 0001
NXT1:
MOV A,@R1
CLR C
SUBB A,#41H /ПОРЯДОК БОЛЬШЕ ИЛИ РАВЕН 41Н?
JC NEGAT /ПРИ CY=1 ЧИСЛО ПОЛОЖИТЕЛЬНОЕ, НО <1, НА NEGAT
MOV A,@R1
CLR C
SUBB A,#4FH /ПОРЯДОК БОЛЬШЕ ИЛИ РАВЕН 4FH?
JC NXT2 /ПРИ CY=1 ЧИСЛО <16383, НА NXT2
BIG: /ДЕЙСТВИЯ ДЛЯ ЧИСЛА, БОЛЬШЕГО 16383
MOV A,#0FFH
MOV @R0,A
INC RO
MOV A,#03FH
MOV @R0,A
DEC RO
LJMP EUPZTOU /В КАЧЕСТВЕ РЕЗУЛЬТАТА ВЫВОДИМ 16383
NXT2:
INC R1
MOV A,@R1
MOV R5,A
INC R1
MOV A,@R1
MOV R4,A /МАНТИССА ЧИСЛА В R5R4
DEC R1
DEC R1
MOV a,@ri /В АККУМУЛЯТОРЕ - ПОРЯДОК ЧИСЛА, ОН МЕЖДУ 41 И 47
NXT3:
CJNE A,#50H,NXT4
SJMP NXT5
NXT4: PUSH ACC
LCALL POSD
— 152
1.5. ПИД-регулятор на МК с использованием программ АПТ
POP ACC
INC А
SJMP NXT3
NXT5:
MOV A,R4
MOV @R0,A
INC RO
MOV A,R5
MOV @R0,A
DEC RO
EUPZTOU:
RET
;ЗАДЕРЖКА 20 MC
DEL20:
MOV R1,#44H
LPEX: MOV R2,#26H
LPIN: DJNZ R2,LPIN
DJNZ ri,lpex
RET
DEL05S:
ACALL DEL01S
ACALL DEL02S
ACALL RET DEL02S
DEL02S:
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
DEL01S:
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL RET DEL20
DEL5S:
ACALL DEL05S
153_
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
ACALL ACALL DEL05S DEL05S
ACALL DEL05S
ACALL DEL05S
ACALL DELO5S
DEL2S:
ACALL DEL05S
ACALL DEL05S
DELIS:
ACALL DEL05S
ACALL DEL05S
RET
POSD: CLR C
MOV A,R5
RRC A
MOV R5,A
MOV A,R4
RRC A
MOV R4,A
RET
/ПОДПРОГРАММА ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 256
/ИЗМЕРЕНИЯМ
IZMN256:
MOV R7,#0
MOV R6,#0
MOV R3,#0
MOV R2,#0
IZMN256C:
LCALL IZMNAP3
MOV A,R6
ADD A,R4
MOV R6,A
MOV A,R7
ADDC A,R5
MOV R7,A
MOV A,R3
ADDC A##0
MOV R3,A
DJNZ R2,IZMN256C
MOV R4, R7
MOV R5,R3
RET
-154
1.5. ПИД-ре1улятор на МК с использованием программ АПТ
IZMNAP3:
SETB DATADC ; P3.6
SETB CSADC /Р3.5
CLR CLKADC ; P3.4
ADC_12:
CLR CSADC ;CS=0 - START
MUL AB /4 МКС HA 12 МГц
MUL AB /4 MKC
MUL AB /4 MKC
MUL AB /4 MKC
MOV A,#0
MOV B,A
SETB CLKADC /МИНУС ПЕРВЫЙ ИМПУЛЬС
NOP
NOP
CLR CLKADC
NOP
NOP
SETB CLKADC /НУЛЕВОЙ ИМПУЛЬС
NOP
NOP
CLR CLKADC
NOP
NOP
SETB CLKADC /ПЕРВЫЙ ИМПУЛЬС
NOP
NOP
CLR CLKADC
NOP
NOP
ACALL CLK.ADC
MOV B.3,C
ACALL CLK_ADC
MOV B.2,C
ACALL CLK.ADC
MOV t B.1,C
ACALL CLK_ADC
MOV B.0,C
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
ACALL CLK.ADC
MOV ACC.7,C
ACALL CLK.ADC
MOV ACC.6,C
ACALL CLK.ADC
MOV ACC.5,C
ACALL CLK.ADC
MOV ACC.4,C
ACALL CLK.ADC
MOV ACC.3,C
ACALL CLK.ADC
MOV ACC.2,C
ACALL CLK.ADC
MOV ACC.1,C
ACALL CLK.ADC
MOV ACC.0,C
MOV R4,A
MOV R5,B
SETB CSADC ;CS=1 - END
MUL AB ;4 МКС HA 12 МГц
MUL AB ;4 MKC
MUL AB ;4 MKC
MUL AB ;4 MKC
RET
CLK.ADC:
SETB CLKADC
MOV C,DATADC ;ЧТЕНИЕ МЛАДШЕГО(1-ГО) БИТА
CLR CLKADC
RET
AD420E:
MOV A,R4
MOV R6,A
MOV A,R5
MOV R7,A
156
1.5. ПИД-регулятор на МК с использованием программ АПТ
/ТЕПЕРЬ ВЫВЕДЕМ ИЗ HL В ЦАП
CLR LATDACO /СБРОС В 0 LATCH
/ВЫВОД ИНФОРМАЦИИ
LCALL VIVDHO
LCALL VIVDHO
LCALL VIVDHO
LCALL VIVDHO
LCALL VIVDHO
LCALL VIVDHO
LCALL VIVDHO
LCALL VIVDHO
MOV A,R7
RLC A
MOV R7,A
LCALL VIVDLO
LCALL VIVDLO
LCALL VIVDLO
LCALL VIVDLO
LCALL VIVDLO
LCALL VIVDLO
LCALL VIVDLO
LCALL VIVDLO
MOV A,R6
RLC A
MOV R6,A
(ИМПУЛЬС ЗАЩЁЛКИВАНИЯ
1
SETB LATDACO
CLR LATDACO /СБРОС В 0 LATCH
RET
VIVDHO: MOV A,R7
RLC A
MOV R7,A
EVIVDHO:MOV DATDAC0,C
SETB CLKDACO
CLR CLKDACO
RET
VIVDLO: MOV A,R6
RLC A
-157-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
MOV R6,A
SJMP EVIVDHO
SDPZ3:
/Подпрограмма сложения 3-байтных
/двоичных чисел с плавающей точкой
/в дополнительном коде формата
/ (8,16) = (Пор,Ман), где байт порядка
/содержит бит знака мантиссы и
/целочисленный двоичный порядок
/со смещением +4ОН, а два 'байта
/мантиссы (СтБ и МлБ) - двоичное
/дробное нормализованное число в
/дополнительном коде.
f
/Входные параметры: R1 - адрес
/слагаемого 1, R0 - адрес слагаемо-
;го 2.
/
/Выходные параметры: R1 - адрес
/суммы (сумма на месте слагаемого
/1). CY=1 - признак переполнения
/или антипереполнения порядка
/суммы.
/Используются все регистры, кроме
/B,RO,R1. Глубина стека - 2 байта.
/Проверка слагаемого 2 (сл2) на нуль.
MOV A,@R0
INC RO
ORL A,@R0
INC RO
ORL A,@R0 ;A=0, если сл2=0.
DEC RO
DEC RO /Восстановление RO
JZ LOOP1 / Если сл2 = 0.
/Проверка слагаемого 1 (СЛ1) на нуль.
MOV A,@R1
INC R1
ORL A,@R1
INC R1
ORL A,@R1 /А=0, если сл1=0.
-158-
1.5. ПИД-регулятор на МК с использованием программ АПТ
LOOP1:
PER1:
DEC R1
DEC R1 /Восстановление R1.
JNZ PERI /Если cnj v.'. 0.
/Перемещение сл2 на место сл1.
MOV A,@R0
MOV @R1,A
INC RO
INC R1
MOV A, @R0
MOV @R1,A
INC RO
INC R1
MOV A,ORO
MOV OR1,A
DEC RO
DEC RO
DEC R1
DEC R1 /Восстановление RO и Rl.
CLR C /CY-'O, адрес результата в R1
RET
/Установка признака обмена
/адресами слагаемых PSW.5 в 0.
CLR PSW.5
/Оба слагаемые не нуль.
/Получение модифицированных
/кодов знаков слагаемых в стек:
;00 = " + ’’, 11="-".
MOV A,@R1
ANL А,#80Н /Выделение знака сл1.
MOV С,ACC.7
RL А
RLC А
PUSH ACC /Код сл1.
MOV A,@R0
ANL A,#8ОН /Выделение знака сл2.
MOV С,АСС.7
RL А
RLC А
PUSH ACC /Код сл2.
/Определение разности порядков.
MOV A,@R0 /А-пор2.
ANL A,#7FH /Исключение знака.
MOV R3,A /R3-nop2.
MOV A,@R1 /A-nopl.
-159-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
ANL A,#7FH /Исключение знака.
CLR С SUBB A,R3 /А=пор1-пор2. JZ PER2 /Если пор1=пор2. JNC PER3 /Если пор1>пор2. CPL А /Дополнение при пор2>пор1. INC А /А=1nopl-nop21. MOV R6,A /Сохранили А в R6. /Обмен адресами слагаемых: сл2 на сл1. MOV A,R0 ХСН A,R1 MOV RO, А SETB PSW.5 /Установка признака обмена MOV A,R6 /Восстановление А иЗ R6. PER3: /Проверка величины разности порядков: <16? MOV R6,A /Сохранили А в R6. CLR С SUBB А, #16 JB ACC.7,PER4 /Если разность < 16. POP АСС POP АСС /Баланс стека. CLR С /СУ=0. JNB PSW.5,PER31 /Если не было обмена. MOV A, R0 ХСН A,R1 MOV R0,А /Обмен регистров R0 и R1. PER31: RET PER4: /Загрузка сл2 в регистры и денормализация мантиссы сл2.
MOV A,R6 /Восстановление А из R6.
/DMAN2:
;Подпрограмма денормализации
/двухбайтной мантиссы числа с пла-
вающей точкой. Входные пара-
метры: А - разность порядков N,
/определяющая величину денорма-
/лизации (N<16), R0 - адрес числа
/с плавающей точкой. Выходные
/параметры:R3, R2 - денормализо-
/ванная мантисса, R5 - выдвинутые
1.5. ПИД-регулятор на МК с использованием программ АПТ
;разряды мантиссы. Не используются
'•регистры В, R0z Rl, R6.
;3агрузка слагаемого в регистры
;R7'R3,R2.
MOV R4,A ;R4=A=N=величина
/нормализации мантиссы.
INC RO
MOV A,@R0
MOV R3,A /R3-CTB Ман.
INC RO
MOV A,@R0
MOV R2,A /R2 - МлБ Ман.
DEC RO
DEC RO /Заодно и восстановили R0
MOV A,@R0 /А - Пор.
MOV R7,A /R7 - Пор.
MOV R5,#0
;Сдвиг мантиссы R3, R2, R5 вправо на N битов.
LOOP2: MOV A,R7 /А - Пор.
RLC A /CY - Знак мантиссы.
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
MOV A,R5
RRC A
MOV R5,A
DJNZ R4,LOOP2 /Зацикливание.
/END DMAN2.
SJMP PER5
PER2:
/Загрузка сл2 в регистры R3, R2, R5=0.
INC RO
MOV A,@R0
MOV R3,A /R3-CTB Ман.
INC RO
MOV A,@R0
MOV R2,A /R2 - МлБ Ман.
DEC RO
DEC RO /Восстановили RO
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
PER5:
MOV R5,#0
/Сложение мантисс.
INC R1
INC R1 /Адрес МлБ Ман1.
MOV A,@R1
ADD A,R2
MOV R2,A
DEC R1
MOV A,@R1
ADDC A,R3
MOV R3, A /R3,R2 - Сумма мантисс.
DEC R1 /Восстановили R1.
/Анализ суммы на переполнение по модифицированным кодам.
SL1:
SL2:
PER51:
PER52:
POP ACC /A-код знака сл2.
MOV R6,A
POP ACC /A-код знака сл1.
ADDC A,R6 /Сложение знаков и переноса
ANL A,#3 /Выделение кода знака суммы
MOV R6,A /Сохранение знаков.
MOV C,ACC.l /CY-знак суммы.
MOV A,@R1 /А-nopl со знаком сл1.
MOV ACC.7,C /А-nopl со знаком суммы.
JNB PSW.5,SL1 /Если не было обмена.
MOV @R0,A
SJMP SL2
MOV @R1,A
MOV AZR6 /Восстановление знаков.
/JB PSW.0,PER8 /Если переполнение: /01 или 10.
/Это аналог JB PSW.O, ,PER8 для глупого отладчика.
CJNE A,#1,PER51
SJMP PER8
CJNE A,#2,PER52
SJMP PER8
/Анализ особого случая переполнения
-162
1.5. ПИД-регулятор на МК с использованием программ АПТ
/ДЛЯ кода знаков 11.
CLR С
SUBB А,#3
JNZ PER6 /Если не код 3.
MOV A,R3
ORL A,R2
JZ PER7 /Если мантисса равна нулю
PER6:
/Нормализация мантиссы влево.
/NMAN2:
/Подпрограмма нормализации
/двухбайтной мантиссы числа с
/плавающей точкой. Входные пара-
метры: R3, R2 - нормализуемая
/мантисса, R5 - младшие биты
/денормализованной мантиссы.
;R1 - адрес порядка. Выходные
/параметры: R3, R2 - нормализован-
ная мантисса, R5 - дополнительные
/младшие биты мантиссы, CY=1 -
/признак антипереполнения порядка.
/Используются все регистры, кроме
/В, RO, Rl, R4, R6, R7.
/Проверка мантиссы на нуль.
MOV A,R3 /A-СтБ Ман.
ORL A,R2
JNZ LOOP5 /Если мантисса не равна нулю
JNB PSW.5,SL3 /Если не было обмена.
MOV @R0,A
SJMP LOOP3
SL3: MOV @R1,A /Обнуление порядка.
LOOP3: CLR C /CY=0
LOOP4: SJMP LOOP6
/Проверка явно
/нормализованной мантиссы:
/знаковый и старший бит различны ?
LOOP5: MOV A,R3 /A-СтБ Ман.
XRL A,@R1
JB ACC.7,LOOP3
-163-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
;Если явная нормализация.
/Проверка неявно
/нормализованной мантиссы.
MOV A,R3
ANL A,#7FH /Исключение старшего бита.
ORL A,R2
CLR C /CY=0.
JZ LOOP6 /Если неявная нормализация.
/Нормализация мантиссы:
/сдвиг влево в R3, R2, R5.
MOV A,R5 RLC А MOV R5,A MOV A,R2 RLC A MOV R2,A MOV A,R3 RLC A
MOV R3,A /Мантисса R5, R2, R3 сдвинута /влево.
/Контроль на антипереполнение
/порядка, его коррекция.
MOV A,@R1 /А-порядок.
ANL A,#7FH /Исключение знака.
SETB C /CY=1.
JZ LOOP6 /Если порядок минимален
JNB PSW.5,SL4
/Если не было обмена.
DEC @R0
SJMP LOOP5
SL4:
DEC @R1
SJMP LOOP5 /Зацикливание.
/END NMAN2.
LOOP6:
JNC PER9 /Нет антипереполнения.
SJMP PER10 /Переполнение: /Антипереполнение порядка
/нормализация мантиссы вправо.
PER7:
MOV A,R6 /Восстановить признаки.
PER8:
RRC А /CY-бит переполнения.
;PMAN2:
-164-
1.5. ПИД-регулятор на МК с использованием программ АПТ
.•Подпрограмма устранения пере-
;полнения двухбайтной мантиссы
/числа с плавающей точкой.
/Входные параметры: R3, R2 -
/мантисса, R5 - дополнительные
/младшие биты мантиссы, CY -
/бит переполнения, R1 - адрес
/порядка. Выходные параметры:
/R3,R2 - нормализованная мантисса,
/CY=1 - признак переполнения
/порядка. Используются регистры А,
/R2, R3, R5.
/Сдвиг вправо мантиссы R3, R2, R5 с учётом CY.
MOV A,R3
RRC А
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
MOV A,R5
RRC A
MOV R5,A
/Контроль порядка на
/переполнение и его коррекция.
MOV A,@R1 /А-Порядок.
CPL A
ANL A,#7FH /Исключение знака.
SETB C /CY=1.
JZ LOOP6 /Если порядок максимален
CLR C /CY=0.
JNB PSW.5,SL5
/Если не было обмена.
INC @R0
SJMP LOOP6
SL5:
INC @R1
SJMP LOOP6
/END PMAN2.
PER9:
/Округление результата. Нормализация мантиссы.
MOV A,R5
JNB АСС.7,PERIО
/Если коррекция равна нулю.
MOV A,R2
-165-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
ADD A,#l
MOV R2,A
MOV A,R3
ADDC A,#0
MOV R3,A
JNC PER10
;PMAN2:
/Подпрограмма устранения пере-
полнения двухбайтной мантиссы
/числа с плавающей точкой.
/Входные параметры: R3, R2 -
/мантисса, R5 - дополнительные
/младшие биты мантиссы, CY -
/бит переполнения, R1 - адрес
/порядка. Выходные параметры:
/R3,R2 - нормализованная мантисса,
/СУ=1 - признак переполнения
/порядка. Используются регистры А,
/ R2, R3, R5.
/Сдвиг вправо мантиссы R3, R2, R5 с учётом CY
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
MOV A,R5
RRC A
MOV R5,A
/Контроль порядка MOV A,@R1 CPL A ANL A,#7FH SETB C JZ PER10 CLR C JNB PSW.5,SL6 INC @rq SJMP PER10 SL6: INC @R1 /END PMAN2. на переполнение и его коррекция. /А-Порядок. /Исключение знака. ;CY=1. /Если порядок максимален. /CY=0. /Если не было обмена.
-166-
1.5. ПИД-регулятор на МК с использованием программ АПТ
PER10:
;Запись результата в память.
JNB PSW.5,PER101
;Если не было обмена.
MOV A, R0
ХСН A,R1
MOV R0,А /Обмен регистров R0 и R1.
PER101:
INC Rl
MOV A,R3
MOV @R1,A
INC Rl
MOV A,R2
MOV @R1, A
DEC Rl
DEC Rl /Восстановление Rl.
RET /CY=1, если ошибка порядка.
/END SDPZ3.
UDPZ3:
/Подпрограмма умножения 3-байтных
/двоичных чисел с плавающей точкой
/в дополнительном коде формата
/(8,16)=(Пор,Ман), где байт порядка
/содержит бит знака мантиссы и
/целочисленный двоичный порядок
/со смещением +4ОН, а два байта
/мантиссы (СтБ и МлБ) - двоичное
/дробное нормализованное число в
/дополнительном коде.
/Входные параметры: R0 - адрес
/множимого, R1 - адрес множителя.
/Выходные параметры: R0 - адрес
,-ПР (ПР на месте множимого) . R1 -
/адрес множителя, CY=1 - признак
/переполнения или антипереполнения
/порядка произ ведения.
/
/Используются все регистры, кроме
/В, RO, R1. Глубина стека - 0 байт.
-167 -
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
CLR C ;Для нормального выхода.
MOV A,@R0
INC RO
ORL A,@R0
INC RO
ORL A,@R0
DEC RO
DEC RO '•Восстановили RO.
JNZ ULOOP2 ;Если ММоО.
ULOOP1:
RET ;Если ММ=0, CY=0.
ULOOP2:
MOV a,@R1
INC R1
ORL a,@ri
INC R1
ORL A,@R1
DEC R1
DEC R1 ^•Восстановили R1.
JNZ UPER1 ;Если МНоО.
MOV @R0,A
INC RO
MOV @R0,A
INC RO
MOV @R0,A '•Обнулили ПР (бывшее ММ).
DEC RO
DEC RO '•Восстановили R0.
RET ;Если МН=0' CY=0.
UPER1:
MOV A,@R0 ;А-байт Пор ММ.
XRL A,@R1 ;@Е1-байт Пор МН.
ANL АД80Н '•Оставить знак произведения.
MOV R7,A ;П7-знак произведения.
MOV A,@R0 ;А-байт Пор ММ.
ANL A,#7FH '•Исключение знака.
MOV R6,A '•Сохранили Пор ММ в R6.
MOV A,@R1 ;А-байт Пор МН.
ANL A,#7FH ;
SUBB A,#40H '•Исключение смещения +40Н.
ADD A,R6 ;А=Пор ММ + Пор МН.
JNB ACC.7,ULOOP3
;Если Пор ПР О.К.
SETB C ;CY=1.
RET ;Если переполнение Пор ПР'СУ=1
ULOOP3:
ORL A,R7 /Вставка знака в байт Пор.
- 168
1.5. ПИД-регулятор на МК с использованием программ АПТ
MOV R7,A ;Н7-байт Пор ПР.
MOV A,@R0 /А-байт Пор ММ.
JNB ACC.7,UPER2 /Если ММ>0.
INC RO
INC RO
MOV A,@R0
CPL A
ADD A,#l
MOV @R0,A
DEC RO
MOV A,@R0
CPL A
ADDC Ar#0
MOV @R0,A /Дополнили ММ.
DEC RO /Восстановили R0.
UPER2: MOV a,@R1 /А-байт Пор МН.
INC Rl
INC Rl
JB ACC.7,ULOOP4 /Если МН<0.
MOV A,@R1
MOV R4,A
DEC Rl
MOV a,@R1
MOV R5,A /Загрузили МН в R5,R4.
DEC Rl /Восстановили R1.
SJMP UPER3
ULOOP4: MOV a,@ri
CPL A
ADD A,#l
MOV R4,A
DEC Rl
MOV a,@ri
CPL A
ADDC Ar#0
MOV R5,A /Дополнили и загрузили /МН в R5,R4.
DEC Rl /Восстановили R1.
UPER3: INC RO /Это для быстроты и удобства
MOV R3 Л0
MOV R2 Л0 /Обнулили ст. биты ПР.
MOV Р6Л16 /Счётчик сдвигов.
-16»-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
UCYCLE1 CLR C
MOV A,R2
RLC A
MOV P2,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A ;Сдвинули влево ПР.
JNC UPER4 /Если ст. бит МН=0.
INC RO
MOV A,@R0
ADD A,R2
MOV R2ZA
DEC RO
MOV A,@R0
ADDC A,R3
MOV R3,A
JNC UPER4 /Если нет заема.
MOV A,R4
ADDC A,#0
MOV R4,A ;Сложили ПР с МН.
UPER4: DJNZ R6,UCYCLE1 ;Зацикливание.
DEC RO ;Восстановили R0.
MOV A,R3
JNB ACC.7,UPER5 ;Не нужно округлять.
MOV A,R4
ADD A,#l
MOV R4,A
MOV A,R5
ADDC A,#0
MOV R5,A /Округлили ПР.
UPER5: MOV A,R7
JNB ACC.7,UPER6 /Не нужно дополнять ПР
MOV A,R4
CPL A
-170-
1.5. ПИД-регулятор на МК с использованием программ АПТ
ADD A,#l
MOV R4,A
MOV A,R5
CPL A
ADDC A,#0
MOV R5,A /Дополнили ПР.
UPER6: MOV A,R5
ORL A,R4
JNZ UCYCLE2 ;Если МаноО.
MOV R7,A ;Обнуление Пор.
SJMP UPER7
UCYCLE2 MOV A,R5
XRL A,R7
CLR C
JB ACC.7,UPER7 ;Если явная нормализация,CY=0
MOV A,R5
ANL A,#7FH ;Исключение старшего бита.
ORL A,R4
JZ UPER7 ;Если неявная нормализация.
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A ;Ман сдвинута влево.
MOV A,R7 /A-Пор ПР.
ANL A,#7FH /Исключение знака.
SETB C ;CY=1.
JZ UPER7 /Если Пор-min.
DEC R7
SJMP UCYCLE2 /Зацикливание. /ПР нормализовано.
UPER7: JNC ULOOP5 /Если Пор О.К.
RET /Если ошибка Пор,СУ=1.
ULOOP5: MOV A,R7
MOV (BRO, A
INC RO
MOV A,R5
MOV (BRO,A
INC RO
MOV A,R4
171 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
MOV @R0,A /ПР записано.
DEC RO
DEC RO /Восстанавливаем RO.
RET END UDPZ3. /Успешный BHXOflzCY=0
CDPZ3:
/Подпрограмма преобразования
/целого двоичного 2-байтного числа
/в число с плавающей точкой.
/Входные параметры: R0 - адрес МлБ
/целого числа,R1 - адрес рез-тата.
/Используются регистры к, PSW, R3,
/R2.
MOV A,@R0
MOV R2,A
INC RO
MOV A,@R0
MOV R3,A /Поместили число в R3,R2.
DEC RO /Восстановили RO.
MOV @R1,#5OH /Поместили начальный порядок в память
MOV A,R3 /A-СтБ Ман.
ORL A,R2
JNZ CCONT /Если мантисса не равна нулю.
MOV @R1,A /Обнуление порядка.
CEND: INC R1
MOV A,R3
MOV @R1,A
INC R1
MOV A,R2
MOV @R1,A /Записали мантиссу.
DEC R1
DEC R1 /Восстановили R1.
RET
CCONT: MOV A,R3 /А-СтБ Ман.
JB ACC.7,CEND /Если число нормализовано.
CLR C
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
- 172-
1.5. ПИД-регулятор на МК с использованием программ АПТ
RLC А
MOV R3 , А
DEC @R1
SJMP CCONT
;END CDPZ3.
.END
/Мантисса R3, R2 сдвинута влево.
/Уменьшили порядок.
/Зацикливание.
Программа снабжена достаточным количеством комментариев, поэто-
му не требует детального описания. Первые 4 команды (сразу после метки
SS3 :) настраивают порты 0 и 1 в квазидвунаправленный режим, аналогич-
ный имеющемуся по умолчанию у портов 1...3 стандартных микроконт-
роллеров семейства х51. Далее в регистры-защёлки портов заносятся все 1,
после чего происходит либо переход на отладочную программу (если в на-
чале строки с командой LJMP SS4, стоящей непосредственно перед мет-
кой SS31:, стоит исключающая эту команду точка с запятой), либо на ос-
новную программу (если точки с запятой нет). При измерении сигнала с
АЦП осуществляется усреднение по 256 измеренным результатам. Вывод
информации в AD420 осуществляет подпрограмма AD420E, данные для
вывода находятся в регистрах R5R4. Всё остальное в программе очевидно.
Отмечу, что в программе отсутствуют проверки бита (флага) переноса
после выполнения программ сложения и умножения, хотя, по-хорошему,
эти проверки нужно делать и прерывать вычисления с остановкой про-
граммы и выводом какой-либо информации (зажиганием светодиода, со-
единённого с одной из линий порта Р1), если бит переноса после какого-
либо сложения или умножения установится в 1.
1.5.5. Отладка аппаратной части устройства
Отладка устройства осуществляется следующим образом. Базу тран-
зистора VT1 отсоединяют от вывода 18 DA3 и через резистор 2.4 кОм со-
единяют с шиной +12 В. Вывод 18 DA3 соединяют с общим проводом че-
рез резистор сопротивлением 1 кОм ±1%. Вход In 1 АЦП DA1 отсоединяют
от делителя R1R2 с движком переменного резистора сопротивлением
5... 10 кОм, включённого между общим проводом и шиной 4-5 В.
Далее формируют отладочную программу — в приведённой выше про-
грамме в начале стоящей непосредственно перед меткой SS31: строки с
командой LJMP SS4 ставят исключающий эту команду символ коммента-
рия (точку с запятой), транслируют программу и загружают её в микрокон-
троллер. Далее подают питающее напряжение на устройство.
Отладочная программа осуществляет непрерывно повторяемое после-
довательное считывание сигнала с АЦП DA1 и выдачу результата этого
считывания в ЦАП DA3. Следовательно, перемещая движок переменного
— 173 —
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
резистора, с которым соединён вход Ini АЦП DA1, мы должны увидеть
синхронное изменение сигнала на выводе 18 ЦАП DA3. Минимальному
сигналу на входе АЦП должно соответствовать напряжение О В на выводе
18 ЦАП, максимальному — примерно 1.25 В. Если при подаче напряжения
питания в устройство так оно и происходит, а на выходе DA2 напряжение
находится в пределах 4.9...5.1 В, то DAI, DA2, DA3 и DD1 функционируют
правильно.
Напряжение на эмиттерном переходе VT1 при подаче напряжения пи-
тания должно быть в пределах 0.6...0.8 В, а на резисторе R3 — 0.1... 1 В, в за-
висимости от рст транзистора VT1. Величину рст можно оценить, разделив
падение напряжения на резисторе R3 (в вольтах) на 0.005. Так, падению
напряжения 0.1 В соответствует рст, равное 0.1/0.005 = 20, и т. д. VT1, уста-
новленный на пластине упомянутой выше площади, должен заметно
греться (до 50...80°).
1.5.6. Окончательный запуск устройства
Если операции по отладке аппаратных средств прошли так, как описа-
но в предыдущем подразделе, отладку аппаратных средств можно считать
завершённой и приступить к окончательным процедурам. Снимите пита-
ние с устройства. Восстановите соединение базы VT1 с выходом DA3, уда-
лив резисторы, соединявшие во время отладки базу с шиной +12 В, а вы-
ход DA3 — с общим проводом. Отсоедините вход Ini АЦП DA1 отдвижка
подстроечного резистора и подключите его к точке соединения резисторов
R1 и R2 (подстроечный резистор также исключите из схемы). Восстанови-
те основную программу — уберите точку с запятой в начале стоящей не-
посредственно перед меткой SS31: строки с командой LJMP SS4, от-
транслируйте программу и загрузите её в микроконтроллер.
Подайте питающее напряжение на устройство и контролируйте паде-
ние напряжения на резисторе R3. Сначала вы должны увидеть, что вели-
чина этого напряжения в течение первых 30...60 с практически дойдёт до
значения, полученного на этапе отладки аппаратных средств при соедине-
нии базы транзистора VT1 с шиной +12 В через резистор 2.4 кОм. Затем
это напряжение будет снижаться (может даже дойти до 0 В и в течение не-
которого времени оставаться нулевым), после чего снова будет возрастать.
Однако величина напряжения второго, третьего и последующих (если они
будут наблюдаться) максимумов будет всё ниже, и затем напряжение вый-
дет на установившийся режим. Если описанных колебаний (от максимума
сигнала на R3 до минимума и обратно) будет больше 3—4, то система неус-
тойчива, и необходимо уменьшать коэффициент усиления KU в разделе объ-
явления констант и переменных программы (там сейчас стоит 5). Если
система выходит на установившееся значение падения напряжения на R3
-174-
1.6. Краткие выводы
без единого переколебания, то коэффициент усиления мал, и его надо уве-
личивать. Изменение коэффициента усиления в данном примере осущест-
вляется изменением соответствующей константы в программе, си пере-
трансляцией и перезашивкой в микроконтроллер.
Устройство, собранное по приведённой схеме автором данной книги,
обеспечило долговременное поддержание температуры пластины с уста-
новленным на ней датчиком с точностью чуть выше 0. ГС. Для дальнейше-
го повышения точности поддержания температуры необходимо более точ-
но подобрать постоянные времени интегратора и дифференциатора (вер-
нее, длительность периода квантования). Также необходимо иметь в виду,
что терморезистор R2 и транзистор VT1 должны быть размещены как мож-
но ближе друг к другу, так как увеличение расстояния между ними приво-
дит к возрастанию времени задержки между изменением регулирующего
воздействия и реакцией на это изменение термодатчика регулятора, что
ухудшает параметры регулятора.
1.6. Краткие выводы
Итак, мы завершили главу, посвящённую программам арифметики с
плавающей точкой. Подведём итоги. Для начала мы вспомнили различные
варианты представления знаковых двоичных чисел, как целых, так и дроб-
ных, проанализировали особенности как самой арифметики, так и чисел
ограниченной точности, вспомнили правила округления и оценили пог-
решности, возникающие при симметричном и несимметричном округле-
нии. Мы познакомились с такими понятиями, как «диапазон представле-
ния чисел» и «значность чисел».
Мы рассмотрели два различных формата, используемых для представ-
ления в микроконтроллерных системах чисел с плавающей точкой, и выбра-
ли в качестве основного трёхбайтный формат, когда число хранится в памя-
ти микроконтроллерной системы в виде последовательности трёх байтов,
размещённых в порядке возрастания адресов памяти. Первый байт числа в
старшем бите содержит знак мантиссы 5М и смещённый порядок (смещение
равно 6410 = 4016), а два остальных байта — СтБ и МлБ мантиссы.
Диапазон представления абсолютных величин ненулевых чисел в этом
случае:
0.27-10-19 < |Л| S0.92-1019.
Граничная относительная ошибка такого представления не превышает
величины
8Г < 2“l6+1 ~ 0.310"4.
-175-
Глава 1. АРИФМЕТИКА С ПЛАВАЮЩЕЙ ТОЧКОЙ
В большинстве случаев практического применения арифметики с пла-
вающей точкой нет особой необходимости в использовании форматов,
обеспечивающих повышенную точность, поскольку в микроконтроллер-
ных системах точность исходной информации, как правило, ограничена
классом точности первичных датчиков входных сигналов и составляет
0.1...0.05%, что заведомо ниже, чем точность представления чисел в трёх-
байтном формате.
Далее в этой главе нами были рассмотрены подпрограммы, реализую-
щие сложение, умножение и деление чисел с плавающей точкой. (Вычита-
ние реализуется умножением вычитаемого на минус единицу с последую-
щим сложением с уменьшаемым.) Сложение и умножение (быстрая вер-
сия) занимают в среднем 150... 180 тактов микроконтроллера или
150... 180 мкс на 12-мегагерцовом стандартном контроллере семейства х51.
Операция деления осуществляется в три с лишним раза медленнее.
При использовании контроллеров с более быстрым ядром время вы-
полнения этих подпрограмм, естественно, уменьшается. Самые быстрые
из имеющихся на момент написания данной книги микроконтроллеры х51
с однотактным RISC-подобным ядром произведут эти операции примерно
в 20 раз быстрее (7...9 мкс на умножение и 25...27 мкс на деление).
Среди рассмотренных нами подпрограмм преобразования чисел были
программа конверсии трёхбайтного формата чисел с ПТ в двоично-десяти-
чное представление (она позволяет отображать информацию на дисплее в
привычной для человека десятичной системе) и программа, которая пре-
образует в формат чисел с ПТ целые числа, получаемые микроконтролле-
ром в ходе опроса подключенных к нему первичных датчиков.
И наконец, мы познакомились с программами для расчёта значений
элементарных (алгебраических и некоторых трансцендентных) функций с
помощью вышеупомянутых подпрограмм сложения, умножения и деле-
ния чисел с плавающей точкой в трёхбайтном формате. Для этих «расчёт-
ных» программ были подробно описаны алгоритмы работы и приведены
числовые таблицы, позволяющие проверить правильность их функциони-
рования. Используя эти программы в качестве образца, читатель сможет
написать свою собственную программу для расчёта любой требуемой фун-
кции.
Завершает данную главу пример использования рассмотренных под-
программ в «практической» программе ПИД-регулятора на основе микро-
контроллера 51-го семейства P89LPC915 фирмы Philips. В последующих
главах книги приведён ряд примеров аппаратной и программной реализа-
ции различных устройств с использованием микроконтроллеров, что даёт
читателю возможность глубже изучить их практические возможности и
методы их программирования.
—176—
Глава 2. 1001-е ЗАРЯДНОЕ УСТРОЙСТВО
2.1. Описание устройства
2.1.1. Введение
«1001-е зарядное устройство» — под таким названием в одном из жур-
налов «Схемотехника» за 2000 г. была опубликована моя статья, в которой
я описал, как должна быть реализована конструкция, позволяющая заря-
жать никель-кадмиевые и никель-металлогидридные аккумуляторы боль-
шими токами, сокращающими время заряда до 1 часа. К сожалению, от-
сутствие времени не позволило мне тогда отмакетировать подобное уст-
ройство, и я ограничился лишь достаточно «сырой» схемой, которая, на
мой взгляд, была в состоянии выполнить требуемые действия. Я надеялся,
что кто-нибудь из читателей сумеет нужным образом доработать эту конс-
трукцию. Но, увы, этого не произошло. Более того, за несколько прошед-
ших после той публикации лет не появилось и серийно производимых уст-
ройств, реализующих подобные алгоритмы. Поэтому я постарался выбрать
время и завершить разработку, описание которой читатели найдут в насто-
ящей главе.
Прежде чем говорить о самом устройстве, необходимо подробно рас-
сказать о различных способах заряда никель-кадмиевых (NiCd) и никель-
металлогидридных (NiMH) аккумуляторов.
2.1.2. Способы заряда NiCd- и NiMH-аккумуляторов
Самый простой (и надёжный) из них — это заряд малым током. Под
малым током понимают зарядный ток (в амперах), численно равный 0.1
от ёмкости аккумулятора в ампер-часах. В литературе этот способ часто
называют нормальным зарядом или зарядом с током величиной 0.1 С
(С — от «capacity», ёмкость). Как нетрудно сообразить, для аккумулятора
с ёмкостью 700 мА-ч ток 0.1С равен 70 мА, для 2.1 А-ч— 210 мА и т. д.
Именно такими токами (50... 150 мА) и заряжают аккумуляторы широко
— 177 —
Глава 2. 1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
распространенные зарядные устройства типов ЗУ-01, ЗУ-01 М, ЗУ-80 и им
подобные.
У подобного способа есть минимум два достоинства. Первое — это де-
шевизна (стоимость упомянутых зарядных устройств от 70 до 150 рублей).
Второе — безопасность для аккумуляторов, поскольку практически все
производимые сегодня аккумуляторы рассматриваемых классов позволя-
ют осуществлять заряд током 0.1 С неопределенно долго без риска повре-
дить аккумулятор. Поэтому, если забыть о заряжаемом аккумуляторе и он
простоит под зарядкой несколько суток — ничего страшного, из строя он
не выйдет (что, увы, не всегда можно сказать о зарядном устройстве).
Но у способа заряда 0.1С есть и один недостаток, являющийся прямым
следствием вышеупомянутых достоинств. Время заряда составляет обычно
14... 16 часов, и этот срок зачастую оказывается чересчур долгим. Поэтому
такой способ не стал доминирующим.
Второй часто применяемый сегодня способ заряда — быстрый заряд
(вернее, относительно быстрый). Алгоритм такого заряда — заряд током
0.2...0.3 С в течение 5...6 часов с последующим дозарядом (без контроля
времени, вплоть до выключения устройства) безопасным током 0.1 С.
Именно таков принцип работы предлагаемых в большом количестве ки-
тайских зарядных устройств для быстрого заряда.
Ещё один алгоритм быстрого заряда — заряд током 0.2...0.3 С до того
момента, когда падение напряжения на заряжаемом аккумуляторе достиг-
нет некоторого наперед заданного значения. Но поскольку аккумуляторы
даже от одного производителя часто имеют заметно различающиеся значе-
ния напряжений, соответствующих уровню 100%-го заряда (а уж аккуму-
ляторы от разных производителей — тем более), этот алгоритм также не
получил широкого распространения.
Устройства «быстрого» заряда частично избавлены от недостатка,
свойственного устройствам, заряжающим аккумуляторы током 0.1 С. Вре-
мя заряда сокращено примерно втрое (т. е. до 5...6 часов). Однако и это
слишком долго. Если вы собираетесь использовать заряжаемые аккумуля-
торы для питания фотоаппарата, то за эти несколько часов, допустим, экс-
курсия, которую вы хотите заснять, может закончиться. Так что всё равно
вам придётся заряжать аккумуляторы в ночное время накануне, а в этом
случае, что 5, что 15 часов — роли не играет.
Третий способ — скоростной заряд током 1С. Для аккумулятора
с ёмкостью 700 мА ч ток 1С равен 700 мА, для 2.1 Ач — 2100 мАи т. д. Вре-
мя заряда таким током — всего 1 час или чуть-чуть более. Однако подоб-
ные токи уже не являются безопасными для аккумуляторов, и при скоро-
стном заряде зарядное устройство должно контролировать целый ряд
параметров: температуру аккумулятора, падение напряжения на нём и вре-
- 178-
2.1. Описание устройства
мя заряда. Увы, это заметно усложняет конструкцию, в связи с чем подоб-
ные устройства пока ещё практически не производятся серийно.
И в завершение необходимо упомянуть ещё один способ — струйный
заряд. Обычно он применяется в случаях, когда аккумуляторы оказывают-
ся подзаряжающим напряжением гораздо более 14... 16 часов. Это типично
для систем хранения данных или систем аварийного освещения. В подоб-
ных случаях ток заряда выбирается на уровне 0.03...0.05С. Рассматривае-
мый способ очень похож на первый из упомянутых выше способов (нор-
мальный заряд). Различие состоит в том, что заряд в системах хранения
данных и аварийного освещения осуществляется не во внешнем зарядном
устройстве, а от источника основного питания этих систем, и в штатном
режиме работы аккумуляторы из упомянутых систем не извлекаются. Кро-
ме того, при струйном заряде ток ещё в 2...3 раза меньше, чем при нор-
мальном.
В Табл. 2.1 перечислены наиболее распространенные способы заряда
NiCd- и NiMH-аккумуляторов.
Таблица 2.1, Способы заряда NiCd- и NiMH-аккумуляторов
Основные параметры Методы заряда
Нормальный Быстрый Скоростной Струйный
Отключение вручную Отключение по таймеру Отключе- ние по до- стижении заданного напряжения Отключе- ние по сни- жению на- пряжения на 10...20 мВ (AV-заряд) Отключение при росте температуры свыше 1°С/мин (АТ-заряд) Без отключения
Время заряда [ч] 14...16 5...8 5...8 1...2 1...2 30 и более
Ток заряда 0.1С 0.2...0.3С 0.2...0.3С 0.5...1С 0.5...1С 0.03...0.05С
Степень заряда ба- тареи [%] до 120 до 120 до 120 110...120 100...110 120
2.1.3. Подробнее о скоростном заряде NiCd- и NiMH-
аккумуляторов
Рассмотрим более подробно, как должны быть реализованы устройства
заряда током 1С.
На Рис. 2.1 приведены типовые зарядные характеристики никель-кад-
миевых аккумуляторов фирмы GP (типовые зарядные характеристики ак-
кумуляторов других производителей совершенно такие же). По оси абс-
цисс отложена величина заряда аккумулятора (в процентах от номиналь-
- 179 -
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ной ёмкости), а по оси ординат — падение напряжения на аккумуляторе в
процессе заряда. На рисунке приведены три зависимости — для токов за-
ряда 0.1С, 0.5С и 1С.
Рис. 2.1. Кривые заряда NiCd-аккумуляторов.
Обратите внимание на следующее обстоятельство. На зарядных харак-
теристиках вблизи 100%-ной ёмкости отчетливо заметен «горб», величина
которого обычно составляет не менее 20...50 мВ. При этом величина тако-
го горба максимальна для тока 1С и снижается в несколько раз по мере
снижения зарядного тока.
Именно наличие упомянутого «горба» позволяет в большинстве случа-
ев легко определить момент достижения полного заряда аккумулятора.
Этот момент соответствует снижению падения напряжения на аккумуля-
торе на 10...20 мВ в сравнении с максимумом. При этом заряд на аккуму-
ляторе примерно на 20% больше его номинала.
Очевидно, что если ваше зарядное устройство может контролировать
падение напряжения на заряжаемом аккумуляторе и определять момент,
когда оно снизится на 20 мВ в сравнении с максимумом, то сигнал, фор-
мируемый в этот момент, должен отключать заряд большим током. Значе-
ние 20 мВ соответствует зарядному току 1С. Для меньших токов заряда ве-
личина снижения должна быть выбрана меньшей. При токах 0.1...0.3С она
становится сопоставимой с шумами, в связи с чем подобный критерий за-
ряда не может быть использован при заряде малыми токами.
На Рис. 2.2 приведены типовые зарядные характеристики никель-ме-
таллогидридных аккумуляторов всё той же фирмы GP. Здесь нужно обра-
тить внимание на следующее обстоятельство. Структура кривых схожа с
приведёнными на Рис. 2.1, однако величина «горба» заметно меньше. Оче-
видно, что величину снижения напряжения в сравнении с максимумом
— 180 —
2.1. Описание устройства
Рис. 2.2. Кривые заряда NiMH-аккумуляторов.
для определения момента завершения заряда током 1С стоит выбирать на
уровне 10... 15 мВ. Соответственно для меньших токов её необходимо вы-
брать ещё меньшей. При этом заряд током, меньшим, чем 0.5С, для скоро-
стного заряда не рекомендуется. В общем логично: какой же это скоро-
стной заряд, если ток заряда менее 0.5С?
Упомянутый способ, характеризующийся завершением заряда в мо-
мент снижения напряжения на аккумуляторе на 10...20 мВ в сравнении с
максимумом, получил в англоязычной литературе название Negative
Delta V или сокращённо NDV. В отечественной литературе подобный спо-
соб именуют способом AV-заряда или способом отрицательного AV-заря-
да—кому как нравится. Название способа однозначно отражает его
суть — отключение зарядного тока в момент небольшого снижения напря-
жения на аккумуляторе в конце заряда. Ещё раз напомню, что речь идёт
только о никель-кадмиевых (NiCd) и никель-металлогидридных (NiMH)
аккумуляторах.
Вследствие быстроты отклика способ AV-заряда хорошо использовать
для определения времени конца заряда монолитных батарей, собранных
из нескольких последовательно включённых одиночных аккумуляторов.
Правда, при этом нужно иметь в виду, что входящие в состав батареи акку-
муляторы должны быть согласованы по ёмкости, причём не только по но-
минальной, но и по реальной — последняя у одинаковых по номиналу ак-
кумуляторов может различаться от образца к образцу до 20%. Если при
сборке батареи входящие в её состав аккумуляторы будут различаться по
реальной ёмкости, снижение напряжения в конце заряда на одном из ак-
кумуляторов будет маскироваться ростом на другом, в результате чего упо-
мянутый «горб» окажется размытым. Согласованные аккумуляторы обес-
— 181 —
Глава 2. 1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
печат синхронное снижение напряжения на каждом, в результате чего мо-
мент завершения заряда может быть четко выделен.
Ещё одно преимущество способа AV-заряда проявляется при попытке
зарядить частично или полностью заряженные аккумуляторы. При уста-
новке подобного аккумулятора в зарядное устройство, реализующее алго-
ритм скоростного AV-заряда, падение напряжения на таком аккумуляторе
сначала, как обычно, возрастает, а затем, спустя несколько минут (в зави-
симости от степени разряженности аккумулятора), падает. Таким образом,
исключается перезаряд аккумулятора, приводящий при заряде большим
током к деградации его внутренних электродов.
Существует ещё один способ скоростного заряда. В его основе лежит
известное свойство аккумуляторов разогреваться по мере приближения к
состоянию 100%-го заряда. Пока запасённая аккумулятором энергия дале-
ка от максимума, его температура остаётся неизменной. Когда уровень за-
ряда достигнет примерно 70%, скорость поглощения аккумулятором энер-
гии снижается, и её излишки нагревают корпус аккумулятора тем сильнее,
чем меньше способность аккумулятора к её поглощению. К моменту до-
стижения 100% заряда скорость разогрева аккумулятора достигает значе-
ний 0.8... Г/мин. что является критерием завершения заряда.
Таким образом, если зарядное устройство (или сам аккумулятор) имеет
термодатчик, а также узел, способный измерять скорость изменения тем-
пературы этого датчика, и может зафиксировать момент достижения зна-
чения 0.8... 1°/мин, то сигнал, формируемый в этот момент, должен отклю-
чать заряд большим током.
Подобный способ получил название способа ЛТ-заряда. При этом в от-
личие от способа AV-заряда уровень заряда составляет 100% от номиналь-
ной ёмкости, т. е. риск перезаряда аккумулятора практически полностью
исключен. Но у метода есть очевидный недостаток: в составе зарядного ус-
тройства должен быть датчик температуры аккумулятора, а это усложняет
и схему устройства, и его конструктивное исполнение. Поэтому подобные
зарядники всё ещё редкость.
После завершения заряда большим током, вне зависимости от того,
использовался ли способ AV-заряда или АТ-заряда, аккумуляторы с целью
компенсации саморазряда рекомендуется дозарядить малым током
(0.1...0.2С). Время дозаряда — 1...2 часа. Однако это требование, которое
без каких-либо комментариев можно встретить у всех производителей ак-
кумуляторов, весьма противоречиво. С одной стороны, практически все
они провозглашают возможность заряжать производимые ими аккумуля-
торы током 0.1С сколь угодно долго, десятки часов. С другой стороны, при
скоростном заряде аккумулятор запасает заряд, составляющий 100... 120%
от номинала, и осознать, о каком дозаряде идёт речь, весьма трудно. Мне,
во всяком случае, понять это без дополнительных разъяснений не удалось,
- 182 —
2.1. Описание устройства
а последние, увы, отсутствуют. Из всего сказанного я сделал вывод, чго
после завершения заряда током 1С нужно переключить аккумулятор на
дозаряд током 0.05...0.1С и держать его в таком состоянии вплоть до извле-
чения из зарядного устройства. При этом аккумулятор может быть исполь-
зован в любой момент, в том числе и сразу после переключения с заряда
большим током на заряд малым током.
И последнее, что необходимо отметить: в процессе заряда большим то-
ком необходимо контролировать температуру аккумулятора и ни в коем
случае не давать ей превысить 55°С (некоторые производители допускают
для своих изделий 60°С). Таким образом, это последнее замечание должно
окончательно убедить нас в необходимости иметь в составе устройства за-
ряда большим током термодатчик, контролирующий температуру заряжа-
емого аккумулятора.
2.1.4. Характеристики разряда NiCd- и NiMH-аккумуляторов
Для никель-кадмиевых аккумуляторов крайне необходим полный пе-
риодический разряд. Если его не производить, на пластинах элементов
формируются крупные кристаллы, существенно снижающие ёмкость ак-
кумулятора. Этот феномен получил название эффект памяти. Для борьбы
с ним необходимо один раз в месяц производить так называемый конт-
рольно-тренировочный цикл (КТЦ) — полностью разряжать аккумулятор
током нормального разряда, а затем немедленно заряжать его.
Оставлять аккумуляторы в полностью разряженном состоянии катего-
рически не рекомендуется, так как при этом может произойти пере пол ю-
совка напряжения. Переполюсовка происходит при напряжениях на акку-
муляторе менее 0.2 В. При этом потенциал анода становится ниже потен-
циала катода. В таком состоянии элемент находится относительно
недолго, так как этот процесс связан с выделением водорода у анода. По
мере увеличения внутрикорпусного давления может сработать предохра-
нительный клапан, и часть внутреннего содержимого аккумулятора выде-
лится наружу. После этого аккумулятор, увы, придёт в негодность.
С упомянутым выше током нормального разряда не всё столь просто,
как кажется. Для никель-кадмиевых аккумуляторов нормальным разряд-
ным током является и ток величиной 1 С, и 0.1С. Но последний характери-
зуется более глубоким разрядом аккумулятора, и с этой точки зрения он
предпочтительнее для проведения КТЦ. С другой стороны, время разряда
током 0.1 С длится до 10 часов, что, как правило, слишком долго. Поэтому
выбор тока разряда определяется предпочтениями разработчика.
Величина напряжения, принимаемого за уровень полного разряда, для
никель-кадмиевых аккумуляторов составляет 1 В для тока разряда 0.1С и
0.9 В для разрядного тока 1С и более.
- 183-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
У никель-металлогидридных аккумуляторов эффект памяти выражен го-
раздо слабее, чем у никель-кадмиевых. Однако он всё-таки присутствует. По-
этому для них также рекомендуется периодически осуществлять КТЦ. Сооб-
ражения, из которых нужно выбирать разрядный ток и пороговое напряже-
ние завершения разряда, те же, что и для никель-кадмиевых аккумуляторов.
Как упоминалось, после завершения полного разряда аккумуляторы
немедленно следует зарядить. При этом рекомендуется сначала заряжать
их небольшим током, величиной 0.1...0.2С (иногда в литературе его назы-
вают инициирующим током), и только спустя несколько минут переклю-
чаться на заряд током 1С.
Рис. 2.3. Реальная зависимость напряжения
на заряжаемом аккумуляторе от времени заряда.
У некоторых аккумуляторов в начальный момент заряда большим током
происходит кратковременное снижение падения напряжения на них
(Рис. 2.3). Это снижение длится 1—2 минуты, после чего начинается рост на-
пряжения до достижения максимума, соответствующего 100%-му заряду ак-
кумулятора (см. Рис. 2.1,2.2). Из этого следует, что в первые 1—2 минуты
после начала заряда большим током ваше зарядное устройство, реализующее
алгоритм скоростного AV-заряда, не должно реагировать на снижение напря-
жения на аккумуляторе, даже если оно превысит заданные 15...20 мВ.
2.1.5. Алгоритм работы устройства для скоростного AV-заряда
NiCd- и NiMH-аккумуляторов
Алгоритм работы устройства, реализующего скоростной AV-заряд ни-
кель-кадмиевых и никель-металлогидридных аккумуляторов, приведён на
Рис. 2.4.
Сначала устройство определяет, вставлен ли в гнездо ЗУ заряжаемый
аккумулятор, и если нет, то отслеживает момент установки аккумулятора в
-184-
2.1. Описание устройства
Рис. 2.4. Алгоритм работы устройства, реализующего скоростной AV-заряд.
— 185 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ЗУ. Соответственно органы индикации, которыми могут быть два светоди-
ода (я выбрал диоды красного и зелёного свечения), должны отображать,
что устройство находится в ожидании установки аккумулятора. Пусть для
определённости этому состоянию соответствуют погашенные светодиоды.
Как только устройство обнаружило, что аккумулятор вставлен в гнездо,
оно тут же определяет, необходим ли предварительный разряд аккумулято-
ра. Обычно делают так, что эту информацию оно получает, опрашивая со-
стояние соответствующего тумблера. Выберем, что если он замкнут, то тре-
буется предварительный разряд, а если разомкнут, то необходимо только
зарядить аккумулятор.
При замкнутом тумблере включается соответствующая разрядная
цепь, и начинается разряд аккумулятора током 0.1...0.2С. О нахождении
устройства в этом режиме говорит состояние светодиодов индикации —
оба они, и красный, и зелёный, горят. Разряд продолжается до тех пор, по-
ка напряжение на аккумуляторе не снизится до 1 В. Когда это произойдет,
разрядная цепь отключится.
Как только разряд будет завершён, начнётся собственно цикл заряда
аккумулятора. Сначала включится соответствующая цепь, и в течение 1
минуты через аккумулятор будет пропущен инициирующий ток (0.1 С). За-
ряду током 0.1 С соответствует состояние, когда горит зелёный светодиод,
а красный погашен.
Спустя минуту после включения инициирующего тока цепь его про-
хождения отключается и включается цепь прохождения через аккумулятор
большого тока (1 С). Заряду током 1С соответствует состояние, когда горит
красный светодиод, а зелёный погашен.
В первые одну-две минуты заряда большим током устройство не конт-
ролирует напряжение на аккумуляторе. Затем, не изменяя величины заряд-
ного тока, оно начинает осуществлять контроль напряжения на аккумуля-
торе и его температуры. Помимо этого осуществляется контроль времени
заряда большим током. Процесс заряда большим током длится до тех пор,
пока либо не будет зафиксирован отрицательный AV-перепад (амплитудой
15 мВ), либо температура аккумулятора не достигнет 55°С, либо не закон-
чится отведённый лимит времени заряда (выберем его равным 140 мин.).
После отключения цепи заряда большим током снова включится цепь
заряда малым током и устройство перейдёт в режим дозаряда током 0.1 С.
При этом красный светодиод будет погашен, а горение зелёного индици-
рует, каким образом завершился заряд большим током. Если был зафикси-
рован отрицательный AV-перепад, то зелёный светодиод горит непрерыв-
но. При перегреве аккумулятора зелёный светодиод мигает с периодом
примерно 2 с, а если отключение произошло по достижении 140 минут, он
мигает с периодом примерно 8 с.
-186-
2.1. Описание устройства
Это состояние сохраняется вплоть до момента извлечения аккумулято-
ра из гнезда, после чего осуществляется переход в исходное состояние
(ожидание установки аккумулятора в ЗУ).
2.1.6. Некоторые особенности построения программы зарядного
устройства
Описанный выше алгоритм предусматривает использование микро-
контроллера. Если устройство, реализующее этот алгоритм, будет иметь
только одно гнездо для заряжаемого аккумулятора, т. е. будет рассчитано
на работу только с одним аккумулятором, то написать программу, реализу-
ющую этот алгоритм, не составит особого труда никому, у кого есть за пле-
чами хотя бы две-три написанные и отлаженные оригинальные програм-
мы. Именно поэтому в упомянутой своей статье в «СХЕМОТЕХНИКЕ» за
2000 г. я не стал уделять особого внимания программе, ограничившись
лишь кратким описанием алгоритма.
Однако один заряжаемый аккумулятор — это мало. Как правило, их
требуется не менее двух. Поэтому лучше, если зарядное устройство будет
приспособлено для одновременной зарядки двух (или даже четырёх) акку-
муляторов. И вот здесь начинаются некоторые проблемы.
Если мы в устройстве используем один микроконтроллер, то на него
ложится нагрузка по обслуживанию двух (или четырёх) заряжаемых акку-
муляторов. Иными словами, он должен одновременно выполнять две (че-
тыре) совершенно независимые задачи. А подобная программа — это уже
не столь тривиальная вещь, как программа для обслуживания одного заря-
жаемого аккумулятора. В конце главы (см. подразд. 2.4.1) подробно описа-
на программа, которая была специально разработана Алексеем Фрунзе
под рассматриваемое в настоящей главе зарядное устройство, предназна-
ченное для одновременного заряда двух аккумуляторов. В упомянутой
программе микроконтроллер параллельно выполнял две независимые за-
дачи, корректно переключаясь с одной на другую. В том же подразделе
приведён и усовершенствованный под реальный микроконтроллер вари-
ант этой программы, в которой на выполнение каждой задачи отводилось
65 мс, после чего происходило переключение микроконтроллера на дру-
гую задачу, которая также выполнялась 65 мс, затем происходил возврат к
первой и т. д. В упомянутой программе в качестве независимых задач были
использованы тривиальные программки, осуществляющие «мигание» све-
тодиодов, соединённых с соответствующими линиями портов микроконт-
роллера. Как нетрудно догадаться, в программе зарядного устройства в ка-
честве этих независимых задач используются две программы, реализую-
щие алгоритм, описанный в предыдущем разделе.
- 187 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Но и это ещё не всё. Поскольку микроконтроллер в ходе выполнения
алгоритма должен осуществлять измерение напряжений на двух аккумуля-
торах и на двух термодатчиках, а также отображать на индикаторе эти ре-
зультаты измерений (без отображения отладка экспериментального образ-
ца крайне сложна), нужно найти место в программе, где будут размещены
соответствующие подпрограммы. Причём если подпрограммы измерений
могли бы находиться каждая в своей независимой программе, то подпро-
грамма отображения, одновременно выводящая на индикатор данные из-
мерений на обоих аккумуляторах, не может находиться в той или иной не-
зависимой программе. Поэтому я поступил следующим образом. Микро-
контроллер осуществляет все измерения и отображения в каждом 16-м
цикле переключения с одной задачи на другую в теле самой подпрограммы
переключения. Поскольку длительность каждого цикла — 65 мс, то изме-
рения и вывод информации на индикатор происходят с интервалом при-
мерно в 16 х 65 мс = 1 с. Более высокое быстродействие для рассматривае-
мого устройства излишне.
2.1.7. Принципиальная схема устройства для скоростного заряда
NiCd- и NiMH-аккумуляторов
Вышеописанный алгоритм необходим и достаточен для реализации
скоростного AV-заряда любого NiCd- или NiMH-аккумулятора. В не-
сколько упрощенном варианте он был описан в упомянутой моей статье
семилетней давности. Очевидно, что реализация алгоритма без использо-
вания микроконтроллера весьма затруднительна. Кроме того, для реализа-
ции этого алгоритма микроконтроллер должен иметь возможность изме-
рять напряжение и на аккумуляторе, и на термодатчике. Соответственно
если устройство предназначено для заряда двух аккумуляторов, то каналов
измерения напряжения должно быть четыре.
Далее, необходимы управляемые микроконтроллером цепи заряда ак-
кумулятора (аккумуляторов) токами 1С, 0.1С, цепи разряда, светодиоды
контроля режима работы и тумблеры задания предварительного разряда. В
экспериментальном устройстве крайне желательно иметь также многораз-
рядный цифровой индикатор, на котором отображались бы измеряемые
напряжения, — без этого отладка может оказаться весьма затруднительной.
Удовлетворяющая этим критериям схема устройства для заряда двух
аккумуляторов типоразмера ДА приведена на Рис. 2.5.
Основу её составляет микроконтроллер DD1 AT89S51 с АЦП DA3
ADS7816 и аналоговым мультиплексором DA2 ADG713. Последние две
микросхемы обеспечивают контроль напряжения на заряжаемых/разря-
жаемых аккумуляторах и на термодатчиках. Опорное напряжение 4.095 В
для АЦП формируется на делителе R27, R28.
-188-
11.5к
R5
4.3 к
|VT1
КТ3107Г
R3
1.5к
VT2
КТ3102Б
DA1
AD822
+9 В
-5 В
С1
0.1 мк
3
8
R7I
510
Ом
С2
0.1 мк
4
JJBaij^
R6
1.5 к
R8I
510|
Ом
R14
VT5 /
*КТ814А\
'5|DAlX
КТ3107Г
I VT10
1КТ3107П
R22
6.2 к I
R20
1.5 к
С80.1 мк
С11
10 мк
Ugl <-77 IN2
11 _ _LL inn
Ua2^T
Ug2<--
36 1
37 16
34 9
35 8
IN1
С1
С2
СЗ
С4
IN3
IN4
OUT1
OUT2
О1ГГЗ
О1ГГ4
VT4
1^3 KT825AM,
КГ3102Б
Uai Ugi л
G,f
R18
1.3 к
VT9
_КТ3102Б
^VD3
--КД503А
-5 В
R16 I
60м vVD4
КД503А
А1 :
А2
2
15
10
R274.7K noe<
,__। R28 1 к
С510мк
8
СЗ
4 О.Нлк
2
3
Vref
+In
ADS
7816
C6 J-C7
ЮмкТ" 0.1 мк
----•—CZJ—
L____ R291 к
DA3
31
32
33
17
5
10
С4
0.1 мк
12
13
14
15
16
22
23
24
25
26
10____1_
JJ____2
12____3
13____4
14____5
15____6
16____7
17____8
31 11
32 12
33 13
34___14
35 15
36___16
37___17
22 23
23 24
24 25
25 26
26 27
27 28
-40
Р1.0 ЁА
Р1.1
Р1.2 RST
Р1.3
Р1.4
Р1.5
Р1.6
Р1.7
Р3.1 Х2
Р3.2
РЗ.З ю Q
о>
Р3.4 £
Р3.5 Х1
Р3.6
Р3.7
Р2.2
Р2.3
Р2.4
Р2.5
Р2.6 DD1
Р2.7
9
19
xcTF
10 мк
IN DA40UT
LM317L
R35
22 к
R36I
22 к!
R34
R32100 2400
R37 22K
R38 22K
HG1
НТ1610
Рис. 2.5. Принципиальная схема устройства скоростного заряда.
R39
100 к
40 С930ПФ
18 -_II__I
ZQ1
СЮ 30 пФ
2.1. Описание устройства
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Микросхема DA4 (LM317L) вырабатывает напряжение 1.5 В, необхо-
димое для питания индикатора DD5 (НТ1610).
Переключатели S2 и S3 служат для информирования процессора о не-
обходимости предварительного разряда заряжаемого аккумулятора — при
замыкании на землю линии Р1.7 микроконтроллера в момент установки
аккумулятора 1 в соответствующее зарядное гнездо заряду будет предшест-
вовать разряд. Аналогично и для аккумулятора 2: чтобы он разряжался,
нужно в момент его установки в зарядное гнездо замкнуть на землю линию
Р2.7.
Заряд и разряд аккумулятора 1, а также индикацию состояния осу-
ществляют цепи, входящие в блок А1.
Заряд малым током осуществляет генератор тока на транзисторе VT6,
включает/отключает этот ток управляемый от микроконтроллера транзис-
тор VT8. Установка ВЫСОКОГО (1) уровня на линии Р1.5 микроконтрол-
лера разрешает прохождение через VT6 тока, равного 0.6 B/R15 (в данном
случае — примерно 100 мА). НИЗКИЙ (0) уровень на Р1.5 уменьшает этот
ток до единиц микроампер, т. е. фактически выключает VT6.
Разряд осуществляет генератор тока на транзисторе VT7, включает/от-
ключает этот ток управляемый от микроконтроллера транзистор VT9. Ус-
тановка ВЫСОКОГО уровня на линии Р1.4 микроконтроллера разрешает
прохождение через VT7 тока, равного 0.6 B/R16 (в данном случае — также
примерно 100 мА). НИЗКИЙ уровень на Р 1.4 уменьшает этот ток до еди-
ниц микроампер, т. е. фактически выключает VT7.
Несколько более сложной является цепь заряда аккумулятора боль-
шим током. Она состоит из генератора тока на транзисторе VT4 и операци-
онного усилителя DA1.2. Ток заряда равен отношению падения напряже-
ния на резисторе R7 (в данном случае — примерно 0.7 В) к сопротивлению
резистора в эмиттерной цепи VT4. Выбор резистора определяется положе-
нием движка сильноточного переключателя S1. Подключение резистора
R9 (0.91 Ом, 5 Вт) обеспечивает заряд током 0.8 A, R10 (0.7 Ом, 5 Вт) — то-
ком 1 A, R11 (0.47 Ом, 5 Вт) — током 1.5 A, R12 (0.39 Ом, 5 Вт) — током
1.8 A, R13 (0.3 Ом, 5 Вт) — током 2.2 А.
Величина падения напряжения на резисторе R7 задаётся подстроеч-
ным резистором R6. Включение/отключение тока в этой цепи обеспечива-
ется транзисторами VT1, VT2. Установка ВЫСОКОГО уровня на линии
Р1.6 микроконтроллера закрывает эти транзисторы, разрешая прохожде-
ние тока по цепи: плюс источника питания 4.9 В — один из резисторов в
эмиттерной цепи VT4 — собственно транзистор VT4 — аккумулятор
АСС1 — минус источника питания 4.9 В. НИЗКИЙ уровень на Р1.6 от-
крывает VT1, VT2, и последний шунтирует резистор R6. Правда, при шун-
тировании на R6 всё же остается небольшое падение напряжения, порядка
20...30 мВ. Чтобы это напряжение не вызвало прохождения нежелательно-
— 190 —
2.1. Описание устройства
го 20...50-миллиамперного тока, потенциал на верхнем (по схеме) выводе
резистора R7 должен быть на 50... 100 мВ выше, чем на объединённых вы-
водах резисторов R9...R13. Именно поэтому напряжение источника, кото-
рый заряжает аккумулятор большим током, выбрано равным 4.9 В, т. е. на
100 мВ меньше, чем напряжение на выходе 5-вольтового источника, пита-
ющего остальные цепи.
Описываемая цепь обеспечивает ступенчатое переключение токов за-
ряда при помощи S1. Если у кого-то возникнет желание более плавно пе-
реключать токи заряда, необходимо в каждом канале заряда установить уп-
равляемый от микроконтроллера ЦАП и соединить его выход с неинвер-
тирующим входом DA1.1. В этом случае можно исключить S1, оставив в
эмиттере VT4 только один одноомный резистор. Ток заряда будет опреде-
ляться отношением напряжения на выходе ЦАП к сопротивлению резис-
тора в эмиттере VT4 (1 Ом).
Кроме того, нужно ещё позаботиться о том, чтобы как-то вводить в
микроконтроллер значение тока заряда. Всё это заметно усложняет схему
устройства, ввиду чего мной был выбран её упрощенный вариант, с ис-
пользованием S1.
Индикаторные светодиоды VD5 (красный), VD6 (зелёный) управляют-
ся через соответствующие резисторы напрямую, от линий Р1.3 и Р1.2 мик-
роконтроллера.
В качестве термодатчика используется прямовключенный эмиттерный
переход транзистора VT5. Как известно, при постоянстве протекающего
через р-и-переход тока падение напряжения на нем линейно зависит от
температуры. Для большинства биполярных транзисторов крутизна пре-
образования составляет от 2 до 2.4 мВ/°С. При этом росту температуры со-
ответствует снижение падения напряжения на р-л-переходе, понижению
температуры — увеличение падения напряжения.
Ток через эмиттерный переход VT5 равен примерно 3 мА и определяет-
ся сопротивлением резистора R14. В программе при расчёте температуры я
использовал минимальное значение крутизны преобразования — 2 мВ/
градус. Это означает, что если падение напряжения на VT5 снизится на
20 мВ, то микроконтроллер будет считать, что температура возросла на
Ю°С. Реально, если коэффициент преобразования равен, например,
2.2 мВ/градус, рост будет составлять не 10, а 9 градусов. Но поскольку нам
нужно, чтобы нагрев аккумулятора не превысил заданной величины, луч-
ше пусть наша аппаратура будет несколько завышать результат измерения
в сравнении с истинным — в этом случае мы не рискуем перегреть аккуму-
лятор вследствие погрешностей измерений.
Контроль температуры с использованием VT5 осуществляется следую-
щим образом. В момент установки аккумулятора в гнездо микроконтрол-
лер измеряет (в милливольтах) падение напряжения на VT5 и запоминает
— 191 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
его. Далее, в процессе заряда аккумулятора микроконтроллер периодичес-
ки производит измерение напряжения на VT5, вычитает его из зафиксиро-
ванного в момент установки аккумулятора в гнездо и делит разность на 2.
Полученное значение и есть величина нагрева аккумулятора по отноше-
нию к температуре окружающей среды.
Перегревом считается снижение напряжения на VT5 в сравнении с
первоначальным на 60 мВ. Для микроконтроллера эта величина означает
возрастание температуры на 30 градусов. Таким образом, даже если воздух
нагрет до +30°С, 60-милливольтный спад даёт значение 30 + 30 = 60°С. Ре-
ально же значение температуры будет ниже из-за большего, чем 2 мВ/°С,
коэффициента температурного преобразования VT5. Кроме того, если
температура окружающей среды составит не +30°С, а +25°С, у нас оста-
нется ещё 5-градусный запас. Таким образом, выбранный способ измере-
ния температуры на аккумуляторе предельно прост и дёшев и при этом
вполне надёжно предохраняет аккумуляторы от перегрева.
Конструктивно термодатчик можно выполнить так, как описано в мо-
ей статье семилетней давности (Рис. 2.6).
Рис. 2.6. Конструктивное исполнение термодатчика.
Заряд и разряд аккумулятора 2, а также индикацию состояния осу-
ществляют цепи, входящие в блок А2, который полностью идентичен бло-
ку А1.
Блок питания особенностей не имеет — он содержит стабилизаторы
напряжения на +5 В и —5 В с допустимыми токами нагрузки до 500 мА и
стабилизатор напряжения +4.9 В с током нагрузки до 5 А (Рис. 2.7). Я ис-
пользовал трансформатор ТН50. Стабилизатор LT1083 установлен на ра-
диаторе площадью примерно 300 см2, стабилизаторы 7805 и 7905 — на ра-
диаторах площадью 100 см2.
Поскольку устройство содержит сильноточные цепи, монтаж его дол-
жен быть проведён достаточно аккуратно. Я это понял не сразу, когда об-
наружил, что зарядные токи 1.5 А и выше создают сильные помехи АЦП
(десятки милливольт), приводящие к ложным срабатываниям микроконт-
2.1. Описание устройства
Рис. 2.7. Блок питания устройства скоростного заряда.
роллера в процессе заряда большим током. При этом измерения с помо-
щью внешнего вольтметра (Щ300) показали, что реальные шумы на заря-
жаемом аккумуляторе не превышают 1 мВ. Так что происхождение этих
помех — результат неудачного монтажа.
К сожалению, перемонтировать устройство у меня уже не было ни вре-
мени, ни сил, поэтому его экспериментальное исследование я проводил на
токах заряда, меньших 1.5 А. С учётом появившегося опыта советую при
повторении устройства придерживаться следующих рекомендаций.
Минусовые выводы гнезд обоих аккумуляторов должны быть соедине-
ны проводником минимально возможного сопротивления. Точка этого со-
единения должна являться «меккой заземления» — к ней отдельными про-
водами, не пересекающимися в других точках, должны сходиться провод-
ники земли от АЦП с мультиплексором, от микроконтроллера с
индикатором, переключателями S2 и S3 и элементами обвязки, от блока
А1 и от блока А2 (т. е. 4 провода). Сюда же, в эту точку, должны приходить
земли от стабилизаторов питания, причём эти последние соединения (с
землями стабилизаторов) также должны иметь минимальное сопротивле-
ние. С целью выполнения последнего требования эти соединения нужно
выполнить многожильным проводом диаметром не менее 1...1.5 мм и дли-
ной не более 5... 10 см.
Транзисторы VT4, VT6 и VT7 каждого блока должны быть установлены
на общем (для них всех) радиаторе площадью примерно 300 см2. Посколь-
-193-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ку у всех этих транзисторов коллекторы соединены с корпусом и по схеме
коллекторы всех этих транзисторов объединены, то устанавливать на об-
щем радиаторе их можно без изолирующих прокладок. Радиатор транзис-
торов VT4, VT6 и VT7 первого блока не должен иметь электрический кон-
такт с радиатором транзисторов VT4, VT6 и VT7 второго блока.
2.2. Наладка устройства
2.2.1. Имитатор напряжения на аккумуляторах и термодатчиках
На Рис. 2.8 приведена схема отладочного устройства, имитирующего
напряжения на заряжаемых аккумуляторах и на термодатчиках. В качестве
резисторов R2 и R6 используются сдвоенные переменные резисторы с ли-
нейной зависимостью сопротивления от угла поворота движка резистора.
В точках Б и Г формируются напряжения 0.7...2.2 В (именно те, которые
обычно бывают на аккумуляторах в процессе их заряда или разряда), в точ-
ках А и В — на 550...650 мВ выше, чем в точках Б и Г соответственно.
Рис. 2.8. Имитатор напряжения на аккумуляторах и термодатчиках.
Необходимость использовать для отладки подобное устройство проис-
текает из того, что реальный процесс заряда занимает один-два часа, и ес-
ли в монтаже что-либо не так, то вам придётся произвести несколько цик-
лов запуска устройства. А это потребует неоправданно много времени на
отладку. Использование же отладочного устройства позволит быстро сма-
— 194 —
2.2. Наладка устройства
котировать все возможные варианты поведения заряжаемых аккумулято-
ров и проверить правильность отработки микроконтроллером всех предус-
мотренных вариантов заряда.
Выводы 3, 6, 11 и 14 DA2 нужно сначала отсоединить от блоков А1 и
А2. Далее вывод 3 DA2 должен быть соединён с точкой Б имитатора,
вывод 6 DA2 — с точкой В имитатора, вывод 11 DA2 — с точкой Г имитато-
ра, вывод 14 DA2— с точкой А имитатора. Такое соединение имитирует
подключение обоих каналов зарядного устройства к плюсовым выводам
заряжаемых аккумуляторов и к эмиттерам транзисторов термодатчиков.
Вращение движков резисторов R2 и R6 позволяет имитировать изменение
напряжения на аккумуляторах в процессе работы с ними, а резисторов R3
и R7 — имитировать нагрев термодатчиков (уменьшение падения напря-
жения на каждом из этих резисторов на 2 мВ эквивалентно нагреву термо-
датчика на ГС).
2.2.2. Отладка устройства по постоянному току
Отсоедините нижние (по схеме) выводы резисторов R2, R20 и R24 обо-
их блоков А1 и А2 от выводов микроконтроллера и соедините их все с об-
щим проводом, отключив таким образом все цепи заряда и разряда обоих
аккумуляторов. Соединения с общим проводом лучше осуществить через
нормально замкнутые контакты кнопочных переключателей (по переклю-
чателю на каждый резистор). Установите вместо аккумуляторов резисторы
типа С5-16 мощностью 5 Вт и сопротивлением 0.1...0.5 Ом.
Не устанавливая микроконтроллер с программой в панельку, подайте
на схему питание и установите движки переменных резисторов имитатора
R2 и R6 в такое положение, чтобы напряжения в точках Б и Г были макси-
мальными (более 2 В). Установите движки переменных резисторов имита-
тора R3 и R7 в положение, когда напряжения в точках А и В также будут
максимальными. Подстроечным резистором R27 установите на выводе 1
DA3 напряжение, равное 4.090...4.095 В, а резистором R32 на выходе
DA4— 1.55...1.6 В. Убедитесь в наличии питающих напряжений на выво-
дах 4 DA2 (-5 В), 13 DA2, 8 DA3, 40 DD1 (+5 В), а также сигнала ВЫСО-
КОГО уровня на выводе 31 DD1.
Убедитесь в том, что напряжения в точках соединения резисторов
R9...R13 блоков А1 и А2 на 100 мВ ниже, чем на верхних (по схеме) выво-
дах резисторов R7; если это не так, подстройте напряжение на выходе
микросхемы LT1083 в блоке питания. Следует также проверить, что ток
через резисторы, установленные вместо аккумуляторов, не превышает
2...4 мА (если это не так, найдите, какое из устройств заряда или разряда
не отключено, и устраните причину его включения). Убедитесь в наличии
напряжений +9 В на выводах 8 DA1 и —5 В на выводах 4 DA1 в обоих бло-
— 195 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ках А1 и А2. Между эмиттерами и коллекторами транзисторов термодат-
чиков VT5 напряжение должно составлять примерно 0.6...0.7 В. Отключи-
те питание.
2.2.3. Проверка функционирования токозадающих цепей
Проверка функционирования токозадающих цепей осуществляется
следующим образом. Включите питание и подайте 1 на нижний (по схеме)
вывод резистора R24 блока А1 (если этот вывод соединён с общим прово-
дом через нормально замкнутые контакты кнопочного выключателя,
просто нажмите и удерживайте кнопку). Транзисторы VT9 и VT10 при
этом должны закрыться, на базе VT7 установится напряжение в пределах
3.6...3.8 В, и через установленный вместо аккумулятора резистор потечёт
ток, равный примерно 100 мА (для измерения этого тока измерьте падение
напряжения на этом резисторе и разделите на его сопротивление). Снова
подайте 0 на нижний (по схеме) вывод резистора R24 блока А1 (отпустите
кнопку) — ток должен прекратиться.
Подайте 1 на нижний (по схеме) вывод резистора R20 блока А1. Тран-
зистор VT8 при этом должен закрыться, на базе VT6 установится напряже-
ние в пределах +3.6...3.8 В. Через установленный вместо аккумулятора ре-
зистор потечет ток, также равный примерно 100 мА, но направление его
протекания изменится на противоположное. Снова подайте 0 на нижний
(по схеме) вывод резистора R20 блока А1 — ток должен прекратиться.
Установите переключатель S1 блока А1 в такое положение, чтобы к
эмиттеру VT4 был подключен резистор R9. Подайте 1 на нижний (по схе-
ме) вывод резистора R2 блока А1. Транзисторы VT1 и VT2 при этом долж-
ны закрыться, а на неинвертирующем входе операционного усилителя
DA1.1 установится напряжение в пределах от 0 до +1.3 В. Вращением
движка подстроечного резистора R6 установите его равным 0.7...0.75 В.
Убедитесь в равенстве падений напряжений на резисторах R6, R7, R8, R9.
Транзистор VT4 при этом должен открыться, и через него потечёт ток,
равный примерно 0.8 А (он определяется отношением падения напряже-
ния на R9 к сопротивлению этого резистора). Подстроить величину этого
тока можно вращением движка подстроечного резистора R6. Измерение
этого тока, как и в предыдущих случаях, осуществляется измерением паде-
ния напряжения на резисторе, установленном вместо аккумулятора, и де-
лением измеренного напряжения на сопротивление резистора.
Переключая S1, убедитесь, что подключение резистора R10 обеспечи-
вает заряд током 1 A, R11 — током 1.5 A, R12 — током 1.8 A, R13 — током
2.2 А.
Снова подайте 0 на нижний (по схеме) вывод резистора R24 блока А1.
Ток через транзистор VT4 должен прекратиться.
— 196 —
2.2. Наладка устройства
Повторите описанную процедуру для токозадающих цепей блока А2.
Отключите питание.
2.2.4. Проверка правильности функционирования алгоритма
Следующим этапом должна быть проверка правильности функциони-
рования алгоритма, записанного («прошитого») в микроконтроллер.
Установите переключатели S2 и S3 в верхнее (по схеме) положение.
Вставьте микроконтроллер с предварительно прошитой программой в па-
нельку и подайте питание. На индикаторе в первый момент должна отоб-
разиться последовательность цифр 3210 7654, которая будет оставаться не-
изменной в течение примерно 5 с. После этого на нём последовательно бу-
дут отображаться результаты измерения напряжения в точках Б и Г
имитатора, а вслед за ними — разности напряжений между точками (А—Б)
и (В—Г). Напряжения в точках Б и Г будут отображаться примерно в тече-
ние 3 с, а разности напряжений (А—Б) и (В—Г) — в течение 1 с. Первая па-
ра напряжений — это результаты измерений напряжений (в милливольтах)
на аккумуляторах, вторая — результаты измерений напряжений на термо-
датчиках. Измерьте эти напряжения при помощи цифрового вольтметра
или тестера и убедитесь, что показания на индикаторе расходятся с пока-
заниями вольтметра не более чем на 10...20 мВ. Если это не так, подстрой-
те опорное напряжение АЦП (резистор R27).
Поскольку напряжения в точках Б и Г имитатора выставлены больше
2 В, микроконтроллер трактует это как отсутствие аккумуляторов в гнездах
зарядного устройства. При этом он постоянно измеряет напряжения в
этих точках, ожидая момента, когда одно или оба этих напряжения ока-
жутся ниже 2В, — это будет означать, что аккумулятор (аккумуляторы)
вставлены в гнезда зарядного устройства и следует приступить к заряду.
Пока же они не вставлены, микроконтроллер поддерживает НИЗКИЕ (ну-
левые) уровни на своих выводах 5, 6, 7, 25, 26, 27, а также поддерживает в
выключенном состоянии светодиоды VD5, VD6 обоих блоков.
Поверните движок резистора R2 имитатора так, чтобы напряжение в
точке Б снизилось до 1.2...1.3 В. Микроконтроллер трактует это как уста-
новку в зарядное гнездо одного из аккумуляторов. Поскольку Р1.7 в еди-
ничном состоянии, он пропускает цикл разряда и сразу приступает к заря-
ду. На индикаторе при отображении результатов измерения в точках Б и Г
вы должны увидеть, что одно из напряжений снизится примерно с 2100 до
1200... 1300, а при отображении падения напряжения на термодатчиках в
той половине индикатора, на которой отображалось 1200... 1300, вместо
падения напряжения на термодатчике (550...700) будет отображаться при-
рост (в градусах Цельсия) температуры термодатчика. Как отмечалось ра-
нее, последняя определяется как делённая на 2 разность между падением
— 197 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
напряжения на термодатчике в момент установки аккумулятора (сниже-
ния напряжения в точке Б) и падением напряжения на нем в текущий мо-
мент. До тех пор пока не будет сдвинут движок резистора R3 имитатора,
это будет восприниматься как неизменность падения напряжения на тер-
модатчике, т. е. прирост температуры будет нулевым. На индикаторе этому
будут соответствовать показания ООО.
В первую минуту микроконтроллер пропускает через аккумулятор ма-
лый ток. При этом горит зелёный светодиод блока А1 и устанавливается в 1
вывод 6 микроконтроллера. По истечении минуты малый зарядный ток
отключается и включается большой ток. При этом зелёный светодиод гас-
нет, загорается красный, вывод 6 микроконтроллера возвращается в НИЗ-
КОЕ состояние, а в 1 устанавливается вывод 7.
В этом состоянии микроконтроллер будет находиться до тех пор, пока
не произойдет одно из трёх событий:
1. Падение напряжения в точке Б снизится на 15 или более милливольт.
2. Температура термодатчика возрастет на 30 или более градусов.
3. Время заряда превысит 2 с небольшим часа.
В первом случае микроконтроллер выключит заряд большим током
(установит 0 на выводе 7), включит заряд малым током (установит 1 на вы-
воде 6), выключит красный светодиод и включит зелёный, который будет
гореть непрерывно. Во втором случае всё произойдет точно так же, за ис-
ключением того, что зелёный светодиод будет мигать с периодом пример-
но 2 с. В третьем случае всё также, но зелёный светодиод будет мигать с пе-
риодом примерно 8 с.
Первый случай макетируется таким поворотом движка резистора R2
имитатора, при котором напряжение в точке Б снизится ещё на 15 или бо-
лее милливольт в сравнении с текущим. Осуществив это действие, вы
должны увидеть, что красный светодиод погас, а зелёный — зажёгся и го-
рит непрерывно.
Второй случай макетируется таким поворотом движка резистора R3
имитатора (при неизменном R2), когда падение напряжения в точке А
снизится более чем на 60 мВ. Красный светодиод погаснет, зелёный на-
чнёт мигать с периодом 2 с.
Третий случай — вы не трогаете ни один из резисторов и просто ждёте 2
часа (примерно 2 ч 20 мин для 12-мегагерцовой частоты кварцевого резона-
тора). Красный светодиод погаснет, зелёный начнёт мигать с периодом 8 с.
Описанные выше вращения движков резисторов R2 или R3 имитатора
нужно производить не ранее чем через 2 минуты после включения заряда
большим током (загорания красного светодиода) — до этого момента мик-
роконтроллер не отреагирует на подобные изменения напряжения.
Давайте для определённости после того, как включится заряд большим
током (загорится красный светодиод), завершим его первым вариантом —
— 198 —
2.2. Наладка устройства
вращением движка резистора R2 имитатора, при котором напряжение в
точке Б снизится ещё на 15 или более милливольт. Осуществив это дейс-
твие, вы, как уже отмечалось, должны увидеть, что красный светодиод по-
гас, а зелёный — зажёгся и горит непрерывно.
Как только начнётся дозаряд малым током (погаснет красный светоди-
од и загорится или начнёт мигать зелёный), микроконтроллер перейдёт в
режим ожидания извлечения аккумулятора из гнезда, индикацией которо-
го будет возврат напряжения в точке Б к уровню более 2 В. Это достигается
соответствующим поворотом движка резистора R2 имитатора. Поверните
движок R2 в состояние максимального напряжения в точке Б. Оба свето-
диода погаснут, и на выводах 5, 6, 7, 25, 26, 27 снова установятся нулевые
уровни. Верните R2 и R3 имитатора в положения, соответствующие мак-
симумам напряжений в точках А и Б.
Таким образом, осуществив вышеописанные действия, вы смакетируе-
те полный нормальный цикл скоростного заряда — от установки аккумуля-
тора в гнездо до его извлечения. Завершение процесса заряда производит-
ся по спаду напряжения в конце заряда.
Далее повторите весь этот цикл, но завершение заряда осуществите по
перегреву аккумулятора (пункт 2, см. выше). После загорания красного
светодиода удостоверьтесь сначала в том, что при снижении (путём враще-
ния движка резистора R3 имитатора) напряжения в точке А на 20...30 мВ
на индикаторе отображается число от 010 до 015 («нагрев» аккумулятора
составляет 10... 15 градусов). Когда снижение превысит 60 мВ, заряд боль-
шим током прекратится, красный светодиод погаснет и начнёт мигать зе-
лёный светодиод. Поверните движок R2 имитатора в состояние макси-
мального напряжения в точке Б. Оба светодиода погаснут, и на выводах 5,
6, 7, 25, 26, 27 снова установятся НИЗКИЕ (нулевые) уровни. Верните
движки подстроечных резисторов R2 и R3 имитатора в положения, соот-
ветствующие максимумам напряжений в точках А и Б.
Вновь повторите этот цикл, но завершение заряда осуществите по пре-
вышению лимита времени (пункт 3, см. выше). Удостоверьтесь в том, что
через два с небольшим часа после начала заряда большим током при неиз-
менном положении движков резисторов R2 и R3 заряд большим током
прекратится, красный светодиод погаснет и начнёт мигать с периодом 8 с
зелёный светодиод. Поверните движок R2 имитатора в состояние макси-
мального напряжения в точке Б. Оба светодиода погаснут, и на выводах 5,
6, 7, 25, 26, 27 снова установятся НИЗКИЕ (нулевые) уровни. Верните
движки подстроечных резисторов R2 и R3 имитатора в положения, соот-
ветствующие максимумам напряжений в точках А и Б.
Теперь надо проверить отработку микроконтроллером разряда аккуму-
лятора. Установите S2 в положение, когда на выводе 8 (Р1.7) микроконт-
роллера будет уровень логического нуля. Поверните движок резистора R2
— 199 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
имитатора так, чтобы напряжение в точке Б снизилось до 1.2... 1.3 В. Мик-
роконтроллер трактует это как установку в зарядное гнездо одного из акку-
муляторов. Поскольку Р1.7 в нулевом состоянии, он начинает отрабаты-
вать цикл разряда. Загораются оба светодиода — и красный, и зелёный, —
и устанавливается ВЫСОКИЙ (единичный) уровень на выводе 5 микро-
контроллера (включается цепь разряда). В этом состоянии микроконтрол-
лер будет находиться до тех пор, пока напряжение в точке Б не опустится
ниже 1 В.
Поверните движок резистора R2 имитатора так, чтобы напряжение в
точке Б снизилось до 0.8...0.9 В. Микроконтроллер трактует это как то, что
достигнут требуемый уровень разряда, и завершит его. Оба светодиода на
несколько секунд погаснут, вывод 5 вернётся в 0.
Далее начнётся заряд. Как и ранее, в первую минуту микроконтроллер
пропускает через аккумулятор малый ток. При этом горит зелёный свето-
диод блока А1 и устанавливается в 1 вывод 6 микроконтроллера. По исте-
чении минуты малый зарядный ток отключается и включается большой
ток. При этом гаснет зелёный светодиод, загорается красный, вывод 6
микроконтроллера возвращается в НИЗКИЙ (0) уровень, а в 1 устанавли-
вается вывод 7. Поверните движок резистора R2 имитатора так, чтобы на-
пряжение в точке Б поднялось до 1.3... 1.6 В.
Давайте, как и ранее, заряд большим током завершим AV-перепа-
дом—таким вращением движка резистора R2 имитатора, при котором
напряжение в точке Б снизится на 15 или более милливольт в сравнении с
установленным. Осуществив это действие, вы, как отмечалось выше,
должны увидеть, что красный светодиод погас, а зелёный зажёгся и горит
непрерывно.
Как только начнётся дозаряд малым током (погаснет красный светоди-
од и загорится или начнёт мигать зелёный), микроконтроллер перейдёт в
режим ожидания извлечения аккумулятора из гнезда, индикацией чего бу-
дет возврат напряжения в точке Б к уровню более 2 В. Поверните движок
R2 имитатора в состояние максимального напряжения в точке Б. Оба све-
тодиода погаснут, и на выводах 5, 6, 7, 25, 26, 27 снова установятся НИЗ-
КИЕ уровни. Верните R2 и R3 имитатора в положения, соответствующие
максимумам напряжений в точках А и Б.
Таким образом, осуществив все описанные выше действия, вы смаке-
тируете полный нормальный цикл скоростного заряда— установку аккуму-
лятора в гнездо, его разряд до заданного уровня, инициирующий заряд ма-
лым током, заряд большим током, дозаряд малым током и извлечение ак-
кумулятора. Завершение процесса заряда производится по спаду
напряжения в конце заряда. Если этот цикл пройдет так, как описано,
проверять заряд с предварительным разрядом и завершением по перегреву
или по превышению лимита времени не нужно.
-200-
2.3. Экспериментальное исследование устройства
Далее повторите все описанные выше действия для второго аккумуля-
тора (точки В и Г вместо А и Б, резисторы имитатора R6, R7 вместо R2, R3,
переключатель S3 вместо S2, выводы 25, 26, 27 вместо 5, 6, 7). Затем про-
верьте независимость работы каналов заряда: начните заряд в одном из ка-
налов, остановитесь на каком-нибудь шаге (например, на разряде), начни-
те заряд на другом аккумуляторе, также прервитесь на каком-то этапе, вер-
нитесь к первому и т. д., до завершения заряда обоих. Убедитесь, что заряд
каждого из них происходит вне зависимости от того, в каком состоянии
находится второй.
2.2.5. Завершающие операции
После того как вы убедитесь, что независимо друг от друга микроконт-
роллер и цепи формирования токов заряда и разряда функционируют пра-
вильно, отсоедините от входов DA3 устройство, изображённое на Рис. 2.8,
и соедините входы DA3 с эмиттерами термодатчиков VT5 и плюсовыми
выводами аккумуляторов, как указано на Рис. 2.5. Восстановите соедине-
ние нижних (по схеме) выводов резисторов R2, R20 и R24 обоих блоков А1
и А2 с выводами микроконтроллера (также см. Рис. 2.5). Удалите резисто-
ры, установленные вместо аккумуляторов.
Подайте питание на устройство. На индикаторе в течение 3 с будут
отображаться напряжения на коллекторах транзисторов VT4 каналов 1 и 2
(примерно по 3500...3600 мВ) и в течение 1 с — напряжения на транзисто-
рах термодатчиков VT5 каналов 1 и 2 (примерно по 600...700 мВ). Подне-
сите нагретый паяльник на расстояние 1...2 см к транзистору VT5 одного
из каналов и убедитесь в том, что на индикаторе падение напряжения на
этом транзисторе будет уменьшаться. Уберите паяльник — оно медленно
начнёт возвращаться к исходному значению. Повторите операцию для
транзистора VT5 второго канала и убедитесь в правильности функциони-
рования второго термодатчика.
На этом отладка устройства завершается. Зарядное устройство готово к
работе.
2.3. Экспериментальное исследование устройства
2.3.1. Заряд аккумулятора без предварительного разряда
На Рис. 2.9 приведена зависимость напряжения на заряжаемом акку-
муляторе от времени, а на Рис. 2.10 — изменение в процессе заряда его
температуры. По оси абсцисс на обоих рисунках отложено время в мину
тах. По оси ординат на первом рисунке отложено напряжение на аккуму
— 201 -
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ляторе в милливольтах, а на втором — нагрев аккумулятора (в градусах
Цельсия) в сравнении с его исходной температурой.
В качестве заряжаемого в данном случае использовался NiMH-аккуму-
лятор GP номинальной ёмкостью 1.5 А-ч примерно трёхлетнего возраста,
прошедший от полусотни до сотни циклов заряда/разряда. Заряд осущест-
влялся током 0.8 А. Как видно из Рис. 2.9, заряд происходил в полном со-
ответствии с изложенным выше (см. Рис. 2.2). При пропускании через ак-
кумулятор большого зарядного тока напряжение на нем возросло с 1.25 до
1.55 В и далее плавно поднималось в течение примерно 110 мин до 1.7 В.
После этого началось ожидаемое его снижение, и минут через 15 спад пре-
высил 15-милливольтовый порог. В этот момент микроконтроллер отклю-
чил заряд большим током и включил дозаряд малым током. Напряжение
на аккумуляторе при этом снизилось примерно до 1500 мВ и далее продол-
жало медленно снижаться.
Рост температуры аккумулятора начался примерно в момент снижения
напряжения на нем. Подъём её составил 10 градусов, т. е. аккумулятор на-
грелся примерно до 33...34°С. На ощупь он был чуть теплее руки (темпера-
тура ладоней и пальцев рук у большинства из нас лежит в пределах
27...29°С).
Запасённая аккумулятором ёмкость составила примерно 1.6 А-ч, что
хорошо согласуется с его номинальным значением.
Интересно, что на аккумуляторе было написано, что быстрый заряд
надо осуществлять током 0.375 А, и ни про какие амперные токи речи не
было. Тем не менее он прекрасно заряжался током 0.5С, а затем и — 0.7С
(но на больших токах, как я отмечал выше, устройство из-за погрешностей
в монтаже работало нестабильно).
Следует отметить, что в момент, когда я экспериментировал с первыми
NiMH-аккумуляторами, зарядное устройство не контролировало время
заряда. Контроль времени (о нём речь пойдет ниже) был введён позднее.
2.3.2. Заряд аккумулятора с предварительным разрядом
На Рис. 2.11 и 2.12 приведены зависимости напряжения на заряжае-
мом аккумуляторе и его нагрева в процессе заряда, при этом заряду акку-
мулятора предшествовал разряд (контрольно-тренировочный цикл акку-
мулятора). Как и в предыдущем случае, по оси абсцисс на обоих рисунках
отложено время в минутах. По оси ординат на Рис. 2.11 отложено напря-
жение на аккумуляторе в милливольтах, а на Рис. 2.12 — нагрев аккумуля-
тора (в градусах Цельсия) в сравнении с его исходной температурой.
В качестве заряжаемого в данном случае использовался NiMH-аккуму-
лятор GP номинальной ёмкостью 1.5 А-ч из той же партии, что и описан-
ный выше.
-202-
203
Рис. 2.9. Напряжение на аккумуляторе при заряде без предварительного разряда.
2.3. Экспериментальное исследование устройства
204
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Рис. 2.10. Температура аккумулятора при заряде без предварительного разряда.
205
Рб?с. 2.11. Напряжение на аккумуляторе при заряде с предварительным разрядом.
экспериментальное исследование устройства
206
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Рис. 2.12. Температура аккумулятора при заряде с предварительным разрядом.
2.3. Экспериментальное исследование устройства
Как видно из Рис. 2.11, цикл заряда практически такой же, как и в пре-
дыдущем случае. Цикл разряда тоже без особенностей, напряжение на ак-
кумуляторе сначала медленно снижается до 1.2 В, а затем скорость сниже-
ния резко увеличивается, и минут через 5 аккумулятор полностью разря-
жается.
Этот аккумулятор при заряде нагрелся сильнее предыдущего (на 15
градусов). В остальном же картина заряда похожа на вышеописанную.
2.3.3. Заряд уже заряженного аккумулятора
На Рис. 2.13 приведена зависимость напряжения на заряжаемом акку-
муляторе для аккумулятора, полностью заряженного за два с небольшим
часа до установки в зарядное устройство. Это аккумулятор, заряд которого
изображён на Рис. 2.9 и 2.10.
Как видно из рисунка, после установки аккумулятора в зарядное уст-
ройство напряжение на нем возросло до максимума за 4...5 мин и затем на-
чало снижаться. Заряд отключился через 12 мин — зарядное устройство
правильно отработало цикл заряда уже заряженного аккумулятора и не до-
пустило его перезаряда.
Температура на этом аккумуляторе в ходе заряда поднялась всего на 2
градуса, в связи с чем график её роста я не привожу.
Я пробовал заряжать пять или шесть NiMH-аккумуляторов ёмкостью
от 1.3 до 1.8 А-ч от GP и Sanyo, все они вели себя примерно так же, как и
описанные выше.
2.3.4. Заряд аккумулятора без спада напряжения в конце заряда
На Рис. 2.14 и 2.15 приведены зависимости напряжения на заряжае-
мом аккумуляторе и его нагрева в процессе заряда для только что куплен-
ного и ещё ни разу не заряжавшегося NiCd-аккумулятора GP номиналь-
ной ёмкостью 700 мА-ч. Как и в предыдущем случае, по оси абсцисс на
обоих рисунках отложено время в минутах. По оси ординат на Рис. 2.14 от-
ложено напряжение на аккумуляторе в милливольтах, а на Рис. 2.15 — на-
грев аккумулятора (в градусах Цельсия) в сравнении с его исходной
температурой.
Картина заряда, как видно, не соответствует описанной выше. Напря-
жение на аккумуляторе довольно быстро возросло до 1.95 В, после чего на-
чался его медленный рост в течение почти двух часов. И это при том, что
аккумулятор заряжался током 1 С, т. е. уже через час после установки акку-
мулятора в ЗУ должен был бы начаться спад напряжения, индицирующий
100%-ный уровень заряда. Вместо этого напряжение на нем практически
вышло на некий неизменный уровень. Что удивительно, температура ак-
кумулятора при этом выросла незначительно (всего на 9 градусов) и не
-207-
208
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Рис. 2.13. Напряжение при заряде уже заряженного аккумулятора.
209
Рис. 2.14. Напряжение на аккумуляторе при заряде с аномальной зарядной характеристикой.
2.3. Экспериментальное исследование устройства
210
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Рис. 2.15. Температура при заряде аккумулятора с аномальной зарядной характеристикой.
2.4. Программа для микроконтроллера зарядного устройства
проявляла каких-либо тенденций к заметному росту Не дождавшись мо-
мента автоматического отключения заряда большим током, я выключил
зарядное устройство принудительно.
Я предположил, что такое аномальное поведение заряжаемого аккуму-
лятора связано с тем, что его реальная ёмкость заметно больше номиналь-
ной (судя по литературе, такое бывает). Для проверки этого предположе-
ния я поставил аккумулятор разряжаться через 1-омный 5-ваттный резис-
тор. Разряд произошел чуть менее чем за полчаса, что однозначно
свидетельствует о том, что запасенная аккумулятором энергия менее 1 А-ч.
Таким образом, остается просто принять к сведению, что такое (отсутствие
AV-спада) также бывает. Тем более что совершенно аналогично вёл себя
ещё один аккумулятор из этой упаковки. При этом, однако, оба они заря-
дились до своего номинального уровня.
После этого я внес доработку в программу микроконтроллера ЗУ, от-
ключающую заряд большим током спустя два часа после его начала (если
за это время он не отключен перегревом аккумулятора или спадом напря-
жения в конце заряда).
Далее я попробовал снова зарядить один из вышеупомянутых NiCd-
аккумуляторов (после того, как он был разряжен). Результаты приведены
на Рис. 2.16 и 2.17. Как видно, после прохождения первого цикла заряд-
разряд поведение аккумулятора в зарядном устройстве заметно измени-
лось и стало именно таким, как и ожидалось. Заметный рост напряжения
на аккумуляторе начался через час после начала заряда, а ещё примерно
через 20 минут произошло отключение спадом напряжения. Следует от-
метить, что нагрев аккумулятора начался не в момент начала спада на-
пряжения на нем, а заметно раньше. Тем не менее величина нагрева не
превысила 10°С.
2.4. Программа для микроконтроллера зарядного
устройства
2.4.1. Основная идея
Настоящий раздел посвящен идеям, заложенным в программу рас-
смотренного зарядного устройства, а также последовательности действий
по написанию и отладке этой программы в реальном устройстве с мини-
мальным количеством внешних отладочных средств. Я умышленно пост-
роил этот раздел таким образом, чтобы показать, как можно написать и от-
ладить подобную (достаточно сложную) программу, даже не имея аппарат-
ного эмулятора (увы, типичная ситуация для многих читателей настоящей
книги...).
-211-
212
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Рис. 2.16. Повторный заряд аккумулятора с аномальной зарядной характеристикой.
213
Рис. 2.17. Температура на аккумуляторе с аномальной зарядной характеристикой при повторном заряде.
2.4. Программа для микроконтроллера зарядного устройства
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Как уже упоминалось выше, лучшим вариантом построения програм-
мы является тот, в котором микроконтроллер осуществляет работу с каж-
дым из аккумуляторов независимо, т. е. так, как будто эта задача — единс-
твенная, и при этом с приемлемой частотой переключаясь между этими
(как бы единственными) задачами. Иными словами, в программе должен
быть предусмотрен режим переключения задач, или многозадачный ре-
жим, известный всем сколь-нибудь подготовленным пользователям совре-
менных компьютеров.
Действительно, когда речь заходит о многозадачном режиме, все тут же
вспоминают Windows — классический пример реализации подобного ре-
жима. Но трудно сразу привыкнуть к мысли, что многозадачность — это не
привилегия могучих процессоров, работающих на частотах свыше тысячи
мегагерц и имеющих сотни мегабайт памяти. Как это ни удивительно на
первый взгляд, но многозадачный режим без особых затрат реализуется и
на таком простом «думателе», как стандартный микроконтроллер семейс-
тва х51.
Итак, мы хотим сделать программы заряда каждого из аккумуляторов
независимыми, как будто каждая из них единственная, отладить их и пос-
ле этого объединить в главной программе, где микроконтроллер работает с
первой из этих «частных» программ фиксированный промежуток времени,
например 50...60 мс, после чего аккуратно сохраняет содержимое регист-
ров и переходит ко второй программе. Спустя те же 50...60 мс он корректно
завершает работу со второй программой и возвращается к первой (я гово-
рю о случае переключения между двумя задачами). И так далее, пока не
выключится питание...
Как это реализовать? Вспомним, что в архитектуре х51 предусмотрено
4 комплекта регистров общего назначения. То, с каким именно комплек-
том регистров мы работаем, определяет состояние битов RS1 и RS0 регист-
ра PSW (соответственно PSW.4 и PSW.3). Изменяя состояние RS1 и RS0,
мы можем выбирать тот или иной комплект рабочих регистров. При этом
содержимое регистров того комплекта, который в данный момент не за-
действован, сохраняется неизменным (если вы не «портите» его, исполь-
зуя эти регистры как обычные ячейки внутреннего ОЗУ). Иными словами,
некая часть механизма переключения между двумя, тремя или четырьмя
задачами в микроконтроллерах семейства х51 уже предусмотрена.
Что ещё надо сохранять? Как правило, аккумулятор, регистры В, PSW
и DPTR. В вашем конкретном случае, возможно, потребуется сохранять
что-то ещё, но это будет несложно сделать по аналогии с тем, как это сде-
лано в приведённом ниже тексте программы-примера. Очевидно, что для
сохранения каждого из комплектов регистров нужно несколько стеков, по
числу задач. Но так как переключения стеков в микроконтроллере х51 не
предусмотрено, нам просто нужно организовать эти несколько стеков где-
-214-
2.4. Программа для микроконтроллера зарядного устройства
то в ОЗУ, и осуществлять переключение стеков простым изменением со-
держимого регистра SP.
Переключение с одной задачи на другую легче всего осуществить при
помощи прерывания от таймера. Подпрограмма прерывания сохраняет в
стеке завершаемой программы её регистры, осуществляет переключение
со стека одной задачи на стек другой и восстанавливает регистры задачи, с
которой ей предстоит работать в ближайшие 50...60 мс. Далее таймер на-
страивается на вызов прерывания через эти 50...60мс, запускается, и на
этом прерывание завершается.
Ниже приведена конкретная программа, осуществляющая параллель-
ное независимое выполнение двух различных задач. Программа написана
и отлажена Алексеем Фрунзе.
Программа, осуществляющая параллельное независимое
выполнение двух различных задач
. ORG 0
#INCLUDE U'DEFS.INC"
SP.NEXT .EQU 4FH ;next task's ! SP holder (04FH)
SP1 .EQU 4FH ;24 bytes for stack 1 (050H.. .067H)
SP2 .EQU 67H ;24 bytes for stack 2 (068H.. .07FH)
/Startup and initialization;
START:
MOV SP, #SP2
MOV DPTR , #TASK2
PUSH DPL
PUSH DPH ;push TASK2 (will return from ISR to TASK2)
XRL PSW, #8
PUSH PSW ;push PSW (register bank = 1 for task 2)
XRL PSW, #8
PUSH ACC ;push A
PUSH В ;push В
PUSH DPL
PUSH DPH ;push DPTR
MOV SP_NEXT, SP ;ISR will get SP from SP_NEXT
-215-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
MOV SP, #SP1 /done with task 2, now task 1
ACALL SETUP-TIMER /setup timer and enable timer interrupt
AJMP TASK1 /go to task 1!
SETUP-TIMER: ;SETUP TIMER /ENABLE TIMER RET SPEED INTERRUPT
/Timer ISR/
TIMER, _ISR:
PUSH PSW
PUSH ACC
PUSH в
PUSH DPL
PUSH DPH /pushed everything
MOV A, SP_NEXT
MOV SP_NEXT, SP
MOV SP, A /swapped SPs
POP DPH
POP DPL
POP В
POP ACC
POP PSW /poped everything
RETI /continue other task
/Task 1/
999999 TASK1: 9 9
MOV RO, #00H
MOV Rl, #11H
MOV R2, #22H
MOV R3, #33H
MOV R4, #44H
MOV R5, #55H
MOV R6, #66H
MOV R7, #77H
-216-
2.4. Программа для микроконтроллера зарядного устройства
MOV MOV MOV SETB CLR DPTR, #1234H A, #0AH
B, #0BH
c
ov
TASKl. _1: NOP NOP NOP
ACALL NOP NOP NOP TIMER_ISR /simulate timer interrupt
;Task i»111 i TASK2: AJMP 2; ' / / TASK1_1
MOV RO, #77H
MOV Rl, #66H
MOV R2, #55H
MOV R3, #44H
MOV R4, #33H
MOV R5, #22H
MOV R6, #11H
MOV R7, #00H
MOV DPTR, #4321H
MOV A, #0A0H
MOV B, #0B0H
CLR c
SETB ov
3ASK2-1:
NOP
NOP
NOP
ACALL
NOP
NOP
NOP
AJMP
.END
TIMER.ISR
TASK2_1
;simulate timer interrupt
-217-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Рассмотрим эту программу подробнее.
С метки START: начинается собственно программа. Первые 11 команд
формируют стек второй задачи. Сначала в регистр SP записывается на-
чальный адрес 24-байтного массива ячеек ОЗУ, в котором будет находить-
ся стек второй задачи (точнее, стек будет располагаться в ячейках
68H...7FH, а в SP заносится 67Н). Далее в стек заносится стартовый адрес
второй задачи (т. е. адрес, куда надо будет перейти после завершения пер-
вого выполнения фрагмента первой задачи, на него осуществится переход
по команде RETI). Затем устанавливается в 1 бит PSW.3 — он указывает на
то, что вторая задача будет работать со вторым банком регистров общего
назначения, и модифицированный таким образом регистр PSW также со-
храняется в стеке. Затем в стеке последовательно сохраняются аккумуля-
тор, регистры В и DPTR.
После этого полученное значение указателя стека сохраняется в
SP_NEXT, а в регистр SP записывается начальный адрес 24-байтного мас-
сива ячеек ОЗУ, в котором будет находиться стек первой задачи (точнее,
стек будет располагаться в ячейках 50Н...67Н, а в SP заносится значение
4FH). Далее следует вызов подпрограммы-«заглушки» SETUP_TIMER. Эта
подпрограмма не выполняет никаких действий, но в дальнейшем вместо
неё будет вызываться подпрограмма, предназначенная для настройки тай-
мера-счётчика 0 (подробнее о том, как настраивать таймер-счётчик, см. в
первом томе, стр. 216...217) и запуска его на счёт. Завершает стартовый
блок команда перехода на выполнение задачи 1.
Собственно, задачи 1 и 2 в данном примере — демонстрационные, ил-
люстрирующие задержки с программным переходом на подпрограмму об-
работки таймерного прерывания. На месте этих задач вы впоследствии
разместите свои реальные задачи. На всякий случай обращаю ваше внима-
ние на то, что эти реальные задачи не должны использовать одни и те же
ячейки ОЗУ, не забудьте убедиться в этом после завершения сборки вашей
программы.
Основная изюминка — в подпрограмме обслуживания прерывания по
таймеру TIMER_ISR. Она осуществляет следующие действия. Сначала со-
храняет в стеке текущей задачи её регистры, о которых мы говорили вы-
ше (для контроля правильности сохранения в процессе последующей от-
ладки мы занесли в упомянутые регистры различные численные значе-
ния для каждой из задач). Далее осуществляется обмен содержимым
ячеек SP и SP_NEXT. Напомню, что в первой из них к моменту заверше-
ния первого выполнения фрагмента первой задачи хранится указатель
стека первой из задач, а во второй — соответственно второй задачи. Пос-
ле обмена SP указывает на стек второй задачи, и именно из него происхо-
дит загрузка аккумулятора и остальных регистров, а на хранящийся в
этом стеке адрес возврата микроконтроллер переходит по команде RETI.
-218-
2.4. Программа для микроконтроллера зарядного устройства
Таким образом, после завершения прерывания микроконтроллер оказы-
вается полностью во второй задаче и выполняет её до следующего преры-
вания. И так далее...
Файл с макроопределениями DEFS.INC можно найти во всё том же
первом томе, на стр. 218...220.
Отладка этого фрагмента осуществлялась в программном симуляторе
EMF52, описанном во втором томе настоящей книги. Поскольку програм-
мный симулятор не поддерживает прерывания, они просто-напросто ими-
тировались вызовами подпрограммы ACALL TIMER—I SR. Прокрутив эту
программу в симуляторе, убеждаемся в её работоспособности и в том, что
содержимое регистров при переходе из одной задачи в другую корректно
сохраняется.
Следующий шаг состоит в том, чтобы сделать программу, работающую
уже не в симуляторе, а в реальном устройстве с микроконтроллером, с ре-
альным переключением задач по таймерному прерыванию. Эта программа
приведена ниже. От только что рассмотренного нами прототипа она отли-
чается тем, что в ней настроены система прерываний и таймер, а конкрет-
ная задача заключается в том, чтобы обеспечить мигание светодиодов, со-
единённых с линиями портов Р1.0 и Р1.1 (см. Рис. 2.18). Процедуры на-
стройки таймера и системы прерываний аналогичны описанным в
соответствующих главах первого тома. Запустив эту программу на микро-
контроллере в схеме, приведённой на Рис. 2.18, убеждаемся в том, что оба
светодиода мигают, причём один с частотой 1 Гц, а другой — в 2 раза реже.
Пусть вас не смущает то, что в программе заложено переключение свето-
диодов спустя 0.5 и 1 с, а реально они переключаются через 1 и 2 с — так и
должно быть, ведь микроконтроллер работает с каждой из задач только по-
ловину своего времени, поэтому все задержки, реализованные програм-
мным способом, растягиваются ровно вдвое.
Программа с таймерным прерыванием, осуществляющая
параллельное независимое выполнение двух различных задач
.ORG 0
#INCLUDE"DEFS.INC"
SP_NEXT.EQU 4FH
SP1 .EQU 4FH
SP2 .EQU 67H
;next task's SP holder (04FH)
;24 bytes for stack 1 (050H...067H)
;24 bytes for stack 2 (068H...07FH)
Startup and initialization
-219-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
.ORG 0
LJMP START
.ORG OBH
LJMP TIMER.ISR
.ORG 100H
START;
MOV SP, #SP2
MOV DPTR, #TASK2
PUSH DPL
PUSH DPH ;push TASK2 (will return from ISR to TASK2)
XRL PSW, #8
PUSH PSW ;push PSW (register bank - 1 for task 2)
XRL PSW, #8
PUSH ACC ;push A
PUSH В ;push В
PUSH DPL
PUSH DPH ;push DPTR
MOV SP_NEXT, SP ;ISR will get SP from SP_NEXT
MOV SP, #SP1 ;done with task 2, now task 1
ACALL SETUP-TIMER ;setup timer and enable timer interrupt
AJMP TASK1 ;go to task 1!
SETUP. TIMER:
CLR TRO
CLR TRI
MOV IP, #0
MOV IE, #0
MOV TMOD, #00000001B
MOV DPTR, #0
MOV TLO, DPL
MOV THO, DPH ;set timer registers
— 220 -
2.4. Программа для микроконтроллера зарядного устройства
SETB ETO ;enable timer int
SETB EA ;enable interrupt
SETB TRO ,-start timer
RET
Delay;
DEL20: MOV R1,#OFDH
LPEX: MOV R2 , #26H
LPIN: DJNZ R2,LPIN
DJNZ Rl,LPEX
RET
DELOIS:
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
RET
DEL05S:
ACALL DEL01S
ACALL DEL01S
ACALL DEL01S
ACALL DEL01S
ACALL DEL01S
RET
/Timer ISR;
' ii ii t t i i i i TIMER_ISR:
CLR TRO /stop timer
CLR EA ;interrupt disable
PUSH PSW
PUSH ACC
PUSH В
PUSH DPL
PUSH DPH ;pushed everything
- 221 -
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
MOV A, SP_NEXT
MOV SP.NEXT, SP
MOV SP, A ,-swapped SPs
MOV DPTR, #0
MOV TLO, DPL
MOV THO, DPH /set timer registers
POP DPH
POP DPL
POP В
POP ACC
POP PSW ;poped everything
SETB EA /enable interrupt
SETB TRO /start timer
RETI /continue other task
i / i / / t /Task 1;
/ t t 9 i t TASKl: ' 9 9
SETB P1.0
LCALL DEL05S
CLR P1.0
LCALL DEL05S
SJMP TASKl
9 9 9 9 9 9 ;Task 2;
TASK2:
SETB Pl.l
LCALL DEL05S
LCALL DEL05S
CLR Pl.l
LCALL DEL05S
LCALL DEL05S
SJMP TASK2
.END
-222
2.4. Программа для микроконтроллера зарядного устройства
О +5 В
R1
390
Ом
С1
0.1 мкФ
+ С2
“ 10.0 мкФ
2
3
4
5
6
7
8
10
12
13
14
15
16
17
21
22
23
24
20
Р1.0 Р1.1 Р1.2 Р1.3 Р1.4 Р1.5 Р1.6 Р1.7 РЗ.О Р3.1 Р3.2 РЗ.З Р3.4 Р3.5 Р3.6 Р3.7 Р2.0 Р2.1 Р2.2 Р2.3 Vss CPU АТ89С 51
Vdd
— 31
ЕА Л—
9
RES
30
ALE —
____ 29
PSEMQ^-
XT 1
ХТ2
РО.О
Р0.1
Р0.2
РО.З
Р0.4
Р0.5
Р0.6
19
39
38
37
36
35
34
33
32
Р0.7 —
„о и 25
Р2.4 —
26
Р2.5 —
27
Р2.6 —
«0-7 28
Р2.7 —
СЗ
30 пФ
R4
hoo кОм
18
BZ1
12 МГц
Рис. 2.18. Схема с микроконтроллером и светодиодами.
Собственно, именно эта программа и является начальной в анализиру-
емом процессе отладки. При её выполнении мы видим, что режим пере-
ключения задач работает и переключения происходят без сбоев (програм-
— 223 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ма без сбоев работала несколько часов — такие проверки необходимы для
того, чтобы удостовериться, что нигде не происходят какие-либо перепол-
нения: стеков, тех или иных регистров и т. д.).
2.4.2. Программа с измерениями и отображением
при переключении между задачами
Как упоминалось выше, микроконтроллер в ходе выполнения алгорит-
ма заряда аккумуляторов должен осуществлять измерение напряжений на
этих двух аккумуляторах, а также на двух термодатчиках, после чего отоб-
ражать на индикаторе полученные результаты измерений. Эти измерения
и отображения микроконтроллер должен осуществлять в каждом 16-м
цикле переключения с одной задачи на другую в теле самой подпрограммы
переключения (а поскольку длительность каждого цикла — 65 мс, то изме-
рения и вывод информации на индикатор происходят с интервалом при-
мерно в 16 х 65 мс = 1 с). Некоторая сложность состоит в том, что внутри
подпрограммы обработки прерывания, в которой происходит переключе-
ние с одного банка регистров на другой, мы должны (для измерений и
отображений) воспользоваться регистрами R0...R7, при этом не нарушив
их содержимого ни для первой, ни для второй задачи, да ещё и вызывать
при этом те или иные подпрограммы. Как показано в следующей програм-
ме, эта задача выполнима, но требует внимательного анализа, какие регис-
тры в какой момент являются текущими регистрами общего назначения,
переключения на свободный (4-й) банк и возврата на нужный банк после
завершения программ измерения и отображения.
Программа с измерениями и отображением при переключении
между задачами
!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&. &
& ПРОГРАММА ОТЛАДКИ МНОГОЗАДАЧНОГО РЕЖИМА &
& НА КОНТРОЛЛЕРЕ АТ89С51 &
& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&.&&&&&&&&&&&&&&&&&&&&.&&&&
АДРЕСА И КОНСТАНТЫ
-224-
2.4. Программа для микроконтроллера зарядного устройства
АСС .EQU OEOH
В .EQU OFOH
PSW .EQU ODOH
SP .EQU 81H
DPL .EQU 82H
DPH .EQU 83H
РО .EQU 80H
Р1 • EQU 90H
Р2 .EQU OAOH
РЗ .EQU OBOH
В.О .EQU OFOH
В.1 .EQU 0F1H
В.2 .EQU 0F2H
В.З .EQU 0F3H
В.4 .EQU 0F4H
В.5 .EQU 0F5H
В.6 .EQU 0F6H
В.7 .EQU 0F7H
АСС.О .EQU OEOH
АСС.1 .EQU 0E1H
АСС.2 .EQU 0E2H
АСС.З .EQU 0E3H
АСС. 4 .EQU 0E4H
АСС. 5 .EQU 0E5H
АСС. 6 .EQU 0E6H
АСС.7 .EQU 0E7H
PSW.0 • EQU ODOH
PSW.1 .EQU 0D1H
PSW.2 .EQU 0D2H
PSW.3 .EQU 0D3H
PSW.4 .EQU 0D4H
PSW.5 .EQU 0D5H
PSW.6 .EQU 0D6H
PSW.7 .EQU 0D7H
РО.О .EQU 080H
Р0.1 .EQU 081H
Р0.2 .EQU 082H
РО.З • EQU 083H
Р0.4 .EQU 084H
Р0.5 • EQU 085H
Р0.6 • EQU 086H
Р0.7 .EQU 087H
Р1.0 .EQU 090H
Pl.l .EQU 091H
Pl.2 .EQU 092H
Pl.3 .EQU 093H
-225-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Р1.4 • EQU 094H
Р1.5 .EQU 095H
Р1.6 .EQU 096H
Р1.7 .EQU 097H
Р2.0 .EQU OAOH
Р2.1 .EQU 0A1H
Р2.2 .EQU 0A2H
Р2.3 • EQU 0A3H
Р2.4 • EQU 0A4H r
Р2.5 • EQU 0A5H !
Р2.6 .EQU 0A6H i
Р2.7 .EQU 0A7H !
РЗ.О .EQU OBOH
Р3.1 .EQU 0B1H
Р3.2 • EQU 0B2H
РЗ.З .EQU 0B3H
Р3.4 .EQU 0B4H
Р3.5 .EQU 0B5H ;
РЗ.б .EQU 0B6H
РЗ .7 .EQU 0B7H •
TMOD .EQU 089H
TCON .EQU 088H
TL0 .EQU 08 AH
ТНО .EQU 08CH
IE • EQU 0A8H
IP • EQU 0B8H
TRO • EQU 08CH
TRI .EQU 08EH
ETO .EQU 0A9H
EA f .EQU OAFH
CNT_T .EQU 3EH ;СЧЁТЧИК 65-МИЛЛИСЕКУНДНЫХ ИНТЕРВАЛОВ
SP_NEXT .EQU 3FH /
SP1 • EQU 3FH /
SP2 • EQU 5FH /
ADOO • EQU ОЗОН ;8 БАЙТ ОЗУ ЭО
CNT1 • EQU 038H ;2 БАЙТА - СЧЁТЧИК ДЛЯ AD00+0.. . .3
CNT2 .EQU ОЗАН ;2 БАЙТА - СЧЁТЧИК ДЛЯ AD00+4.. . .7
CLKIND1 • EQU Pl.l
DATIND1 .EQU P1.0
CSADC .EQU P3.3 ;АЦП ADS7816
CLKADC .EQU P3.1 ;АЦП ADS7816
-226-
2.4. Программа для микроконтроллера зарядного устройства
DATADC .EQU P3.2 /АЦП ADS7816
L513_l • EQU P3.6 /МУЛЬТИПЛЕКСОР ADG513, УПР.КЛЮЧОМ 1
L513_8 .EQU P3.5 /МУЛЬТИПЛЕКСОР ADG513, УПР.КЛЮЧОМ 2
L513_9 • EQU P3.4 /МУЛЬТИПЛЕКСОР ADG513, УПР.КЛЮЧОМ 3
L513_16 • EQU P3.7 /МУЛЬТИПЛЕКСОР ADG513, УПР.КЛЮЧОМ 4
MEANDR1S ZELEN_VD • EQU .EQU Pl. 7 Pl. 2 /ЗЕЛЁНЫЙ СВЕТОДИОД
KRASN_VD • EQU Pl.3 /КРАСНЫЙ СВЕТОДИОД
U_ACC1 • EQU 20H /НАПР.НА 1-М АККУМУЛЯТОРЕ
UT_ACC1 .EQU 22H /НАПР.НА 1-М АККУМ. И ТЕРМОДАТЧ.
U_ACC2 .EQU 24H /НАПР.НА 2-М АККУМУЛЯТОРЕ
UT_ACC2 • EQU 26H /НАПР.НА 2-М АККУМ. И ТЕРМОДАТЧ.
НАЧАЛО ПРОГРАММЫ:
/ .ORG 0
/ LUMP START
/ .ORG OBH
9 LUMP TIMER_ISR
9 .ORG 100H
START: MOV AD00+0,#0
MOV AD00+1,#1
MOV AD00+2,#2
MOV AD00+3,#3
MOV AD00+4,#4
MOV AD00+5,#5
MOV AD00+6,#6
MOV AD00+7,#7
LCALL INDVIV
LCALL DEL4S
MOV P1,#OFFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV CNT_T,#0
-227-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
MOV DPTR,#0
MOV CNT1,DPL
MOV CNT1+1,DPH
MOV DPTR,#1000
MOV CNT2,DPL
MOV CNT2+1,DPH
MOV SP, #SP2
MOV DPTR, #TASK2
PUSH DPL
PUSH DPH
XRL PSW, #8
PUSH PSW
XRL PSW, #8
PUSH ACC
PUSH В
PUSH DPL
PUSH DPH
MOV SP_NEXT, SP
MOV SP, #SP1
ACALL SETUP-TIMER
AJMP TASK1
SETUP_TIMER:
CLR TRO
CLR TRI
MOV MOV IP, #0 IE, #0
MOV TMOD, #00000001B
MOV DPTR, #0
MOV TL0, DPL
MOV TH0, DPH
SETB SETB SETB RET ET0 EA TRO
-228-
2.4. Программа для микроконтроллера зарядного устройства
DEL20: /ЗАДЕРЖКА 20 мс
LPEX: LPIN: MOV MOV DJNZ DJNZ RET R1,#OFDH R2,#26H R2,LPIN Rl,LPEX
DEL01S: ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
DEL05S: RET ACALL DEL01S
ACALL DEL01S
ACALL DEL01S
ACALL DEL01S
ACALL DEL01S
DEL2S: RET ACALL DELO5S
ACALL DEL05S
DEL1S: ACALL DEL05S
ACALL DEL05S
DEL8S: RET ACALL DEL2S
ACALL DEL2S
DEL4S: ACALL DEL2S
ACALL DEL2S
TIMER_ISR: RET
CLR TRO
CLR EA
PUSH PSW
PUSH ACC
-229-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
PUSH PUSH PUSH В DPL DPH
MOV A, SP_NEXT
MOV SP_NEXT, SP
MOV SP, A
MOV DPTR, #0
MOV TLO, DPL
MOV THO, DPH
MOV A,CNT_T
INC A
MOV CNT_T,A ;ИНКРЕМЕНТИРОВАЛ CNT_T ПО МОДУЛЮ 256
ANL A,#00111111B /ЗАНУЛИЛ 2 СТАРШИХ БИТА
JNZ T_ISR_1
/ЭТО ДЕЛАЕТСЯ РАЗ В 4 СЕКУНДЫ
MOV C,MEANDR1S /КОНТРОЛЬНЫЙ МЕАНДР НА ЛИНИИ
CPL С
MOV MEANDR1S,C
PUSH PSW
SETB PSW.3 /БАНК РОН НОМЕР 4
SETB PSW.4
/ОТЛАДКА АЦП И МУЛЬТИПЛЕКСОРА
L7816513:
LCALL LCALL MOV MOV A13_1_VK IZMN16 U_ACC1,R4 U_ACC1+1,R5
LCALL LCALL MOV MOV A13_16_V IZMN16 UT_ACC1,R4 UT_ACC1+1,R5
LCALL LCALL MOV MOV A13_9_VK IZMN16 U_ACC2,R4 U_ACC2+1,R5
-230-
2.4. Программа для микроконтроллера зарядного устройства
LCALL A13_8_VK
LCALL IZMN16
MOV UT_ACC2,R4
MOV UT_ACC2+1,R5
MOV A,CNT_T
ANL A,#11000000B /ОСТАВИЛ 2 СТАРШИХ БИТА
JZ OTBUTACC /ЕСЛИ CNT_T=0, ОТОБРАЖАТЬ UT_ACCi
;ОТОБРАЖАЕМ U_ACCi (ЕСЛИ ДВА СТАРШИХ БИТА CNT.T СОДЕРЖАТ ЧИСЛО 1, 2 ИЛИ 3)
MOV R0,#AD00+0
MOV R1,#U_ACC1
LCALL UNPKQ /U_ACC1+0..1 В AD00+0..3
MOV RO,#AD00+4
MOV Rl, #U_ACC2
LCALL UNPKQ /U_ACC2+O..l В AD00+4..7
SJMP OTBNEXT
/ОТОБРАЖАЕМ UT_ACCi (ЕСЛИ ДВА СТАРШИХ БИТА CNT_T СОДЕРЖАТ ЧИСЛО 0)
OTBUTACC:
MOV R0,#AD00+0
MOV Rl,#UT_ACC1
LCALL UNPKQ ;UT_ACC1+O. .1 В AD00+0. .3
MOV R0,#AD00+4
MOV Rl,#UT_ACC2
LCALL UNPKQ /UT-ACC2+0. .1 В ADOO+4. .7
OTBNEXT:
;LCALL A13.OTKL
LCALL INDVIV /ВЫВЕЛИ НА ДИСПЛЕЙ
/ POP PSW
T_ISR_1: POP DPH
POP DPL
POP В
POP ACC
POP PSW
/ SETB EA
— 231 -
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
SETB TRO
RETI
TASK1:
SETB ZELEN_VD
LCALL DEL05S
CLR ZELEN_VD
LCALL DEL05S
SJMP TASK1
TASK2:
SETB KRASN__VD
LCALL DEL05S
LCALL DEL05S
CLR KRASN_VD
LCALL DEL05S
LCALL DEL05S
SJMP TASK2
;ВЫВОД ИНФОРМАЦИИ НА ЖК-ИНДИКАТОР HT-1610
INDVIV: MOV A,AD00+3
ACALL SIMBOL1
MOV A,AD00+2
ACALL SIMBOL1
MOV A,AD00+l
ACALL SIMBOL1
MOV A,AD00+0
ACALL SIMBOL1
MOV A,#0FH
ACALL SIMBOL1
MOV A,#0FH
ACALL SIMBOL1
MOV A,AD00+7
ACALL SIMBOL1
MOV A,AD00+6
ACALL SIMBOL1
MOV A,AD00+5
ACALL SIMBOL1
MOV A,AD00+4
ACALL RET SIMBOL1
232
2.4. Программа для микроконтроллера зарядного устройства
SIMBOL1:
ANL A,#00001111B
CJNE A,#O,SIMB11
MOV A,#10
SJMP SIMB12
SIMB11: CJNE A,#0FH,SIMB12
MOV A,#0
SIMB12: CLR CLKIND1
SWAP A
ACALL BIT1
ACALL BIT1
ACALL BIT1
ACALL BIT1
RET
BIT1: RLC A
MOV DATIND1,C ;ВЫВ. ДАННЫХ В ЖК-ДИСПЛЕЙ
SETB CLKIND1 ;ИМПУЛЬС ЗАЩЁЛКИВАНИЯ
CLR CLKIND1
RET
/ПОДПРОГРАММА РАСПАКОВКИ В ОЗУ ЭО .*****
UNPKQ: MOV A,@R1
MOV R2,A
INC R1
MOV A,@R1
MOV R3,A
DEC R1
INC RO
INC RO
INC RO
LCALL BN2BCD
LEVBIT: MOV A,R5
ANL A,#U110000B
CJNE A,#0,ENDPKQ
MOV A,R5
ORL A,#11110000B
MOV R5,A
ENDPKQ: MOV A,R5
-233
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
LCALL RVIV
MOV A,R5
LCALL VIV
MOV A,R4
LCALL RVIV
MOV A,R4
LCALL VIV
INC RET RO
RVIV: SWAP A
VIV: ANL A,#00001111B
CJNE A,#00001111B,NEF
MOV A,#0FFH
NEF: MOV @R0,A
DEC RO
RET
/ПОДПРОГРАММА УМНОЖЕНИЯ
;П/П MUL21 ОСУЩЕСТВЛЯЕТ УМНОЖЕНИЕ ЦЕЛЫХ ДВОИЧНЫХ ЧИСЕЛ
/БЕЗ ЗНАКА ФОРМАТА 16x8=24 (БЕЗ ПРОВЕРКИ СОМНОЖИТЕЛЕЙ НА
/НОЛЬ.МНОЖИТЕЛЬ-В А,МНОЖИМОЕ-В DE,ПРОИЗВЕДЕНИЕ-В (A,H,L)
/ИСПОЛЬЗУЮТСЯ ВСЕ РЕГИСТРЫ,СОХРАНЯЕТСЯ DE.
MUL21: /R0*R5R4=R0R5R4, RO И Rl COXP
MOV R2,#8
MOV A,#0
MOV R3,A
MOV R6,A
MOV R7,A
LOOP67: MOV A,R6
ADD A,R6
MOV R6,A
MOV A,R7
ADDC A,R7
MOV R7,A
MOV A,R0
ADDC A,RO
MOV R0,A
JNC LOOP68
MOV A,R6
ADD A,R4
MOV R6,A
MOV A,R7
ADDC A,R5
— 234 —
2.4. Программа для микроконтроллера зарядного устройства
MOV R7,A
MOV A,RO
ADDC A,R3
MOV R0;A
LOOP68: DJNZ R2,LOOP67
MOV A,R6
MOV R4,A
MOV A,R7
MOV R5,A
RET
;П/П BN2BCD - ПРЕОБРАЗОВАНИЕ ДВОИЧНОГО ЧИСЛА В ДВОИЧНО-ДЕСЯТИЧНОЕ
;ИСХОДНОЕ ЧИСЛО В(R2,R3),РЕЗУЛЬТАТ В (R4,R5,R6)
BN2BCD: ;R3R2 -> R6R5R4, RO И R1 COXP
MOV R7,#10H
MOV АД0
MOV R4,A
MOV R5,A
MOV R6,A
BN2CKL: MOV A,R2
ADD A,R2
MOV R2,A
MOV A,R3
ADDC A,R3
MOV R3,A
;ДВОИЧНО-ДЕСЯТИЧНОЕ УДВОЕНИЕ СУММЫ С УЧЁТОМ ПЕРЕНОСА:
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
/’ПРОВЕРКА КОНЦА ЦИКЛА:
DJNZ R7,BN2CKL
RET
₽OSD: CLR C
MOV A,R5
— 235
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
RRC А
MOV R5, А
MOV A,R4
RRC А
MOV R4, А
RET
INXD: INXDEN:RE1 MOV ADD MOV MOV ADDC MOV r> A,R4 A,#l R4,A A,R5 A,#0 R5,A
A13_8_VK:
CLR L513_l /ОТКЛЮЧИЛИ
SETB L513_8 ;ВКЛЮЧИЛИ !!’!!!
SETB L513_9 ;ОТКЛЮЧИЛИ
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_8
A13_1_VK:
SETB L513_l /ВКЛЮЧИЛИ !!!!!!
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513_9 /ОТКЛЮЧИЛИ
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_l
A13_9_VK:
CLR L513_l /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
CLR L513_9 /ВКЛЮЧИЛИ !’!!!!
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_9
A13_16_V: CLR L513.1 /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513_9 /ОТКЛЮЧИЛИ
CLR L513_16 ;ВКЛЮЧИЛИ !!!!!!
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА ;L513_16
A13_OTKL: CLR L513_l /ОТКЛЮЧИЛИ
— 236
2.4. Программа для микроконтроллера зарядного устройства
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513.9 /отключили
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ОТКЛЮЧЕНИЕ
/ОДИНОЧНОЕ ИЗМЕРЕНИЕ ADS7816
IZMNAP3:
SETB DATADC 7
SETB CSADC /
CLR CLKADC
ADC_12:
CLR CSADC /CS=0 - START
MOV АД0
MOV В,A
7 SETB CLKADC /МИНУС ПЕРВЫЙ ИМПУЛЬС
CLR CLKADC
7 SETB CLKADC /НУЛЕВОЙ ИМПУЛЬС
CLR CLKADC
7 SETB CLKADC /ПЕРВЫЙ ИМПУЛЬС
CLR CLKADC
7 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ СТАРШЕГО (12-ГО) БИТА
CLR CLKADC
MOV B.3,C
7 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 11-ГО БИТА
CLR CLKADC
MOV B.2,C
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 10-ГО БИТА
CLR CLKADC
MOV B.1,C
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 9-ГО БИТА
CLR CLKADC
MOV B.0,C
-137-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
SETB MOV CLR MOV CLKADC C,DATADC CLKADC ACC.7,C /ЧТЕНИЕ 8-ГО БИТА
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 7-ГО БИТА
CLR CLKADC
MOV ACC.6,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ б-ГО БИТА
CLR CLKADC
MOV ACC . 5,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 5-ГО БИТА
CLR CLKADC
MOV ACC.4,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 4-ГО БИТА
CLR CLKADC
MOV ACC.3,0
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 3-ГО БИТА
CLR CLKADC
MOV ACC.2,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 2-ГО БИТА
CLR CLKADC
MOV ACC.1,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ МЛАДШЕГО(1-ГО) БИТА
CLR CLKADC
MOV ACC.0,C
MOV R4,A
MOV R5,B
SETB CSADC ,-CS=l - END
RET
238-
2.4. Программа для микроконтроллера зарядного устройства
/ПОДПРОГРАММА ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 16
/ИЗМЕРЕНИЯМ
IZMN16:
MOV MOV MOV MOV IZMN16C: R7 ,#0 R6,#0 R3,#0 R2,#16
LCALL MOV ADD MOV MOV ADDC MOV DJNZ MOV MOV MOV MOV LCALL LCALL LCALL LCALL RET IZMNAP3 A,R6 A,R4 R6,A A,R7 A,R5 R7,A R2,IZMN16C A,R6 R4,A A,R7 R5,A POSD POSD POSD POSD
.END
Создавая этот (промежуточный) вариант программы, мы должны были
реализовать требуемые измерения и убедиться в том, что осуществляется
корректное измерение напряжений всех четырёх каналов (на обоих акку-
муляторах и на обоих термодатчиках), а также корректное отображение
этой информации на индикаторе (и всё это происходит, как мы договори-
лись, в процессе переключения с одной задачи на другую). Также, пос-
кольку в нашем распоряжении, как мы условились, отсутствуют внешние
аппаратные отладочные средства, мы должны при старте программы про-
дотировать хотя бы индикатор, т. к., если он будет в нерабочем состоянии
(неважно, из-за проблем с аппаратными средствами или из-за ошибок в
программе), оценить правильность измерений мы не сможем.
На этом этапе мы будем работать со схемой, приведённой на Рис. 2.5, к
которой подключен имитатор, изображённый на Рис. 2.8.
При старте рассматриваемая программа заносит в ячейки ОЗУ с име-
нами ADO 0+0...AD0 0+7 значения от 0 до 7, после чего отображает содержи-
— 239 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
мое этих ячеек на индикаторе в течение 4 с. Наличие упомянутых цифр на
индикаторе в течение первых четырёх секунд после включения питания
свидетельствует о корректной работе связанных с индикатором аппарат-
ных и программных средств. Если что-то не так, то, прежде чем двигаться
дальше, нужно найти, что мешает правильной работе индикатора, и устра-
нить эту помеху.
Настройка стеков для двух задач, таймера-счётчика, осуществляющего
прерывание, и системы прерывания, взята без каких-либо изменений из
корректно работавшей программы, приведённой на стр. 219...222. Обра-
щаю внимание тех, кто делает только первые шаги в программировании:
при написании программ в режиме с минимальными отладочными воз-
можностями нужно стремиться в каждую из уже работающих промежуточ-
ных программ вносить как можно меньшее количество изменений, и после
каждого изменения заносить программу в микроконтроллер и тестировать
её, проверяя, корректно ли она работает после доработки. Безусловно, что
при этом увеличивается количество промежуточных программ, но общее
количество ошибок, которые вы неизбежно делаете в процессе разработки
программы, в итоге оказывается меньшим, чем в случае, когда вы при каж-
дой доработке вносите большое количество изменений в отлаженные фраг-
менты. Да и искать ошибки в программах, минимально отличающихся от
тех, которые работали безошибочно, будет быстрее и проще. Таким обра-
зом, несмотря на большее количество промежуточных программ, общая за-
дача решается быстрее, чем в случае, когда вы пытаетесь все доработки в
программу внести за один или два раза.
Вернёмся к рассматриваемой программе. В подпрограмме обработки
таймерного прерывания, происходящей через каждые 65 мс, инкременти-
руется содержимое 8-битного счётчика CNT_T с последующим занулением
двух старших битов остающейся в аккумуляторе после инкрементирова-
ния копии этого счётчика. При этом упомянутая копия в данном случае
каждые 4 с обнуляется. Когда это происходит, программа изменяет на про-
тивоположный (с 0 на 1 и наоборот) уровень сигнала на линии порта
MEANDR1S, после чего осуществляет последовательное переключение
мультиплексора ADG513 с первого на четвёртый входы и измерения каж-
дого из подключенного сигналов. Измерения производятся с усреднением
по 16 результатам.
Таким образом, на линии Р1.7 (именно она имеет символическое имя
MEANDR1S) мы должны видеть переключение сигнала из единичного в ну-
левой уровень и наоборот с периодом в 4 с. Если это так, то таймер-счёт-
чик функционирует нормально, также корректно работает программа об-
работки прерывания и фрагмент, выделяющий момент, когда должны про-
изводиться измерения. Такая промежуточная проверка корректности
работы перечисленных аппаратных и программных средств необходима
— 240 —
2.4. Программа для микроконтроллера зарядного устройства
для того, чтобы при некорректных измерениях (или вообще при отсутс-
твии результатов измерений на индикаторе) быстро определить место, ку-
да вкралась ошибка.
По завершении измерения программа записывает его результаты в
ячейки ОЗУ-с именами AD00+0...AD00+7 с последующим отображением
содержимого этих ячеек на индикаторе. При этом, если значение (в деся-
тичном виде) старших двух битов счётчика CNT_T равно 1, 2 или 3, на ин-
дикаторе отображаются результаты измерений в точках биг имитатора, а
если оба старших бита равны 0, то отображаются результаты измерений в
точках айв. Таким образом, по длительности отображения мы однозначно
понимаем, какие из результатов измерения мы видим на индикаторе в тот
или иной момент.
Если аппаратные средства работают корректно, то при запуске рас-
сматриваемой программы вы увидите результаты измерений сигналов с
имитатора, которые будут обновляться каждые 4 с, и при этом будет на-
блюдаться мигание светодиодов, по-прежнему «играющих роль» незави-
симых переключаемых задач. Таким образом, эта программа даёт нам воз-
можность убедиться в том, что мы реализовали требуемые измерения и
отображения в теле подпрограммы обработки прерывания и наши незави-
симые «частные» программы корректно функционируют, ничуть не «дога-
дываясь» о том, какие сложные действия осуществляются в момент пере-
ключения с одной из них на другую.
В завершение отмечу, что измерения в этой программе производятся не*
в каждом 16-м (как говорилось ранее), а в каждом 64-м цикле таймерного
прерывания, т. е. интервал между измерениями составляет не 1, а 4 с. Это
сделано умышленно, для увеличения промежутка времени между измере-
ниями настолько, чтобы результаты можно было легко записать на листок
бумаги (мы же договорились о минимуме отладочных средств...).
Ещё одно замечание: в сравнении с программами, описанными в пре-
дыдущем подразделе, глубина каждого из стеков для независимых задач
выбрана равной 32, а не 24 байтам — анализ с карандашом в руке показал,
что с учётом хранения адресов возврата при вызове предполагаемых в не-
зависимых программах подпрограмм 24-байтный стек будет использо-
ваться практически полностью, поэтому при отсутствии аппаратного от-
ладчика лучше подстраховаться и увеличить его глубину ещё на 8 байт.
2.4.3. Синтез основной программы
Как бы ни была хороша программа, описанная в предыдущем подраз-
деле, в ней отсутствует главное, ради чего она была написана, — сами про-
граммы заряда/разряда аккумуляторов. Поэтому следующим этапом со-
здания программы для нашего зарядного устройства является замена под-
—ш
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
программ-«заглушек», управляющих светодиодами, на реальные
программы, соответствующие изображённому на Рис. 2.4 алгоритму.
Они были написаны отдельно и затем предварительно отлажены в про-
граммном симуляторе EMF52. После этого они были вставлены в про-
грамму, приведённую в подразд. 2.4.2. В результате получился черновой
вариант программы, действительно обеспечивающей работу устройства.
Первый вариант программы для устройства скоростного заряда
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& &
;& ПРОГРАММА ДЛЯ СКОРОСТНОГО ЗАРЯДНОГО УСТРОЙСТВА &
;& НА КОНТРОЛЛЕРЕ АТ89С51 &
;& &
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;АДРЕСА И КОНСТАНТЫ
АСС . EQU ОЕОН
В . EQU 0F0H
PSW . EQU ODOH
SP .EQU 81H
DPL .EQU 82H
DPH .EQU 83H
PO • EQU 80H
Pl • EQU 90H
P2 .EQU OAOH
P3 .EQU OBOH
B.O .EQU OFOH
B.l .EQU 0F1H
B.2 .EQU 0F2H
B.3 .EQU 0F3H
B.4 .EQU 0F4H
B.5 .EQU 0F5H
B.6 .EQU 0F6H
B.7 .EQU 0F7H
ACC.O .EQU OEOH
ACC.l .EQU 0E1H
ACC. 2 .EQU 0E2H
ACC.3 .EQU 0E3H
—242-
2.4. Программа для микроконтроллера зарядного устройства
АСС.4 . EQU 0Е4Н
АСС.5 . EQU 0Е5Н
АСС.6 . EQU 0Е6Н
АСС.7 . EQU 0Е7Н
PSW.0 . EQU 0D0H
PSW.1 . EQU 0D1H
PSW.2 . EQU 0D2H
PSW.3 . EQU 0D3H
PSW.4 .EQU 0D4H
PSW.5 .EQU 0D5H
PSW.6 . EQU 0D6H
PSW.7 . EQU 0D7H
РО.О . EQU 080Н
РОЛ . EQU 081Н
Р0.2 . EQU 082Н
РО.З . EQU 083Н
Р0.4 . EQU 084Н
Р0.5 . EQU 085Н
Р0.6 . EQU 086Н
Р0.7 . EQU 087Н
Р1.0 . EQU 090Н
Р1.1 .EQU 091Н
Р1.2 . EQU 092Н
Р1.3 . EQU 093Н
Р1.4 . EQU 094Н
Р1.5 . EQU 095Н
Р1.6 . EQU 096Н
Р1.7 . EQU 097Н
Р2.0 . EQU ОАОН
Р2.1 . EQU 0А1Н
Р2.2 .EQU 0А2Н
Р2.3 .EQU ОАЗН
Р2.4 . EQU 0А4Н
Р2.5 .EQU 0А5Н
Р2.6 .EQU 0А6Н
Р2.7 . EQU 0А7Н
РЗ.О . EQU ОВОН
Р3.1 .EQU 0В1Н
Р3.2 . EQU 0В2Н
РЗ.З . EQU ОВЗН
Р3.4 .EQU 0В4Н
Р3.5 . EQU 0В5Н
Р3.6 .EQU 0В6Н
Р3.7 .EQU 0В7Н
TMOD .EQU 089Н
-243-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
TCON .EQU 088H
TL0 .EQU 08 AH
ТНО .EQU 08CH
IE .EQU 0A8H
IP .EQU 0B8H
TRO .EQU 08CH
TRI .EQU 08EH
ETO .EQU 0A9H
EA / .EQU OAFH
CNT-T .EQU 3EH /СЧЁТЧИК 65-МИЛЛИСЕКУНДНЫХ ИНТЕРВАЛОВ
SP.NEXT .EQU 3FH ;
SP1 .EQU 3FH ;
SP2 .EQU 5FH ;
ADOO .EQU ОЗОН /8 БАЙТ ОЗУ ЭО
CNT1 .EQU 038Н /2 БАЙТА - СЧЁТЧИК ДЛЯ AD00+0...3
CNT2 .EQU ОЗАН /2 БАЙТА - СЧЁТЧИК ДЛЯ AD00+4...7
CLKIND1 .EQU Р1.1
DATIND1 .EQU Р1.0
CSADC .EQU РЗ.З ;
CLKADC .EQU Р3.1 ;
DATADC .EQU Р3.2 ;
L513_l .EQU РЗ.б
L513_8 .EQU Р3.5
L513_9 .EQU Р3.4
L513_16 .EQU Р3.7
ZELEN-VD .EQU Р1.2
KRASN_VD .EQU Р1.3
U-ACC1 .EQU 20Н ;ПОТЕНЦИАЛ НА ПЛЮСЕ АККУМУЛЯТОРА ОТН. ЗЕМЛИ
UT_ACC1 .EQU 22Н /ПОТЕНЦИАЛ НА ЭМИТТЕРЕ VT8 ОТН. ЗЕМЛИ
U_ACC2 .EQU 24Н /ПАДЕНИЕ НАПРЯЖЕНИЯ НА АККУМУЛЯТОРЕ 2
UT_ACC2 • EQU 26Н /ПАДЕНИЕ НАПРЯЖЕНИЯ НА АККУМУЛЯТОРЕ 2 + ДИОДЕ 2
U_A1_MAX .EQU 28Н /МАКСИМАЛЬНЫЙ РЕЗУЛЬТАТ ИЗМЕРЕНИЯ U НА АККУМУЛЯТОРЕ 1
U_A2_MAX .EQU 2АН /МАКСИМАЛЬНЫЙ РЕЗУЛЬТАТ ИЗМЕРЕНИЯ U НА АККУМУЛЯТОРЕ 2
VD1ST .EQU 2СН /ПАДЕНИЕ НАПР. НА ЭМИТТЕРЕ VT8 В МОМЕНТ НАЧАЛА ЗАРЯДА
VD2ST .EQU 2ЕН /ПАДЕНИЕ НАПРЯЖЕНИЯ ДИОДЕ 2 В НАЧАЛЕ ЗАРЯДА
REDLED1 .EQU Р1.3
GRNLED1 .EQU Р1.2
UNCHI .EQU Р1.6
-244-
2.4. Программа для микроконтроллера зарядного устройства
CHBIG1 CHLIT1 .EQU .EQU Р1.4 Р1.5
REDLED2 .EQU Р2.5
GRNLED2 .EQU Р2.6
UNCH2 .EQU Р2.4
CHBIG2 . EQU Р2.2
CHLIT2 . EQU Р2.3
DELTAU . EQU 15
DELTAT .EQU 70
/НАЧАЛО ПРОГРАММЫ:
.ORG 0
/ LJMP START
7 .ORG OBH
9 LJMP TIMER_ISR
9 .ORG 100H
START:
MOV AD00+0,#0
MOV AD00+l,#l
MOV AD00+2,#2
MOV AD00+3,#3
MOV AD00+4,#4
MOV AD00+5,#5
MOV AD00+6,#6
MOV AD00+7,#7
LCALL INDVIV
LCALL DEL4S
9 MOV Pl,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
CLR UNCHI /ОТКЛЮЧИЛИ РАЗРЯД
CLR CHBIG1 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ
CLR CHLIT1 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
CLR UNCH2 /ОТКЛЮЧИЛИ РАЗ РЯД
—245 -
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
CLR CHBIG2 /ОТКЛЮЧИЛИ ЗАРЯД волыним током
CLR CHLIT2 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
MOV CNT—T,#0
MOV DPTR,#0
MOV VD1ST,DPL
MOV VD1ST+1,DPH /ЗАНУЛИЛ VD1ST+0..1
MOV VD2ST,DPL
MOV VD2ST+1,DPH /ЗАНУЛИЛ VD2ST+0..1
MOV SP, #SP2
MOV DPTR, #TASK2
PUSH DPL
PUSH DPH 9
XRL PSW, #8
PUSH PSW 9
XRL PSW, #8
PUSH ACC 9
PUSH В 9
PUSH DPL
PUSH DPH 9
MOV SP-NEXT, SP 9
MOV SP, #SP1 9
ACALL SETUP-TIMER 9
AJMP TASK1 9
SETUP_TIMER:
CLR TRO
CLR TRI
MOV IP, #0
MOV IE, #0
MOV TMOD, #00000001B
MOV DPTR, #0
MOV TLO, DPL
MOV THO, DPH
SETB ETO
SETB EA
— 246 —
2.4. Программа для микроконтроллера зарядного устройства
SETB TRO
RET
DEL20:
LPEX: LPIN: MOV MOV DJNZ DJNZ RET R1,#OFDH R2,#26H R2,LPIN R1,LPEX
DELOIS:
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
DEL05S: RET
ACALL DELOIS
ACALL DELOIS
DEL02S: ACALL DELOIS
ACALL DELOIS
ACALL DELOIS
DEL2S: RET
ACALL DEL05S
DELIS: ACALL DEL05S
ACALL DEL05S
ACALL DELO5S
DEL8S: RET
ACALL DEL2S
DEL4S: ACALL DEL2S
ACALL DEL2S
ACALL DEL2S
RET
TIMER_ISR:
CLR TRO
CLR EA
-047—
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
PUSH PUSH PUSH PUSH PUSH PSW ACC В DPL DPH
MOV A, SP.NEXT
MOV SP.NEXT, SP
MOV SP, A
MOV DPTR, #0
MOV TLO, DPL
MOV THO, DPH
MOV A,CNT_T
INC A
MOV CNT_T,A /ИНКРЕМЕНТИРОВАЛ CNT.T ПО МОДУЛЮ 256
ANL A,#00001111B /ЗАНУЛИЛ 4 СТАРШИХ БИТА
JZ MNDR1S
LJMP T.ISR.l
ЭТО ДЕЛАЕТСЯ РАЗ В 1 СЕКУНДУ
MNDR1S:
PUSH PSW
SETB PSW.3 /БАНК POH НОМЕР 4
SETB PSW. 4
L7816513:
LCALL A13.1.VK
LCALL IZMN16
MOV U_ACC1,R4
MOV U_ACC1+1,R5
LCALL A13.16.V
LCALL IZMN16
MOV UT.ACC1,R4
MOV UT_ACC1+1,R5
LCALL A13.9.VK
LCALL IZMN16
MOV U_ACC2,R4
MOV U.ACC2+1,R5
- 248-
2.4. Программа для микроконтроллера зарядного устройства
LCALL LCALL MOV MOV A13_8_VK IZMN16 UT_ACC2ZR4 UT_ACC2+1,R5
MOV ANL JZ A,CNT_T A,#001100000B /ОСТАВИЛ 2 СТАРШИХ БИТА OTBUTACC /ЕСЛИ CNT_T=0, ОТОБРАЖАТЬ UT.ACCi
/ОТОБРАЖАЕМ U.ACCi (ЕСЛИ ПЯТЫЙ И ЧЕТВЁРТЫЙ БИТЫ CNT.T СОДЕРЖАТ ЧИСЛО 1, 2 ИЛИ 3)
MOV R0,#AD00+0
MOV R1,#U_ACC1
LCALL UNPKQ /U_ACC1+O..l В AD00+0..3
MOV R0,#AD00+4
MOV R1,#U_ACC2
LCALL UNPKQ /U_ACC2+O..l В AD00+4..7
SJMP OTBNEXT
/ОТОБРАЖАЕМ ТЕМПЕРАТУРУ (ЕСЛИ ПЯТЫЙ И ЧЕТВЁРТЫЙ БИТЫ CNT_T СОДЕРЖАТ ЧИСЛО 0)
OTBUTACC MOV ORL JNZ a,vdist a,vdist+i OTBUT2 /А = 0 ТОЛЬКО ПРИ VD1ST+0..1 = 0
t MOV R2,UT_ACC1
MOV R3,UT_ACC1+1
MOV R4,U_ACC1
MOV R5,U_ACC1+1
LCALL BCMNDE /R3R2=(UT_ACC1+O..1 - U_ACC1+O..l)
SJMP OTBUT3 /НА РАСПАКОВКУ В AD00+0..3
OTBUT2:
MOV R4,UT_ACC1
MOV R5,UT-ACCl+l
MOV R2,U_ACC1
MOV R3,U_ACC1+1
LCALL DEMNBC /R5R4=(UT_ACC1+0..1 - U_ACC1+O..l)
MOV R2,VD1ST
MOV R3,VD1ST+1
LCALL BCMNDE ;R3R2=VD1ST+O..1 - (UT.ACC1+0..1 - U_ACC1+O..l)
JNC OTBUT30 /ЕСЛИ R3R2 HE < 0, НА РАСПАКОВКУ В AD00+0..3
MOV R2,#0
MOV R3,#0 /ЗАНУЛИЛ ОТРИЦАТЕЛЬНУЮ РАЗНОСТЬ В R3R2
OTBUT30:
-249
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
OTBUT3: LCALL MOV LCALL POSB
ro,#adoo+o LOOP3152 /РАСПАКОВАЛ ПЕРВЫЙ РЕЗУЛЬТАТ В AD00+0..3
Г MOV A,VD2ST
ORL A,VD2ST+1 /А = 0 ТОЛЬКО ПРИ VD2ST+0..1 = 0
JNZ OTBUT4
/ MOV R2,UT_ACC2
MOV R3,UT_ACC2+1
MOV R4,U_ACC2
MOV R5,U_ACC2+1
LCALL BCMNDE /R3R2=(UT_ACC2+0..1 - U_ACC2+O..l)
SJMP OTBUT5 /НА РАСПАКОВКУ В ADO0+4..7
OTBUT4:
MOV R4,UT_ACC2
MOV R5,UT_ACC2+1
MOV R2,U_ACC2
MOV R3,U_ACC2+1
LCALL DEMNBC ;R5R4=(UT_ACC2+0..1 - U_ACC2+0..1)
MOV R2,VD2ST
MOV R3,VD2ST+1
LCALL BCMNDE ;R3R2=VD2ST+0..1 - (UT.ACC2+0..1 - U.ACC2+0..1)
JNC OTBUT50 /ЕСЛИ R3R2 HE < 0, НА РАСПАКОВКУ В AD00+4..7
MOV R2,#0
MOV R3,#0 /ЗАНУЛИЛ ОТРИЦАТЕЛЬНУЮ РАЗНОСТЬ В R3R2
OTBUT50:
LCALL POSB
OTBUT5:
MOV R0,#AD00+4
LCALL LOOP3152 /РАСПАКОВАЛ ВТОРОЙ РЕЗУЛЬТАТ В AD00+4..7
OTBNEXT:
/ LCALL INDVIV /ВЫВЕЛИ НА ДИСПЛЕЙ
/ POP PSW
T_ISR_1:
POP DPH
POP DPL
POP В
POP ACC
POP PSW
- 250 -
2.4. Программа для микроконтроллера зарядного устройства
SETB ЕА
SETB TRO
RETI
ВЫВОД ИНФОРМАЦИИ НА ЖК-ИНДИКАТОР НТ-1610
INDVIV:
MOV A,AD00+3
ACALL SIMBOL1
MOV A,AD00+2
ACALL SIMBOL1
MOV A,AD00+l
ACALL SIMBOL1
MOV a,adoo+o
ACALL SIMBOL1
MOV A,#0FH
ACALL SIMBOL1
MOV A,#0FH
ACALL SIMBOL1
MOV A,AD00+7
ACALL SIMBOL1
MOV A,AD00+6
ACALL SIMBOL1
MOV A,AD00+5
ACALL SIMBOL1
MOV A,AD00+4
ACALL SIMBOL1
RET
SIMBOL1:
ANL A,#00001111B
CJNE A,#O,SIMB11
MOV A,#10
SJMP SIMB12
SIMB11: CJNE A,#0FH,SIMB12
MOV A,#0
SIMB12: CLR CLKIND1
SWAP A
ACALL BIT1
ACALL BIT1
ACALL BIT1
ACALL BIT1
RET
251 -
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
BIT1: RLC MOV SETB CLR RET A DATIND1,C ;ВЫВ. ДАННЫХ В ЖК-ДИСПЛЕЙ CLKIND1 ;ИМПУЛЬС ЗАЩЁЛКИВАНИЯ CLKIND1
UNPKQ: MOV A,@R1
MOV R2,A
INC Rl
MOV A,@R1
MOV R3,A
DEC Rl
LOOP3152
INC RO
INC RO
INC RO
LCALL BN2BCD
LEVBIT: MOV A,R5
ANL A,#11110000B
CJNE A,#0,ENDPKQ
MOV A,R5
ORL A,#11110000B
MOV R5,A
ENDPKQ: MOV A,R5
LCALL RVIV
MOV A,R5
LCALL VIV
MOV A,R4
LCALL RVIV
MOV A,R4
LCALL VIV
INC RO
RET
RVIV: SWAP A
VIV: ANL A,#00001111B
CJNE A, #00001111B,NEF
MOV A,#0FFH
NEF: MOV @R0,A
DEC RET RO
.•ПОДПРОГРАММА УМНОЖЕНИЯ
-252-
2.4. Программа для микроконтроллера зарядного устройства
;П/П MUL21 ОСУЩЕСТВЛЯЕТ УМНОЖЕНИЕ ЦЕЛЫХ ДВОИЧНЫХ ЧИСЕЛ
;БЕЗ ЗНАКА ФОРМАТА 16x8=24 (БЕЗ ПРОВЕРКИ СОМНОЖИТЕЛЕЙ НА
;НОЛЬ.МНОЖИТЕЛЬ-В А,МНОЖИМОЕ-В DE,ПРОИЗВЕДЕНИЕ-В (A,H,L)
;ИСПОЛЬЗУЮТСЯ ВСЕ РЕГИСТРЫ,СОХРАНЯЕТСЯ DE.
MUL21: MOV MOV MOV MOV MOV R2,#8 A,#0 R3,A R6,A R7,A ;RO*R5R4=ROR5R4, RO И Rl COXP
LOOP67: MOV A,R6
ADD A,R6
MOV R6,A
MOV A,R7
ADDC A,R7
MOV R7,A
MOV A,RO
ADDC A,RO
MOV RO,A
JNC LOOP68
MOV A,R6
ADD A,R4
MOV R6,A
MOV A,R7
ADDC A,R5
MOV R7,A
MOV A,RO
ADDC A,R3
MOV RO,A
LOOP68: DJNZ R2,LOOP67
MOV A,R6
MOV R4,A
MOV A,R7
MOV R5,A
г ЗЕТ
BN2BCD: ;R3R2 -> R6R5R4, RO И Rl COXP
MOV R7,#10H
MOV A,#0
MOV R4,A
MOV R5,A
MOV R6,A
BN2CKL: MOV A,R2
ADD A,R2
MOV R2,A
-253
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
MOV AZR3
ADDC A,R3
MOV R3,A
;ДВОИЧНО-ДЕСЯТИЧНОЕ УДВОЕНИЕ СУММЫ С УЧЁТОМ ПЕРЕНОСА:
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R5
ADDC AZR5
DA A
MOV R5,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
;ПРОВЕРКА КОНЦА ЦИКЛА:
DJNZ R7,BN2CKL
RET
DECMBC: CLR C
MOV AZR5
SUBB A,R3
JNZ RETDCB
MOV AZR4
SUBB A,R2
RETDCB: RET
BCCMDE: CLR C
MOV A,R3
SUBB A,R5
JNZ RETBCD
MOV A,R2
SUBB A,R4
RETBCD: RET
DEMNBC: CLR C
MOV A,R4
SUBB A,R2
MOV R4,A
MOV A,R5
SUBB AZR3
MOV RET R5ZA
BCMNDE: CLR C
MOV AZR2
SUBB AZR4
-Z54-
2.4. Программа для микроконтроллера зарядного устройства
MOV MOV SUBB MOV RET R2,A A,R3 A,R5 R3,A
POSB: CLR C
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
RET
POSD: CLR C
MOV A,R5
RRC A
MOV R5,A
MOV A,R4
RRC A
MOV R4,A
RET
A13_8_VK
CLR L513_l /ОТКЛЮЧИЛИ
SETB L513__8 ;ВКЛЮЧИЛИ !!!!!!
SETB L513.9 /ОТКЛЮЧИЛИ
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513.8
A13_1_VK
SETB L513.1 /ВКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513_9 /ОТКЛЮЧИЛИ
SETB L513-16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_l
A13_9_VK
CLR L513_l /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
CLR L513_9 /ВКЛЮЧИЛИ И’!’’
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_9
A13_16_V
-255-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
CLR L513_l /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513_9 /ОТКЛЮЧИЛИ
CLR L513_16 /ВКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513.16
A13.0TKL
CLR L513_l /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513_9 /ОТКЛЮЧИЛИ
SETB L513_16 /ОТКЛЮЧИЛИ
/ RET /НАСТРОИЛИ ADG513 НА ОТКЛЮЧЕНИЕ
IZMNAP3:
SETB DATADC /
SETB CSADC 9
CLR CLKADC 9
ADC_12:
CLR CSADC /CS=0 - START
MOV A,#0
MOV B,A
/ SETB CLKADC /МИНУС ПЕРВЫЙ ИМПУЛЬС
CLR CLKADC
/ SETB CLKADC /НУЛЕВОЙ ИМПУЛЬС
CLR CLKADC
/ SETB CLKADC /ПЕРВЫЙ ИМПУЛЬС
CLR CLKADC
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ СТАРШЕГО (12-ГО) БИТА
CLR CLKADC
MOV B.3,C
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 11-ГО БИТА
CLR CLKADC
MOV B.2,C
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 10-ГО БИТА
CLR CLKADC
MOV B.1,C
—256
2.4. Программа для микроконтроллера зарядного устройства
SETB MOV CLR MOV CLKADC C,DATADC CLKADC B.0,C ;ЧТЕНИЕ 9-ГО БИТА
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 8-ГО БИТА
CLR CLKADC
MOV ACC.7,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 7-ГО БИТА
CLR CLKADC
MOV ACC.6,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 6-ГО БИТА
CLR CLKADC
MOV ACC.5,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 5-ГО БИТА
CLR CLKADC
MOV ACC.4,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 4-ГО БИТА
CLR CLKADC
MOV ACC.3,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 3-ГО БИТА
CLR CLKADC
MOV ACC.2,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 2-ГО БИТА
CLR CLKADC
MOV ACC.1,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ МЛАДШЕГО(1-ГО) БИТА
CLR CLKADC
MOV ACC.O/C
-251-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
MOV R4,A
MOV R5,B
SETB CSADC
RET
;CS=1 - END
/ПОДПРОГРАММА ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 16
/ИЗМЕРЕНИЯМ
IZMN16:
MOV R7,#0
MOV R6,#0
MOV R3,#0
MOV R2,#16
IZMN16C:
LCALL IZMNAP3
MOV A,R6
ADD A,R4
MOV R6,A
MOV A,R7
ADDC A,R5
MOV R7,A
DJNZ R2,IZMN16C
MOV A,R6
MOV R4,A
MOV A,R7
MOV R5,A
LCALL POSD
LCALL POSD
LCALL POSD
LCALL POSD
RET
/ОСНОВНОЙ ЦИКЛ КАНАЛА 1
TASK1:
CYCL1:
LCALL OFFALL1 /ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/РАЗРЯД
MOV VD1ST,#O
MOV VD1ST+1,#O
/ПРОВЕРКА, ВСТАВЛЕН ЛИ АККУМУЛЯТОР 1
— 258 —
2.4. Программа для микроконтроллера зарядного устройства
LCALL CHECKAC1
JNC CYCL1
LCALL DELIS
LCALL CHECKAC1
JNC CYCL1
;CY=1 - ВСТАВЛЕН
;CY=1 - ВСТАВЛЕН
/ОПРЕДЕЛЯЕМ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ VT8 КАНАЛА 1
/И ЗАНОСИМ РЕЗУЛЬТАТ В VD1ST
LCALL UVD1 /В R5R4 - ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ
MOV VD1ST,R4
MOV VD1ST+1,R5
/ОПРЕДЕЛЯЕМ, НУЖЕН ЛИ РАЗРЯД АККУМУЛЯТОРА 1, ЕСЛИ НЕТ - НА ЗАРЯД
MOV A,Pl
ANL A,#10000000B
JNZ NERAZR1 /Pl.7=1 - СРАЗУ НА ЗАРЯД БОЛЬШИМ ТОКОМ
/РАЗРЯД 1-ГО АККУМУЛЯТОРА
RAZR1:
LCALL UNCHARI /ГОРЯТ ОБА СВЕТОДИОДА, ВКЛЮЧЕНА ЦЕПЬ /РАЗРЯДА, ОСТАЛЬНЫЕ ЦЕПИ ОТКЛЮЧЕНЫ
/ОПРЕДЕЛЯЕМ, ПОРА ЛИ ЗАВЕРШИТЬ РАЗРЯД
LCALL RDUACC1 /В R3R2 - U_ACC1+O..1
MOV DPTR,#1000
MOV R4,DPL
MOV R5,DPH
LCALL BCCMDE /СРАВНЕНИЕ (U-ACC1+0..1) - 1000
JNC RAZR1 /CY=1-ЕЩЕ РАЗРЯЖАТЬ, Т.К. (U_ACCl+0..1)>1000
/ОТКЛЮЧАЕМ ЦЕПЬ РАЗРЯДА
LCALL OFFALL1 /ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/РАЗРЯД
LCALL DEL8S /ЗАДЕРЖКА
/ДАЁМ ИНИЦИИРУЮЩИЙ МАЛЫЙ ТОК, ЗАТЕМ - БОЛЬШОЙ ТОК,
/ИЗМЕРЯЕМ U НА АККУМУЛЯТОРЕ 1 И ЗАНОСИМ ЕГО В U_A1_MAX+O. . 1
NERAZR1:
LCALL CHARGEL1 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL DEL8S /МИНУТНЫЙ ЗАРЯД МАЛЫМ ТОКОМ, БЕЗ КОНТРОЛЯ U
259 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
LCALL DEL8S
LCALL DEL8S
LCALL DEL8S
;ВКЛЮЧАЕМ ЗАРЯД ВОЛЫНИМ ТОКОМ И ДЕРЖИМ ЕГО ПРИМЕРНО МИНУТУ
LCALL CHARGEB1 ;ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
LCALL DEL8S ;МИНУТНЫЙ ЗАРЯД БОЛЬШИМ ТОКОМ, БЕЗ КОНТРОЛЯ U
LCALL DEL8S
LCALL DEL8S
LCALL DEL8S
LCALL RDUACC1 /В R3R2 - U-ACC1+0..1
MOV U_A1_MAX,R2
MOV U_A1_MAX+1,R3 /НАЧАЛЬНОЕ ЗНАЧЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ /НА АККУМУЛЯТОРЕ 1 В U_A1_MAX+O..1
/СОХРАНЯЕМ ЗАРЯД БОЛЬШИМ ТОКОМ И ПРОВЕРЯЕМ, ЕСТЬ ЛИ ПЕРЕГРЕВ ИЛИ ПЕРЕЗАРЯД
ZAR1:
LCALL CHARGEB1 /ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
LCALL PEREGRV1 /СУ=1 - ПЕРЕГРЕВ
JC DOZARD12 /ПРИ ПЕРЕГРЕВЕ НА ДОЗАРЯД С МИГАНИЕМ
LCALL PEREZAR1 /СУ=1 - ПЕРЕЗАРЯД НАСТУПИЛ
JC DOZARAD1 /ПРИ ОКОНЧАНИИ ЗАРЯДА НА ДОЗАРЯД МАЛЫМ I
;ИЗМЕРЯЕМ ТЕКУЩЕЕ U НА АККУМУЛЯТОРЕ 1, И ЕСЛИ ОНО БОЛЬШЕ U_A1_MAX+O..1,
;ЗАНОСИМ ТЕКУЩЕЕ В U_A1_MAX+O . .1
LCALL RDUACC1 /В R3R2 - U_ACC1+O..l
MOV R4,U_A1_MAX
MOV R5,U_A1_MAX+1 /МАХ. ЗНАЧ. U НА АККУМУЛЯТОРЕ 1 В R5R4
LCALL BCCMDE /ТЕКУЩЕЕ МИНУС МАКСИМАЛЬНОЕ
JC NOTMAX1 /ЕСЛИ ТЕКУЩЕЕ<МАКСИМАЛЬНОГО, НА NOTMAX1
MOV U_A1_MAX,R2
MOV U_A1_MAX+1,R3 /НОВЫЙ МАХ.
NOTMAX1:
SJMP ZAR1
;ТЕПЕРЬ ДОЗАРЯД МАЛЫМ ТОКОМ С ОЖИДАНИЕМ ИЗВЛЕЧЕНИЯ И ВОЗВРАТОМ НА СТАРТ
;ПОСЛЕ ИЗВЛЕЧЕНИЯ
DOZARAD1:
LCALL CHARGEL1 ;ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL СНЕСКАС1 ;СУ=1 - ВСТАВЛЕН
JC DOZARAD1 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
-260-
2.4. Программа для микроконтроллера зарядного устройства
LCALL DEL20
LCALL CHECKAC1 /CY=1 - ВСТАВЛЕН
JC DOZARAD1 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL1 /ЕСЛИ ВЫНУТ - НА СТАРТ
/ТОЖЕ ДОЗАРЯД 1 ЧАЛЫМ ТОКОМ, НО ЗЕЛЁНЫЙ СВЕТОДИОД МИГАЕТ
DOZARD12:
LCALL CHARGEL1 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL CHECKAC1 /CY=1 - ВСТАВЛЕН
JC DOZARD13 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LCALL DEL20
LCALL CHECKAC1 /CY=1 - ВСТАВЛЕН
JC DOZARD13 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL1 /ЕСЛИ ВЫНУТ - НА СТАРТ
DOZARD13:
LCALL DEL05S /ЗАДЕРЖКА 2*200 МС ЕСТЬ, К НЕЙ ЕЩЕ 500 МС
SETB GRNLED1 /ПОГАСИЛ ЗЕЛЁНЫЙ СВЕТОДИОД
LCALL DELIS
SJMP DOZARD12
ПОДПРОГРАММЫ
/ПЕРЕНОС U_ACC1+O..l В R3R2, UT_ACC1+O..l В R5R4
RDUACC1:
LCALL DEL20 /ЗАДЕРЖКА, ЗА ЭТО ВРЕМЯ ЕСТЬ ИЗМЕРЕНИЕ
CLR ЕА
MOV R2,U_ACC1
MOV R3,U_ACC1+1
MOV R4,UT_ACC1
MOV R5,UT_ACC1+1
SETB EA
RET
/ВЫЧИСЛЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ И СОХРАНЕНИЕ В R5R4
UVD1:
LCALL RDUACC1
LCALL DEMNBC /R5R4 = (UT_ACC1+O..1) - (U_ACC1+O..1)
RET
/ОТКЛЮЧЕНИЕ СВЕТОДИОДОВ, КАНАЛОВ ЗАРЯДА И РАЗРЯДА АККУМУЛЯТОРА 1
OFFALL1:
SETB REDLED1 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
-261-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
SETB GRNLED1 /ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCHI /ОТКЛЮЧИЛИ РАЗРЯД
CLR CHBIG1 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ
CLR CHLIT1 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
RET
.•УСТАНОВКА ЗАРЯДА БОЛЬШИМ ТОКОМ
CHARGEB1:
CLR REDLED1 /ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
SETB GRNLED1 /ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCHI /ОТКЛЮЧИЛИ РАЗРЯД
CLR CHLIT1 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
SETB CHBIG1 /ВКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
RET
/УСТАНОВКА ЗАРЯДА МАЛЫМ ТОКОМ
CHARGEL1:
SETB REDLED1 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
CLR GRNLED1 /ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCHI /ОТКЛЮЧИЛИ РАЗРЯД
CLR CHBIG1 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
SETB CHLIT1 /ВКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
RET
/УСТАНОВКА РАЗРЯДА
UNCHAR1:
CLR REDLED1 /ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
CLR GRNLED1 /ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR CHLIT1 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
CLR CHBIG1 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
SETB UNCH1 /ВКЛЮЧИЛИ РАЗРЯД
RET
/ПРОВЕРКА, ВСТАВЛЕН ЛИ АККУМУЛЯТОР
СНЕСКАС1:
LCALL RDUACC1 /R3R2 - (U_ACC1+O..1)
MOV DPTR,#2000 /2000 MB-ГРАНИЦА, МЕНЬШЕ - ВСТАВЛЕН, > - НЕТ
MOV R4,DPL
MOV R5,DPH
LCALL RET BCCMDE /(U_ACCl+0..1) - 2000, CY=1, ЕСЛИ ВСТАВЛЕН
-262
2.4. Программа для микроконтроллера зарядного устройства
;ПРОВЕРКА НА ПЕРЕГРЕВ ТРАНЗИСТОРА КАНАЛА 1
PEREGRV1:
LCALL UVD1 ;R5R4-ТЕКУЩЕЕ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ
MOV A,R4
ADD a,#deltat
MOV R4,A
MOV A,R5
ADDC A,#0
MOV R5,A /R5R4 = (ТЕКУЩЕЕ U ДИОДА) +80
MOV R2,VD1ST
MOV R3,VD1ST+1 /НЗК2=ПАДЕНИЕ НАПРЯЖЕНИЯ НА ДИОДЕ ПРИ СТАРТЕ
LCALL DECMBC ;{(ТЕКУЩЕЕ U ДИОДА) + 80} - СТАРТОВОЕ, СУ=1 -
RET /ПЕРЕГРЕВ
;ПРОВЕРКА НА ДОСТИЖЕНИЕ МАКСИМАЛЬНОГО ЗАРЯДА НА АККУМУЛЯТОРЕ 1
PEREZAR1:
LCALL RDUACC1 R4,U_A1_MAX R5 ,U_A1__MAX+1 C A,R4 A,#DELTAU R4,A A,R5 A,#0 R5,A BCCMDE /R3R2 = U.ACC1+0..1 /R5R4 = U_A1_MAX+O..1
MOV
MOV
CLR /R5R4 = /{U_ACC /CY=1 - (U_A1_MAX+O..1) - 20 1 + 0.. 1} - {(U-A1-MAX+0. ПЕРЕЗАРЯД .1) - 20}
MOV
SUBB
MOV
MOV
SUBB
MOV
LCALL
RET i
/ОСНОВНОЙ ЦИКЛ TASK2: CYCL2: LCALL КАНАЛА 2 OFFALL2 /ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/
РАЗРЯД MOV VD2ST,#0 MOV VD2ST+l,#0 /ПРОВЕРКА, ВСТАВЛЕН ЛИ АККУМУЛЯТОР 2 LCALL СНЕСКАС2 ;CY=1 - JNC CYCL2 LCALL DELIS ВСТАВЛЕН
263-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
LCALL СНЕСКАС2 ;CY=1 - ВСТАВЛЕН
JNC CYCL2
/ОПРЕДЕЛЯЕМ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ VT8 КАНАЛА 2
/И ЗАНОСИМ РЕЗУЛЬТАТ В VD2ST
LCALL UVD2 /В R5R4 - ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ
MOV MOV VD2ST,R4 VD2ST+1,R5
ОПРЕДЕЛЯЕМ, НУЖЕН ЛИ РАЗРЯД АККУМУЛЯТОРА 2, ЕСЛИ НЕТ - НА ЗАРЯД
MOV А,Р2
ANL А,#10000000В
JNZ NERAZR2 /Р2.7=1 - СРАЗУ НА ЗАРЯД БОЛЬШИМ ТОКОМ
РАЗРЯД 2-ГО АККУМУЛЯТОРА
RAZR2:
LCALL UNCHAR2 /ГОРЯТ ОБА СВЕТОДИОДА, ВКЛЮЧЕНА ЦЕПЬ
/РАЗРЯДА, ОСТАЛЬНЫЕ ЦЕПИ ОТКЛЮЧЕНЫ
/ОПРЕДЕЛЯЕМ, ПОРА ЛИ ЗАВЕРШИТЬ РАЗРЯД
LCALL RDUACC2 MOV DPTR,#1000 MOV R4,DPL MOV R5,DPH LCALL BCCMDE JNC RAZR2 /ОТКЛЮЧАЕМ ЦЕПЬ РАЗРЯДА LCALL OFFALL2 LCALL DEL8S /ДАЁМ ИНИЦИИРУЮЩИЙ МАЛЫЙ ТОК, /ИЗМЕРЯЕМ U НА АККУМУЛЯТОРЕ 2 NERAZR2: LCALL CHARGEL2 LCALL DEL8S LCALL DEL8S LCALL DEL8S LCALL DEL8S /В R3R2 - U_ACC2+O..l /СРАВНЕНИЕ (U_ACC2+0..1) - 1000 ,-CY=l-ЕЩЕ РАЗРЯЖАТЬ, Т.К. (U_ACC2+0..1)>1000 /ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/РАЗРЯД /ЗАДЕРЖКА ЗАТЕМ ДАЁМ БОЛЬШОЙ ТОК, И ЗАНОСИМ ЕГО В U_A2_MAX+0..1 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I /МИНУТНЫЙ ЗАРЯД МАЛЫМ ТОКОМ, БЕЗ КОНТРОЛЯ U
-264
2.4. Программа для микроконтроллера зарядного устройства
/ВКЛЮЧАЕМ ЗАРЯД БОЛЬШИМ ТОКОМ И ДЕРЖИМ ЕГО ПРИМЕРНО МИНУТУ
LCALL CHARGEB2 /ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
LCALL DEL8S /МИНУТНЫЙ ЗАРЯД БОЛЬШИМ ТОКОМ, БЕЗ КОНТРОЛЯ U
LCALL DEL8S
LCALL DEL8S
LCALL DEL8S
LCALL RDUACC2 /В R3R2 - U_ACC2 + O..l
MOV U_A2_MAX,R2
MOV U_A2_MAX+1,R3 /НАЧАЛЬНОЕ ЗНАЧЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ
/НА АККУМУЛЯТОРЕ 1 В U_A1_MAX+O..1
/СОХРАНЯЕМ ЗАРЯД БОЛЬШИМ ТОКОМ И ПРОВЕРЯЕМ, ЕСТЬ ЛИ ПЕРЕГРЕВ ИЛИ ПЕРЕЗАРЯД
ZAR2:
LCALL CHARGEB2 /ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
LCALL PEREGRV2 /СУ=1 - ПЕРЕГРЕВ
JC DOZARD22 /ПРИ ПЕРЕГРЕВЕ НА ДОЗАРЯД С МИГАНИЕМ
LCALL PEREZAR2 /СУ=1 - ПЕРЕЗАРЯД НАСТУПИЛ
JC DOZARAD2 /ПРИ ОКОНЧАНИИ ЗАРЯДА НА ДОЗАРЯД МАЛЫМ I
/ИЗМЕРЯЕМ ТЕКУЩЕЕ U НА АККУМУЛЯТОРЕ 2, И ЕСЛИ ОНО БОЛЬШЕ U_A2_MAX+0..1,
/ЗАНОСИМ ТЕКУЩЕЕ В U_A2_MAX+0..1
LCALL RDUACC2 /В R3R2 - U_ACC2+O..l
MOV R4,U_A2_MAX
MOV R5,U_A2_MAX+1 /МАХ. ЗНАЧ. U НА АККУМУЛЯТОРЕ 2 В R5R4
LCALL BCCMDE /ТЕКУЩЕЕ МИНУС МАКСИМАЛЬНОЕ
JC NOTMAX2 /ЕСЛИ ТЕКУЩЕЕ<МАКСИМАЛЬНОГО, НА NOTMAX2
MOV U_A2_MAX,R2
MOV U_A2_MAX+1,R3 /НОВЫЙ MAX.
NOTMAX2:
SJMP ZAR2
/ТЕПЕРЬ ДОЗАРЯД МАЛЫМ ТОКОМ С ОЖИДАНИЕМ ИЗВЛЕЧЕНИЯ И ВОЗВРАТОМ НА СТАРТ
;ПОСЛЕ ИЗВЛЕЧЕНИЯ
DOZARAD2:
LCALL CHARGEL2 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL CHECKAC2 /СУ=1 - ВСТАВЛЕН
JC DOZARAD2 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LCALL DEL20
LCALL CHECKAC2 /СУ=1 - ВСТАВЛЕН
JC DOZARAD2 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL2 /ЕСЛИ ВЫНУТ - НА СТАРТ
-265
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
/ТОЖЕ ДОЗАРЯД МАЛЫМ ТОКОМ, НО ЗЕЛЁНЫЙ СВЕТОДИОД МИГАЕТ
DOZARD22:
LCALL CHARGEL2 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО
LCALL CHECKAC2 /СУ=1 - ВСТАВЛЕН
JC DOZARD23 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LCALL DEL20
LCALL CHECKAC2 /СУ=1 - ВСТАВЛЕН
JC DOZARD23 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL2 /ЕСЛИ ВЫНУТ - НА СТАРТ
DOZARD23:
LCALL DELO5S /ЗАДЕРЖКА 2*200 МС ЕСТЬ, К НЕЙ ЕЩЕ 500 МС
SETB GRNLED2 /ПОГАСИЛ ЗЕЛЁНЫЙ СВЕТОДИОД
LCALL DELIS
SJMP DOZARD22
/ПОДПРОГРАММЫ
/ПЕРЕНОС U_ACC2+O..l В R3R2, UT_ACC2+0..1 В R5R4
RDUACC2:
LCALL DEL20 /ЗАДЕРЖКА, ЗА ЭТО ВРЕМЯ ЕСТЬ ИЗМЕРЕНИЕ
CLR EA
MOV R2,U_ACC2
MOV R3,U_ACC2+1
MOV R4,UT_ACC2
MOV R5,UT_ACC2+1
SETB EA
RET
/ВЫЧИСЛЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ И СОХРАНЕНИЕ В R5R4
UVD2:
LCALL RDUACC2
LCALL DEMNBC ;R5R4 = (UT_ACC2+0..1) - (U_ACC2+0..1)
RET
/ОТКЛЮЧЕНИЕ СВЕТОДИОДОВ, КАНАЛОВ ЗАРЯДА И РАЗРЯДА АККУМУЛЯТОРА 2
OFFALL2:
SETB REDLED2 SETB GRNLED2 CLR UNCH2 CLR CHBIG2 CLR CHLIT2 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД /ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД /ОТКЛЮЧИЛИ РАЗРЯД /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ током -266-
2.4. Программа для микроконтроллера зарядного устройства
RET
ОСТАНОВКА ЗАРЯДА БОЛЬШИМ ТОКОМ
CHARGEB2:
CLR REDLED2 ;ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
SETB GRNLED2 '•ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCH2 '•ОТКЛЮЧИЛИ РАЗРЯД
CLR CHLIT2 '•ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
SETB CHBIG2 '•ВКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
RET
'•УСТАНОВКА ЗАРЯДА МАЛЫМ ТОКОМ
CHARGEL2:
SETB REDLED2 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
CLR GRNLED2 ;ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCH2 '•ОТКЛЮЧИЛИ РАЗРЯД
CLR CHBIG2 '•ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
SETB CHLIT2 '•ВКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
RET
'•УСТАНОВКА РАЗРЯДА
UNCHAR2:
CLR REDLED2 /ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
CLR GRNLED2 ;ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR CHLIT2 '•ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
CLR CHBIG2 '•ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
SETB UNCH2 '•ВКЛЮЧИЛИ РАЗРЯД
RET
/ПРОВЕРКА' ВСТАВЛЕН ЛИ АККУМУЛЯТОР
СНЕСКАС2:
LCALL RDUACC2 ;R3R2 - (U_ACC2+0..1)
MOV DPTR,#2000 ;2000 MB-ГРАНИЦА, МЕНЬШЕ - ВСТАВЛЕН, > - НЕТ
MOV R4'DPL
MOV R5,DPH
LCALL BCCMDE ;(U_ACC2+0..1) - 2000, CY=1, ЕСЛИ ВСТАВЛЕН
RET
;ПРОВЕРКА НА ПЕРЕГРЕВ ТРАНЗИСТОРА КАНАЛА 2
PEREGRV2:
LCALL UVD2 ;R5R4-ТЕКУЩЕЕ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ
-267-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
MOV A,R4
ADD A,#DELTAT
MOV R4,A
MOV A,R5
ADDC A,#0
MOV R5,A ;R5R4 = (ТЕКУЩЕЕ U ДИОДА) + 80
MOV R2,VD2ST
MOV R3,VD2ST+1 /ПЗР2=ПАДЕНИЕ НАПРЯЖЕНИЯ НА ДИОДЕ ПРИ СТАРТЕ
LCALL DECMBC /{(ТЕКУЩЕЕ U ДИОДА) + 80} - СТАРТОВОЕ, CY=1
RET /ПЕРЕГРЕВ
ПРОВЕРКА НА ДОСТИЖЕНИЕ МАКСИМАЛЬНОГО ЗАРЯДА НА АККУМУЛЯТОРЕ 2
PEREZAR2:
LCALL RDUACC2 /R3R2 = U_ACC2+O..l
MOV R4,U_A2_MAX
MOV R5,U_A2_MAX+1 ;R5R4 = U_A2_MAX+0..1
CLR C
MOV A,R4
SUBB A,#DELTAU
MOV R4,A
MOV A,R5
SUBB A,#0
MOV R5,A /R5R4 = (U_A2_MAX+0..1) - 20
LCALL BCCMDE /{U_ACC2+0..1} - {(U_A2_MAX+0..1) - 20}
RET /CY=1 - ПЕРЕЗАРЯД
.END
От исходной (см. подразд. 2.4.2) эта программа отличается, как отмеча-
лось, лишь заменой подпрограмм мигания светодиодов на программы за-
ряда/разряда аккумуляторов, да добавлением в начало программы, где
осуществляется инициализация аппаратных средств, фрагмента, отключа-
ющего при старте все цепи заряда и разряда. Кроме того, измерение с
отображением в этой программе происходят не через каждые 4 с, а через
1 с. Остальные же фрагменты предыдущей программы не изменились.
Структура программы заряда/разряда аккумуляторов практически
полностью соответствует описанной в подразд. 2.1.5, за исключением од-
ного — в ней отсутствуют фрагменты, определяющие длительность заряда,
сравнивающие её с максимально допустимым временем заряда и иниции-
рующие прекращение заряда по превышению лимита времени. Эти фраг-
менты были введены позднее, и они описаны в следующей (окончатель-
ной) программе. А программа, рассматриваемая в настоящем разделе, бы-
ла запущена сначала со схемой, приведённой на Рис. 2.5, к которой
-268-
2.4. Программа для микроконтроллера зарядного устройства
подключался имитатор, изображённый на Рис. 2.8. С её помощью была
произведена отладка устройства, описанная в разд. 2.2.4 и 2.2.5 (за исклю-
чением проверки превышения лимита времени). Далее имитатор (Рис. 2.5)
был отключен, схема (Рис. 2.4) была восстановлена, и с помощью этой
программы были проведены исследования аккумуляторов, приведённые
на Рис. 2.9...2.15.
2.4.4. Окончательная программа для микроконтроллера зарядного
устройства
Отсутствие горба на зарядной характеристике одного из аккумуляторов
в течение почти двух часов заряда, как уже упоминалось, побудило меня
включить в программу контроль времени заряда. Это сделано в приведён-
ной ниже программе, которая стала окончательной для зарядного устройс-
тва, рассматриваемого в настоящей главе.
В ячейках памяти с именами cntit, CNT1T+1, CNT2T, CNT2T+1 ор-
ганизованы двухбайтные счётчики секундных интервалов времени заряда
первого и второго аккумулятора соответственно. Содержимое счётчиков
инкрементируется ежесекундно и в процессе заряда сравнивается с пре-
дельным значением, задаваемым константой time (см. раздел перемен-
ных и констант программы). Величина отрицательного перепада задаётся
константой DELTAU, а максимально допустимого перегрева — константой
DELTAT (см. там же). При желании эти константы можно поварьировать.
Программа снабжена большим количеством комментариев и каких-
либо дополнительных разъяснений не требует.
Рабочая программа ZU611
;& &
;&ПРОГРАММА ДЛЯ СКОРОСТНОГО ЗАРЯДНОГО УСТРОЙСТВА Sc
;ScHA КОНТРОЛЛЕРЕ АТ89С51 Sc
;& Sc
АДРЕСА И КОНСТАНТЫ
ACC
В
.EQU
.EQU
ОЕОН
OFOH
-269-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
PSW . EQU ODOH
SP . EQU 81Н
DPL . EQU 82Н
DPH . EQU 83Н
РО . EQU 80Н
Р1 . EQU 90Н
Р2 . EQU ОАОН
РЗ . EQU ОВОН
В.О . EQU OFOH
В.1 . EQU 0F1H
В.2 . EQU 0F2H
В.З . EQU 0F3H
В.4 . EQU 0F4H
В.5 . EQU 0F5H
В,6 . EQU 0F6H
В.7 . EQU 0F7H
АСС.О . EQU ОЕОН
АСС.1 . EQU 0Е1Н
АСС. 2 . EQU 0Е2Н
АСС.З . EQU ОЕЗН
АСС. 4 . EQU 0Е4Н
АСС. 5 . EQU 0Е5Н
АСС. 6 . EQU 0Е6Н
АСС. 7 . EQU 0Е7Н
PSW.0 . EQU ODOH
PSW.1 . EQU 0D1H
PSW.2 . EQU 0D2H
PSW.3 . EQU 0D3H
PSW.4 . EQU 0D4H
PSW.5 . EQU 0D5H
PSW.6 . EQU 0D6H
PSW.7 . EQU 0D7H
РО.О . EQU 080Н
Р0.1 . EQU 081Н
Р0.2 . EQU 082Н
РО.З . EQU 083Н
Р0.4 . EQU 084Н
Р0.5 . EQU 085Н
Р0.6 . EQU 086Н
Р0.7 . EQU 087Н
Р1.0 . EQU 090Н
Р1.1 . EQU 091Н
Р1.2 . EQU 092Н
Р1.3 . EQU 093Н
Р1.4 . EQU 094Н
Р1.5 . EQU 095Н
— 270 —
2.4. Программа для микроконтроллера зарядного устройства
Р1.6 .EQU 096H
Р1.7 .EQU 097H
Р2.0 .EQU OAOH
Р2.1 .EQU 0A1H
Р2.2 .EQU 0A2H
Р2.3 .EQU 0A3H /
Р2.4 .EQU 0A4H 9
Р2.5 .EQU 0A5H f
Р2.6 .EQU 0A6H /
Р2.7 .EQU 0A7H /
РЗ.О .EQU OBOH 9
Р3.1 .EQU 0B1H 9
Р3.2 .EQU 0B2H 9
РЗ.З .EQU 0B3H 9
Р3.4 .EQU 0B4H 9
Р3.5 .EQU 0B5H 9
Р3.6 .EQU 0B6H 9
Р3.7 .EQU 0B7H 9
TMOD .EQU 089H
TCON .EQU 088H
TL0 .EQU 08 AH
ТНО .EQU 08CH
IE .EQU 0A8H
lt> .EQU 0B8H
TRO .EQU 08CH
TRI .EQU 08EH
ETO .EQU 0A9H
EA 9 .EQU OAFH
CNT.T .EQU 3EH /СЧЁТЧИК 65-МИЛЛИСЕКУНДНЫХ ИНТЕРВАЛОВ
SP_NEXT .EQU 3FH 9
SP1 .EQU 3FH 9
SP2 .EQU 5FH 9
ADOO .EQU ОЗОН ;8 БАЙТ ОЗУ ЭО
CNT1T .EQU 038H /2 БАЙТА-СЧЁТЧИК ВРЕМЕНИ ЗАРЯДА ПЕРВОГО
/АККУМУЛЯТОРА
CNT2T .EQU ОЗАН /2 БАЙТА-СЧЁТЧИК ВРЕМЕНИ ЗАРЯДА ВТОРОГО
/АККУМУЛЯТОРА
CLKIND1 .EQU Pl.l /ТАКТОВЫЙ СИГНАЛ ИНДИКАТОРА НТ1610
datindi .EQU P1.0 /ДАННЫЕ НА ИНДИКАТОР НТ1610
CSADC .EQU P3.3 /СИГНАЛ CS АЦП
CLKADC .EQU P3.1 /ТАКТОВЫЙ СИГНАЛ АЦП
-271.
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
DATADC .EQU P3.2 /ДАННЫЕ С АЦП
L513_l .EQU P3.6 /УПРАВЛЕНИЕ 1-М КЛЮЧОМ МУЛЬТИПЛЕКСОРА
L513_8 .EQU P3.5 /УПРАВЛЕНИЕ 2-М КЛЮЧОМ МУЛЬТИПЛЕКСОРА
L513_9 .EQU P3.4 /УПРАВЛЕНИЕ 3-М КЛЮЧОМ МУЛЬТИПЛЕКСОРА
L513.16 .EQU P3.7 /УПРАВЛЕНИЕ 4-М КЛЮЧОМ МУЛЬТИПЛЕКСОРА
ZELEN_VD .EQU Pl. 2
KRASN.VD .EQU Pl.3
U_ACC1 .EQU 20H /ПОТЕНЦИАЛ НА ПЛЮСЕ АККУМУЛЯТОРА ОТН. ЗЕМЛИ
UT-ACC1 .EQU 22H /ПОТЕНЦИАЛ НА ЭМИТТЕРЕ VT8 ОТН. ЗЕМЛИ
U_ACC2 .EQU 24H /ПАДЕНИЕ НАПРЯЖЕНИЯ НА АККУМУЛЯТОРЕ 2
UT.ACC2 .EQU 26H /ПАДЕНИЕ НАПРЯЖЕНИЯ НА АККУМУЛЯТОРЕ 2 + ДИОДЕ 2
U-A1-MAX .EQU 28H /МАКСИМАЛЬНЫЙ РЕЗУЛЬТАТ ИЗМЕРЕНИЯ U НА /АККУМУЛЯТОРЕ 1
U_A2_MAX .EQU 2AH /МАКСИМАЛЬНЫЙ РЕЗУЛЬТАТ ИЗМЕРЕНИЯ U НА /АККУМУЛЯТОРЕ 2
VD1ST .EQU 2CH /ПАДЕНИЕ НАПР. НА ЭМИТТЕРЕ VT8 В МОМЕНТ НАЧАЛА /ЗАРЯДА
VD2ST .EQU 2 EH /ПАДЕНИЕ НАПРЯЖЕНИЯ ДИОДЕ 2 В НАЧАЛЕ ЗАРЯДА
REDLED1 .EQU Pl.3 /КРАСНЫЙ СВЕТОДИОД КАНАЛА 1
GRNLED1 • EQU Pl. 2 /ЗЕЛЁНЫЙ СВЕТОДИОД КАНАЛА 1
UNCHI .EQU Pl. 6 /ЦЕПЬ РАЗРЯДА КАНАЛА 1
CHBIG1 • EQU Pl. 4 /ЦЕПЬ ЗАРЯДА БОЛЬШИМ ТОКОМ КАНАЛА 1
CHLIT1 .EQU Pl. 5 /ЦЕПЬ ЗАРЯДА МАЛЫМ ТОКОМ КАНАЛА 1
REDLED2 .EQU P2.5 /КРАСНЫЙ СВЕТОДИОД КАНАЛА 2
GRNLED2 .EQU P2.6 /ЗЕЛЁНЫЙ СВЕТОДИОД КАНАЛА 2
UNCH2 .EQU P2.4 /ЦЕПЬ РАЗРЯДА КАНАЛА 2
CHBIG2 .EQU P2.2 /ЦЕПЬ ЗАРЯДА БОЛЬШИМ ТОКОМ КАНАЛА 2
CHLIT2 • EQU P2.3 /ЦЕПЬ ЗАРЯДА МАЛЫМ ТОКОМ КАНАЛА 2
DELTAU .EQU 15 /ОТРИЦАТЕЛЬНОЕ ДЕЛЬТА V
DELTAT • EQU 60 /ПРЕДЕЛ НАГРЕВА, РАВНЫЙ Токр+60/(2.2...2.4)
TIME • EQU 3600 /ЛИМИТ ВРЕМЕНИ, РАВНЫЙ 2*3600 С
/НАЧАЛО ПРОГРАММЫ:
. *****
/
.ORG О
LJMP START
-272
2.4. Программа для микроконтроллера зарядного устройства
.ORG OBH
/ LJMP TIMER_ISR
7 .ORG 100H
START:
MOV AD00+0,#0
MOV AD00+l,#l
MOV AD00+2,#2
MOV AD00+3,#3
MOV AD00+4,#4
MOV AD00+5,#5
MOV AD00+6,#6
MOV AD00+7,#7
LCALL INDVIV
LCALL DEL4S
7 MOV P1,#OFFH
MOV P2,#0FFH
MOV P3,#0FFH
CLR UNCHI /ОТКЛЮЧИЛИ РАЗРЯД
CLR CHBIG1 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ
CLR CHLIT1 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
CLR UNCH2 /ОТКЛЮЧИЛИ РАЗ РЯД
CLR CHBIG2 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ
CLR CHLIT2 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
MOV CNT_T,#0
MOV DPTR,#0
MOV VD1ST,DPL
MOV VD1ST+1, DPH/ЗАНУЛИЛ VD1ST+0..1
MOV VD2ST,DPL
MOV VD2ST+1,DPH / ЗАНУЛИЛ VD2ST+0 . . 1
7 MOV SP, #SP2
9 MOV DPTR, #TASK2
PUSH DPL
PUSH DPH
9 XRL PSW, #8
PUSH PSW
XRL PSW, #8
9 PUSH ACC
PUSH в
- 273
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
PUSH DPL
PUSH DPH
MOV SP.NEXT, SP;
MOV SP, #SP1 ;
ACALL SETUP.TIMER ;
AJMP TASK1
SETUP_TIMER:
CLR CLR TRO TRI
MOV IP, #0
MOV IE, #0
MOV TMOD, #00000001B
MOV DPTR, #0
MOV TLO, DPL
MOV THO, DPH
SETB ETO
SETB EA
SETB TRO
RET
DEL20: MOV R1,#OFDH
LPEX: MOV R2,#26H
LPIN; DJNZ R2,LPIN
DJNZ R1,LPEX
RET
DEL01S; ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL RET DEL20
DEL05S: ACALL DEL01S
ACALL DEL01S
-274-
2.4. Программа для микроконтроллера зарядного устройства
ACALL DELOIS
DEL02S:
ACALL DEL01S
ACALL DEL01S
RET
DEL2S:
ACALL DELO5S
ACALL DELO 5S
DELIS:
ACALL DEL05S
ACALL DELO5S
RET
DEL8S:
ACALL DEL2S
ACALL DEL2S
DEL4S:
ACALL DEL2S
ACALL DEL2S
RET
TIMER-ISR:
CLR CLR TRO EA
PUSH PSW
PUSH ACC
PUSH В
PUSH DPL
PUSH DPH /pushed everything
MOV A, SP_NEXT
MOV SPJNEXT, SP
MOV SP, A /swapped SPs
MOV DPTR, #0
MOV TLO, DPL
MOV THO, DPH
MOV A,CNT_T
INC A
MOV CNT_T,A /ИНКРЕМЕНТИРОВАЛ CNT_T ПО МОДУЛЮ 256
ANL A,#0000111IB /ЗАНУЛИЛ 4 СТАРШИХ БИТА
JZ MNDR1S
LJMP T_ISR_1
-275-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
/ЭТО ДЕЛАЕТСЯ РАЗ В СЕКУНДУ
MNDR1S:
PUSH PSW
SETB PSW.3 /БАНК POH НОМЕР 4
SETB PSW. 4
L7816513:
LCALL A13_1_VK
LCALL IZMN16
MOV U_ACC1,R4
MOV U_ACC1+1,R5
LCALL A13_16_V
LCALL IZMN16
MOV UT_ACC1,R4
MOV UT_ACC1+1,R5
LCALL A13_9_VK
LCALL IZMN16
MOV U_ACC2,R4
MOV U_ACC2+1,R5
LCALL A13_8_VK
LCALL IZMN16
MOV UT_ACC2,R4
MOV UT_ACC2+1,R5
MOV A,CNT_T
ANL A,#001100000B /ОСТАВИЛ 2 СТАРШИХ БИТА
JZ OTBUTACC /ЕСЛИ CNT_T=0, ОТОБРАЖАТЬ UT.ACCi
/ОТОБРАЖАЕМ и_АССКЕСЛИ ПЯТЫЙ И ЧЕТВЁРТЫЙ БИТЫ CNT_T СОДЕРЖАТ 1, 2 ИЛИ 3)
MOV ro,#adoo+o
MOV Rl,#U_ACC1
LCALL UNPKQ ,-U_ACCl+0. .1 BAD0O+0..3
MOV R0,#AD00+4
MOV Rl,#U_ACC2
LCALL UNPKQ /U_ACC2+O..l В AD00+4..7
SJMP OTBNEXT
ОТОБРАЖАЕМ ТЕМПЕРАТУРУ (ЕСЛИ ПЯТЫЙ И ЧЕТВЁРТЫЙ БИТЫ CNT_T СОДЕРЖАТ ЧИСЛО 0)
-276-
2.4. Программа для микроконтроллера зарядного устройства
OTBUTACC:
MOV ORL JNZ A,VD1ST A,VD1ST+1 ;A = 0 ТОЛЬКО ПРИ VD1ST+0..1 = 0 OTBUT2
9 MOV R2,UT_ACC1
MOV R3,UT_ACC1+1
MOV R4,U_ACC1
MOV R5,U_ACC1+1
LCALL BCMNDE /R3R2=(UT_ACC1+O..1 - U_ACC1+O..l)
SJMP OTBUT3 /НА РАСПАКОВКУ В AD00+0..3
OTBUT2:
MOV R4,UT_ACC1
MOV R5,UT_ACC1+1
MOV R2,U_ACC1
MOV R3,U_ACC1+1
LCALL DEMNBC ;R5R4=(UT_ACC1+O..1 - U_ACC1+O..l)
MOV R2,VD1ST
MOV R3,VD1ST+1
LCALL BCMNDE ;R3R2=VD1ST+O..1 - (UT_ACC1+O..1 - U_ACC1+O..l)
JNC OTBUT30 /ЕСЛИ R3R2 HE < 0, НА РАСПАКОВКУ В AD00+0..3
MOV R2,#0
MOV R3,#0 /ЗАНУЛИЛ ОТРИЦАТЕЛЬНУЮ РАЗНОСТЬ В R3R2
OTBUT30:
LCALL POSB
OTBUT3:
MOV R0,#AD00+0
LCALL LOOP3152 /РАСПАКОВАЛ ПЕРВЫЙ РЕЗУЛЬТАТ В AD00+0..3
/ MOV A,VD2ST
ORL A,VD2ST+1 /А = 0 ТОЛЬКО ПРИ VD2ST+0..1 = 0
JNZ OTBUT4
9 MOV R2,UT_ACC2
MOV R3,UT_ACC2+1
MOV R4,U_ACC2
MOV R5,U_АСС2+1
LCALL BCMNDE /R3R2=(UT_ACC2+0..1 - U_ACC2+O..l)
SJMP OTBUT5 /НА РАСПАКОВКУ В AD00+4..7
OTBUT4:
MOV R4,UT_ACC2
MOV R5,UT_ACC2+1
MOV R2,U_ACC2
MOV R3,U_ACC2+1
-277-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
LCALL DEMNBC ; R5R4=(UT_ACC2+0..1 - U_ACC2+O..l)
MOV R2,VD2ST
MOV R3,VD2ST+1
LCALL BCMNDE ;R3R2=VD2ST+0..1 - (UT_ACC2+0..1 - U_ACC2+O..l)
JNC OTBUT50 ; ЕСЛИ R3R2 HE < 0z НА РАСПАКОВКУ В AD00+4..7
MOV R2,#0
MOV R3,#0 ; •ЗАНУЛИЛ ОТРИЦАТЕЛЬНУЮ РАЗНОСТЬ В R3R2
OTBUT50: LCALL POSB
OTBUT5: MOV RO,#AD00+4
LCALL LOOP3152 ; РАСПАКОВАЛ ВТОРОЙ РЕЗУЛЬТАТ В AD00+4..7
OTBNEXT: LCALL INDVIV ВЫВЕЛИ НА ДИСПЛЕЙ
POP PSW
T_ISR_1: POP DPH
POP DPL
POP В
POP ACC
POP PSW
9 SETB EA
SETB TRO
9 RETI
;ВЫВОД ИНФОРМАЦИИ НА ЖК-ИНДИКАТОР НТ-1610
INDVIV:
MOV A,AD00+3
ACALL SIMBOL1
MOV A,AD00+2
ACALL SIMBOL1
MOV a,adoo+i
ACALL SIMBOL1
MOV A,AD00+0
ACALL SIMBOL1
MOV A,#0FH
ACALL SIMBOL1
MOV A,#0FH
— 278 —
2.4. Программа для микроконтроллера зарядного устройства
ACALL SIMBOL1
MOV A,AD00+7
ACALL SIMBOL1
MOV A,AD00+6
ACALL SIMBOL1
MOV A,AD00+5
ACALL SIMBOL1
MOV A,AD00+4
ACALL SIMBOL1
RET SIMBOL1: ANL A,#00001111B
CJNE AZ#O,SIMB11
MOV А,#Ю
SJMP SIMB12
SIMB11: CJNE A,#0FH,SIMB12
MOV АД0
SIMB12: CLR CLKIND1
SWAP A
ACALL BIT1
ACALL BIT1
ACALL BIT1
ACALL BIT1
RET BIT1: RLC A
MOV DATIND1,C ;ВЫВ. ДАННЫХ В ЖК-ДИСПЛЕЙ
SETB CLKIND1 ;ИМПУЛЬС ЗАЩЁЛКИВАНИЯ
CLR CLKIND1
RET UNPKQ: MOV A,@R1
MOV R2,A
INC R1
MOV A,@R1
MOV R3,A
DEC R1
LOOP3152: INC RO
INC RO
INC RO
LCALL BN2BCD
LEVBIT: MOV A,R5
ANL АЛ111Ю000В
-279-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
CJNE АД0, ENDPKQ
MOV A,R5
ORL A,#11110000B
MOV R5,A
ENDPKQ: MOV A,R5
LCALL RVIV
MOV A,R5
LCALL VIV
MOV A,R4
LCALL RVIV
MOV A,R4
LCALL VIV
INC RO
RET
RVIV: SWAP A
VIV: ANL АЛ00001111В
CJNE A,#00001111B,NEF
MOV A30FFH
NEF: MOV @R0,A
DEC RO
RET
/ПОДПРОГРАММА УМНОЖЕНИЯ
;П/П MUL21 ОСУЩЕСТВЛЯЕТ УМНОЖЕНИЕ ЦЕЛЫХ ДВОИЧНЫХ ЧИСЕЛ
/БЕЗ ЗНАКА ФОРМАТА 16x8=24 (БЕЗ ПРОВЕРКИ СОМНОЖИТЕЛЕЙ НА
/НОЛЬ.МНОЖИТЕЛЬ-В А,МНОЖИМОЕ-В DE,ПРОИЗВЕЛЕНИЕ-В (A,H,L)
/ИСПОЛЬЗУЮТСЯ ВСЕ РЕГИСТРЫ,СОХРАНЯЕТСЯ DE.
MUL21: ;R0*R5R4=R0R5R4, R0 И Rl СОХР.
MOV R2 Л8
MOV АЛО
MOV R3,A
MOV R6,A
MOV R7,A
LOOP67: MOV A,R6
ADD A,R6
MOV R6,A
MOV A,R7
ADDC A,R7
MOV R7,A
MOV A,RO
ADDC A,RO
MOV RO,A
JNC LOOP68
-28ft
2.4. Программа для микроконтроллера зарядного устройства
MOV A,R6
ADD MOV MOV ADDC MOV MOV ADDC MOV LOOP68: DJNZ MOV MOV MOV MOV RET / BN2BCD: A,R4 R6,A A,R7 A,R5 R7,A A,RO A,R3 R0,A R2,LOOP67 A,R6 R4,A A,R7 R5,A ;R3R2 -> R6R5R4, RO И Rl COXP
MOV R7,#10H MOV A,#0 MOV R4,A MOV R5,A MOV R6,A BN2CKL: MOV A,R2 ADD A,R2 MOV R2,A MOV A,R3 ADDC A,R3 MOV R3,A ;ДВОИЧНО-ДЕСЯТИЧНОЕ УДВОЕНИЕ СУММЫ С УЧЁТОМ ПЕРЕНОСА:
MOV ADDC DA MOV MOV ADDC DA MOV MOV ADDC DA MOV ;ПРОВЕРКА КОНЦА DJNZ RET A,R4 A,R4 A R4,A A,R5 A,R5 A R5,A A,R6 A,R6 A R6,A ЦИКЛА: R7,BN2CKL
281
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
DECMBC: CLR C
MOV A,R5
SUBB A,R3
JNZ RETDCB
MOV A,R4
SUBB A,R2
RETDCB: RET
BCCMDE: CLR C
MOV A,R3
SUBB A,R5
JNZ RETBCD
MOV A,R2
SUBB A,R4
RETBCD: RET
DEMNBC: CLR C
MOV A,R4
SUBB A,R2
MOV R4,A
MOV A,R5
SUBB A,R3
MOV R5,A
RET
BCMNDE: CLR C
MOV A,R2
SUBB A,R4
MOV R2ZA
MOV A,R3
SUBB A,R5
MOV R3,A
RET
POSB: CLR C
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
RET
POSD: CLR C
MOV A,R5
RRC A
-282-
2.4. Программа для микроконтроллера зарядного устройства
MOV MOV RRC MOV RET R5,A A,R4 A R4,A
INXB: MOV A,R2
ADD A,#l
MOV R2,A
MOV A,R3
ADDC A,#0
MOV R3,A
INXBEN: / RET
А13_8_VK:
CLR L513_l /ОТКЛЮЧИЛИ
SETB L513_8 /ВКЛЮЧИЛИ !’!!!!
SETB L513_9 /ОТКЛЮЧИЛИ
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513.8
A13_1_VK:
SETB L513_l /ВКЛЮЧИЛИ !!!!!!
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513_9 /ОТКЛЮЧИЛИ
SETB L513JL6 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_l
A13_9_VK:
CLR L513_l /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
CLR L513.9 /ВКЛЮЧИЛИ !!!!!!
SETB L513_16 /ОТКЛЮЧИЛИ
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_9
A13_16_V:
CLR L513_l /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
SETB L513.9 /ОТКЛЮЧИЛИ
CLR L513_16 /ВКЛЮЧИЛИ ’!!!!!
RET /НАСТРОИЛИ ADG513 НА ПРОПУСКАНИЕ СИГНАЛА L513_16
A13_OTKL:
CLR L513_l /ОТКЛЮЧИЛИ
CLR L513_8 /ОТКЛЮЧИЛИ
-283-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
/ SETB SETB RET L513.9 L513_16 /ОТКЛЮЧИЛИ /ОТКЛЮЧИЛИ /НАСТРОИЛИ ADG513 НА ОТКЛЮЧЕНИЕ
IZMNAP3:
SETB DATADC 9
SETB CSADC 9
CLR CLKADC 9
ADC_12:
CLR CSADC /CS=0 - START
MOV A,#0
MOV B,A
9 SETB CLKADC /МИНУС ПЕРВЫЙ ИМПУЛЬС
CLR CLKADC
9 SETB CLKADC /НУЛЕВОЙ ИМПУЛЬС
CLR CLKADC
9 SETB CLKADC /ПЕРВЫЙ ИМПУЛЬС
CLR CLKADC
9 SETB CLKADC :
MOV C,DATADC /ЧТЕНИЕ СТАРШЕГО (12-ГО) БИТА
CLR CLKADC
MOV B.3,C
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 11-ГО БИТА
CLR CLKADC
MOV B.2,C
9 * SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ Ю-ГО БИТА
CLR CLKADC
MOV B.1,C
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 9-ГО БИТА
CLR CLKADC
MOV B.0,C
9 SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 8-ГО БИТА
CLR CLKADC
-284-
2.4. Программа для микроконтроллера зарядного устройства
MOV ACC.7,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 7-ГО БИТА
CLR CLKADC
MOV ACC.6 , C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ б-ГО БИТА
CLR CLKADC
MOV ACC.5,С
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 5-ГО БИТА
CLR CLKADC
MOV ACC.4,С
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 4-ГО БИТА
CLR CLKADC
MOV ACC.3,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 3-ГО БИТА
CLR CLKADC
MOV ACC.2,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ 2-ГО БИТА
CLR CLKADC
MOV ACC.1,C
SETB CLKADC
MOV C,DATADC /ЧТЕНИЕ МЛАДШЕГО(1-ГО) БИТА
CLR CLKADC
MOV АСС.О/С
MOV R4,A
MOV R5,B
SETB CSADC /CS=1 - END
RET
—285-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ПОДПРОГРАММА ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 16
;ИЗМЕРЕНИЯМ
IZMN16:
MOV R7,#0
MOV R6,#0
MOV R3,#0
MOV R2,#16
IZMN16C:
LCALL IZMNAP3
MOV A,R6
ADD A,R4
MOV R6,A
MOV A,R7
ADDC A,R5
MOV R7,A
DJNZ R2,IZMN16C
MOV A,R6
MOV R4,A
MOV A,R7
MOV R5,A
LCALL POSD
LCALL POSD
LCALL POSD
LCALL POSD
RET
;ОСНОВНОЙ ЦИКЛ КАНАЛА 1
TASK1:
CYCL1:
LCALL OFFALL1 ;ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/РАЗРЯД
MOV VD1ST,#O
MOV VD1ST+1,#O
ПРОВЕРКА, ВСТАВЛЕН ЛИ АККУМУЛЯТОР 1
LCALL СНЕСКАС1 ;CY=1 - ВСТАВЛЕН
JNC CYCL1
LCALL DELIS
LCALL CHECKAC1 ;CY=1 - ВСТАВЛЕН
JNC CYCL1
;ОПРЕДЕЛЯЕМ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ VT8 КАНАЛА 1
;И ЗАНОСИМ РЕЗУЛЬТАТ В VD1ST
— 286 —
2.4. Программа для микроконтроллера зарядного устройства
LCALL UVD1 /В R5R4 - ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ
MOV VD1ST,R4
MOV VD1ST+1,R5
/ОПРЕДЕЛЯЕМ, НУЖЕН ЛИ РАЗРЯД АККУМУЛЯТОРА 1, ЕСЛИ НЕТ - НА ЗАРЯД
MOV A,Pl
ANL A,#10000000B
JNZ NERAZR1 /Pl.7=1 - СРАЗУ НА ЗАРЯД БОЛЬШИМ ТОКОМ
РАЗРЯД 1-ГО АККУМУЛЯТОРА
RAZR1:
LCALL UNCHAR1 ;ГОРЯТ ОБА СВЕТОДИОДА, ВКЛЮЧЕНА ЦЕПЬ
/РАЗРЯДА, ОСТАЛЬНЫЕ ЦЕПИ ОТКЛЮЧЕНЫ
/ОПРЕДЕЛЯЕМ, ПОРА ЛИ ЗАВЕРШИТЬ РАЗРЯД
LCALL RDUACC1 /В R3R2 - U-ACC1+0..1
MOV DPTR,#1000
MOV R4,DPL
MOV R5,DPH
LCALL BCCMDE /СРАВНЕНИЕ (U_ACC1+O..1) - 1000
JNC RAZR1 /СУ=1-ЕЩЕ РАЗРЯЖАТЬ, T.K. (U_ACCl+0..1)>1000
/ОТКЛЮЧАЕМ ЦЕПЬ РАЗРЯДА
LCALL OFFALL1 /ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/РАЗРЯД
LCALL DEL8S /ЗАДЕРЖКА
/ДАЁМ ИНИЦИИРУЮЩИЙ МАЛЫЙ ТОК, ЗАТЕМ ДАЁМ БОЛЬШОЙ ТОК,
/ИЗМЕРЯЕМ U НА АККУМУЛЯТОРЕ 1 И ЗАНОСИМ ЕГО В U_Al_MAX+0..1
NERAZR1:
LCALL CHARGEL1 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL DEL8S /МИНУТНЫЙ ЗАРЯД МАЛЫМ ТОКОМ, БЕЗ КОНТРОЛЯ U
LCALL DEL8S
LCALL DEL8S
LCALL DEL8S
MOV CNT1T,#O
MOV CNT IT+1, #0/ЗАНУЛИЛИ СЧЁТЧИК ВРЕМЕНИ ЗАРЯДА
/ВКЛЮЧАЕМ ЗАРЯД БОЛЬШИМ ТОКОМ И ДЕРЖИМ ЕГО ПРИМЕРНО МИНУТУ
LCALL CHARGEB1 /ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
-287-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
LCALL DEL8S /МИНУТНЫЙ ЗАРЯД БОЛЬШИМ ТОКОМ, БЕЗ КОНТРОЛЯ U
LCALL DEL8S
LCALL DEL8S
LCALL DEL8S
LCALL RDUACC1 /В R3R2 - U_ACC1+O..l
MOV U_A1_MAX,R2
MOV U_A1_MAX+1,R3/НАЧАЛЬНОЕ ЗНАЧЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ
/НА АККУМУЛЯТОРЕ 1 В U_A1_MAX+O..1
/СОХРАНЯЕМ ЗАРЯД БОЛЬШИМ ТОКОМ И ПРОВЕРЯЕМ, ЕСТЬ ЛИ ПЕРЕГРЕВ ИЛИ ПЕРЕЗАРЯД
ZAR1:
LCALL CHARGEB1 /ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
LCALL PEREGRV1 /СУ=1 - ПЕРЕГРЕВ
JC DOZARD12 /ПРИ ПЕРЕГРЕВЕ НА ДОЗАРЯД С МИГАНИЕМ
LCALL PEREZAR1 /СУ=1 - ПЕРЕЗАРЯД НАСТУПИЛ
JC DOZARAD1 /ПРИ ОКОНЧАНИИ ЗАРЯДА НА ДОЗАРЯД МАЛЫМ I
LCALL DELIS
MOV R2,CNT1T
MOV R3,CNT1T+1 /СЧЁТЧИК ВРЕМЕНИ В R3R2
LCALL INXB /ИНКРЕМЕНТ СЧЁТЧИКА ВРЕМЕНИ
MOV CNT1T,R2
MOV CNT1T+1,R3
MOV DPTR, #Т1МЕ/ЛИМИТ ВРЕМЕНИ В DPTR
MOV R4,DPL
MOV R5,DPH /ЛИМИТ ВРЕМЕНИ В R5R4
LCALL DECMBC /TIME - ИНКРЕМЕНТИРОВАННОЕ CNT1T+0..1
JC DOZARD14 /ПРИ ЗАРЯДЕ ДОЛЬШЕ 2*3600 С НА ДОЗАРЯД
/С МИГАНИЕМ
/ИЗМЕРЯЕМ ТЕКУЩЕЕ U НА АККУМУЛЯТОРЕ 1, И ЕСЛИ ОНО БОЛЬШЕ U_A1_MAX+O..1,
/ЗАНОСИМ ТЕКУЩЕЕ В U_A1_MAX+O..1
LCALL RDUACC1 /В R3R2 - U_ACC1+O..l
MOV R4,U_A1_MAX
MOV R5,U_A1_MAX+1/МАХ. ЗНАЧ. U НА АККУМУЛЯТОРЕ 1 В R5R4
LCALL BCCMDE /ТЕКУЩЕЕ МИНУС МАКСИМАЛЬНОЕ
JC NOTMAX1 /ЕСЛИ ТЕКУЩЕЕ<МАКСИМАЛЬНОГО, HA NOTMAX1
MOV U_A1_MAX,R2
MOV U_A1_MAX+1,R3/НОВЫЙ MAX.
NOTMAX1:
SJMP ZAR1
/ТЕПЕРЬ ДОЗАРЯД МАЛЫМ ТОКОМ С ОЖИДАНИЕМ ИЗВЛЕЧЕНИЯ И ВОЗВРАТОМ НА СТАРТ
-288
2.4. Программа для микроконтроллера зарядного устройства
;ПОСЛЕ ИЗВЛЕЧЕНИЯ
DOZARAD1:
LCALL CHARGEL1 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL CHECKAC1 /CY=1 - ВСТАВЛЕН
JC DOZARAD1 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LCALL DEL20
LCALL CHECKAC1 /CY=1 - ВСТАВЛЕН
JC DOZARAD1 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL1 /ЕСЛИ ВЫНУТ - НА СТАРТ
/ТОЖЕ ДОЗАРЯД МАЛЫМ ТОКОМ, НО ЗЕЛЁНЫЙ СВЕТОДИОД МИГАЕТ
DOZARD12:
LCALL CHARGEL1 ;ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL СНЕСКАС1 ;CY=1 - ВСТАВЛЕН
JC DOZARD13 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LCALL DEL20
LCALL СНЕСКАС1 ;CY=1 - ВСТАВЛЕН
JC DOZARD13 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL1 /ЕСЛИ ВЫНУТ - НА СТАРТ
DOZARD13:
LCALL DEL05S ;ЗАДЕРЖКА 500 МС
SETB GRNLED1 ;ПОГАСИЛ ЗЕЛЁНЫЙ СВЕТОДИОД
LCALL DELO5S
SJMP DOZARD12
/ТОЖЕ ДОЗАРЯД МАЛЫМ ТОКОМ, НО ЗЕЛЁНЫЙ СВЕТОДИОД МИГАЕТ РЕЖЕ
DOZARD14:
LCALL CHARGEL1 ;ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL СНЕСКАС1 ;CY=1 - ВСТАВЛЕН
JC DOZARD15 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LCALL DEL20
LCALL СНЕСКАС1 ;CY=1 - ВСТАВЛЕН
JC DOZARD15 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL1 /ЕСЛИ ВЫНУТ - НА СТАРТ
DOZARD15:
LCALL DEL2S ;ЗАДЕРЖКА 2 С
SETB GRNLED1 /ПОГАСИЛ ЗЕЛЁНЫЙ СВЕТОДИОД
LCALL DEL2S
SJMP DOZARD14
/ПОДПРОГРАММЫ
/ПЕРЕНОС U_ACC1+O..l В R3R2, UT_ACC1+O..l В R5R4
289-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
RDUACC1:
LCALL DEL20 /ЗАДЕРЖКА, ЗА ЭТО ВРЕМЯ ЕСТЬ ИЗМЕРЕНИЕ
CLR ЕА
MOV R2,U_ACC1
MOV R3,U_ACC1+1
MOV R4,UT_ACC1
MOV R5,UT_ACC1+1
SETB EA
RET
/ВЫЧИСЛЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ И СОХРАНЕНИЕ В R5R4
UVD1:
LCALL RDUACC1
LCALL DEMNBC /R5R4 = (UT.ACC1+0..1) - (U_ACC1+O..1)
RET
/ОТКЛЮЧЕНИЕ СВЕТОДИОДОВ, КАНАЛОВ ЗАРЯДА И РАЗРЯДА АККУМУЛЯТОРА 1
OFFALL1: REDLED1 GRNLED1 UNCHI CHBIG1 CHLIT1 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД /ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД /ОТКЛЮЧИЛИ РАЗРЯД /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
SETB
SETB
CLR
CLR
CLR
RET
/УСТАНОВКА ЗАРЯДА БОЛЬШИМ ТОКОМ
CHARGEB1:
CLR REDLED1 /ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
SETB GRNLED1 /ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCHI /ОТКЛЮЧИЛИ РАЗРЯД
‘ CLR CHLIT1 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
SETB CHBIG1 /ВКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ
RET
/УСТАНОВКА ЗАРЯДА МАЛЫМ ТОКОМ
CHARGEL1:
SETB REDLED1 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
CLR GRNLED1 /ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCHI /ОТКЛЮЧИЛИ РАЗРЯД
CLR CHBIG1 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
SETB CHLIT1 /ВКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
—•290 —
2.4. Программа для микроконтроллера зарядного устройства
RET
УСТАНОВКА РАЗРЯДА
UNCHAR1: CLR REDLED1 ;ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД CLR GRNLED1 ;ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД CLR CHLIT1 ;ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ CLR CHBIG1 ;ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ SETB UNCH1 ;ВКЛЮЧИЛИ РАЗРЯД RET
ПРОВЕРКА, ВСТАВЛЕН ЛИ АККУМУЛЯТОР
СНЕСКАС1: LCALL RDUACC1 ;R3R2 - (U_ACC1+O..1) MOV DPTR,#200 ;2000 MB-ГРАНИЦА, МЕНЬШЕ - ВСТАВЛЕН, > - НЕТ 0 MOV R4,DPL MOV R5,DPH LCALL BCCMDE ;(U_ACC1+O..1) - 2000, CY=1, ЕСЛИ ВСТАВЛЕН RET
;ПРОВЕРКА НА ПЕРЕГРЕВ ТРАНЗИСТОРА КАНАЛА 1
PEREGRV1: LCALL UVD1 ;R5R4 - ТЕКУЩЕЕ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ MOV А, R4 ADD A,#DELTAT MOV R4, A MOV A,R5 ADDC A,#0 MOV R5,A ;R5R4 = (ТЕКУЩЕЕ U ДИОДА) + 80 MOV R2,VD1ST MOV R3,VD1ST+1;НЗН2=ПАДЕНИЕ НАПРЯЖЕНИЯ НА ДИОДЕ ПРИ СТАРТЕ LCALL DECMBC ;{(ТЕКУЩЕЕ U ДИОДА) + 80} - СТАРТОВОЕ, CY=1 - RET /ПЕРЕГРЕВ
;ПРОВЕРКА НА ДОСТИЖЕНИЕ МАКСИМАЛЬНОГО ЗАРЯДА НА АККУМУЛЯТОРЕ 1
PEREZAR1: LCALL RDUACC1 ;R3R2 = U_ACCl+0..1 MOV R4,U_A1_MAX MOV R5,U_A1_MAX+1; R5R4 = U_Al_MAX+0 . . 1 CLR C MOV A,R4
— 291 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
SUBB A,#DELTAU
MOV R4,A
MOV A,R5
SUBB Az#0
MOV R5,A ;R5R4 = (U_A1_MAX+O. . 1) - 20
LCALL BCCMDE ;{U_ACC1+O..1} - {(U_A1_MAX+O..1) - 20}
RET ;CY=1 - ПЕРЕЗАРЯД
/ОСНОВНОЙ ЦИКЛ КАНАЛА 2
TASK2:
CYCL2:
LCALL OFFALL2 ;ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/РАЗРЯД
MOV VD2ST,#0
MOV VD2ST+l,#0
/ПРОВЕРКА, ВСТАВЛЕН ЛИ АККУМУЛЯТОР 2
LCALL CHECKAC2 /CY=1 - ВСТАВЛЕН
JNC CYCL2
LCALL DELIS
LCALL CHECKAC2 /CY=1 - ВСТАВЛЕН
JNC CYCL2
/ОПРЕДЕЛЯЕМ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ VT8 КАНАЛА 2
/И ЗАНОСИМ РЕЗУЛЬТАТ В VD2ST
LCALL UVD2 /В R5R4 - ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ
MOV VD2ST,R4
MOV VD2ST+1,R5
/ОПРЕДЕЛЯЕМ, НУЖЕН ЛИ РАЗРЯД АККУМУЛЯТОРА 2, ЕСЛИ НЕТ - НА ЗАРЯД
MOV А,Р2
ANL А,#10000000В
JNZ NERAZR2 /Р2.7=1 - СРАЗУ НА ЗАРЯД БОЛЬШИМ ТОКОМ
/РАЗРЯД 2-ГО АККУМУЛЯТОРА
RAZR2:
LCALL UNCHAR2 /ГОРЯТ ОБА СВЕТОДИОДА, ВКЛЮЧЕНА ЦЕПЬ
/РАЗРЯДА, ОСТАЛЬНЫЕ ЦЕПИ ОТКЛЮЧЕНЫ
/ОПРЕДЕЛЯЕМ, ПОРА ЛИ ЗАВЕРШИТЬ РАЗРЯД
— 292 —
2.4. Программа для микроконтроллера зарядного устройства
LCALL RDUACC2 /В R3R2 - U-ACC2+0..1
MOV DPTR,#1000
MOV R4,DPL
MOV R5,DPH
LCALL BCCMDE /СРАВНЕНИЕ (U_ACC2+0..1) - 1000
JNC RAZR2 ;СУ=1-ЕЩЕ РАЗРЯЖАТЬ, T.K. (U_ACC2+0..1)>1000
;ОТКЛЮЧАЕМ ЦЕПЬ РАЗРЯДА
LCALL OFFALL2 ;ОТКЛ. ОБА СВЕТОДИОДА И ВСЕ ЦЕПИ ЗАРЯД/РАЗРЯД
LCALL DEL8S ;ЗАДЕРЖКА
/ДАЁМ ИНИЦИИРУЮЩИЙ МАЛЫЙ ТОК, ЗАТЕМ ДАЁМ БОЛЬШОЙ ТОК,
;ИЗМЕРЯЕМ U НА АККУМУЛЯТОРЕ 2 И ЗАНОСИМ ЕГО В U_A2_MAX+0..1
NERAZR2:
LCALL CHARGEL2 ;ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL DEL8S ;МИНУТНЫЙ ЗАРЯД МАЛЫМ ТОКОМ, БЕЗ КОНТРОЛЯ U
LCALL DEL8S
LCALL DEL8S
LCALL DEL8S
MOV CNT2T,#0
MOV CNT2T+l,#0/ЗАНУЛИЛИ СЧЁТЧИК ВРЕМЕНИ ЗАРЯДА
/ВКЛЮЧАЕМ ЗАРЯД БОЛЬШИМ ТОКОМ И ДЕРЖИМ ЕГО ПРИМЕРНО МИНУТУ
LCALL CHARGEB2 /ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
LCALL DEL8S /МИНУТНЫЙ ЗАРЯД БОЛЬШИМ ТОКОМ, БЕЗ КОНТРОЛЯ U
LCALL DEL8S
LCALL DEL8S
LCALL DEL8S
LCALL RDUACC2 /В R3R2 - U.ACC2+0..1
MOV U_A2_MAX,R2
MOV U_A2_MAX+1,R3 /НАЧАЛЬНОЕ ЗНАЧЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ
/НА АККУМУЛЯТОРЕ 1 В U_Al_MAX+0..1
/СОХРАНЯЕМ ЗАРЯД БОЛЬШИМ ТОКОМ И ПРОВЕРЯЕМ, ЕСТЬ ЛИ ПЕРЕГРЕВ ИЛИ ПЕРЕЗАРЯД
ZAR2:
LCALL CHARGEB2 /ГОРИТ КРАСНЫЙ СВЕТОДИОД, ВКЛ.ЦЕПЬ БОЛЬШОГО I
LCALL PEREGRV2 ?CY=1 - ПЕРЕГРЕВ
JC DOZARD22 /ПРИ ПЕРЕГРЕВЕ НА ДОЗАРЯД С МИГАНИЕМ
LCALL PEREZAR2 /С¥=1 - ПЕРЕЗАРЯД НАСТУПИЛ
JC DOZARAD2 /ПРИ ОКОНЧАНИИ ЗАРЯДА НА ДОЗАРЯД МАЛЫМ I
-293-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
LCALL DELIS
MOV R2,CNT2T
MOV R3,CNT2T+1 ;СЧЁТЧИК ВРЕМЕНИ В R3R2
LCALL INXB ;ИНКРЕМЕНТ СЧЁТЧИКА ВРЕМЕНИ
MOV CNT2T,R2
MOV CNT2T+1,R3
MOV DPTR,#TIME ; ЛИМИТ ВРЕМЕНИ В DPTR
MOV R4,DPL
MOV R5,DPH ;ЛИМИТ ВРЕМЕНИ В R5R4
LCALL DECMBC ;TIME - ИНКРЕМЕНТИРОВАННОЕ CNT1T+0..1
JC DOZARD24 ;ПРИ ЗАРЯДЕ ДОЛЬШЕ 2*3600 С НА ДОЗАРЯД
;С МИГАНИЕМ
;ИЗМЕРЯЕМ ТЕКУЩЕЕ U НА АККУМУЛЯТОРЕ 2, И ЕСЛИ ОНО БОЛЬШЕ U_A2_MAX+0..1,
;ЗАНОСИМ ТЕКУЩЕЕ В U_A2_MAX+0..1
LCALL RDUACC2 ;В R3R2 - U_ACC2 + O..l
MOV R4,U_A2_MAX
MOV R5,U_A2_MAX+1 ;MAX. ЗНАЧ. U НА АККУМУЛЯТОРЕ 2 В R5R4
LCALL BCCMDE ;ТЕКУЩЕЕ МИНУС МАКСИМАЛЬНОЕ
JC NOTMAX2 ;ЕСЛИ ТЕКУЩЕЕ<МАКСИМАЛЬНОГО, НА NOTMAX2
MOV U_A2_MAX'R2
MOV U_A2_MAX+1,R3 ;НОВЫЙ MAX.
NOTMAX2:
SJMP ZAR2
;ТЕПЕРЬ ДОЗАРЯД МАЛЫМ ТОКОМ С ОЖИДАНИЕМ ИЗВЛЕЧЕНИЯ И ВОЗВРАТОМ НА СТАРТ
/ПОСЛЕ ИЗВЛЕЧЕНИЯ
DOZARAD2:
LCALL CHARGEL2 LCALL СНЕСКАС2 JC DOZARAD2 LCALL DEL20 LCALL CHECKAC2 JC DOZARAD2 LJMP CYCL2 ;ТОЖЕ ДОЗАРЯД МАЛЫМ ТОКОМ, DOZARD22: LCALL CHARGEL2 LCALL CHECKAC2 JC DOZARD23 LCALL DEL20 LCALL CHECKAC2 '•ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I ;CY=1 - ВСТАВЛЕН ;ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД ;CY=1 - ВСТАВЛЕН ;ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД ;ЕСЛИ ВЫНУТ - НА СТАРТ НО ЗЕЛЁНЫЙ СВЕТОДИОД МИГАЕТ ;ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I ;CY=1 - ВСТАВЛЕН ;ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД ;CY=1 - ВСТАВЛЕН
— 294 —
2.4. Программа для микроконтроллера зарядного устройства
JC DOZARD23 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL2 /ЕСЛИ ВЫНУТ - НА СТАРТ
DOZARD23:
LCALL DELO5S /ЗАДЕРЖКА 500 МС
SETB GRNLED2 /ПОГАСИЛ ЗЕЛЁНЫЙ СВЕТОДИОД
LCALL DEL05S
SJMP DOZARD22
/ТОЖЕ ДОЗАРЯД МАЛЫМ ТОКОМ, НО ЗЕЛЁНЫЙ СВЕТОДИОД МИГАЕТ РЕЖЕ
DOZARD24:
LCALL CHARGEL2 /ГОРИТ ЗЕЛЁНЫЙ СВЕТОДИОД, ВКЛ. ЦЕПЬ МАЛОГО I
LCALL СНЕСКАС2 /CY=1 - ВСТАВЛЕН
JC DOZARD25 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LCALL DEL20
LCALL СНЕСКАС2 /CY=1 - ВСТАВЛЕН
JC DOZARD25 /ЕСЛИ ВСТАВЛЕН - ПРОДОЛЖИТЬ ДОЗАРЯД
LJMP CYCL2 /ЕСЛИ ВЫНУТ - НА СТАРТ
DOZARD25:
LCALL DEL2S /ЗАДЕРЖКА 2 С
SETB GRNLED2 /ПОГАСИЛ ЗЕЛЁНЫЙ СВЕТОДИОД
LCALL DEL2S
SJMP DOZARD24
/ПОДПРОГРАММЫ
/ПЕРЕНОС U_ACC2+O..l В R3R2, UT_ACC2+O..l В R5R4
RDUACC2:
LCALL DEL20 /ЗАДЕРЖКА, ЗА ЭТО ВРЕМЯ ЕСТЬ ИЗМЕРЕНИЕ
CLR ЕА
MOV R2,U_ACC2
MOV R3,U_ACC2+1
MOV R4,UT_ACC2
MOV R5,UT_ACC2+1
SETB EA
RET
/ВЫЧИСЛЕНИЕ ПАДЕНИЯ НАПРЯЖЕНИЯ НА ЭМИТТЕРНОМ ПЕРЕХОДЕ И СОХРАНЕНИЕ В R5R4
UVD2:
LCALL RDUACC2
LCALL DEMNBC /R5R4 = (UT_ACC2+0..1) - (U_ACC2+0..1)
RET
/ОТКЛЮЧЕНИЕ СВЕТОДИОДОВ, КАНАЛОВ ЗАРЯДА И РАЗРЯДА АККУМУЛЯТОРА 2
— 295 —
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
OFFALL2: SETB SETB CLR CLR CLR RET REDLED2 GRNLED2 UNCH2 CHBIG2 CHLIT2 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД /ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД /ОТКЛЮЧИЛИ РАЗРЯД /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
/УСТАНОВКА ЗАРЯДА БОЛЬШИМ током
CHARGEB2:
CLR REDLED2 /ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
SETB GRNLED2 /ОТКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR UNCH2 /ОТКЛЮЧИЛИ РАЗРЯД
CLR CHLIT2 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
SETB RET CHBIG2 /ВКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током
«•УСТАНОВКА ЗАРЯДА МАЛЫМ ТОКОМ
CHARGEL2: SETB CLR CLR CLR SETB RET REDLED2 GRNLED2 UNCH2 CHBIG2 CHLIT2 /ОТКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД /ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД /ОТКЛЮЧИЛИ РАЗРЯД /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ током /ВКЛЮЧИЛИ ЗАРЯД МАЛЫМ током
/УСТАНОВКА РАЗРЯДА UNCHAR2: CLR REDLED2 /ВКЛЮЧИЛИ КРАСНЫЙ СВЕТОДИОД
CLR GRNLED2 /ВКЛЮЧИЛИ ЗЕЛЁНЫЙ СВЕТОДИОД
CLR CHLIT2 /ОТКЛЮЧИЛИ ЗАРЯД МАЛЫМ ТОКОМ
CLR CHBIG2 /ОТКЛЮЧИЛИ ЗАРЯД БОЛЬШИМ ТОКОМ
SETB UNCH2 /ВКЛЮЧИЛИ РАЗРЯД
RET
;ПРОВЕРКАt , ВСТАВЛЕН ЛИ АККУМУЛЯТОР
СНЕСКАС2: LCALL RDUACC2 /R3R2 - (U_ACC2+0..1) MOV DPTR,#2000/2000 MB-ГРАНИЦА, МЕНЬШЕ - ВСТАВЛЕН, > - НЕТ MOV R4,DPL MOV R5,DPH
-296-
2.5. Краткие выводы
LCALL BCCMDE /(U.ACC2+0..1) - 2000, CY = 1, ЕСЛИ ВСТАВЛЕН
RET
;ПРОВЕРКА НА ПЕРЕГРЕВ ТРАНЗИСТОРА КАНАЛА 2
PEREGRV2:
LCALL UVD2 ;R5R4-ТЕКУЩЕЕ ПАДЕНИЕ НАПРЯЖЕНИЯ НА ПЕРЕХОДЕ
MOV A,R4
ADD A,#DELTAT
MOV R4,A
MOV A,R5
ADDC A,#0
MOV R5,A ;R5R4 = (ТЕКУЩЕЕ U ДИОДА) + 80
MOV R2,VD2ST
MOV R3, VD2ST+1/РЗР2=ПАДЕНИЕ НАПРЯЖЕНИЯ HA ДИОДЕ ПРИ СТАРТЕ
LCALL DECMBC /{(ТЕКУЩЕЕ U ДИОДА) + 80} - СТАРТОВОЕ, CY=1 -
RET /ПЕРЕГРЕВ
;ПРОВЕРКА НА ДОСТИЖЕНИЕ МАКСИМАЛЬНОГО ЗАРЯДА НА АККУМУЛЯТОРЕ 2
PEREZAR2:
LCALL RDUACC2 /R3R2 = U_ACC2+0..1
MOV R4,U_A2_MAX
MOV R5,U_A2_MAX+1 /R5R4 = U_A2_MAX+0..1
CLR C
MOV A,R4
SUBB A,#DELTAU
MOV R4,A
MOV A,R5
SUBB A,#0
MOV R5,A ;R5R4 = (U_A2_MAX+0..1) - 20
LCALL BCCMDE ; ;{U_ACC2+0..1} - {(U_A2_MAX+0. .1) - 20}
RET ;CY=1 - ПЕРЕЗАРЯД
.END
2.5. Краткие выводы
Материал, приведённый в настоящей главе, многофункционален.
С одной стороны, я постарался показать, как надо решать довольно не-
простую задачу заряда аккумуляторов большим током. Страницы многих из-
даний переполнены схемами зарядных устройств, но зачастую их авторы даже
не удосужились посмотреть, как производители аккумуляторов рекомендуют
работать со своими изделиями. В итоге эти авторы оснащают свое детище
Массой ненужных сервисных функций, вплоть до голосового предупрежде-
-297-
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
ния о том, что аккумулятор заряжен, в то время как главное — методика заря-
да — реализуется почти так же, как и в устройствах двадцатилетней давности.
Многие производители — Maxim, Linear Technology и т. д. — выпуска-
ют специализированные микросхемы для создания зарядных устройств.
Но увы, задача обеспечения «правильности» заряда столь технически
сложна, что предлагаемые ими микросхемы решают её лишь частично. Да
и поскольку все функции у этих микросхем жёстко предопределены, про-
стора для творчества и эксперимента (в рамках дозволенного производите-
лями!) практически не остаётся. Поэтому, несмотря на многочисленные
попытки грандов электроники завоевать эту нишу, она по-прежнему не за-
нята. Отчасти и потому, что разработчику микросхем, как и каждому из
нас, иногда интереснее сотворить что-то новое самому, чем читать реко-
мендации каких-то там «аккумуляторщиков».
С другой стороны, на материале настоящей главы я постарался проде-
монстрировать разработчикам, как, не имея достаточного самостоятель-
ного опыта и практически без средств аппаратной отладки, можно создать
и отладить довольно сложное аппаратно-программное устройство. Как
уже говорилось выше, при написании программ в режиме с минимальны-
ми отладочными возможностями нужно стремиться в каждую из уже рабо-
тающих промежуточных программ вносить как можно меньшее количест-
во изменений. После каждого такого изменения следует «прошивать» про-
грамму в микроконтроллер, вставлять его в устройство и тестировать
программу, проверяя, корректно ли она работает после доработки. Безу-
словно, при этом увеличивается количество промежуточных программ, но
общее количество ошибок, которые вы неизбежно делаете в процессе раз-
работки программы, в итоге оказывается меньшим, чем в случае, когда вы
при каждой доработке вносите большое количество изменений в отлажен-
ные фрагменты. Да и искать ошибки в программах, минимально отличаю-
щихся от тех, которые работали безошибочно, легче и проще. Таким обра-
зом, несмотря на большее количество промежуточных программ, общая
задача решается быстрее, чем в том случае, когда вы пытаетесь отладить
программу за один или два приёма.
В настоящем разделе приведено пять промежуточных программ. Ре-
ально же у меня их было больше десятка. Например, прежде чем появилась
программа с измерениями в момент переключения между задачами (см.
подразд. 2.4.2), была написана ещё одна, которая позволила проверить
корректность работы аппаратных и программных средств индикатора, а
также корректность работы с регистрами общего назначения внутри под-
программы обработки таймерного прерывания. «Уши» от этой программы
«торчат» в программе с измерениями в момент переключения между зада-
чами в виде неиспользуемых переменных CNT1 и CNT2. Несколько проме-
жуточных программ «уместилось» между двумя последними — я экспери-
— 298 —
2.5. Краткие выводы
монтировал с константами DELTAT, DELTAU, менял длительность иниции-
рующего заряда, напряжение, определяющее момент завершения разряда
аккумулятора, и т. д. В общем я создавал программу именно таким мето-
дом, о котором я и веду рассказ в этой главе.
И третье, ради чего это устройство появилось на страницах настоящей
книги, — демонстрация режима переключения задач в столь слабом (по
сравнению с х86) вычислительном устройстве, как микроконтроллер. Ко-
нечно, подобные вещи реализованы в операционных системах для микро-
контроллеров, но они находятся «внутри» этих операционных систем, а раз-
работчики, лишь использующие эти ОС, сами уже ничего подобного, как
правило, не создают. Наверное, это и не удивительно — сейчас дешевле сде-
лать систему на четырёх двухдолларовых контроллерах, чем два-три месяца
отлаживать сложную программу для одного, переключающегося на четыре
разные задачи. Хотя если речь идёт о разработке устройства, предполагаемо-
го к выпуску миллионными тиражами, то приоритеты окажутся иными.
Пожалуй, на этом можно было бы поставить точку. Я подробно описал
алгоритм, привёл текст программы, которую можно изменять для тех или
иных экспериментов, описал аппаратные средства, последовательность их
отладки. Но предела совершенствованию нет, и в нашем распоряжении
появляются всё новые и новые микроконтроллеры. Так, например, не ус-
пели мы завершить разработку описанного выше зарядного устройства,
как напрашивается его продолжение — на более удобном для этого
микроконвертере. ADuC812, изделие производителя, имя которого ещё не-
давно даже не ассоциировалось с микроконтроллерами, имеет встроенный
12-битный АЦП (функционально аналогичный использовавшемуся нами
ASD7816) и мультиплексор 8/1, что позволяет создать зарядное устройство
на 4 аккумулятора, цифровая часть которого будет заметно проще цифро-
вой части его прототипа, изображенного на Рис. 2.5. Схема зарядного уст-
ройства на ADuC812 приведена на Рис. 2.19.
Что касается программы, то за основу можно взять программу из
подразд. 2.4.4. Естественно, в неё нужно внести изменения, в первую оче-
редь связанные с работой встроенных в микроконвертер АЦП и входного
мультиплексора. Далее, поскольку речь идёт о заряде уже не двух, а четырёх
аккумуляторов, нужны четыре независимых подпрограммы для обслужи-
вания каждого из них, четыре области стека для переключения задач и ме-
ханизм переключения, который бы переключал не с первой задачи на вто-
рую, а затем обратно, а с первой на вторую, со второй на третью, с третьей
на четвёртую и только затем с четвёртой на первую. Стек нужно разместить
в старших 128 байтах оперативной памяти. А содержимое регистров, ис-
пользуемых при измерении в подпрограмме прерывания, теперь придётся
хранить не в четвёртом банке регистров общего назначения, а в стеке, пос-
кольку этот банк будет занят обслуживанием четвёртого аккумулятора.
-299-
300
Cl
10.0
ЮмкГ
20
34
48
21
35
C5
R2 0.1
C6
C7
□VDO
DVDd
DVdo
DGND
DGND
DGND
AVdd
AGND
1 IU — —
и. 1 7
2 11
3 12 10 1
4 13 11 2
5 14 12 3
6 15 13 4
7 16 14 11
1 20 15 12
2 21 16 13
3 22 17 14
4 23
5 24 20 28
6 25 21 29
7 26 22 30
J 0 23 31
2 1 24 36
3 2 25 37
4 3 26 38
5 4 27 39
6 5
7 6
1 17
2 27
3 7
4 32
5 33
6 34
7 35
CREF
AINO
AIN1
AIN2
AIN3
AIN4
AIN5
AIN6
AIN7
P2.0
P2.2
P2.3
CPU
ADuC
824
Рис. 2.19. ЗУ HaADuC812.
Глава 2.1001-Е ЗАРЯДНОЕ УСТРОЙСТВО
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО
ТОКА НА ADUC824
В первом номере журнала «Схемотехника» за 2002 г. я опубликовал ста-
тью, в которой описывался вольтметр постоянного тока на микросхеме
AD7714. Поработав с этой микросхемой, я обнаружил, что её программи-
рование весьма нетривиально, и решил облегчить задачу тем, кто, как и я,
захочет использовать её в своих разработках. Тем более что некоторые осо-
бенности запуска и монтажа этой микросхемы плохо документированы, и
как знать, сколько времени я потратил бы на их исследование, если бы не
подсказки друзей-разработчиков, уже помыкавшихся с запуском AD7714.
Впоследствии этот материал, слегка переработанный и дополненный,
вошел в последнюю главу первого тома настоящей книги.
Когда я готовил упомянутую статью, я даже и не мог предположить, сколь
востребованной она окажется. Поскольку на том сайте, где, как следовало из
статьи в «Схемотехнике», можно было найти программное обеспечение для
микроконтроллерного вольтметра, по ряду причин оно отсутствовало, чита-
тели обращались за ним ко мне напрямую. Так вот, с момента выхода статьи и
до сегодняшнего дня, когда я пишу эти строки, за программой ко мне обрати-
лось почти триста человек, и поток обращений ещё не иссяк. Я объясняю это
тем, что, во-первых, созданный на основе AD7714 вольтметр обладает превос-
ходными характеристиками, а во-вторых, работа с этой микросхемой отнима-
ет много времени даже у подготовленных специалистов.
Появление в продаже микроконвертера ADuC824 (и последовавших за
ним ADuC834, ADuC836, ADuC845...ADuC848), в состав которого входит
сигма-дельта АЦП, аналогичный AD7714, позволяет надеяться, что отны-
не создавать устройства, подобные вышеупомянутому вольтметру, станет
намного проще. В связи с этим мне представлялось интересным исследо-
вать характеристики вольтметра, выполненного на микроконвертере, и
сравнить их с теми, что были получены с использованием AD7714.
3.1. Микроконвертеры от Analog Devices
Как уже отмечалось в первом томе, микроконвертеры — это не просто
микроконтроллеры со встроенным АЦП. При разработке этих изделий в
— 301 —
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
первую очередь ставилась задача не ухудшить характеристики АЦП при
встраивании в него микроконтроллера. Именно так: не АЦП встроить в
микроконтроллер, а микроконтроллер — в хороший АЦП, не добиваться
прекрасной производительности встроенного микроконтроллера, а сохра-
нить (или не ухудшить) отношение «сигнал/шум» этого АЦП.
Сначала эта идея, высказанная представителями Analog Devices, была
воспринята весьма осторожно, по крайней мере в нашей стране. Я хорошо
помню семинар, на котором представители AD провели презентацию
своего первого микроконвертера (это был ADuC812 с 8-канальным 12-
битным АЦП). Наши разработчики никак не могли понять, почему при
создании микроконвертера Analog Devices использовала морально уста-
ревшее ядро х51, которое в тот момент по производительности превосхо-
дило разве что только 4-битные микроконтроллеры. Представители Analog
Devices, в свою очередь, никак не могли взять в толк, чем же нас не удов-
летворяет ядро х51 — оно хоть и не шустрое, но и помех немного, а ведь
именно это — ключевой момент в вопросе выбора. Помнится, что выгля-
дели они под перекрёстным допросом наших любителей быстрых процес-
сорных ядер, как студенты на экзамене у строгого преподавателя.
Но уже спустя два года ситуация коренным образом изменилась. На
аналогичном семинаре представитель Analog Devices не без гордости сооб-
щил, что объёмы заказов на микроконвертеры минимум на порядок пре-
высили самые смелые предположения, и фирма с трудом успевает удовлет-
ворять заказы потребителей. Столь явное принятие рынком нового изде-
лия подсказало разработчикам, что они правильно спрогнозировали
потребность рынка, и начались проработки микроконвертеров следующе-
го семейства. Затем ещё и ещё, и в итоге сегодня семейство микроконвер-
теров от AD включает в себя 14 микросхем.
Надо заметить, что в эту гонку включились и другие крупнейшие про-
изводители полупроводниковой электроники. Свой аналог микроконвер-
тера выпустила сначала фирма Maxim, объединившая свои усилия с погло-
щенной ею Dallas Semiconductors. Практически одновременно с ней пред-
ставила свой микроконвертер и Texas Instruments, «съевшая» ещё одного
гранда аналоговой микроэлектроники — Burr Brown. Последний тандем
выпустил, как и AD, целую линейку подобных изделий, но это тема для
другой книги.
Перечень микроконвертеров от Analog Devices приведён в Табл. 3.1.
Как следует из таблицы, эти микроконвертеры условно разделяются на
две большие группы — изделия на основе 12-битных быстрых АЦП после-
довательного приближения с 8-входовыми мультиплексорами и изделия
на основе относительно медленных 16...24-битных сигма-дельта АЦП. Мы
рассмотрим типичного представителя второй группы — микроконвертер
ADuC824 с основным 24-битным и дополнительным 16-битным АЦП.
- 302-
Таблица 3.1. Микроконвертеры от Analog Devices
303
с f5 Ядро [MIPS] (пиковое значение) ПЗУ [Б] |Флэш [Б] 1 ОЗУ [Б] Питание [В] Порты вв./выв. АЦП ЦАП Точность термо- датчика [°C] ШИМ НОИ Последова- тельные порты Тактирование Таймеры Температурный диапазон [°C]
Микроконвертеры на основе 12-битных АЦП последовательного приближения с ядром 8052
ADuC812 8052 (1.3) 8К 640 256 2.7...5.5 32 12 бит, 8 кан., 200 KSPS 12 бит, 2 кан. ±3 Нет Внут./ внеш. UART, SPI, 12С Внешнее 3x16-бит -40...+ 125
ADuC814 8052 (1-3) 8К 640 256 2.7...5.5 16 12 бит, 8 кан., 247 KSPS 12 бит, 2 кан. ±1.5 Нет Внут./ внеш. UART, SPI, 12С Внут. cPLL 3x16-бит IxTIC -40...+ 125
ADuC831 8052 (1.3) 62К 4К 2К+256 2.7...5.5 32 12 бит, 8 кан., 200 KSPS 12 бит, 2 кан. ±1.5 2x16 бит Внут./ внеш. UART, SP1,12С Внешнее 3x16-бит IxTIC IxBaud Rate -40...+ 125
ADuC832 8052 (1.3) 62К 4К 2К+256 2.7...5.5 32 12 бит, 8 кан., 200 KSPS 12 бит, 2 кан. ±1.5 2x16 бит Внут./ внеш. UART, SP1,12С Внут. cPLL Зх16-бит IxTIC IxBaud Rate -40...+125
ADUC841 8052 (20) 62К, 8К 4К 2К+256 2.7...5.5 32 12 бит, 8 кан., 400 KSPS 12 бит, 2 кан. ±1.5 2x16 бит Внут. 20-Ю-6 /внеш. UART, SPI, I2C Внешнее Зх 16-бит IxTIC IxBaud Rate -40...+85
ADuC842 8052 (16) 62К, 32К, 8К 4К 2К+256 2.7...5.5 32 12 бит, 8 кан., 400 KSPS 12 бит, 2 кан. ±1.5 2x16 бит Внут. 20-10-6 /внеш. UART, SPI, I2C Внут. cPLL Зх 16-бит IxTIC IxBaud Rate -40...+85
ADuC843 8052 (16) 62К, 32К, 8К 4К 2К+256 2.7...5.5 32 12 бит, 8 кан., 400 KSPS Нет ±1.5 2x16 бит Внут. 20-Ю-6 /внеш. UART, SPI, I2C Внут. cPLL Зх16-бит IxTIC IxBaud Rate -40...+85
3.1. Микроконвертеры от Analog Devices
(продолжение)
304
Ядро [MIPS] (пиковое значение) ПЗУ [Б] 1 Флэш [Б] I ОЗУ [Б Питание [В] Порты вв./выв. АЦП ЦАП Точность термо- датчика [°C] ШИМ ИОН Последова- тельные порты Тактирование Таймеры Температурный диапазон [°C]
Микроконвертеры на основе сигма-дельта АЦП (24- и 16-битных) с ядром 8052
ADuC816 8052 (1.0) 8К 640 256 2.7...5.25 32 16 бит, 2кан., 105SPS 12 бит, 1 кан. ±1.5 Нет Внут./ внеш. UART, SPI, 12С Внут. cPLL Зх 16-бит IxTIC -40...+85
ADuC824 8052 (1-0) 8К 640 256 2.7...5.25 32 24 бита и 16 бит, I05SPS 12 бит, 1 кан. ±1.5 Нет Внут./ внеш. UART, SPI, 12С Внут. cPLL Зх16-бит IxTIC -40...+85
ADuC834 8052 (1-0) 62К 4К 2К+256 2.7...5.25 32 24 бита и 16 бит, 105 SPS 12 бит, 1 кан. ±1.5 2x16 бит Внут./ внеш. UART, SPI, I2C Внут. cPLL 3x16-бит IxTIC lx Baud Rate -40...+ I25
ADuC836 8052 (1-0) 62К 4К 2К+256 2.7...5.25 32 16 бит, 2 кан., 105 SPS 12 бит, 1 кан. ±1.5 2x16 бит Внут./ внеш. UART, SPI, I2C Внут. cPLL 3x16-бит IxTIC lx Baud Rate -40...+ 125
Микроконвертеры на основе многоканальных сигма-дельта АЦП (24- и 16-битных) с ядром 8052
ADuC845 8052 (12) 62К, 32К, 8К 4К 2К+256 2.7...5.5 32 24 бита, 2 кан., 1.3KSPS 12 бит, 1 кан. ±1.5 2x16 бит Внут./ внеш. UART, SPI, I2C Внут. cPLL Зх 16-бит IxTIC I xBaud Rate -40...+ 125
ADuC847 8052 (12) 62К. 32К, 8К 4К 2К.+256 2.7...5.5 32 24 бита, 1.3KSPS Нет Нет 2x16 бит Внут./ внеш. UART, SPI, I2C Внут. cPLL Зх16-бит IxTIC I x Baud Rate -40...+125
ADuC848 8052 (12) 62К, 32К, 8К 4К 2К+256 2.7...5.5 32 16 бит, 1.3 KSPS Нет Нет 2x16 бит Внут./ внеш. UART, SPI, I2C Внут. cPLL 3x16-бит IxTIC lx Baud Rate -40...+125
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
3.2. Микроконвертер ADUC824
3.2. Микроконвертер ADUC824
Ядро этого микроконвертера — хорошо знакомое многим разработчи-
кам х52, дополненное целым рядом весьма полезных свойств. Перечислю
самые интересные из них.
Во-первых, у этого микроконвертера имеется 640 байт оперативной
флэш-памяти данных, содержимое которой остается неизменным даже при
выключении питания. Во-вторых, микроконвертер использует очень де-
шёвый (в сравнении с привычными мегагерцовыми) часовой кварц
с программно управляемым умножителем частоты, обеспечивающим ра-
боту ядра на тактовых частотах от чуть менее 100 кГц до чуть более
12 МГц. В-третьих, в микросхеме имеются ставшие уже стандартными
SPI-интерфейс, 12С-интерфейс, сторожевой таймер WDT и таймер реаль-
ного времени TIC. И, в-четвёртых, микроконвертер содержит последова-
тельный загрузчик, что в комплекте с разработанной самой Analog Devices
программой загрузки позволяет программировать микроконвертер от ком-
пьютера напрямую, без какого-либо дополнительного программатора. Пос-
леднее выгодно отличает семейство ADuC от позволяющих аналогичную
загрузку изделий Philips, Atmel, SiLabs и ряда других — чтобы их запрог-
раммировать, вам придётся или потратить силы на создание программато-
ра (если алгоритм последовательного программирования открыт для ко-
нечного пользователя), или потратить деньги на приобретение программа-
тора сторонних фирм.
Analog Devices предлагает также и свои средства разработки, отладки и
трансляции программ. Но я по привычке пользуюсь описанным в первом
томе ассемблером TASM. Не потому, что он лучше — скорее наоборот, он не
имеет ни редактора, ни отладочной среды, ни встроенного загрузчика (да и
много чего ещё!). Но за десять с лишним лет я не обнаружил в нём ни еди-
ной ошибки при трансляции своих программ, а это дорогого стоит.
3.3. Принципиальная схема и работа устройства
Как я уже сказал, из всего многообразия имеющихся в ADuC824 ресур-
сов в данный момент нас интересует только его основной 24-битный АЦП.
Точнее, принципиальные схемы ADuC824 с элементами обвязки, а также
схема прецизионного формирователя входного (измеряемого) сигнала.
Естественно, нам нужна программа, обеспечивающая опрос АЦП, обра-
ботку результатов измерений и отображение их на дисплее. Также нас ин-
тересуют метрологические характеристики этого АЦП (для этого и нужен
прецизионный формирователь входного сигнала) и зависимость этих ха-
рактеристик от режима работы микроконвертера (если такая зависимость
проявится).
-305-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Принципиальная схема ADuC824 с элементами обвязки приведена на
Рис. 3.1.
Оптимальным вариантом прецизионного формирователя входного сиг-
нала является резистивный делитель из резисторов с минимальным значе-
нием ТКС (температурного коэффициента электрического сопротивления)
и минимальными шумами, подключенный к выходу используемого микро-
конвертером внешнего источника опорного напряжения. Наиболее инте-
ресно посмотреть характеристики АЦП при измерении больших сигналов
(от 1.5 до 2.5 В), чтобы исключить влияние шумов встроенного усилителя.
Для измерения малых сигналов можно использовать как встроенный,
так и внешний усилитель. Первый вариант проще в схемотехническом от-
ношении (и дешевле), второй обеспечивает (при использовании соответс-
твующих усилителей) лучшие шумовые и дрейфовые характеристики.
Источником опорного напряжения является превосходная микро-
схема AD780BR от фирмы Analog Devices. Она формирует напряжение
+(2.500 ±0.001) В, а типовое значение ТКН (температурного
коэффициента напряжения) этой величины составляет всего 3 ррт/°С!
На входы AIN3, AIN4 микроконвертера сигнал подается с резисторного
делителя R3R4, подключенного к выходу источника опорного напряже-
ния. В качестве R3 и R4 используются высокостабильные прецизионные
резисторы С2-29-0.1% с номиналами 3.92 кОм и 18 кОм, и ТКС, равным
25 ррт/°С. Шумовые и дрейфовые характеристики этих элементов чрез-
вычайно высоки. И кроме того, благодаря такому схемному решению (ког-
да входной сигнал «завязан» с источником опорного напряжения) откло-
нения от номинального значения, которые могут даже возникнуть в источ-
нике опорного напряжения, всё равно никак не скажутся на результате
измерения, так как величина измеряемого сигнала изменится пропорцио-
нально изменению опорного напряжения.
Питание +5 В на входы DVdd микроконвертера подается со стабилиза-
тора DA1 7805, используемого в стандартной схеме включения. Питание
аналоговой части осуществляется через фильтр L1C10R2R1. Для осущест-
вления корректного сброса использован супервизор питания DD4 DS1833
от Dallas Semiconductors.
Для отображения информации используется индикатор DD3 НТ1610,
хорошо известный читателям по первому тому. Питание +1.5 В для него
формируется источником DA3 на микросхеме LM317L.
Для загрузки программы в микроконвертер служит кнопка S1. Если
она нажата до подачи питания на микроконвертер, последний при вклю-
чении переходит в режим загрузки пользовательской программы по СОМ-
порту. Для формирования уровней RS-232 используется микросхема
ADM242 в стандартной схеме включения.
-306-
С1 СЗ
DA1
+IN GND # 7805 OUT
DA2
2
IN
4
— GND
REF
A0780
С2 С4
307
6
OUT
Tnp ---
R4
C1,C2,C7,C8,C18 - 10.0 мкФ x 16 В
C3...C6, C9...C7
R1,R2
R3
— 1.0 мкФ
-2.2 0м
R4
R5...R9
-3.92 кОм ± 0.1%, C2-29
- 18 кОм ± 0.1%, C2-29
— ЮкОм
R11
- 240 Ом
R10
L1
-СПЗ-19А, 100 Ом
— 10 мкГн
DD1
21
35
47
5
6
8
7
12
4
3
2
9
10
43
44
45
46
49
50
51
52
34
48
C9 C11 C12 20
DVdd DVdd DVdd DGND DGND DGND ANDD AGND REFIN+ REFIN- AIN4 AIN3 AIN5 P1.2 P1.1 P1.0 AIN1 AIN2 PO.O P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 CPU ADuC 824 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 ALE EA( PSENc RES I SS( MISO SCLK SDAT XTAL1 XTAL2
28
29
30
31
36
37
38
39
16
17
18
19
22
23
24
25
42
I41
15
13
14
26
40
R5
18r=i
—QSHDN
12
C15
C13
< >
АРМ
242
СИ-
CI-
С2-
С2+
2 С16
4
5 С17
6
T1I
T2I
Т1О
15
Х1
R1O
T1O —
14
TxD
|- GND
R1I
RxD
13
10
R2O
R6 R7
CLK
Vdd
R2I —
DD3
hk BB0
DI
HT1610
DD4
RES CPURES DS 1833 Vcc GND
27
32
32768 Гц R1°
Рис. 3.1. Принципиальная схема ADuC824 с элементами обвязки.
UN
ADJ
#
LM317
DA3
3
OUT
R11
3.3. Принципиальная схема и работа устройства
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Работать устройство должно следующим образом. Напряжение с дели-
теля R3R4, равное примерно 1.8 В, подается на дифференциальные входы
AIN3, AIN4 микроконвертера. Микроконвертер измеряет его, преобразует
в двоично-десятичный формат, масштабирует и отображает на индикаторе.
Мы же фиксируем результаты измерений, после чего оцениваем разброс и
повторяемость этих результатов.
АЦП микроконвертера может работать в режиме одиночного измере-
ния и в непрерывном режиме. Мы рассмотрим вариант использования
одиночного измерения, причём как в режиме единичного измерения, так
и в режиме измерения с накоплением и усреднением. Перед каждым оди-
ночным измерением и перед каждой серией измерений мы будем осущест-
влять подстройку нуля АЦП и калибровку шкалы.
Также мы попробуем оценить результаты работы АЦП при различных
интервалах времени измерения и, кроме того, при различной скорости ра-
боты ядра процессора.
3.4. Программирование микроконвертера
Теперь рассмотрим вопросы, связанные с программированием микро-
конвертера. Для начала отмечу, что Analog Devices снабдила выпускаемые
изделия большим количеством различной полезной документации, вклю-
чая ассемблерные примеры. Ниже приведён текст программы, демонстри-
рующей программирование основного АЦП.
Пример программы для основного АЦПАОиС824 от Analog Devices
1 2 3 ; Author : ADI - Apps
4
5 ; Date : Sept. 1999
6
7 ; File : adcconv.asm
8
9 ; Hardware : ADUC824
10
11 ; Description : example routine to continuosuly trigger
12 9 a single conversion on the ADC main channel
13 / The Conversion result is written to ext. memory
14 15 16 17 18 19 7 9 9 9 9 P3.4 is toggled 5 times at 100ms delay The ADC result is written to external memory P3.4 is toggled 5 times at 500ms and the sequence repeats itself.
t
20 :
21 $MOD824 ; Use 8052 predefined Symbols
— 308 —
3.4. Программирование микроконвертера
22
0000 0000 0000 020060 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 FLAG CSEG ORG / EQU ООООН ООН JMP ; Define Bit ; Defines the following as a ; segment of code ; Load Code at '0’ START ; Jump to START
0033 0033 0035 0037 0039 003С 003Е 0041 0043 0044 0045 0047 0048 0049 004В 004С 004D 004F 0051 0053 0056 0058 005А 7401 7В0А В2В4 120079 DBF9 900000 E5D9 F0 АЗ E5DA F0 АЗ E5DB F0 АЗ 7405 7В0А В2В4 120079 DBF9 D200 32 г ORG 0033Н TIC1: TIC2: ! / MOV MOV CPL CALL DJNZ MOV MOV MOVX INC MOV MOVX INC MOV MOVX INC MOV MOV CPL CALL DJNZ SETB RETI ; Read ADC Result H/M/L to ; external Memory ; 10 flashes at 100ms A,#01H ; 100msec delay R3,#0Ah ; loop=5 P3.4 ; Toggle LED DELAY ; Delay lOOmSec R3,TIC1 ; Dec loop DPTR, #00H ; DPTR=00 A,ADC0L ; read ADC low byte @DPTR,A ; write low byte to ; e^t memory DPTR ; DPTR=01 A,ADC0M ; read ADC Middle byte @DPTR,A ; write Middle byte to ; ext mem. DPTR ; DPTR=02 A,ADC0H ; read ADC High byte @DPTR,A ; write low High byte ; to ext mem DPTR ; 5 flashes at 500ms A,#05H ; 500msec delay R3,#0Ah ; loop=10 P3.4 ; Toggle LED Delay ; Delay lOOmSec R3,TIC2 ; Dec loop Flag ; Set Flag ; Return from Interrupt
0060 0060 / ORG 0060Н START: ; Configure Interrupt System
-309-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0060 D288 70 SETB ITO ; CONFIG EXT. INT. Falling Edge
0062 D2AF 71 SETB EA ; Enable Global Interrupts
72
73 ; Configure ADC
0064 75D120 74 MOV ADCMODE,#2OH ; ENABLE MAIN ADC; Mode- Power down
0067 75D240 75 MOV ADC0CON,#40H ; 24 BITS
76 ; USE EXTERNAL REFERENCE
77 ; AIN1-AIN2
78 ; BIPOLAR MODE
79 ; RANGE = +/-20mV
006А D2AE 80 SETB EADC ; ENABLE ADC INTERRUPT
81
82 ; Looped single conversions
006С С200 83 CONV: CLR FLAG ; Initial condition for FLAG ; variable
006Е 75D122 84 MOV ADCMODE,#22H ; INITIATE A MAIN ADC SINGLE ; CONVERSION
0071 120079 85 CALL DELAY ; Jump to subroutine DELAY
0074 3000FD 86 JNB FLAG,$ ; Stay here until FLAG=1 ;(wait for ADC Int.)
0077 80F3 87 88 89 JMP CONV ; Next ADC Conversion
/
90 :
91
0079 92 DELAY: ; Delays by A*100ms (def. Core ; Clk =1.57MHz)
0079 F8 93 MOV R0, A ; Acc holds delay variable
007А 79FE 94 DLY0: MOV Rl,#0FEh ; Set up delay loopO
007С 7А19 95 DLY1: MOV R2,#019h ; Set up delay loopl
007Е DAFE 96 DJNZ R2,$ ; Dec R2 & Jump here until R2 is 0
0080 D9FA 97 DJNZ R1,DLY1 ; Dec R1 & Jump DLY1 until R1 is 0
0082 D8F6 98 DJNZ R0,DLY0 ; Dec R0 & Jump DLY0 until R0 is 0
0084 22 99 RET ; Return from subroutine
100
101 END
102
103
104
VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
При анализе этой программы у меня возникло подозрение, что данный
пример разработчиками на реальной аппаратуре не проверялся. Поводом
для этого послужила малозаметная ошибка в тексте программы — при вы-
зове подпрограммы DELAY в строке 85 значение аккумулятора, в котором
должно находиться число, определяющее длительность задержки, не опре-
делено. В итоге задержка может быть от 0 до 255 мс и меняться от запуска к
запуску. Очевидно, разработчики написали вполне работоспособную про-
грамму, но просмотрели ошибку в ней, а тестирование, которое эту ошиб-
ку выявило бы, проведено не было.
— 310 —
3.4. Программирование микроконвертера
Можно, конечно, предположить, что эта ошибка возникла на этапе
подготовки материалов к публикации. На мой взгляд, это маловероятно,
так как подобные материалы собираются стандартными Windows-проце-
дурами копирования/вставки, а при этом потерять строку из середины до-
кумента практически невозможно.
Но тем не менее даже программа с ошибкой полезна, когда впервые
пишешь свою программу аналогичного назначения. Во всяком случае, я
написание своей собственной программы начал со знакомства с вышепри-
ведённым примером.
3.4.1. Регистры, обеспечивающие функционирование основного
АЦП
Режимы работы основного АЦП микроконвертера определяются со-
держимым следующих регистров:
• ADCSTAT — статусный регистр АЦП, содержит биты состояния ос-
новного и дополнительного АЦП;
• ADCMODE — регистр режима, управляет режимами работы обоих
АЦП;
• ADCOCON — регистр управления основным АЦП;
• SF — регистр «Sino-фильтра, задаёт быстродействие и частоты по-
давления;
• ADC0L/M/H — три регистра, содержащих 24-битный результат из-
мерения.
Помимо них в микроконвертере имеется ещё ряд регистров, которые со-
держат калибровочные коэффициенты и управляют источниками тока, но
мы их не будем использовать, поэтому я и не упомянул о них при перечис-
лении регистров. Зато нас будет интересовать структура регистра управле-
ния ФАПЧ PLLCON — он задает тактовую частоту ядра микроконвертера.
Рассмотрим упомянутые регистры более подробно.
ADCSTAT — статусный регистр АЦП
Регистр ADCSTAT отражает состояние обоих каналов АЦП, включая
готовность данных, калибровку и различные относящиеся к АЦП ошибки
и предупреждения, в том числе ошибку отсутствия ИОН и флаг перепол-
нения.
• Адрес SFR..................................0D8H
• Значение по включению питания...............ООН
• Адресация отдельных битов...............имеется
7 6 5 4 3 2 10
RDY0 RDY1 | CAL NOXREF | ERR0 ERR1 — —
— 311 —
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Таблица 3.2. Назначение битов в ADCSTAT
Бит Название Описание
7 RDY0 Бит готовности основного АЦП. Устанавливается в 1 по завершении преобразования АЦП или по завер- шении цикла калибровки. Сбрасывается в 0 непосредственно пользователем или косвенно, путём записи битов запуска следующего цикла преобразования или калибровки основного АЦП (в регистре ADCMODE). Основному АЦП запрещается запись результатов в регистры данных или калибровки до тех пор, пока бит RDY0 не сброшен
6 RDY1 Бит готовности дополнительного АЦП. Все определения для RDY0 справедливы для RDY1
5 CAL Бит состояния калибровки. Устанавливается в 1 аппаратно по завершении калибровки. Сбрасывается в 0 косвенно, путём записи битов запуска следующего цик- ла преобразования или калибровки (в регистре ADCMODE)
4 NOXREF Бит отсутствия внешнего ИОН (активен в случае активности одного из АЦП). Устанавливается в 1 для индикации того, что один или оба контакта REFIN никуда не подключены (плавающие), или если напряжение вне- шнего источника ниже предельно допустимого. При использовании вне- шнего ИОН при NOXREF - 1 результатом преобразования будут едини- цы во всех битах регистров данных. Сбрасывается в 0, если величина опорного напряжения находится в до- пустимых пределах
3 ERR0 Бит ошибки основного АЦП. Устанавливается в 1 аппаратно в том случае, когда во всех битах регистров данных либо только нули, либо только единицы. После калибровки уста- новленный бит сигнализирует об ошибке, вызванной тем, что в регистры калибровки не произведено записи. Сбрасывается в 0 путём установки в 1 бита начала преобразования или ка- либровки (в регистре ADCMODE)
2 ERR1 Бит ошибки дополнительного АЦП. Все определения для ERR0 справедливы и для ERR1
1 — Зарезервирован для дальнейшего использования
0 — Зарезервирован для дальнейшего использования
ADCMODE — регистр режима АЦП
Этот регистр используется для управления работой обоих АЦП.
• Адрес SFR..............................................0D1H
• Значение по включению питания...........................ООН
• Адресация отдельных битов.......................отсутствует
7 6 5 4 3 2 1 0
— — ADC0EN ADC1EN — MD2 MD1 MD0
-312-
3.4. Программирование микроконвертера
Таблица 3.3. Назначение битов в ADCMODE
Бит Название Описание
7 — Зарезервирован для дальнейшего использования
6 — Зарезервирован для дальнейшего использования
5 ADC0EN Разрешение основного АЦП. Устанавливается в 1 пользователем для того, чтобы разрешить работу ос- новного АЦП и установить его в режим в соответствии с выбранными би- тами MD2...MD0. Сбрасывается в 0 пользователем для установки основного АЦП в режим «Power Down»
4 ADC1EN Разрешение дополнительного АЦП. Устанавливается в 1 пользователем для того, чтобы разрешить работу до- полнительного АЦП и установить его в режим в соответствии с выбран- ными битами MD2...MD0. Сбрасывается в 0 пользователем для установки дополнительного АЦП в режим «Power Down»
3 — Зарезервирован для дальнейшего использования
2 1 0 MD2 MD1 MD0 Биты режима основного и дополнительного АЦП. Эти биты устанавливают режим работы выбранного АЦП следующим образом:
MD 2 MD 1 MD 0 Описание
0 0 0 Питание (включенное по умолчанию) снято
0 0 1 Холостой режим. Фильтр АЦП и его модулятор поддерживаются в сброшенном состоянии, хотя на модулятор подается тактовый сигнал
0 1 0 Режим однократного преобразования. Выполняется однократное преобразование выбранным АЦП. По завершении преобразования регистры данных AD0L/M/H и/или AD1L/H модифицируются, записыва- ются соответствующие флаги в ADCSTAT, и снова снима- ется питание, биты MD2...MD0 сбрасываются в 0
0 1 1 Циклическое преобразование. В режиме циклического преобразования регистры данных соответствующего АЦП постоянно модифицируются с частотой, определяемой содержимым регистра SF
1 0 0 Внутренняя калибровка нуля. Автоматически осуществляется внутреннее короткое за- мыкание разрешённых входов
1 0 1 Внутренняя калибровка верхнего предела (полной шка- лы).При выполнении этой калибровки к выбранным вхо- дам подключается внутренний или внешний ИОН
1 1 0 Системная калибровка нуля. Пользователь должен подать на разрешённые входы на- пряжение системного нуля
1 1 1 Системная калибровка внешнего предела (полной шкалы). Пользователь должен подать напряжение системной пол- ной шкалы на разрешённые входы
— 313 —
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Примечания:
1. Любое изменение битов MD немедленно сбросит оба АЦП. Запись в биты MD2...MD0 без
изменения их содержимого также рассматривается как сброс (за исключением п. 3 примечания).
2. Если команда загружается в ADCOCON, когда ADC0EN = 1, или если ADC0EN изменяется
с 0 на 1, тогда оба АЦП также немедленно сбрасываются. Иными словами, основной АЦП имеет
приоритет над дополнительным, и любая команда, относящаяся к первому, воздействует и на вто-
рой.
3. Если команда загружается в ADC1CON или если ADC1EN изменяется с 0 на 1, тогда сбра-
сывается только дополнительный АЦП. Например, если основной АЦП выполняет циклическое
преобразование, когда дополнительный АЦП запускается, то основной АЦП продолжает беспре-
пятственно работать, а дополнительный будет сфазирован с выходом основного. Результат будет
таким, что время выполнения первого цикла преобразования для дополнительного АЦП будет за-
держано на три такта, пока поток с дополнительного АЦП не синхронизируется с потоком основ-
ного.
4. Как только в ADCMODE записываются значения битов, соответствующие выбору режима
калибровки, биты RDY0 и RDY1 в ADCSTAT немедленно сбрасываются, и запускается цикл ка-
либровки. По завершении цикла данные записываются в соответствующие регистры калибровки.
В ADCSTAT записываются соответствующие биты, а биты MD2...MD0 сбрасываются в 0, с тем
чтобы указать, что АЦП возвратился в состояние «питание снято».
5. Любой запрос на калибровку дополнительного АЦП игнорируется до тех пор, пока выбран
температурный датчик.
6. Калибровки выполняются при максимальном значении в SF (SF = 255), обеспечивая тем
самым оптимальное выполнение калибровки.
ADCOCON — регистр управления основным АЦП
Этот регистр используется для конфигурации основного АЦП с точки
зрения диапазона измерений, выбора канала, разрешению внешнего ИОН
и выбору режима униполярного/биполярного кодирования.
• Адрес SFR...............................................0D2H
• Значение по включению питания............................07Н
• Адресация отдельных битов........................отсутствует
7 6 5 4 3 2 1 0
— XREF0 СН1 СНО UNI0 RN2 RN1 RN0
Таблица 3.4. Назначение битов в ADCOCON
Бит Название Описание
7 — Зарезервирован для дальнейшего использования
6 XREF0 Бит выбора внешнего ИОН для основного АЦП. Устанавливается в 1 пользователем для того, чтобы разрешить использова- ние основным АЦП внешнего ИОН через контакты REFIN(+), REFIN(—). Сбрасывается пользователем в 0 для использования основным АЦП внут- реннего ИОН (Kref = 1-25 В)
-314-
3.4. Программирование микроконвертера
(продолжение)
Бит Название Описание
5 4 СН1 СНО Биты выбора канала для основного АЦП. Сбрасываются/устанавливаются пользователем для выбора пары диффе- ренциальных входов, используемых основным АЦП
СН1 СНО Вход (+) Вход (-) Примечание
0 0 AIN1 AIN2
0 1 AIN3 AIN4
1 0 AIN2 AIN2 Внутреннее замыкание
1 1 AIN3 AIN2
3 UNI0 Бит униполярного преобразования основного АЦП. Устанавливается пользователем в 1 для разрешения униполярного кодирова- ния (т. е. ноль на дифференциальном входе даст 000000Н на выходе АЦП). Сбрасывается пользователем в 0 для разрешения биполярного кодирова- ния (т. е. ноль на дифференциальном входе даст 800000Н на выходе АЦП)
2 1 0 RN2 RN1 RN0 Биты диапазона основного АЦП. Эти биты устанавливают диапазон допустимых входных сигналов основ- ного АЦП следующим образом:
RN2 RN1 RN0 Входной диапазон основного АЦП при rREF = 2.5 В
0 0 0 ±20 мВ
0 0 1 ±40 мВ
0 1 0 ±80 мВ
0 1 1 ±160 мВ
1 0 0 ±320 мВ
1 0 1 ±640 мВ
1 1 0 ±1.28 В
1 1 1 ±2.56 В
SF — регистр «8тс»-фильтра
• Адрес SFR.............................................0D4H
• Значение по включению питания..........................45Н
• Адресация отдельных битов......................отсутствует
Число в этом регистре используется для установки коэффициента де-
ления основной частоты и, таким образом, частоты потока выходных дан-
ных основного и дополнительного АЦП. Этот регистр не может быть уста-
новлен пользователем до тех пор, пока любой из АЦП активен. Данный
— 315 —
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
основной поток одинаков как для основного, так и для дополнительного
АЦП и рассчитывается следующим образом:
где Дос “ поток данных на выходе АЦП (частота модификации выхода);
/mod” тактовая частота модулятора (32768 Гц);
SF — десятичное значение содержимого регистра SF.
Допустимый диапазон значений SF — от 0DH до FFH. Примеры вели-
чин SF и соответствующие им частоты (/дос)и время (/ADC) преобразования
АЦП приведены в Табл. 3.5; при подаче питания SF принимает значение по
умолчанию, равное 45Н, что даёт частоту модификации по умолчанию чуть
менее 20 Гц. Следует также отметить, что оба АЦП для минимизации оши-
бок смещения используют цикл стабилизирующего прерывания. Это озна-
чает, что время для однократного преобразования (или время первого цик-
ла при циклическом преобразовании) увеличивается в 2 раза.
Все циклы калибровки выполняются при максимальном значении SF
(SF = 0FFH) для гарантии наиболее надёжной калибровки. Как только
цикл калибровки закончится, в регистре SF восстанавливается величина,
записанная туда пользователем.
Таблица 3.5. Связь между содержимым SF и скоростью преобразования АЦП
SFio SFI6 Adc (ОД 'adc lMCl
13 0D 103.3 9.52
69 45 19.79 50.34
255 FF 5.35 186.77
ADCOH/ ADCOM/ ADC0L — регистры данных основного АЦП
Эти три 8-битных регистра содержат результат 24-битного преобразо-
вания основного АЦП.
• Адрес SFR ACD0H (старший байт данных).................0DBH
• Адрес SFR ACD0M (средний байт данных).................0DAH
• Адрес SFR ACD0L (младший байт данных)..................0D9H
• Значение по включению питания (для всех трёх регистров).07Н
• Адресация отдельных битов (для всех трёх регистров).отсутствует
PLLCON — регистр управления ФАПЧ
ADuC824 предназначен для использования с часовым кварцевым резона-
тором с частотой 32768 кГц. Система фазовой автоподстройки частоты
(ФАПЧ) умножает эту величину на 384 (32 раза по 12) для получения ста-
-316-
3.4. Программирование микроконвертера
бильной рабочей тактовой частоты системы 12.582912 МГц. Микропроцес-
сорное ядро может работать как на этой тактовой частоте, так и на более низ-
ких, в 2,4, 8,..., 128 раз меньших. Это позволяет экономить энергопотребле-
ние в тех случаях, когда не требуется максимума производительности ядра.
По умолчанию тактовая частота равна 1.572864 МГц.
Тактовые сигналы АЦП также получаются из сигналов синхронизации
ФАПЧ, причём частота сигналов, поступающих на модулятор, та же самая,
что и частота кварцевого резонатора. Такой выбор частот гарантирует, что
модулятор и ядро всегда будут синхронизированы вне зависимости от так-
товой частоты ядра.
Регистр PLLCON представляет собой регистр управления ФАПЧ.
• Адрес SFR............................................ 0D7H
• Значение по включению питания....................... ОЗН
• Адресация отдельных битов.........................отсутствует
7 6 5 4 3 2 1 0
OSC.PD LOCK — LTEA/ FINT CD2 CD1 CDO
Таблица 3.6. Назначение битов в PLLCON
Бит Название Описание
7 OSC_PD Бит снятия питания с осциллятора. Устанавливается в 1 пользователем для остановки осциллятора 32 кГц в режиме «Power Down». Сбрасывается в 0 пользователем для запуска осциллятора 32 кГц в режи- ме «Power Down». Это позволяет счётчику временного интервала (TIC) продолжать работу в режиме «Power Down»
6 LOCK Бит прерывания при блокировке ФАПЧ (только для чтения). Устанавливается в 1 автоматически при подаче питания для индикации того, что система ФАПЧ правильно отслеживает частоту резонатора. Сбрасывается в 0 автоматически при подаче питания в случае, если сис- тема ФАПЧ не отслеживает частоту резонатора. Такое может происхо- дить при отсутствии резонатора или при его неисправности. При этом на выходе ФАПЧ может генерироваться частота 12.6 МГц ±20%
5 — Зарезервирован для дальнейшего использования
4 LTEA/ Чтение этого бита возвращает логический уровень на выводе ЕА, зафик- сированный в момент подачи питания или сброса системы
3 FINT Бит быстрой реакции на прерывание. Установка пользователем этого бита в 1 разрешает быструю реакцию на прерывание. Ускорение обеспечивается за счёт того, что обработка пре- рывания происходит на максимальной частоте (12.6 МГц) вне зависи- мости от состояния битов CD2...CD0. По возврату из прерывания выпол- нение программы продолжается на частоте, определяемой CD2...CD0. Сбрасывается пользователем в 0 для запрета быстрой реакции на прерывания
— 317 —
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
(продолжение)
Бит Название Описание
2 1 0 CD2 CD1 CD0 Биты делителя рабочей частоты ЦПУ. Эти биты определяют частоту, на которой будет работать ядро микрокон- троллера:
CD2 CD1 CD0 Тактовая частота [МГц] Примечание
0 0 0 12.582912
0 0 1 6.291456
0 1 0 3.145728
0 1 1 1.572864 Частота по умолчанию
1 0 0 0.786432
1 0 1 0.393216
1 1 0 0.196608
1 1 1 0.098304
Это всё, остальные регистры микроконвертера (естественно, за исклю-
чением стандартных для семейства х51) нам в данном примере не понадо-
бятся.
3.4.2. Программирование основного АЦП
Внимательно проанализировав программу, приведённую в начале дан-
ного раздела, можно сделать следующий вывод. Для того чтобы осущест-
вить измерение основным АЦП, достаточно сделать всего 3 записи в ре-
гистры микроконвертера. Сначала нужно записать 20Н в ADCMODE, раз-
решая работу основного АЦП. Затем (как это сделано в рассматриваемой
программе) записываем 40Н в ADCOCON, выбрав тем самым внешний
ИОН, входы AIN1...AIN2, униполярное кодирование и диапазон 20 мВ. И
наконец, остается записать 22Н в ADCMODE, что запустит одиночное из-
мерение основным АЦП с помещением 24-битового результата в ACD0H/
ACD0M/ACD0L.
Это действительно так, последовательность этих команд «оживит» ос-
новной АЦП. Но при этом не будут проведены основные калибровки (ну-
ля и полной шкалы), что может привести к заметной погрешности измере-
ний. Далее, записывая значение 22Н в ADCMODE, мы должны как-то оп-
ределить момент, когда завершится преобразование, или ждать его
завершения в течение промежутка времени, гарантированно более длин-
ного, чем самое медленное преобразование. Второй вариант хуже, поэтому
посмотрим, как реализовать первый.
— 318 —
3.4. Программирование микроконвертера
Вспомним, что в ADCSTAT 7-й бит является индикатором завершения
преобразования — пока он не установится после запуска преобразования в
1, процесс ещё не завершен. Таким образом, запустив преобразование, нам
нужно опрашивать состояние этого бита и дожидаться, пока он не устано-
вится в 1. Приведённый ниже фрагмент программы реализует эту последо-
вательность.
Запись 22Н в ADCMODE запускает одиночное измерение основным
АЦП. Далее опрашивается регистр ADCSTAT, все его биты, кроме старше-
го, зануляются. Если после этой процедуры результат нулевой, то интере-
сующий нас старший бит ADCSTAT также равен 0, и опрос нужно повто-
рить. Как только после зануления младших 7 бит результат окажется нену-
левым, преобразование считается завершённым, и его результат я
загружаю в регистры R2...R0.
Фрагмент программы запуска преобразования основного АЦП
;ОДИНОЧНОЕ ИЗМЕРЕНИЕ
IZMER24:
MOV ADCMODE,#00100010В ;РАЗРЕШ.ОСН.АЦП, ОДИНОЧН.ИЗМЕР.
LF3:
MOV A,ADCSTAT
ANL А,#10000000В
JZ LF3 ;ЖДЕМ КОНЦА ИЗМЕРЕНИЯ
MOV R2,ADCОН
MOV R1,ADCOM
MOV R0,ADC0L /РЕЗУЛЬТАТ ИЗМЕРЕНИЯ В R2-R0
RET
Далее обратимся к процедурам калибровки. Если мы разрабатываем
прецизионное оборудование, к тому же предназначенное для работы при
температурах, отличающихся от комнатной, то без них обойтись невоз-
можно.
Обычно нужно произвести калибровку нуля, а затем — калибровку
полной шкалы (именно в этой последовательности, а не наоборот!). Такие
калибровки в ADuC824 предусмотрены. Завершение калибровок опреде-
ляется так же, как и завершение процесса основного преобразования,
только в случае калибровок индикатором завершения будет выступать не
7-й (старший) бит регистра ADCSTST, а 5-й.
— 319 —
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Следующий фрагмент демонстрирует, как можно реализовать процесс
упомянутых калибровок.
Фрагмент программы калибровки основного АЦП
/КАЛИБРОВКА НУЛЯ
KALIBR0:
MOV ADCMODE,#00100100В /РАЗРЕШ.ОСН.АЦП, КАЛИБР.О
LF1:
MOV A,ADCSTAT
ANL А,#00100000В
JZ LF1 /ЖДЕМ КОНЦА КАЛИБРОВКИ
RET
/КАЛИБРОВКА ШКАЛЫ
KALIBRSH:
MOV ADCMODE,#00100101В /РАЗРЕШ.ОСН.АЦП, КАЛИБР.ШКАЛЫ
LF2:
MOV A,ADCSTAT
ANL А,#00100000В
JZ LF2 /ЖДЕМ КОНЦА КАЛИБРОВКИ
RET
Следующее, что необходимо учесть: по умолчанию ADuC824 стартует
с тактовой частотой ядра, равной примерно 1.57 МГц, и время измере-
ния по умолчанию равно 50 мс. Если эти параметры вас не устраивают, то
прежде чем заняться основным АЦП, вы должны записать информацию в
регистр PLLCON (задавая тем самым частоту работы ядра микроконтрол-
лера, см. Табл. 3.6) и в регистр SF (задавая скорость преобразования, см.
Табл. 3.5).
3.4.3. Обработка и отображение результатов измерения основного
АЦП
Как отмечалось, результат измерения будет представлять собой трёх-
байтное (24-битное) двоичное число. Но прежде чем отобразить этот ре-
зультат на экране индикатора, нужно преобразовать его в понятный и зна-
комый нам, пользователям, десятичный формат.
Но и это ещё не всё. При измерении напряжения, равного опорному
(2.5 В), АЦП даст результат, равный 0FFFFFFH или 16777215. Этот деся-
тичный результат, как нетрудно заметить, заметно отличается от изме-
-320-
3.4. Программирование микроконвертера
ренных 2.5 В (или 2500 мВ, что то же самое). Для того чтобы превратить
измеритель сигнала на основе ADuC824 в цифровой вольтметр, нам нуж-
но результат измерения либо умножить на 1.4901162, либо разделить на
6.710886. В первом случае мы получим число 24999999, что после уста-
новки в нужное место десятичной точки даст 2.4999999 (сравните с тре-
буемыми 2.500). Во втором случае мы получим 2500000, или после уста-
новки точки — 2.500000 (тоже хорошо, но на один десятичный разряд
хуже).
Конечно, можно, что называется, решить задачу «в лоб» — умножить
друг на друга два многобайтных числа аналогично тому, как это показано в
третьем томе настоящего издания. Или разделить одно на другое два мно-
гобайтных числа (это чуть сложнее, чем умножить). Но гораздо быстрее
получить результат в результате операций сложения и вычитания.
Как нетрудно заметить, чтобы умножить число на 1.49, достаточно
прибавить к нему его половину и затем вычесть из суммы одну сотую ис-
ходного числа. Получить половину от исходного двоичного числа
просто — достаточно сдвинуть его на 1 бит вправо. С одной сотой несколь-
ко сложнее — простыми сдвигами её не получить. Однако можно из 1.5
вычесть одну шестьдесят четвёртую исходного числа — в результате полу-
чим 1.484375, что после умножения на 16777215 даст 24903679. Это чуть
меньше, чем требуемые 24999999, но всего на 0.4%, что может быть ском-
пенсировано аппаратными подстройками (подстроечным резистором
между входом ADuC и выходом предшествующего ему входного каскада на
операционном или инструментальном усилителе).
И ещё об одном аспекте, необходимом для понимания работы про-
граммы. Во многих случаях результаты измерений получаются с гораздо
меньшим разбросом, если есть возможность сделать серию измерений,
просуммировать результаты, а затем разделить сумму на число измерений.
Например, сделать серию из 16 измерений, просуммировать и разделить
на 16 (четырежды сдвинуть сумму на 1 бит вправо). Или сделать серию из
256 измерений с последующим делением суммы на 256 (простым отбрасы-
ванием младшего байта). Представляется интересным сравнить результаты
одиночных измерений с аналогичными результатами, но с усреднением по
16 и по 256 значениям. Для этого в описываемой ниже программе одиноч-
ного измерения, измерения с усреднением по 16 значениям и по 256 значе-
ниям сделаны так, что и в том, и в другом, и в третьем случаях трёхбайтный
результат расположен в одних и тех же регистрах R2...R0 в одном и том же
порядке (старший байт в R2, младший в R0). Вследствие этого модифика-
ция программы для замены одиночного измерения на серию и наоборот
выполняется простым изменением имени вызываемой подпрограммы в
одной из строк программы (с последующей перетрансляцией и загрузкой
её в микроконвертер, но об этом чуть позже).
-321 -
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
После всего сказанного обратимся к обещанной программе.
Программа для основного АЦП ADuC824
TASM 8051 Assembler. ADUC18 Speech Technology Incorporated.
0001 0000
0002 0000
0003 0000 ,’ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.&&&&&&&&&&&&&&&&&&&&&&
0004 0000 ! & &
0005 0000 ;&ПРОГРАММА ДЛЯ МИКРОПРОЦЕССОРА ADuC824 &
0006 0000 &
0007 0000 i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0008 0000
0009 0000 /
0010 0000
ООН 0000 ;АДРЕСА И КОНСТАНТЫ
0012 0000 . * * * * *
0013 0000
0014 0000 ;
0015 0000 ADCSTAT .EQU 0D8H ;БИТ 7 - RDY0(l - КОНЕЦ
;ПРЕОБР), БИТ 5 - CAL (ТАКЖЕ)
0016 0000 ADCMODE .EQU 0D1H ;БИТ 5 - ADC0EN, БИТЫ 2-0 - РЕЖИМ
0017 0000 ;(010-ИЗМ, 100-" 0", 101-ШКАЛА)
0018 0000 ADCOCON .EQU 0D2H ;БИТ б-ВНЕШ.ИОН, БИТЫ 5,4- ;ВХОДЫ(AIN3&4),БИТ 3-УНИП.
0019 0000 ;БИТЫ 2-0 - коэфф, усил. ;(МИН - 111, ;МАКС - 000)
0020 0000 ADC0H .EQU 0DBH
0021 0000 ADC0M .EQU 0DAH
0022 0000 ADC0L .EQU 0D9H
0023 0000 PLLCON .EQU 0D7H
0024 0000 SF .EQU 0D4H
0025 0000 R7 .EQU 7
0026 0000 R6 .EQU 6
0027 0000 R5 .EQU 5
0028 0000 R4 .EQU 4
0029 0000 R3 .EQU 3
0030 0000 R2 .EQU 2
0031 0000 Rl .EQU 1
0032 0000 R0 .EQU 0
0033 0000 ACC .EQU 0E0H
0034 0000 В .EQU OFOH
0035 0000 PSW .EQU ODOH
0036 0000 SP .EQU 81H
0037 0000 DPL .EQU 82H
-322-
3.4. Программирование микроконвертера
0038 0000 DPH .EQU 83Н
0039 0000 Р0 .EQU 8ОН
0040 0000 Pl .EQU 9ОН
0041 0000 Р2 . EQU 0A0H
0042 0000 РЗ .EQU 0B0H
0043 0000 в.о .EQU 0F0H
0044 0000 В.1 .EQU 0F1H
0045 0000 В.2 .EQU 0F2H
0046 0000 в.з .EQU 0F3H
0047 0000 В.4 .EQU 0F4H
0048 0000 В.5 .EQU 0F5H
0049 0000 В.6 .EQU 0F6H
0050 0000 В.7 .EQU 0F7H
0051 0000 АСС.О .EQU ОЕОН
0052 0000 АСС.1 .EQU 0Е1Н
0053 0000 АСС.2 .EQU 0Е2Н
0054 0000 АСС.З .EQU ОЕЗН
0055 0000 АСС.4 .EQU 0Е4Н
0056 0000 АСС.5 .EQU 0Е5Н
0057 0000 АСС.6 .EQU 0Е6Н
0058 0000 АСС.7 .EQU 0Е7Н
0059 0000 PSW.1 . EQU 0D0H
0060 0000 PSW.1 .EQU 0D1H
0061 0000 PSW.2 .EQU 0D2H
0062 0000 PSW.3 .EQU 0D3H
0063 0000 PSW.4 .EQU 0D4H
0064 0000 PSW.5 .EQU 0D5H
0065 0000 PSW.6 .EQU 0D6H
0066 0000 PSW.7 .EQU 0D7H
0067 0000 РО.О .EQU 080Н
0068 0000 Р0.1 .EQU 081Н
0069 0000 Р0.2 .EQU 082Н
0070 0000 РО.З .EQU 083Н
0071 0000 Р0.4 .EQU 084Н
0072 0000 Р0.5 .EQU 085Н
0073 0000 Р0.6 .EQU 086Н
0074 0000 Р0.7 .EQU 087Н
0075 0000 Р1.0 .EQU 090Н
0076 0000 Р1.1 .EQU 091Н
0077 0000 Р1.2 .EQU 092Н
0078 0000 Р1.3 .EQU 093Н
0079 0000 Р1.4 .EQU 094Н
0080 0000 Р1.5 . EQU 095Н
0081 0000 Р1.6 . EQU 096Н
0082 0000 Р1.7 . EQU 097Н
-323-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКАНА ADUC824
0083 0000 Р2.0 .EQU OAOH
0084 0000 Р2.1 .EQU 0A1H
0085 0000 Р2.2 .EQU 0A2H
0086 0000 Р2.3 .EQU 0A3H
0087 0000 Р2.4 .EQU 0A4H
0088 0000 Р2.5 .EQU 0A5H
0089 0000 Р2.6 .EQU 0A6H
0090 0000 Р2.7 .EQU 0A7H
0091 0000 РЗ.О .EQU 0B0H
0092 0000 Р3.1 .EQU 0B1H
0093 0000 Р3.2 .EQU 0B2H
0094 0000 РЗ.З .EQU 0B3H
0095 0000 Р3.4 .EQU 0B4H
0096 0000 Р3.5 .EQU 0B5H
0097 0000 Р3.6 .EQU 0B6H
0098 0000 Р3.7 .EQU 0B7H
0099 0000 CLKIND1 .EQU P3.7
0100 0000 DATIND1 .EQU P2.7
0101 0000 AD00 .EQU 4OH
0102 0000
0103 0000 ;НАЧАЛО ПРОГРАММЫ:
0104 0000 . *****
0105 0000 /
0106 0000 . ORG 0
0107 0000
0108 0000 75 ВО FF MOV P3,#11111111B
0109 0003 75 90 FF MOV Р1Л11111111В
ОНО 0006 75 АО FF MOV Р2Л11111111В
0111 0009 75 80 FF MOV Р0Л11111111В
0112 ооос 75 D7 00 MOV PLLCON,#0
0113 000F /MOV SF ,#245
0114 OOOF /
0115 OOOF SFO:
0116 000F 75 D8 00 MOV ADCSTAT,#000000008 /СБРОСИЛИ RDYO И CAL
0117 0012 75 D2 5F MOV ADCOCON,#01011111B /ВНЕШ.REF, AIN3&4, УНИП., 2.5B
0118 0015
0119 0015 12 00 64 LCALL KALIBRO /КАЛИБРОВКА НУЛЯ
0120 0018 12 00 6Е LCALL KALIBRSH /КАЛИБРОВКА ШКАЛЫ
0121 001В ;LCALL i IZMN256, 256 ИЗМЕРЕНИЙ С УСРЕДНЕНИЕМ
0122 001В 12 00 78 LCALL IZMER24 /ОДИНОЧНОЕ ИЗМЕРЕНИЕ В R2R1R0
0123 001Е
0124 001Е SF1:
0125 001Е 12 01 39 LCALL POLTORA
0126 0021 12 01 65 LCALL BN2BCD32 /ПРЕОБРАЗОВАЛИ В ДВОИЧНО-
0127 0024 /ДЕСЯТИЧНЫЙ ФОРМАТ
-324-
3.4. Программирование микроконвертера
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0024 EF 0025 С4 MOV SWAP AZR7 A
0026 54 OF ANL A,#00001111B
0028 F5 47 MOV AD00+7,A
002А EF MOV A,R7
002В 54 OF ANL A,#00001111B
002D F5 46 MOV AD00+6,A
002F
002F ЕЕ MOV A,R6
0030 С4 SWAP A
0031 54 OF ANL A,#00001111B
0033 F5 45 MOV AD00+5,A
0035 ЕЕ MOV A,R6
0036 54 OF ANL A,#00001111B
0038 F5 44 MOV AD00+4,A
003А
003А ED MOV AZR5
003В С4 SWAP A
003С 54 OF ANL A,#00001111B
ООЗЕ F5 43 MOV AD00+3,A
0040 ED MOV A,R5
0041 54 OF ANL A,#00001111B
0043 F5 42 MOV AD00+2zA
0045 ;
0045 ЕС MOV AZR4
0046 С4 SWAP A
0047 54 OF ANL Az#00001111B
0049 F5 41 MOV AD00+lzA
004В ЕС MOV AZR4
004С 54 OF ANL Az#00001111B
004Е F5 40 MOV AD00+0zA
0050
0050 12 00 88 LCALL , INDVIV24
0053 12 01 АО LCALL , DELIS
0056 12 01 АО LCALL , DELIS
0059 12 01 АО LCALL . DELIS
005С 12 01 АО LCALL . DELIS
005F 12 01 АО LCALL , DELIS
0062
0062 80 АВ SJMP SFO
0064 ;
0064 ; ;КАЛИБРОВКА НУЛЯ
0064
0064 KALIBR0:
0064 75 D1 24 MOV ADCMODE, #0 010 010 0 В;PАЗ РЕШ.ОСН.АЦП, КАЛИБР.0
-325-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0173 0067 LF1:
0174 0067 Е5 D8 MOV A,ADCSTAT
0175 0069 54 20 ANL A,#00100000B
0176 006В 60 FA JZ LF1 /ЖДЕМ КОНЦА КАЛИБРОВКИ
0177 006D 22 RET
0178 006Е
0179 006Е ;КАЛИБРОВКА ШКАЛЫ
0180 006Е /
0181 006Е KALIBRSH:
0182 006Е 75 D1 25 MOV ADCMODE,#00100101B ;РАЗРЕШ.ОСН.АЦП, КАЛИБР.ШКАЛЫ
0183 0071 LF2:
0184 0071 Е5 D8 MOV A,ADCSTAT
0185 0073 54 20 ANL А,#00100000В
0186 0075 60 FA JZ LF2 /ЖДЕМ КОНЦА КАЛИБРОВКИ
0187 0077 22 RET
0188 0078
0189 0078 /ОДИНОЧНОЕ ИЗМЕРЕНИЕ
0190 0078
0191 0078 IZMER24
0192 0078 75 D1 , 22 MOV ADCMODE,#00100010В /РАЗРЕШ.ОСН.АЦП, ОДИНОЧН.ИЗМЕР.
0193 007В LF3:
0194 007В Е5 D8 MOV A,ADCSTAT
0195 007D 54 80 ANL А,#10000000В
0196 007F 60 FA JZ LF3 /ЖДЕМ КОНЦА ИЗМЕРЕНИЯ
0197 0081 /
0198 0081 АА DB MOV R2,ADC0H
0199 0083 А9 DA MOV Rl,ADC0M
0200 0085 А8 D9 MOV R0,ADC0L /РЕЗУЛЬТАТ ИЗМЕРЕНИЯ В R2-R0
0201 0087 /
0202 0087 22 RET
0203 0088
0204 0088 /
0205 0088 /
0206 0088 INDVIV24:
0207 0088 74 0F MOV A,#0FH
0208 008А 11 Bl ACALL SIMBOL1
0209 008С Е5 47 MOV A,AD00+7
0210 008Е 11 Bl ACALL SIMBOL1
0211 0090 74 OF MOV A,#0FH
0212 0092 11 Bl ACALL SIMBOL1
0213 0094 Е5 46 MOV A,AD00+6
0214 0096 11 Bl ACALL SIMBOL1
0215 0098 Е5 45 MOV A,AD00+5
0216 009А 11 Bl ACALL SIMBOL1
-326-
3.4. Программирование микроконвертера
0217 009С Е5 44 MOV A,AD00+4
0218 009Е 11 Bl ACALL SIMBOL1
0219 00А0 Е5 43 MOV AzAD00+3
0220 00А2 11 Bl ACALL SIMBOL1
0221 00А4 Е5 42 MOV A,AD00+2
0222 00А6 11 Bl ACALL SIMBOL1
0223 00А8 Е5 41 MOV A,AD00+l
0224 00AA 11 Bl ACALL SIMBOL1
0225 00AC Е5 40 MOV A,AD00+0
0226 00AE 11 Bl ACALL SIMBOL1
0227 00В0 22 RET
0228 00В1
0229 GOBI SIMBOL1:
0230 GOBI 54 OF ANL A,#00001111B
0231 ООВЗ B4 00 04 CJNE A,#0,SIMBll
0232 00B6 74 OA MOV A,#10
0233 00B8 80 05 SJMP SIMB12
0234 OOBA B4 OF 02SIMB11: CJNE A,#0FH,SIMB12
0235 OOBD 74 00 MOV A,#0
0236 OOBF C2 B7 SIMB12: CLR CLKIND1
0237 00C1 C4 SWAP A
0238 00C2 11 CB ACALL BIT1
0239 00C4 11 CB ACALL BIT1
0240 00C6 11 CB ACALL BIT1
0241 00C8 11 CB ACALL BIT1
0242 OOCA 22 RET
0243 OOCB /
0244 OOCB 33 BIT1: RLC A
0245 OOCC 92 A7 MOV DATIND1,C /ВЫВ. ДАННЫХ В ЖК-ДИСПЛЕЙ
0246 OOCE D2 B7 SETB CLKIND1 /ИМПУЛЬС ЗАЩЁЛКИВАНИЯ
0247 OODO C2 B7 CLR CLKIND1
0248 00D2 22 RET
0249 00D3 /
0250 00D3 /
0251 00D3
0252 00D3 /ПОДПРОГРАММА ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 16
0253 00D3 /ИЗМЕРЕНИЯМ
0254 00D3 /
0255 00D3 IZMN16:
0256 00D3 7F 00 MOV R7,#0
0257 00D5 7E 00 MOV R6,#0
0258 00D7 7D 00 MOV R5,#0
0259 00D9 7C 00 MOV R4,#0
0260 OODB 7B 10 MOV R3,#16
-327-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0261 00DD IZMN16C
0262 00DD 12 00 78 LCALL IZMER24
0263 00Е0 ЕС MOV A,R4
0264 00Е1 28 ADD A, RO
0265 00Е2 FC MOV R4, A
0266 00E3 ED MOV A,R5
0267 00Е4 39 ADDC AZR1
0268 00Е5 FD MOV R5, A
0269 00Е6 ЕЕ MOV A,R6
0270 00Е7 ЗА ADDC A,R2
0271 00Е8 FE MOV R6,A
0272 00Е9 EF MOV A,R7
0273 00EA 34 00 ADDC A,#0
0274 00EC FF MOV R7, A
0275 00ED DB EE DJNZ R3,IZMN16C
0276 00EF
0277 OOEF EF MOV A,R7
0278 00F0 FB MOV R3 , A
0279 00F1 ЕЕ MOV A,R6
0280 00F2 FA MOV R2, A
0281 00F3 ED MOV A,R5
0282 00F4 F9 MOV R1,A
0283 00F5 ЕС MOV A,R4
0284 00F6 F8 MOV R0, A
0285 00F7
0286 00F7 12 01 06 LCALL POSR3_0
0287 00FA 12 01 06 LCALL POSR3_0
0288 00FD 12 01 06 LCALL POSR3_0
0289 0100 12 01 06 LCALL POSR3_0
0290 0103 7В 00 MOV R3,#0
0291 0105 22 RET
0292 0106
0293 0106 POSR3_0:
0294 0106 СЗ CLR C
0295 0107 ЕВ MOV A, R3
0296 0108 13 RRC A
0297 0109 FB MOV R3 , A
0298 010А ЕА MOV A,R2
0299 010В 13 RRC A
0300 010С FA MOV R2, A
0301 010D Е9 MOV A,R1
0302 010Е 13 RRC A
0303 010F F9 MOV Rl, A
0304 ОНО Е8 MOV A, R0
-328-
3.4. Программирование микроконвертера
0305 0111 13 RRC А
0306 0112 F8 MOV R0,А
0307 0113 22 RET
0308 0114
0309 0114
0310 0114 '•ПОДПРОГРАММА ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 256
0311 0114 '•ИЗМЕРЕНИЯМ
0312 0114
0313 0114 IZMN256:
0314 0114 7F 00 MOV R7'#0
0315 0116 7Е 00 MOV R6'#0
0316 0118 7D 00 MOV R5,#0
0317 ОНА 7С 00 MOV R4,#0
0318 011С 7Б 00 MOV R3,#0
0319 011Е IZMN256C:
0320 011Е 12 00 78 LCALL IZMER24
0321 0121 ЕС MOV A,R4
0322 0122 28 ADD A,R0
0323 0123 FC MOV R4ZA
0324 0124 ED MOV A,R5
0325 0125 39 ADDC A'Rl
0326 0126 FD MOV R5,A
0327 0127 ЕЕ MOV A,R6
0328 0128 ЗА ADDC A,R2
0329 0129 FE MOV R6,A
0330 012А EF MOV A,R7
0331 012В 34 00 ADDC A,#0
0332 012D FF MOV R7,A
0333 012Е DB ЕЕ DJNZ R3zIZMN256C
0334 0130
0335 0130 EF MOV A,R7
0336 0131 FA MOV R2,A
0337 0132 ЕЕ MOV A,R6
0338 0133 F9 MOV Rl'A
0339 0134 ED MOV A,R5
0340 0135 F8 MOV R0,A
0341 0136 7В 00 MOV R3,#0
0342 0138 22 RET
0343 0139
0344 0139 ;ПРОГРАММА УМНОЖЕНИЯ ЧИСЛА В R2R1R0 НА 1.375. РЕЗУЛЬТАТ
0345 0139 /МОЖЕТ БЫТЬ И ЧЕТЫРЕХБАЙТНЫМ, НО НЕ БОЛЕЕ 33 000 000 D
0346 0139 /
0347 0139 POLTORA:
0348 0139 ЕА MOV A,R2
0349 013А FE MOV R6.A
-329-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0350 013В Е9 MOV A,R1
0351 013С FD MOV R5,A
0352 013D Е8 MOV A,R0
0353 013Е FC MOV R4ZA ;ПЕРЕНЕСЛИ ЧИСЛО В R6R5R4
0354 013F 7В 00 MOV R3,#0
0355 0141 12 01 06 LCALL POSR3_0 ;BCE ЧИСЛО В R3-R0 СДВИНУЛИ
/ВПРАВО НА 1 РАЗР.
0356 0144 Е8 MOV A,R0
0357 0145 2С ADD A,R4
0358 0146 FC MOV R4,A
0359 0147 Е9 MOV A,R1
0360 0148 3D ADDC A,R5
0361 0149 FD MOV R5,A
0362 014А ЕА MOV A,R2
0363 014В ЗЕ ADDC A,R6
0364 014С FE MOV R6,A
0365 014D ЕВ MOV A,R3
0366 014Е 34 00 ADDC A,#0
0367 0150 FF MOV R7,A
0368 0151 12 01 06 LCALL POSR3_0 ;BCE ЧИСЛО-В R3-R0 СДВИНУЛИ
/ВПРАВО HA 1 PA3P.
0369 0154 12 01 06 LCALL POSR3_0 ;BCE ЧИСЛО В R3-R0 СДВИНУЛИ
/ВПРАВО HA 1 PA3P.
0370 0157 СЗ CLR C
0371 0158 EF MOV A,R7
0372 0159 9В SUBB A,R3
0373 015А FB MOV R3,A
0374 015В ЕЕ MOV A,R6
0375 015С 9А SUBB A,R2
0376 015D FA MOV R2,A
0377 015Е ED MOV A,R5
0378 015F 99 SUBB A,R1
0379 0160 F9 MOV R1,A
0380 0161 ЕС MOV A,R4
0381 0162 98 SUBB A,R0
0382 0163 F8 MOV R0,A
0383 0164 22 RET
0384 0165 ;
0385 0165 ; ;ПРОГРАММА ПРЕОБРАЗОВАНИЯ ЧЕТЫРЕХБАЙТНОГО ДВОИЧНОГО
:ЧИСЛА
0386 0165 ; ;В ДВОИЧНО-ДЕСЯТИЧНОЕ. ВХОДНОЕ ЧЕТЫРЕХБАЙТНОЕ ЧИСЛО В
:R3R2R1RO,
0387 0165 ; ‘РЕЗУЛЬТАТ В ТЕТРАДАХ DPLdO-Й И 9-Й PA3P.)Z R7R6R5R4
;(ОСТАЛЬНЫЕ)
0388 0165 ;
0389 0165 BN2BCD32:
330-
3.4. Программирование микроконвертера
0390 0165 75 F0 20 MOV В,#32
0391 0168 74 00 MOV A,#0
0392 016А FC MOV R4,A
0393 016В FD MOV R5,A
0394 016С FE MOV R6,A
0395 -016D FF MOV R7,A
0396 016E F5 82 MOV DPL, A
0397 0170 ] BN2CKL32:
0398 0170 E8 MOV A,R0
0399 0171 28 ADD A,R0
0400 0172 F8 MOV R0,A
0401 0173 E9 MOV A,R1
0402 0174 39 ADDC A,R1
0403 0175 F9 MOV R1,A
0404 0176 ЕА MOV A,R2
0405 0177 ЗА ADDC A,R2
0406 0178 FA MOV R2,A
0407 0179 ЕВ MOV A,R3
0408 017А ЗВ ADDC A,R3
0409 017В FB MOV R3,A
0410 017С ;ДВОИЧНО-ДЕСЯТИЧНОЕ УДВОЕНИЕ СУММЫ С УЧЁТОМ ПЕРЕНОСА
0411 017С ЕС MOV A,R4
0412 017D ЗС ADDC A,R4
0413 017Е D4 DA A
0414 017F FC MOV R4,A
0415 0180 ED MOV A,R5
0416 0181 3D ADDC A,R5
0417 0182 D4 DA A
0418 0183 FD MOV R5,A
0419 0184 ЕЕ MOV A,R6
0420 0185 ЗЕ ADDC A,R6
0421 0186 D4 DA A
0422 0187 FE MOV R6,A
0423 0188 EF MOV A,R7
0424 0189 3F ADDC A,R7
0425 018А D4 DA A
0426 018В FF MOV R7,A
0427 018С Е5 82 MOV A, DPL
0428 018Е 35 82 ADDC A, DPL
0429 0190 D4 DA A
0430 0191 F5 82 MOV DPL, A
0431 0193 ;ПРОВЕРКА КОНЦА ЦИКЛА:
0432 0193 D5 F0 DA DJNZ B,BN2CKL32
0433 0196 22 RET
0434 0197
-331
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО TOKAHAADUC824
0435 0197
0436 0197
0437 0197
0438 0197 ;ЗАДЕРЖКА 20 мс
0439 0197 « * * * * *
0440 0197
0441 0197 DEL20:
0442 0197 79 FD MOV Rl,#0FDH
0443 0199 7А 26 LPEX: MOV R2,#26H
0444 019В DA FE LPIN: DJNZ R2,LPIN
0445 019D D9 FA DJNZ Rl, LPEX
0446 019F 22 RET
0447 01А0
0448 01А0
0449 01А0 DELIS:
0450 01А0 31 AD ACALL DEL02S
0451 01А2 31 AD ACALL DEL02S
0452 01А4 31 В7 ACALL DEL01S
0453 01А6 DEL05S:
0454 01А6 31 AD ACALL DEL02S
0455 01А8 31 AD ACALL DEL02S
0456 01АА 31 В7 ACALL DEL01S
0457 01 АС 22 RET
0458 01AD ,*
0459 01AD DEL02S:
0460 01AD 31 97 ACALL DEL20
0461 01AF 31 97 ACALL DEL20
0462 01В1 31 97 ACALL DEL20
0463 01ВЗ 31 97 ACALL DEL20
0464 01В5 31 97 ACALL DEL20
0465 01В7 DEL01S:
0466 01В7 31 97 ACALL DEL20
0467 01В9 31 97 ACALL DEL20
0468 01ВВ 31 97 ACALL DEL20
0469 01BD 31 97 ACALL DEL20
0470 01BF 31 97 ACALL DEL20
0471 01С1 22 RET
0472 01С2
0473 01С2 DEL5S:
0474 01С2 31 А6 ACALL DEL05S
0475 01С4 31 А6 ACALL DEL05S
0476 01С6 31 А6 ACALL DEL05S
0477 01С8 31 Аб ACALL DEL05S
0478 01СА 31 А6 ACALL DEL05S
0479 01СС 31 А6 ACALL DEL05S
0480 01СЕ DEL2S:
0481 01СЕ 31 Аб ACALL DEL05S
0482 01D0 31 Аб ACALL DEL05S
0483 01D2 31 Аб ACALL DEL05S
0484 01D4 31 Аб ACALL DEL05S
— 332 -
3.4. Программирование микроконвертера
0485 01D6 22 RET
0486 01D7
0487 01D7
0488 01D7 ;.ORG 01000H
0489 0800 .ORG 00800H
0490 0800 .END
tasm: Number of errors = 0
Сначала для любимого мной ассемблера TASM я определяю адреса ре-
гистров и их отдельных битов, а также некоторые дополнительно исполь-
зуемые программой адреса и константы.
Собственно программа начинается с загрузки единиц во все выходные
регистры-защёлки портов РО...РЗ. Далее в регистр PLLCON я загружаю О,
что переводит ядро микроконтроллера на работу на тактовой частоте
12.58 МГц.
В шестой строке программы (строка 113 листинга) стоит отключенная
точкой с запятой команда MOV SF, #245. Пока перед ней стоит упомяну-
тая точка с запятой, значение SF по умолчанию равно 45Н — 69D. Послед-
нее обеспечивает скорость измерения около 20 Гц, или время измерения
порядка 50 мс.
Если убрать эту точку с запятой, то в SF будет записано число 245D, и
скорость измерения снизится ещё примерно в 4 раза, а время измерения
возрастёт до 200 мс. Ниже я буду сравнивать результаты измерения при
SF = 69 и SF = 245.
Дальше в программе идут описанные выше калибровка нуля и калиб-
ровка полной шкалы. После этого вызывается одна из подпрограмм
измерения — одиночного (в данном случае), с усреднением по 256 результа-
там (если убрать точку с запятой из начала строки с командой
LCALL IZMN256 и поставить её перед командой LCALL IZMER24) или с
усреднением по 16 результатам (LCALL IZMN256 заменить на
LCALL IZMN16, перенеся точку с запятой в строку с LCALL IZMER24).
Как уже упоминалось, после завершения любой из этих трёх подпрограмм
24-битный результат оказывается в регистрах R2...R0.
Далее командой LCALL POLTORA вызывается подпрограмма масшта-
бирования, необходимость которой была описана выше. Правда, реально
она умножает сигнал не в 1.49 раза, а в 1.375 раза. Необходимость измене-
ния коэффициента масштабирования выяснилась на этапе отладки уст-
ройства. Дело в том, что входное сопротивление ADuC824 хотя и довольно
высоко (порядка 20 кОм), но близко к сопротивлению резистора, с кото-
рого снимается измеряемый сигнал (18 кОм). В итоге этот резистор шун-
тируется входным каскадом ADuC824, и измеряемый сигнал оказывается
примерно равным 1.8 В (вместо 2 В по расчёту). В нашем случае это не иг-
рает никакой роли, но тем, кто собирается использовать эту микросхему в
-333 -
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
своих разработках, рекомендую помнить о её относительно невысоком
входном сопротивлении, которое может потребовать применения предва-
рительного каскада на ОУ или инструментальном усилителе.
Собственно умножение в 1.375 раза я осуществляю по вышеприведён-
ному рецепту — сначала сохраняю исходный результат в регистрах R6...R4,
затем содержимое R3...R0 подпрограммой POSR3_0 сдвигаю на 1 бит
вправо (делю на 2) и прибавляю к сохраненному (умножаю исходный ре-
зультат на 1.5). Затем содержимое R3...R0 ещё раз дважды сдвигаю вправо
(делю ещё на 4, т. е. в итоге на 8) и вычитаю его из хранящегося в R6...R4
увеличенного в 1.5 раза исходного результата. Увеличенный таким образом
в 1.375 раза исходный результат размещен в регистрах R3...R0. Отмечу, что
полученный после такого масштабирования результат вполне может быть
и четырёхбайтным, но в любом случае он не более 25000000, т. е. вписыва-
ется в 8 десятичных разрядов.
После процедуры масштабирования командой LCALL BN2BCD32 вы-
зывается подпрограмма преобразования результата из двоичного формата
в двоично-десятичный.
Упомянутая подпрограмма преобразовывает четырёхбайтное двоич-
ное число в 10-разрядное двоично-десятичное. Старший разряд двоично-
десятичного числа хранится в старшей тетраде регистра DPL, следующий
по старшинству разряд — в младшей тетраде DPL, следующий разряд — в
старшей тетраде R7, идущий за ним — в младшей тетраде R7 и т. д. Самый
младший разряд, как нетрудно вычислить, находится в младшей тетраде
регистра R4.
Подпрограмма преобразования построена аналогично описанной на
стр. 116...118 третьего тома подпрограмме B16BCDD, но в ней изменены
порядок расположения в теле подпрограммы операции выдвижения оче-
редного бита в CY и операции двоично-десятичного суммирования. В ре-
зультате подпрограмма избавилась от лишних переходов — на работоспо-
собности это никак не отразилось, но, с точки зрения программиста, она
стала, если хотите, элегантнее (новички, привыкайте!).
После преобразования 8-разрядное (см. выше) двоично-десятичное
число заносится в ОЗУ экранной области (ячейки с адресами
AD00+0...AD00+7, младший разряд в AD00+0). Содержимое этих ячеек
подпрограмма INDVIV24 отображает на экране любимого мной за свою
незамысловатость индикатора НТ1610.
После вызова этой подпрограммы стоят несколько вызовов подпро-
граммы задержки длительностью 1 с — они необходимы для того, чтобы
можно было считывать с индикатора результаты измерения. Если ваше ус-
тройство должно выдавать результаты измерения с максимально возмож-
ной скоростью не на индикатор, а в последовательный (или какой-либо
иной) порт, подобные задержки вам не нужны.
-334-
3.5. Запись программы пользователя в микроконвертер ADUC824
3.5. Запись программы пользователя в микроконвертер
ADUC824
Теперь рассмотрим, каким образом программируются микроконверте-
ры от Analog Devices. На сайте фирмы я нашел инсталляционную програм-
му WSD_V6_06.exe, при запуске которой инсталлируется программа-за-
грузчик wsd.exe.
Микроконвертер должен быть подключен к последовательному порту
С0М1 или COM2 стандартным кабелем через разъём XI (Рис. 3.1). Доста-
точно всего трёх проводов — общий (земля), RxD и TxD. На плату с мик-
роконвертером должно подаваться питание от независимого источника.
Для того чтобы запрограммировать микроконвертер, перед подачей пита-
ния нужно замкнуть на землю вывод PSEN# микроконвертера, нажав
кнопку S1, а отпустить её через пару секунд после того, как питание будет
подано.
Окно программы при запуске выглядит, как показано на Рис. 3.2.
Далее нужно задать конфигурационные параметры, нажав кнопку
«Configuration». При этом появляется окно, показанное на Рис. 3.3. Боль-
Рис. 3.2. Основное окно программы wsd.exe.
-335-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
шинство параметров установлено правильным образом по умолчанию, по-
этому я только лишь устанавливал номер СОМ-порта, к которому подклю-
чена плата с микроконвертером. Нажав «ОК», возвращаемся в основное
окно.
я
1 •:
Рис. 3.3. Окно выбора конфигурационных параметров.
а
Проверить правильность настройки можно нажатием кнопки
«Reset» — если всё хорошо, на экране высветится строка «RESETTING
PART ОК» с рядом параметров. В противном случае, помимо информации
о том, что сброс не прошел, появится окно, в котором будут описаны воз-
можные варианты неисправностей.
Если программа wsd.exe обнаружила подключенный микроконвертер,
кнопки «Download» и «Run» будут активными, если нет — недоступными.
Для того чтобы загрузить программу в микроконвертер, нужно нажать
«Download». Появится окно меню, в нём вы должны выбрать программу,
которую предстоит записать в микроконвертер (см. Рис. 3.4). Процедура
нахождения нужной папки — стандартная для Windows.
Загружаемая программа должна быть в НЕХ-формате. Для тех, кто
пользуется любимым мной ассемблером TASM, скажу, что информация о
том, как оттранслировать программу в НЕХ-формат, приведена на стр. 41
- 336 -
3.5. Запись программы пользователя в микроконвертер ADUC824
verter
jer (V6.06)
824 version 2.30
Jun Файнов: | Hex Files ( Hex|
Отмена
ADUC1 НЕа
м}АХ’С10Ь?<
MjAC’iJCll Ь»
*]ADUCl2he>;
*]ADUC1 Sliex
*]ADUC14hex
2*JADU(?.5hex
^ADUCZO hex
_*]ADUC3F«x
^.ADUClhex
*]ADUC5hex
^ADUCGhex
*]ADUC7hex
%]ADiJC8.hex
-hACUC151.hex
VtlLCIEhex
>i]ADllC17r.ex
4)APUC18hex
4]ADUC181 hex
^ADUCIShex
4)ADUC2 hex
Configuiaticn CC'W2.О’’-СЮ baud
RESETTING PART OFL
ERASING CODE AND DATA GFI
Рис. 3.4. Окно выбора НЕХ-файла для загрузки в микроконвертер.
первого тома настоящей книги. Добавлю только, что вне зависимости от
того, в какой из форматов будет оттранслирован исходный ассемблерный
файл, TASM присвоит ему расширение .obj, и переименовать его в *.hex
затем нужно вручную.
Выбрав НЕХ-файл для загрузки, нажимаем «Открыть» — и происходит
загрузка программы, сопровождаемая бегущей строкой и соответствую-
щей текстовой информацией в окне программы (см. Рис. 3.5). Если после
завершения этой операции нажать кнопку «Run», загруженная в микро-
конвертер программа запустится на выполнение.
Повторная загрузка потребует отключение питания от платы микро-
конвертера, нажатия перед подачей питания кнопки S1 и т. д., т. е. всех тех
действий, которые описаны в начале настоящего раздела.
В общем процедура программирования микроконвертера, как видите,
очень проста, и не требует приобретения новых аппаратных средств (в час-
тности, нового программатора). Это выгодно его отличает от остальных
известных мне микроконтроллеров семейства х51. К недостаткам ADuC я
бы отнес только отсутствие в нем хотя бы простейшего встроенного аппа-
ратного отладчика, общающегося с компьютером по тому же СОМ-порту.
-337-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Рис. 3.5. Программирование микроконвертера.
3.6. Исследование 24-битного АЦП микроконвертера
ADUC824
Теперь давайте рассмотрим, как себя вёл основной АЦП микроконвер-
тера во время моего исследования.
Приведённая в подразд. 3.4.3 программа модифицировалась десяток
раз для того, чтобы осуществлять последовательные циклы измерений с
отображением со следующими параметрами:
• одиночное измерение с длительностью измерения 50 мс при такто-
вой частоте ядра 12.6 МГц;
• одиночное измерение с длительностью измерения 200 мс при такто-
вой частоте ядра 12.6 МГц;
• измерение с усреднением по 16 результатам с длительностью каждо-
го измерения 50 мс при тактовой частоте ядра 12.6 МГц;
-338-
3.6. Исследование 24-битного АЦП микроконвертера ADUC824
• измерение с усреднением по 16 результатам с длительностью каждо-
го измерения 200 мс при тактовой частоте ядра 12.6 МГц;
• измерение с усреднением по 256 результатам с длительностью каж-
дого измерения 50 мс при тактовой частоте ядра 12.6 МГц;
• измерение с усреднением по 256 результатам с длительностью каж-
дого измерения 200 мс при тактовой частоте ядра 12.6 МГц;
• измерение с усреднением по 256 результатам с длительностью каж-
дого измерения 50 мс при тактовой частоте ядра 1.57 МГц;
• одиночное измерение с длительностью каждого измерения 50 мс при
тактовой частоте ядра 98 кГц.
Как отмечалось, одиночное измерение реализовывалось вызовом под-
программы IZMER24, измерение с усреднением по 16 результатам — вызо-
вом подпрограммы IZMN16, измерение с усреднением по 256 результатам —
вызовом IZMN2 56. Функционирование ядра на частоте 12.6 МГц обеспечи-
валось командой MOV PLLCON,#0. Отключение («закомментирование»)
этой команды путём записи в тексте программы непосредственно перед ней
точки с запятой обеспечивало работу микроконвертера на частоте по умол-
чанию (см. Табл. 3.6), а загрузка в PLLCON числа #0FFH обеспечивала фун-
кционирование ядра на частоте 98 кГц.
Увеличение времени измерения до 200 мс осуществлялось путём запи-
си в регистр SF командой MOV SF, #245 числа 245 (для активирования ко-
манды убиралась точка с запятой, стоящая перед ней в тексте программы).
Как уже говорилось, пока команда MOV SF, #245 закомментирована, зна-
чение SF по умолчанию равно 45Н = 69d, что задает время измерения по-
рядка 50 мс.
На Рис. 3.6 и 3.7 приведены результаты одиночных измерений при час-
тоте ядра 12.6 МГц. В первом случае (время измерения 50 мс) результат из-
мерения колеблется в пределах 1.7910538...1.7910627 В, среднее значение
составляет 1.7910579 В. Во втором случае (время измерения 200 мс) резуль-
тат измерения колеблется в диапазоне 1.7910572...1.7910647 В, среднее
значение составляет 1.7910598 В. В обоих случаях между измерениями де-
лалась 5-секундная задержка.
Примечание. На Рис. 3.6...3.17 ось абсцисс представляет собой условную вре-
менную шкалу, а по оси ординат отложены результаты измерений АЦП (отсчё-
ты), масштабированные следующим образом: из результата измерения вычита-
ется 1.79 В, собственно умноженное на 1000 значение остатка и есть та величи-
на, которая приведена на графиках. Например, указанному на Рис. 3.6
значению 1.063 соответствует результат измерения АЦП 1.791063 В.
Из Рис. 3.6 и 3.7 видно, что в обоих случаях разброс результатов от из-
мерения к измерению достаточно велик — почти 10.0 мкВ в первом случае
и 7.4 мкВ — во втором. Если перевести эти величины (разделив на 1.375) в
-339-
340
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Рис. 3.6. Одиночные измерения, частота ядра 12.6 МГц, время измерения 50 мс, интервал между измерениями 5 с.
Рис. 3.7. Одиночные измерения, частота ядра 12.6 МГц, время измерения 200 мс, интервал между измерениями 5 с.
•.6. Исследование 24-битного АЦП микроконвертера AJDUC82
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
единицы АЦП, то разброс составит 72 и 54 единицы соответственно.
С учётом того что изменение на 64 единицы означает разброс в шести
младших битах (26 = 64), можно сделать вывод, что разрешение в битах при
времени измерения 50 мс составляет чуть менее 24 - 6 = 18 бит, а при вре-
мени измерения 200 мс — чуть более 18 бит. Это очень близко к парамет-
рам, заявленным самой Analog Devices, — 18.5 и 19.2 бита соответственно.
Особенно с учётом того, что заявленные цифры специфицированы для ра-
боты в биполярном режиме, а в униполярном, если судить по характерис-
тикам дополнительного АЦП, результат оказывается на 1 бит хуже. Таким
образом, по результатам моих измерений я могу сделать по крайней мере
два вывода. Во-первых, получено ровно то, что Analog Devices нам обещает
в спецификации на микросхему (и это здорово, что цифрам в специфика-
ции можно доверять!). А во-вторых, несмотря на то что рассматриваемый
АЦП 24-битный, нужно помнить, что реальное его разрешение всего
18 бит или даже чуть хуже. Большего от ADuC824 Analog Devices нам, увы,
не обещала.
На Рис. 3.8...3.10 приведены результаты измерений с усреднением по
16 отсчётам при частоте ядра 12.6 МГц. В первом случае (время одиночного
измерения 50 мс) результат измерения колеблется в пределах от 1.7910553
до 1.7910622 В, среднее значение составляет 1.7910589 В. Во втором случае
(время одиночного измерения 200 мс) результат измерения колеблется в
пределах от 1.7910549 до 1.7910596 В, среднее значение составляет
1.7910571 В. В первом случае интервал между измерениями составлял 5 с,
во втором — 7 с.
Из Рис. 3.8 и 3.9 видно, что в обоих случаях разброс результатов от се-
рии к серии по-прежнему достаточно велик — почти 7 мкВ в первом слу-
чае и 4.7 мкВ — во втором. Если перевести эти величины (разделив на
1.375) в единицы АЦП, то разброс составит 50 и 34 единицы соответствен-
но. Сравнив это с предыдущими результатами, мы можем сделать вывод:
усреднение по 16 отсчётам улучшает разрешение АЦП примерно на
полбита.
На Рис. 3.10 приведены результаты измерений с усреднением по 16 от-
счётам при частоте ядра 12.6 МГц и времени одиночного измерения 50 мс.
Эти результаты получены при параметрах, соответствующих Рис. 3.9, но
спустя несколько дней после получения результатов, приведённых на
Рис. 3.9. Как видно, результат измерения колеблется в тех же пределах (от
1.7910547 до 1.7910610 В, среднее значение составляет 1.7910570 В — срав-
ните с полученным ранее 1.7910571 В!). Повторяемость, как мы видим, хо-
рошая, хотя разброс от измерения к измерению, как отмечалось, очень ве-
лик.
На Рис. 3.11, 3.12 приведены результаты измерений с усреднением по
256 отсчётам при частоте ядра 12.6 МГц. В первом случае (время одиночно-
-342-
343
Рис. 3.8. Измерения с усреднением по 16 результатам, частота ядра 12.6 МГц, время измерения 50 мс, интервал между измерениями 5 с.
3.6. Исследование 24-битного АЦП микроконвертера ADUC824
344
Рис. 3.9. Измерения с усреднением по 16 результатам, частота ядра 12.6 МГц, время измерения 200 мс,
интервал между измерениями 7 с.
Diana 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Рис. 3.10. Повторные измерения с усреднением ио 16 результатам, частота ядра 12.6 МГц, время измерения 200 мс,
интервал между измерениями 7 с.
346
Рис. 3.11. Измерения с усреднением по 256 результатам, частота ядра 12.6 МГц, время измерения 50 мс,
интервал между запусками измерений 13 с.
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
347
Рис. 3.12. Измерения с усреднением по 256 результатам, частота ядра 12.6 МГц, время измерения 200 мс,
интервал между запусками измерений 47 с.
3.6. Исследование 24-битного АЦП микроконвертера ADUC824
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
го измерения 50 мс) результат измерения колеблется в пределах от
1.7910559 до 1.7910614 В, среднее значение составляет 1.7910585 В. Во вто-
ром случае (время одиночного измерения 200 мс) результат измерения ко-
леблется в пределах от 1.7910550 до 1.7910594 В, среднее значение состав-
ляет 1.7910577 В. В первом случае интервал между запусками серий изме-
рений составлял 13 с, во втором — 47 с.
Из Рис. 3.11,3.12 видно, что в обоих случаях разброс результатов от се-
рии к серии по-прежнему достаточно велик — 5.5 мкВ в первом случае и
4.4 мкВ — во втором. Если перевести эти величины (разделив на 1.375) в
единицы АЦП, то разброс составит 40 и 32 единицы соответственно.
Результат удивительный. При усреднении по 256 отсчётам внешнего (по
отношению к микроконтроллеру) АЦП, будь то обычный АЦП
последовательного приближения типа ADS7816 или сигма-дельта АЦП
AD7714, после усреднения по 256 отсчётам разброс результатов у меня
обычно не превышал 1...2 единиц. А здесь — более 30. И характер измене-
ний результатов таков, что дальнейшее накопление выглядит практически
бессмысленным, так как увеличение количества накапливаемых результа-
тов в 16 раз даёт в выигрыш в лучшем случае в 0.5 бита.
Объяснить это можно, наверное, тем, что АЦП и микроконтроллер ра-
ботают синхронно, а подавить синхронную помеху таким простым спосо-
бом, как усреднение, невозможно. Иными словами, это плата зато, что мы
вместо двух корпусов (AD7714 и х51) имеем один, в котором эти узлы рас-
положены очень близко друг к другу и питаются от одного источника.
Дальше мне представлялось интересным посмотреть, улучшится ли
разрешение АЦП при снижении тактовой частоты ADuC824. Известно,
что для КМОП-микросхем, к которым принадлежит микроконвертер, сни-
жение тактовой частоты приводит к уменьшению энергопотребления (а
следовательно, и возможного излучения от ядра микроконвертера). На
Рис. 3.13 приведены результаты измерений с усреднением по 256 отсчётам
при частоте ядра 1.57 МГц. Время одиночного измерения составляет 50 мс,
результат измерения колеблется в пределах от 1.7910885 до 1.7910922 В,
среднее значение составляет 1.7910907 В. Интервал между запусками се-
рий измерений составлял 26 с.
Разброс от показания к показанию ещё слегка уменьшился, но по-пре-
жнему велик. Характер изменений остался тем же. Но выявился ещё один
аспект — снижение тактовой частоты ядра привело к некоторому росту по-
казаний при неизменной величине входного сигнала. В общем это можно
объяснить тем, что при снижении частоты входная ёмкость заряжается до
большей величины, чем на высокой частоте. В остальном же поведение
АЦП микроконвертера осталось тем же, что хорошо видно из Рис. 3.14, на
котором приведены результаты измерения при частоте ядра 1.57 МГц (вер-
хняя кривая) и 12.6 МГц (нижняя кривая).
-348-
349
Рис. 3.13. Измерения с усреднением по 256 результатам, частота ядра 1.57 МГц, время измерения 50 мс,
интервал между запусками измерений 26 с.
3.6. Исследование 24-битного АЦП микроконвертера ADUC824
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Как следует из Табл. 3.6, самой низкой из частот, на которых может ра-
ботать ADuC824, является 98 кГц. Естественно, для окончательного пони-
мания, каково влияние тактовой частоты ядра на разрешение основного
АЦП микроконвертера, было бы интересно оценить работу ADuC824 на
частоте 98 кГц.
На Рис. 3.15, 3.16 приведены результаты одиночных измерений при
частоте ядра 98 кГц, время измерения 50 мс. В первом случае результат из-
мерения колеблется в пределах 1.7910995...1.7911265 В, среднее значение
составляет 1.7911076 В. Во втором случае результат измерения колеблется
в пределах 1.7911104...1.7911285 В, среднее значение составляет
1.7911088 В. В обоих случаях интервал между сериями измерений состав-
лял 2 с.
Измерения, изображённые на Рис. 3.16, получены спустя 4 часа после
приведённых на Рис. 3.15. Обращает на себя внимание несколько различ-
ный характер кривых: первая — достаточно сильно изрезана, с одним зна-
чительным выбросом, превышающим остальные показания примерно на
20 мкВ; вторая более гладкая, но таких выбросов больше.
На высоких частотах ядра подобные выбросы отсутствовали. Как-либо
объяснить их происхождение я не могу. Очевидно, что это не могут быть
просто наводки на АЦП со стороны ядра — если мы их увидели на 98-ки-
логерцовой частоте ядра, на более высоких частотах мы должны были бы
увидеть их в не меньшем количестве, чем на 98 кГц.
Характер появления выбросов — нерегулярный. Иногда они проявля-
ются редко — раз в минуту, иногда идут в 5...7 раз чаще. Промежутки, когда
они учащаются, также весьма нерегулярны — от минуты до десятка и более
минут. Почти всегда пара таких выбросов наблюдается при старте про-
граммы сразу после подачи питания.
Столь нерегулярный характер таких выбросов и их обязательное нали-
чие при старте программы наводит на мысль, что причина их возникно-
вения связана с биениями, возникающими в системе с двумя близкими
частотами. Одна частота в 32 кГц фиксированна, другая, вырабатываемая
системой ФАПЧ, — кратна ей, но подвержена небольшим отклонениям
от основного значения в ту или иную сторону. Таким образом, 32-кило-
герцовая гармоника системы ФАПЧ также несколько «гуляет», и биения
между этими частотами каким-то образом сказываются на работе АЦП.
При этом на более высоких частотах система ФАПЧ работает устойчивее
(что вполне объяснимо), поэтому нет столь резких выбросов, как на
98 кГц. Также объясним и нерегулярный характер появления этих
биений — система ФАПЧ отрабатывает любые внешние и внутренние
возмущения, а моменты возникновения тех и других как-либо друг с дру-
гом не связаны.
-350-
Рис. 3.14. Измерения с усреднением по 256 результатам, частота ядра 1.57 МГц (вверху) и 12.6 МГц (внизу).
3.6. Исследование 24-битного АЦП микроконвертера ADUC824
352
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Рис. 3.15. Одиночные измерения, частота ядра 98 кГц, время измерения 50 мс, интервал между измерениями 2 с.
Рис. 3.16. Повторные одиночные измерения, частота ядра 98 кГц, время измерения 50 мс, интервал между измерениями 2 с.
3.6. Исследование 24-битного АЦП микроконвертера ADUC824
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Рис. 3.17. Одиночные измерения, частота ядра 98 кГц (вверху) и 12.6 МГц (внизу).
-354-
3.7. Цифровой вольтметр на ADUC824
На Рис. 3.17 приведены сравнительные результаты измерений на час-
тоте ядра 98 кГц (верхняя кривая) и 12.6 МГц (нижняя кривая). Как и в
предыдущем случае, снижение частоты ядра привело к росту показаний,
причём более значительному, чем снижение частоты с 12.6 до 1.57 МГц.
Это подтверждает вывод о влиянии на результат входной ёмкости. Также
видно, что нижняя кривая не имеет столь больших выбросов, как верхняя.
В то же время в промежутках между выбросами верхняя кривая более глад-
кая, чем нижняя. Это также может быть объяснено влиянием биений — на
более высокой частоте они возникают чаще, но их амплитуда (а следова-
тельно, и воздействие на АЦП) меньше.
Всё сказанное позволяет сделать следующий вывод. На ADuC824 не-
возможно добиться более высокого разрешения, чем специфицированное
самой Analog Devices значение 18...18.5 бит. Для расширения динамичес-
кого диапазона измеряемого сигнала нужно использовать внешний усили-
тель с шумовыми характеристиками, лучшими, чем у микроконвертера.
3.7. Цифровой вольтметр на ADUC824
В завершение темы рассмотрим, как нужно дополнить схему, изобра-
женную на Рис. 3.1, и доработать программу к ней для получения про-
стейшего (но весьма качественного) цифрового вольтметра постоянного
тока.
Доработка аппаратных средств состоит в введении дополнительного
входного каскада на инструментальном усилителе PGA204 фирмы Вшт-
Brown/Texas Instruments. Этот усилитель имеет несколько замечательных
особенностей. Помимо очень хороших точностных характеристик (малое
напряжение смещения нуля, незначительный температурный дрейф вы-
ходного сигнала), он отличается тем, что имеет 4 предела усиления — в 1,
10, 100 и 1000 раз, причём переключение осуществляется не изменением
номиналов резисторов, а подачей соответствующей комбинации логичес-
ких уровней на цифровые входы усилителя АО и А1.
Ещё одна особенность этого усилителя — питать его необходимо на-
пряжением ±15 В. Хотя в спецификации усилителя и написано, что он ра-
ботоспособен от ±4 В, при таком питании его характеристики ухудшаются
настолько, что смысл в его использовании пропадает. Когда я впервые
имел дело с этим усилителем, я подал на него ±7 В и был поражён тем, что
вместо обещанного производителем напряжения смещения нуля порядка
50 мкВ наблюдалось милливольтовое смещение! Также не кратными 10
оказались и коэффициенты усиления при разных комбинациях логичес-
ких сигналов на АО и А1. Я долго возился со схемой, пытаясь понять при-
чину, почему всё настолько хуже, чем описано в спецификации произво-
дителя. И только повысив напряжение питания до номинального уровня
-355-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
(а в спецификации все упомянутые превосходные характеристики огово-
рены именно при ±15 В), я получил то, на что рассчитывал.
Схема входного каскада вольтметра приведена на Рис. 3.18. Управле-
ние коэффициентом усиления в данном случае осуществляется при по-
мощи четырёхпозиционного переключателя S1. При желании можно
осуществлять управление и от микроконвертера, соединив входы АО и А1
с выбранными для управления выводами ADuC824 и соответствующим
образом доработав программу, что позволит снабдить вольтметр автома-
тическим выбором предела измерений. Естественно, при управлении от
микроконвертера переключатель S1 и диоды VD1, VD2 нужно исклю-
чить.
Рис. 3.18. Входной каскад вольтметра.
При соединении с микроконвертером сигнал с движка подстроечного
резистора R3 нужно подать на вход AIN3 микроконвертера, а сигнал с вы-
вода REF усилителя соединить с выходом источника опорного напряже-
ния DA2 (см. Рис. 3.1) и подать на AIN4. Перед этим нужно удалить из схе-
мы на Рис. 3.1 резисторы R3, R4 и отключить вход AIN4 от AGND.
Таким образом, после выполнения описанных подключений на входе
AIN4 будет присутствовать напряжение +2.500 В с выхода DA2. Благодаря
этому диапазон допустимых выходных сигналов PGA204 составляет
±2.49 В (ограничение со стороны входов микроконвертера, сам усилитель
способен выдать ±12.5 В).
-356-
3.7. Цифровой вольтметр на ADUC824
Поскольку описанное подключение входного каскада позволяет вольт-
метру измерять как положительные, так и отрицательные входные сигна-
лы без каких-либо переключений полярности, мы должны использовать
биполярный режим кодирования измеряемого сигнала. Для этого бит
3 UN 10 регистра ADCOCON должен быть установлен в 0. При этом нулево-
му входному сигналу будет соответствовать код 800000Н, сигналу, равному
-Vref, — К°Д 000000Н, а сигналу, равному +Vref, — код 0FFFFFFH.
Соответственно перед отображением результатов измерений, как это
было описано ранее, полученный код нужно масштабировать. В данном
случае масштабный коэффициент будет иным, нежели для униполярного
кодирования. Причина состоит в том, что диапазону кодов от 000000Н до
FFFFFFH теперь соответствует диапазон входных сигналов -2.5...+2.5 В.
И далее при биполярном кодировании самому большому по модулю отри-
цательному сигналу (-2.5 В) соответствует код 000000Н, а самому малому
(примерно —0.1 мкВ) — код 7FFFFFH. Для правильного отображения на
дисплее отрицательных напряжений результат перед масштабированием
нужно преобразовать в дополнительный код (инвертировать младшие 23
бита и затем увеличить полученное значение на 1). Старший, 24-й бит в
данном случае у нас играет роль знакового: когда он равен 0, измеряемое
напряжение отрицательно, когда равен 1 — положительно или равно 0.
Это отличается от общепринятых условий кодирования знаковых чисел,
когда отрицательному числу соответствует единичный знаковый бит, а ну-
левому и положительному — нулевой, но в данном случае это не играет ро-
ли, так как мы не собираемся производить каких-либо арифметических
операций в двоичном коде над отображаемыми на дисплее результатами со
знаком. Этим 24-м битом мы воспользуемся лишь для того, чтобы пра-
вильно отобразить на дисплее минус при измерении отрицательного на-
пряжения.
Ниже приведена программа для цифрового вольтметра.
Программа для цифрового вольтметра
TASM 8051 Assembler. ADUC194 page 1
Speech Technology Incorporated.
0001 0000 ;ИЗ ADUC194
0002 0000
0003 0000
0004 0000 Sc Sc
0005 0000 ; ScTIPOFPAMMA ДЛЯ ЦИФРОВОГО ВОЛЬТМЕТРА HA ADuC824 Sc
0006 0000 ; Sc &
0007 0000 ; Sc Sc Sr Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc &. Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc Sc
0008 0000
-357-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО TOKAHAADUC824
0009 0000 /
0010 0000
ООН 0000 ;АДРЕСА И КОНСТАНТЫ
0012 0000 • ***** 9
0013 0000 9
0014 0000
0015 0000 ADCSTAT .EQU 0D8H ;БИТ 7 - RDY0 (1-КОНЕЦ ПРЕОБР), ;БИТ 5 - CAL (ТАКЖЕ)
0016 0000 ADCMODE .EQU 0D1H ;БИТ 5 - ADC0EN, БИТЫ 2-0 - ;РЕЖИМ
0017 0000 ;(010-ИЗМ, 100--0",101-ШКАЛА)
0018 0000 ADC0CON .EQU 0D2H ;БИТ 6-ВНЕШ.ИОН, БИТЫ 5,4- ;ВХОДЫ(AIN3&4),БИТ 3-УНИП.
0019 0000 ;БИТЫ 2-0 - Кус (МИН - 111, МАКС ООО)
0020 0000 ADC0H . EQU 0DBH
0021 0000 ADC0M .EQU 0DAH
0022 0000 ADC0L .EQU 0D9H
0023 0000 PLLCON .EQU 0D7H
0024 0000 SF .EQU 0D4H
0025 0000 R7 . EQU 7
0026 0000 R6 . EQU 6
0027 0000 R5 . EQU 5
0028 0000 R4 .EQU 4
0029 0000 R3 . EQU 3
0030 0000 R2 . EQU 2
0031 0000 R1 .EQU 1
0032 0000 R0 . EQU 0
0033 0000 АСС .EQU ОЕОН
0034 0000 В .EQU 0F0H
0035 0000 PSW .EQU 0D0H
0036 0000 SP .EQU 81Н
0037 0000 DPL .EQU 82Н
0038 0000 DPH .EQU 83Н
0039 0000 Р0 .EQU 8ОН
0040 0000 Р1 .EQU 90Н
0041 0000 Р2 .EQU 0A0H
0042 0000 РЗ .EQU ОВОН
0043 0000 В.О .EQU 0F0H
0044 0000 В.1 .EQU 0F1H
0045 0000 В.2 .EQU 0F2H
0046 0000 В.З .EQU 0F3H
0047 0000 В.4 .EQU 0F4H
0048 0000 В.5 .EQU 0F5H
0049 0000 В.6 .EQU 0F6H
0050 0000 В.7 .EQU 0F7H
-358-
3.7. Цифровой вольтметр на ADUC824
0051 0000 АСС.О .EQU 0E0H
0052 0000 АСС.1 .EQU 0Е1Н
0053 0000 АСС. 2 .EQU 0Е2Н
0054 0000 АСС.З .EQU ОЕЗН
0055 0000 АСС. 4 .EQU 0Е4Н
0056 0000 АСС. 5 .EQU 0Е5Н
0057 0000 АСС. 6 .EQU 0Е6Н
0058 0000 АСС. 7 .EQU 0Е7Н
0059 0000 PSW.1 .EQU 0D0H
0060 0000 PSW.1 .EQU 0D1H
0061 0000 PSW.2 .EQU 0D2H
0062 0000 PSW.3 .EQU 0D3H
0063 0000 PSW.4 .EQU 0D4H
0064 0000 PSW.5 .EQU 0D5H
0065 0000 PSW.6 .EQU 0D6H
0066 0000 PSW.7 .EQU 0D7H
0067 0000 РО.О .EQU 080H
0068 0000 Р0.1 .EQU 081H
0069 0000 Р0.2 .EQU 082H
0070 0000 РО.З .EQU 083H
0071 0000 Р0.4 .EQU 084H
0072 0000 Р0.5 .EQU 085H
0073 0000 РО.б .EQU 086H
0074 0000 Р0.7 .EQU 087H
0075 0000 Р1.0 .EQU 090H
0076 0000 Р1.1 .EQU 091H
0077 0000 Р1.2 .EQU 092H
0078 0000 Р1.3 .EQU 093H
0079 0000 Р1.4 .EQU 094H
0080 0000 Р1.5 .EQU 095H
0081 0000 Р1.6 .EQU 096H
0082 0000 Р1.7 .EQU 097H
0083 0000 Р2.0 .EQU 0A0H
0084 0000 Р2.1 .EQU 0A1H
0085 0000 Р2.2 .EQU 0A2H
0086 0000 Р2.3 .EQU 0A3H
0087 0000 Р2.4 .EQU 0A4H
0088 0000 Р2.5 .EQU 0A5H
0089 0000 Р2.6 .EQU 0A6H
0090 0000 Р2.7 .EQU 0A7H
0091 0000 РЗ.О .EQU OBOH
0092 0000 Р3.1 .EQU 0B1H
0093 0000 Р3.2 .EQU 0B2H
0094 0000 РЗ.З .EQU 0B3H
0095 0000 Р3.4 .EQU 0B4H
0096 0000 Р3.5 .EQU 0B5H
359-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0097 0000 P3.6 .EQU 0B6H
0098 0099 0100 0101 0102 0103 0104 0105 0106 0107 0108 0109 ОНО 0111 0112 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 P3.7 CLKIND1 DATIND1 AD00 FLAG HCF MCF LCF /НАЧАЛО • ★ ★ ★ ★ ★ 9 9 75 BO FF .EQU 0B7H .EQU P3.7 .EQU P2.7 .EQU 40H .EQU PSW. 5 .EQU 003H /МАСШТАБИРУЮЩИЙ МНОЖИТЕЛЬ, .EQU 015H /РАВНЫЙ 031500H .EQU 000H ПРОГРАММЫ: .ORG 0 MOV P3,#11111111B
0113 0003 75 90 FF MOV P1,#U1111UB
0114 0006 75 AO FF MOV Р2,ШШШВ
0115 0009 75 80 FF MOV PO,#11111111B
0116 ооос 75 D7 00 MOV PLLCON,#0
0117 0118 0119 0120 000F 000F OOOF 000F /MOV SF SFO: 75 D8 00 ,#245 MOV ADCSTAT,#00000000B /СБРОСИЛИ RDY0 И CAL
0121 0012 75 D2 47 MOV ADCOCON,#01010111B /ВНЕШ.REF, AIN3&4,
0122 0123 0015 0015 12 00 64 /БИП., 2.5 В LCALL KALIBRO /КАЛИБРОВКА НУЛЯ
0124 0018 12 00 6E LCALL KALIBRSH /КАЛИБРОВКА ШКАЛЫ
0125 001В 12 00 EO LCALL IZMN16 /16 ИЗМЕРЕНИЙ С УСРЕДНЕНИЕМ
0126 0127 0128 0129 001E 001E 001E 001E ;LCALL : SF1: 12 01 46 IZMER24 /ОДИНОЧНОЕ ИЗМЕРЕНИЕ В R2R1R0 LCALL PREOBR
0130 0021 12 01 79 LCALL BN2BCD32 /ПРЕОБРАЗОВАЛИ В BCD-ФОРМАТ
0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0024 0024 0025 0026 0028 002A 002B 002D 002F 002F 0030 EF C4 54 OF F5 47 EF 54 OF F5 46 EE C4 MOV A,R7 SWAP А ANL А,#00001111В MOV AD00+7,A MOV A,R7 ANL A,#00001111B MOV AD00+6,A MOV A,R6 SWAP A
-36в-
3.7. Цифровой вольтметр на ADUC824
0142 0031 54 0F ANL A,#00001111B
0143 0033 F5 45 MOV AD00+5,A
0144 0035 ЕЕ MOV A,R6
0145 0036 54 0F ANL A,#00001111B
0146 0038 F5 44 MOV AD00+4,A
0147 ООЗА
0148 003А ED MOV A,R5
0149 003В С4 SWAP A
0150 003С 54 OF ANL A,#00001111B
0151 003Е F5 43 MOV AD00+3,A
0152 0040 ED MOV A,R5
0153 0041 54 OF ANL A,#00001111B
0154 0043 F5 42 MOV AD00+2,A
0155 0045 /
0156 0045 ЕС MOV A,R4
0157 0046 С4 SWAP A
0158 0047 54 OF ANL АЛ00001111В
0159 0049 F5 41 MOV AD00+l,A
0160 004В ЕС MOV A,R4
0161 004С 54 OF ANL A,#000011118
0162 004Е F5 40 MOV AD00+0,A
0163 0050 /
0164 0050 12 00 88 LCALL . INDVIV24
0165 0053 12 01 B4 LCALL . DELIS
0166 0056 12 01 B4 LCALL . DELIS
0167 0059 12 01 B4 LCALL , DELIS
0168 005С 12 01 B4 LCALL . DELIS
0169 005F 12 01 B4 LCALL . DELIS
0170 0062
0171 0062 80 АВ SJMP SFO
0172 0064
0173 0064 ;КАЛИБРОВКА НУЛЯ
0174 0064
0175 0064 KALIBRO:
0176 0064 75 D1 24 MOV ADCMODE,#00100100B ;РАЗРЕШ.ОСН.АЦП, КАЛИБР. 0
0177 0067 LF1:
0178 0067 Е5 D8 MOV A,ADCSTAT
0179 0069 54 20 ANL A,#00100000B
0180 006В 60 FA JZ LF1 /ЖДЕМ КОНЦА КАЛИБРОВКИ
0181 006D 22 RET
0182 006Е /
0183 006Е /КАЛИБРОВКА ШКАЛЫ
0184 006Е
0185 006Е KALIBRSH:
0186 006Е 75 D1 25 MOV ADCMODE,#00100101B /РАЗРЕШ.ОСН.АЦП,
/КАЛИБР.ШКАЛЫ
361-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0187 0071 LF2:
0188 0071 Е5 D8 MOV A,ADCSTAT
0189 0073 54 20 ANL А,#00100000В
0190 0191 0192 0193 0194 0195 0075 60 FA 0077 22 0078 0078 0078 0078 JZ LF2 /ЖДЕМ КОНЦА КАЛИБРОВКИ RET /ОДИНОЧНОЕ ИЗМЕРЕНИЕ IZMER24:
0196 0197 0078 75 D1 007В 22 MOV ADCMODE,#00 /РАЗРЕШ.ОСН.АЦП, ОДИНОЧН.ИЗМЕР. 100010В LF3:
0198 007В Е5 D8 MOV A,ADCSTAT
0199 007D 54 80 ANL А,#10000000 В
0200 0201 007F 60 FA 0081 JZ LF3 /ЖДЕМ КОНЦА ИЗМЕРЕНИЯ
0202 0081 АА DB MOV R2,ADC0H
0203 0083 А9 DA MOV Rl,ADC0M
0204 0205 0206 0207 0208 0209 0210 0085 А8 D9 0087 0087 22 0088 0088 0088 0088 MOV R0,ADC0L /РЕЗУЛЬТАТ ИЗМЕРЕНИЯ В R2-R0 RET INDVIV24:
0211 0088 74 0F MOV A,#0FH
0212 008А А2 D5 MOV C,FLAG /ЧИТАЕМ ИНДИКАТОР ЗНАКА
0213 008С 50 02 JNC INDVIV25 /ПЕРЕХОД ДЛЯ НЕОТРИЦ.РЕЗУЛЬТАТА
0214 0215 008Е 74 0Е 0090 MOV А,#0ЕН /КОД ЗНАКА МИНУС НА ИНДИКАТОРЕ INDVIV25:
0216 0090 11 В7 ACALL SIMBOL1
0217 0092 Е5 47 MOV A,ADO0+7
0218 0094 11 В7 ACALL SIMBOL1
0219 0096 74 0F MOV A,#0FH
0220 0098 11 В7 ACALL SIMBOL1
0221 009А Е5 46 MOV A,AD00+6
0222 009С 11 В7 ACALL SIMBOL1
0223 009Е Е5 45 MOV A,AD00+5
0224 00А0 11 В7 ACALL SIMBOL1
0225 00А2 Е5 44 MOV A,ADO0+4
0226 00А4 11 В7 ACALL SIMBOL1
0227 00А6 Е5 43 MOV A,ADO0+3
0228 00А8 11 В7 ACALL SIMBOL1
0229 00AA Е5 42 MOV A,AD00+2
0230 00AC 11 В7 ACALL SIMBOL1
-362
3.7. Цифровой вольтметр на ADUC824
0231 00AE Е5 41 MOV A,AD00+l
0232 00В0 11 В7 ACALL SIMBOL1
0233 00В2 Е5 40 MOV a,adoo+o
0234 00В4 11 В7 ACALL SIMBOL1
0235 00В6 22 RET
0236 00В7
0237 00В7 SIMBOL1:
0238 00В7 54 0F ANL АЛ00001111В
0239 00В9 В4 00 04 CJNE A,#0,SIMBll
0240 00BC 74 ОА MOV А,Ш
0241 00BE 80 ОС SJMP SIMB13
0242 00С0 В4 OF 04 SIMB11:CJNE A,#0FH,SIMB12
0243 ООСЗ 74 00 MOV A,#0
0244 00С5 80 05 SJMP SIMB13
0245 00С7 В4 ОЕ 02 SIMB12:CJNE A,#0EH,SIMB13
0246 ООСА 74 OF MOV A,#0FH
0247 ООСС SIMB13:
0248 ООСС С2 В7 CLR CLKIND1
0249 ООСЕ С4 SWAP A
0250 00CF 11 D8 ACALL BIT1
0251 00D1 11 D8 ACALL BIT1
0252 00D3 11 D8 ACALL BIT1
0253 00D5 11 D8 ACALL BIT1
0254 00D7 22 RET
0255 00D8
0256 00D8 33 BIT1: RLC A
0257 00D9 92 А7 MOV DATIND1,C ;ВЫВ. ДАННЫХ В ЖК-ДИСПЛЕЙ
0258 00DB D2 В7 SETB CLKIND1 /ИМПУЛЬС ЗАЩЁЛКИВАНИЯ
0259 00DD С2 В7 CLR CLKIND1
0260 00DF 22 RET
0261 ООЕО
0262 ООЕО ;
0263 ООЕО ;
0264 ООЕО ;ПОДПРОГРАММА . ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 16
0265 ООЕО ;ИЗМЕРЕНИЯМ
0266 ООЕО
0267 ООЕО IZMN16:
0268 ООЕО 7F 00 MOV R7,#0
0269 00Е2 7Е 00 MOV R6,#0
0270 00Е4 7D 00 MOV R5,#0
0271 00Е6 7С 00 MOV R4;#0
0272 00Е8 7В 10 MOV R3,#16
0273 ООЕА IZMN16C:
0274 ООЕА 12 00 78 LCALL IZMER24
0275 00ED ЕС MOV A,R4
0276 ООЕЕ 28 ADD A,RO
- 363 -
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0277 00EF FC MOV R4,A
0278 00F0 ED MOV A,R5
0279 00F1 39 ADDC A,R1
0280 00F2 FD MOV R5,A
0281 00F3 ЕЕ MOV A,R6
0282 00F4 ЗА ADDC A,R2
0283 00F5 FE MOV R6,A
0284 00F6 EF MOV A,R7
0285 00F7 34 00 ADDC A,#0
0286 00F9 FF MOV R7,A
0287 00FA DB ЕЕ DJNZ R3,IZMN16C
0288 00FC
0289 00FC EF MOV A,R7
0290 00FD FB MOV R3,A
0291 00FE ЕЕ MOV A,R6
0292 00FF FA MOV R2,A
0293 0100 ED MOV A,R5
0294 0101 F9 MOV R1,A
0295 0102 ЕС MOV A,R4
0296 0103 F8 MOV R0,A
0297 0104
0298 0104 12 01 13 LCALL . POSR3_0
0299 0107 12 01 13 LCALL . POSR3.0
0300 010А 12 01 13 LCALL . POSR3_0
0301 010D 12 01 13 LCALL , POSR3_0
0302 ОНО 7В 00 MOV R3,#0
0303 0112 22 RET
0304 0113
0305 0113 POSR3_0:
0306 0113 СЗ CLR C
0307 0114 ЕВ MOV A,R3
0308 0115 13 RRC A
0309 0116 FB MOV R3,A
0310 0117 ЕА MOV A,R2
0311 0118 13 RRC A
0312 0119 FA MOV R2,A
0313 ОНА Е9 MOV A,R1
0314 011В 13 RRC A
0315 011С F9 MOV R1,A
0316 011D Е8 MOV A,R0
0317 011Е 13 RRC A
0318 011F F8 MOV R0,A
0319 0120 22 RET
0320 0121 /
0321 0121 /
0322 0121 /ПОДПРОГРАММА ИЗМЕРЕНИЯ СИГНАЛА С АЦП С УСРЕДНЕНИЕМ ПО 256
-364-
3.7. Цифровой вольтметр на ADUC824
0323 0121 ;ИЗМЕРЕНИЯМ
0324 0121 /
0325 0121 IZMN256:
0326 0121 7F 00 MOV R7,#0
0327 0123 7Е 00 MOV R6,#0
0328 0125 7D 00 MOV R5,#0
0329 0127 7С 00 MOV R4,#0
0330 0129 7В 00 MOV R3,#0
0331 012В IZMN256C:
0332 012В 12 00 78 LCALL IZMER24
0333 012Е ЕС MOV A, R4
0334 012F 28 ADD A, R0
0335 0130 FC MOV R4, A
0336 0131 ED MOV A,R5
0337 0132 39 ADDC A,R1
0338 0133 FD MOV R5,A
0339 0134 ЕЕ MOV A,R6
0340 0135 ЗА ADDC A,R2
0341 0136 FE MOV R6,A
0342 0137 EF MOV A,R7
0343 0138 34 00 ADDC A,#0
0344 013А FF MOV R7,A
0345 013В DB ЕЕ DJNZ R3,IZMN256C
0346 013D /
0347 013D EF MOV A,R7
0348 013Е FA MOV R2,A
0349 013F ЕЕ MOV A,R6
0350 0140 F9 MOV R1,A
0351 0141 ED MOV A,R5
0352 0142 F8 MOV R0, A
0353 0143 7В 00 MOV R3,#0
0354 0145 22 RET
0355 0146
0356 0146 /ПРОГРАММА ПРЕОБРАЗОВАНИЯ ОТРИЦАТЕЛЬНОГО РЕЗУЛЬ-
0357 0146 ТАТА, УСТАНОВКИ/СБРОСА ИНДИКАТОРА ЗНАКА, ПРЕОБ-
0358 0146 РАЗОВАНИЯ ОТРИЦАТЕЛЬНОГО РЕЗУЛЬТАТА В ДОПОЛНИ-
0359 0146 ТЕЛЬНЫЙ КОД,УМНОЖЕНИЯ НА ТРЁХБАЙТНОЕ ЧИСЛО
0360 0146 ;HCF,MCF,LCF И ДЕЛЕНИЯ НА 65536
0361 0146 /
0362 0146 PREOBR:
0363 0146 С2 D5 CLR FLAG /СБРОС ИНДИКАТОРА ЗНАКА
0364 0148 ЕА MOV A,R2
0365 0149 54 80 ANL А, #100000008/ВЫДЕЛЕНИЕ ЗНАКА
0366 014В 70 15 JNZ SF2 /ПЕРЕХОД ЕСЛИ НЕОТРИЦАТ.
0367 014D D2 D5 SETB FLAG /УСТ. ИНДИК. - ЗНАК
0368 014F ЕА MOV A,R2 /ИНВЕРТИРУЕМ РЕЗУЛЬТАТ И
365-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0369 0150 F4 CPL A /УВЕЛИЧИВАЕМ ЕГО НА 1
0370 0151 FA MOV R2,A
0371 0152 Е9 MOV A,R1
0372 0153 F4 CPL A
0373 0154 F9 MOV R1,A
0374 0155 Е8 MOV A,R0
0375 0156 F4 CPL A
0376 0157 24 01 ADD A,#l
0377 0159 F8 MOV R0,A
0378 015А Е9 MOV A,R1
0379 015В 34 00 ADDC A,#0
0380 015D F9 MOV R1,A
0381 015Е ЕА MOV A,R2
0382 015F 34 00 ADDC A,#0
0383 0161 FA MOV R2,A
0384 0162 SF2:
0385 0162 ЕА MOV A,R2
0386 0163 54 7F ANL A,# 01111111В/ИСКЛ.3НАКОВОГО БИТА
0387 0165 F5 F0 MOV В,A /РЕЗУЛЬТАТ В BR1R0
0388 0167
0389 0167 7С 03 MOV R4,#HCF
0390 0169 7В 15 MOV R3,#MCF
0391 016В 7А 00 MOV R2,#LCF
0392 016D 12 01 EB LCALL MUL 63 /ПРОИЗВЕДЕНИЕ В R7-R2
0393 0170 ЕС MOV A,R4 /ДЕЛИМ НА 65536,
0394 0171 F8 MOV R0,A /ОТБРАСЫВАЯ 2 МЛАДШИХ
0395 0172 ED MOV A,R5 /БИТА
0396 0173 F9 MOV R1,A
0397 0174 ЕЕ MOV A,R6
0398 0175 FA MOV R2,A
0399 0176 EF MOV A,R7
0400 0177 FB MOV R3,A /РЕЗУЛЬТАТ В R3-R0
0401 0178 22 RET
0402 0179 /
0403 0179 /ПРОГРАММА ПРЕОБРАЗОВАНИЯ ЧЕТЫРЕХБАЙТНОГО ДВОИЧНОГО
/ЧИСЛА
0404 0179 /В ДВОИЧНО-ДЕСЯТИЧНОЕ. . ВХОДНОЕ ЧЕТЫРЕХБАЙТНОЕ ЧИСЛО В
/R3R2R1R0,
0405 0179 /РЕЗУЛЬТАТ В ТЕТРАДАХ DPLdO-Й И 9-Й РАЗР.), R7R6R5R4
/(ОСТАЛЬНЫЕ)
0406 0179
0407 0179 BN2BCD32:
0408 0179 75 F0 20 MOV В,#32
0409 017С 74 00 MOV A,#0
0410 017Е FC MOV R4,A
0411 017F FD MOV R5,A
-366-
3.7. Цифровой вольтметр на ADUC824
0412 0180 FE MOV R6,A
0413 0181 FF MOV R7,A
0414 0415 0182 F5 82 0184 MOV BN2CKL32: DPL, A
0416 0184 Е8 MOV A,R0
0417 0185 28 ADD A,R0
0418 0186 F8 MOV R0,A
0419 0187 Е9 MOV A,R1
0420 0188 39 ADDC A,R1
0421 0189 F9 MOV R1,A
0422 018А ЕА MOV A,R2
0423 018В ЗА ADDC A,R2
0424 018С FA MOV R2,A
0425 018D ЕВ MOV A,R3
0426 018Е ЗВ ADDC A,R3
0427 0428 018F FB 0190 MOV R3,A ;ДВОИЧНО-ДЕСЯТИЧНОЕ УДВОЕНИЕ СУММЫ С УЧЁТОМ ПЕРЕНОСА
0429 0190 ЕС MOV A,R4
0430 0191 ЗС ADDC A,R4
0431 0192 D4 DA A
0432 0193 FC MOV R4,A
0433 0194 ED MOV A,R5
0434 0195 3D ADDC A,R5
0435 0196 D4 DA A
0436 0197 FD MOV R5,A
0437 0198 ЕЕ MOV A,R6
0438 0199 ЗЕ ADDC A,R6
0439 019А D4 DA A
0440 019В FE MOV R6,A
0441 019С EF MOV A,R7
0442 019D 3F ADDC A,R7
0443 019Е D4 DA A
0444 019F FF MOV R7,A
0445 01А0 Е5 82 MOV A, DPL
0446 01А2 35 82 ADDC A, DPL
0447 01А4 D4 DA A
0448 0449 01А5 F5 82 01А7 MOV DPL, A /ПРОВЕРКА КОНЦА ЦИКЛА:
0450 0451 0452 0453 0454 0455 0456 0457 01А7 D5 F0 01АА 22 01 АВ 01 АВ 01 АВ 01 АВ 01 АВ 01 АВ DA DJNZ RET / r /ЗАДЕРЖКА 20 ;***** B,BN2CKL32 MC
-367
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0458 01АВ
0459 01АВ DEL20:
0460 01АВ 79 FD MOV Rl,#0FDH
0461 01AD 7А 26 LPEX: MOV R2,#26H
0462 01AF DA FE LPIN: DJNZ R2,LPIN
0463 01В1 D9 FA DJNZ R1,LPEX
0464 01ВЗ 22 RET
0465 01В4
0466 01В4
0467 01В4 DELIS:
0468 01В4 31 С1 ACALL DEL02S
0469 01В6 31 С1 ACALL DELO2 S
0470 01В8 31 СВ ACALL DELO IS
0471 01ВА DEL05S:
0472 01ВА 31 С1 ACALL DELO2S
0473 01ВС 31 С1 ACALL DEL02S
0474 01ВЕ 31 СВ ACALL DEL01S
0475 01С0 22 RET
0476 01С1
0477 01С1 DEL02S:
0478 01С1 31 АВ ACALL DEL20
0479 01СЗ 31 АВ ACALL DEL20
0480 01С5 31 АВ ACALL DEL20
0481 01С7 31 АВ ACALL DEL20
0482 01С9 31 АВ ACALL DEL20
0483 01СВ DEL01S:
0484 01СВ 31 АВ ACALL DEL20
0485 01CD 31 АВ ACALL DEL20
0486 01CF 31 АВ ACALL DEL20
0487 01D1 31 АВ ACALL DEL20
0488 01D3 31 АВ ACALL DEL20
0489 01D5 22 RET
0490 01D6
0491 01D6 DEL5S:
0492 01D6 31 ВА ACALL DEL05S
0493 01D8 31 ВА ACALL DEL05S
0494 01DA 31 ВА ACALL DELO5S
0495 01DC 31 ВА ACALL DEL05S
0496 01DE 31 ВА ACALL DELO 5S
0497 01Е0 31 ВА ACALL DELO5S
0498 01Е2 DEL2S:
0499 01Е2 31 ВА ACALL DEL05S
0500 01Е4 31 ВА ACALL DEL05S
0501 01Е6 31 ВА ACALL DELO5S
0502 01Е8 31 ВА ACALL DELO5S
0503 01ЕА 22 RET
368—
3.7. Цифровой вольтметр на ADUC824
0504 01ЕВ
0505 01ЕВ /
0506 01ЕВ
0507 01ЕВ /ПОДПРОГРАММА УМНОЖЕНИЯ ДВУХ ТРЁХБАЙТНЫХ ЧИСЕЛ С
0508 01ЕВ /ПОЛУЧЕНИЕМ ] НА ВЫХОДЕ 6- -БАЙТНОГО РЕЗУЛЬТАТА.
0509 01ЕВ /СОМНОЖИТЕЛИ В В(СТ.БАЙТ)R1R0 И В R4(СТ.БАЙТ)R3R2,
0510 01ЕВ /РЕЗУЛЬТАТ В R7R6R5R4R3R2.
0511 01ЕВ /
0512 01ЕВ MUL63:
0513 01ЕВ 74 18 MOV А,#24 /МНОЖИТЕЛЬ ТРЁХБАЙТНЫЙ
0514 01ED 7F 00 MOV R7,#0 /ПОСЛЕ 24 СДВИГОВ ЭТИ
0515 01EF 7Е 00 MOV R6,#0 /3 БАЙТА БУДУТ ТРЕМЯ
0516 01F1 7D 00 MOV R5,#0 /МЛАДШИМИ БАЙТАМИ ПРОИЗВЕДЕНИЯ
0517 01F3 MUL63_1:
0518 01F3 СО ЕО PUSH АСС
0519 01F5 ЕА MOV A,R2 /В А - МЛ.БАЙТ МНОЖИТЕЛЯ
0520 01F6 13 RRC А /АНАЛИЗ ЕГО МЛ. БИТА
0521 01F7 50 0А JNC MUL63_2 /ЕСЛИ ОН НЕ 0, НЕ СУММИРОВАТЬ
0522 0F9 ED MOV A,R5 /ПЛЮСУЕМ МНОЖИМОЕ К НАКАПЛИВАЕМОЙ
0523 01FA 28 ADD A,R0 /СУММЕ, КОТОРАЯ ПОСЛЕ ЗАВЕРШЕНИЯ
0524 01FB FD MOV R5,A /П/П И БУДЕТ ПРОИЗВЕДЕНИЕМ
0525 01FC ЕЕ MOV A,R6
0526 01FD 39 ADDC A,R1
0527 01FE FE MOV R6,A
0528 01FF EF MOV A,R7
0529 0200 35 F0 ADDC A,В
0530 0202 FF MOV R7,A
0531 0203 MUL63_2:
0532 0203 EF MOV A,R7
0533 0204 13 RRC A
0534 0205 FF MOV R7,A
0535 0206 ЕЕ MOV A,R6
0536 0207 13 RRC A
0537 0208 FE MOV R6,A
0538 0209 ED MOV A,R5
0539 020А 13 RRC A
0540 020В FD MOV R5,A
0541 020С ЕС MOV A,R4
0542 020D 13 RRC A
0543 020Е FC MOV R4,A
0544 020F ЕВ MOV A,R3
0545 0210 13 RRC A
0546 0211 FB MOV R3,A
0547 0212 ЕА MOV A,R2 /СДВИНУЛИ МНОЖИТЕЛЬ И
0548 0213 13 RRC A /НАКАПЛИВАЕМУЮ СУММУ
0549 0214 FA MOV R2,A /НА 1 БИТ ВПРАВО
-369
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
0550 0215 DO Е0 POP ACC
0551 0217 D5 Е0 D9 DJNZ ACC,MUL63_1
0552 021А 22 RET
0553 021В
0554 021В /ПОДПРОГРАММА ДЕЛЕНИЯ ШЕСТИБАЙТНОГО ЧИСЛА ИЗ R7R6R5R4R3R2
0555 021В ; НА ТРЁХБАЙТНОЕ В BR1R0 С ПОЛУЧЕНИЕМ ТРЁХБАЙТНОГО ЧАСТНОГО
0556 021В ;В R4R3R2
0557 021В
0558 021В DIV63:
0559 021В 74 18 MOV А,#24
0560 021D DCLK.63
0561 021D СО Е0 PUSH АСС
0562 021F СЗ CLR С
0563 0220 ЕА MOV A,R2
0564 0221 33 RLC А
0565 0222 FA MOV R2,A
0566 0223 ЕВ MOV A,R3
0567 0224 33 RLC А
0568 0225 FB MOV R3,A
0569 0226 ЕС MOV A,R4
0570 0227 33 RLC А
0571 0228 FC MOV R4,A
0572 0229 ED MOV A,R5
0573 022А 33 RLC A
0574 022В FD MOV R5,A
0575 022С ЕЕ MOV A,R6
0576 022D 33 RLC A
0577 022Е FE MOV R6,A
0578 022F EF MOV A,R7
0579 0230 33 RLC A
0580 0231 FF MOV R7,A
0581 0232 СО D0 PUSH PSW
0582 0234 PER1_63
0583 0234 СЗ CLR C
0584 0235 ED MOV A,R5
0585 0236 98 SUBB AzR0
0586 0237 FD MOV R5,A
0587 0238 ЕЕ MOV A,R6
0588 0239 99 SUBB A,R1
0589 023А FE MOV R6,A
0590 023В EF MOV A,R7
0591 023С 95 F0 SUBB A,В
0592 023Е FF MOV R7,A
0593 023F 40 05 JC PER2_63
0594 0241 DO DO POP PSW
0595 0243 PER3_63
-370-
3.7. Цифровой вольтметр на ADUC824
0596 0243 0А INC R2
0597 0244 80 0Е SJMP PER4_63
0598 0246 PER2_63
0599 0246 DO DO POP PSW
0600 0248 40 F9 JC PER3_63
0601 024А ED MOV A,R5
0602 024В 28 ADD AzR0
0603 024С FD MOV R5,A
0604 024D EE MOV A,R6
0605 024Е 39 ADDC A,R1
0606 024F FE MOV R6,A
0607 0250 EF MOV A,R7
0608 0251 35 F0 ADDC A,В
0609 0253 FF MOV R7,A
0610 0254 PER4_63
0611 0254 DO E0 POP ACC
0612 0256 D5 E0 C4 DJNZ ACC,DCLK_63
0613 0259 22 RET
0614 025А
0615 025А
0616 025А ;.ORG 01000H
0617 0800 .ORG 00800H
0618 0800 .END
tasm: Number of errors = О
От программы, приведённой в подразд. 3.4.3, она отличается следую-
щим. Во-первых, при измерении основным АЦП используется биполяр-
ный режим кодирования. Во-вторых, для масштабирования используется
программа MUL63 умножения двух беззнаковых трёхбайтных чисел с полу-
чением шестибайтного результата (с последующим делением произведе-
ния на 65536, осуществляемым простым отбрасыванием двух младших
байтов). В-третьих, для индикации знака результата измерения использу-
ется флаг FLAG в регистре PSW Если измеренный результат отрицатель-
ный, то FLAG устанавливается в 1, если положительный или нулевой, то
FLAG = 0. Этот флаг используется затем программой вывода на дисплей
INDVIV24.
Рассмотрим эти отличия более подробно. Как уже упоминалось, ре-
зультат измерения может быть и положительным, и отрицательным. Отри-
цательному результату соответствует нулевое значение старшего, 24-го би-
та результата. Поэтому программа PREOBR сначала анализирует этот бит, и
если он равен 0, то осуществляет следующие действия. Она устанавливает
в 1 FLAG и преобразовывает оставшийся 23-битный результат в дополни-
тельный код — инвертирует все биты и увеличивает инвертированный ре-
зультат на 1. После этого старший 24-й бит результата зануляется (как для
-371-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
положительного, так и для отрицательного результата измерения) и произ-
водится масштабирование.
Масштабирование осуществляется умножением результата на трёхбай-
тное число, хранящееся в HCF, MCF, LCF, с последующим делением на
65536. В данном случае коэффициент масштабирования равен 3.082. Если
по каким-то причинам вам нужен иной коэффициент, то соответствующее
ему значение числа в HCF, MCF, LCF определяется умножением на этот
коэффициент числа 65536 и переводом произведения в шестнадцатерич-
ную форму (например, с использованием Windows-калькулятора).
Если измеренное напряжение отрицательно, то подпрограмма отобра-
жения INDVIV24 в крайний левый разряд индикатора выводит код ОЕН,
обеспечивающий отображение знака минус.
Отладка устройства проста — при правильном монтаже и исправных
деталях оно сразу начинает работать. Для калибровки вольтметра нужно
подать на вход инструментального усилителя PGA204 при единичном ко-
эффициенте усиления входной положительный или отрицательный сиг-
нал, равный по модулю примерно 2 В, измерить результат вольтметром
класса Щ300 или Щ31 и вращением подстроечного резистора на выходе
PGA204 добиться максимально возможного соответствия показаний
ЩЗОО и налаживаемого вольтметра.
3.8. Краткие выводы
Итак, мы рассмотрели характеристики основного АЦП микроконвер-
тера ADuC824, получаемые на различных тактовых частотах ядра и с
различным временем измерения. Мы убедились, что реальное разрешение
этого АЦП составляет всего 18... 18.5 бит (что, правда, находится в полном
соответствии с теми характеристиками, которые заявлены на этот АЦП са-
мой Analog Devices). Как-либо уменьшить разброс показаний за счёт ус-
реднения не удалось, так как разброс от серии измерений к серии практи-
чески не уменьшается с ростом числа измерений в серии. Можно предпо-
ложить, что причина этого связана с биениями, возникающими в системе
с двумя близкими частотами. Одна частота в 32 кГц фиксированна, другая,
вырабатываемая системой ФАПЧ, кратна ей, но подвержена небольшим
отклонениям от основного значения в ту или иную сторону. Таким обра-
зом, 32-килогерцовая гармоника системы ФАПЧ также несколько «гуля-
ет», и биения между этими частотами каким-то образом сказываются на
работе АЦП. При этом на более высоких частотах система ФАПЧ работает
устойчивее (это вполне объяснимо), поэтому нет столь высоких выбросов,
как на частоте ядра, равной 98 кГц. Также объясним и нерегулярный ха-
рактер появления этих биений — система ФАПЧ отрабатывает любые вне-
-372-
3.8. Краткие выводы
шние и внутренние возмущения, а моменты возникновения тех и других
как-либо друг с другом не связаны.
К сожалению, все многобитные АЦП Analog Devices на основе сигма-
дельта преобразования имеют такую же систему тактирования ядра, поэто-
му проверить это предположение анализом работы АЦП на микроконвер-
тере с фиксированной тактовой частотой, задаваемой внешним кварцем,
без системы умножения частоты и ФАПЧ невозможно. В связи с этим при-
ходится сделать вывод, что разрешения в 22...23 бита можно достигнуть
лишь на микросхеме AD7714 и отдельном микроконтроллере, как описано
в первом томе настоящего издания. Но микроконвертер, безусловно, про-
ще и удобнее этой парочки, поэтому в тех случаях, когда 18-битного разре-
шения достаточно (а это, наверное, процентов 80 возможных применений
подобных изделий), имеет смысл использовать именно микроконвертер.
В целом же рассмотренный нами микроконвертер ADuC — чрезвычай-
но удачная микросхема. Ядро его — это хорошо знакомое многим разра-
ботчикам ядро х52, дополненное целым рядом весьма полезных свойств.
Вот самые интересные из них.
• У этого микроконвертера имеется 640 байт оперативной флэш-памя-
ти данных, содержимое которой остается неизменной даже при вы-
ключении питания.
• Микроконвертер использует очень дешёвый (по сравнению с при-
вычными мегагерцевыми) часовой кварц с программно управляе-
мым умножителем частоты, обеспечивающим работу ядра на часто-
тах от чуть менее 100 кГц до чуть более 12 МГц.
• В микросхеме имеются ставшие уже стандартными SPI-интерфейс,
12С-интерфейс, сторожевой таймер WDT и таймер реального време-
ни TIC.
• И микроконвертер содержит последовательный загрузчик, что в
комплекте с разработанной самой Analog Devices программой за-
грузки позволяет программировать микроконвертер от компьютера
напрямую, без какого-либо дополнительного программатора.
Последнее выгодно отличает семейство ADuC от позволяющих анало-
гичную загрузку изделий Philips, Atmel, SiLabs и ряда других — чтобы их
запрограммировать, вам придётся или потратить силы на создание про-
грамматора (если алгоритм последовательного программирования открыт
для конечного пользователя), или потратить деньги на приобретение про-
грамматора сторонних фирм.
К недостаткам ADuC я бы отнес лишь отсутствие в нём хотя бы про-
стейшего встроенного аппаратного отладчика, общающегося с компьюте-
ром по тому же СОМ-порту.
-373-
Глава 3. ВОЛЬТМЕТР ПОСТОЯННОГО ТОКА НА ADUC824
Работа с основным АЦП микроконвертера на удивление проста. Для
того чтобы осуществить, например, одиночное измерение основным
АЦП, достаточно сделать всего 3 записи в регистры микроконвертера.
Сначала нужно записать 20Н в ADCMODE, разрешая работу основного
АЦП. Затем требуется записать информацию в ADCOCON, выбрав тем са-
мым внешний или внутренний ИОН, входы AIN1...AIN2 или AIN3...AIN4,
униполярное или биполярное кодирование и диапазон от ±20 мВ до
±2.56 В. И наконец, записываем 22Н в ADCMODE, что запустит одиноч-
ное измерение основным АЦП с помещением 24-битового результата в
ACD0H/ACD0M/ACD0L.
Глава 4. ВСТРОЕННАЯ
В МИКРОКОНТРОЛЛЕР ФЛЭШ-
ПАМЯТЬ ДАННЫХ
4.1. Вступление
Исторически сложилось так, что поначалу микроконтроллеры распо-
лагали лишь двумя типами памяти. Память первого типа, именуемая
ROM (Read Only Memory), а в отечественной литературе — ПЗУ (посто-
янное запоминающее устройство), обладала тем свойством, что сохраня-
ла записанную в неё информацию даже при выключении питания. Па-
мять второго типа — RAM (Random Acsess Memory), а в отечественной
литературе — ОЗУ (оперативное запоминающее устройство) при выклю-
чении питания не сохраняла информацию. Зато содержимое RAM микро-
контроллер мог изменять в любой момент. В ROM же информация запи-
сывалась («прошивалась») при помощи специального внешнего устройс-
тва — программатора.
Стирание содержимого ROM осуществлялось ультрафиолетовым из-
лучением (два десятилетия у отечественных специалистов-микроконт-
роллерщиков чрезвычайной популярностью пользовался бытовой уль-
трафиолетовый облучатель «ФОТОН», который покупался якобы для то-
го, чтобы супруга могла загорать даже зимой, а на деле использовался
лишь для стирания содержимого ПЗУ). Однако, для того чтобы ультра-
фиолетовое излучение могло достичь кристалла, в корпусе микросхемы
приходилось делать специальное окно из кварца, прозрачного для уль-
трафиолета. Процесс изготовления корпуса с кварцевым окном с течени-
ем времени превратился в самую дорогостоящую при создании микро-
контроллера операцию, чуть ли не на порядок более дорогую, чем всё ос-
тальное, вместе взятое. Поэтому фирмы-разработчики прилагали
огромные усилия для того, чтобы найти альтернативу ультрафиолетово-
му стиранию ROM.
И эти усилия увенчались успехом. В начале 90-х годов прошлого столе-
тия почти одновременно целый ряд фирм приступил к выпуску электри-
-375-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
чески стираемых ПЗУ. Правда, поначалу их стирание и программирование
требовало повышенного напряжения питания (от 12 до 21 В). Но с течени-
ем времени разработчики сумели (видимо, за счёт внутренних преобразо-
вателей питания) избавиться от высоких напряжений, и для проведения
операции стирания/программирования стало хватать стандартных 5 В пи-
тающего напряжения.
После этого микроконтроллеры стали способны даже самостоятельно
модифицировать свою память программ (это свойство преподносится про-
изводителями как очень ценная опция). Я, правда, до сих пор так и не
осознал этой ценности, особенно с учётом того, что доступность измене-
ния ROM без аппаратных переключений снижает степень надёжности
системы в целом. Но это отдельный разговор.
А вот то, что в микроконтроллерах появилась оперативная память, ана-
логичная вышеописанной ROM, т. е. модифицируемая микроконтролле-
ром и в то же время сохраняющая свое содержимое при выключении пита-
ния, действительно заметно расширило возможности микроконтроллера.
Пример, наглядно это демонстрирующий, вы найдете в конце настоящей
главы.
Подобная память получила название флэш-память данных (оператив-
ная флэш-память). Сегодня большинство микроконтроллерных семейств
имеет в своем составе изделия с флэш-памятью объёмом от сотен байт до
десятков килобайт.
У вас может возникнуть вопрос: а чем флэш-память данных отличает-
ся от «породившей» её электрически стираемой ROM с подобной струк-
турой? Да почти ничем. Первое отличие — количество циклов перезапи-
си для ROM гарантируется сегодня на уровне 1...10 тысяч, а для флэш-па-
мяти данных — на два порядка больше (она ведь меняется чаще!). И
второе отличие — это организация доступа к ней, о чём мы поговорим
чуть ниже.
Не обошлись без флэш-памяти данных и микроконтроллеры семейства
х51. Однако в отличие от ПЗУ и ОЗУ, единых для всех представителей это-
го семейства, у различных 51-х контроллеров флэш-память организована
по-разному. Дело в том, что при проектировании микросхемы 8051 фирма
Intel не предполагала, что появится ещё какой-то вид памяти, отличаю-
щейся от стандартных для того времени ROM и RAM. Поэтому в адресном
пространстве х51 нет дополнительного места для флэш-памяти данных.
Как следствие, производители различных семейств х51 осуществляют до-
ступ к этой памяти каждый по-своему. Поэтому ниже мы рассмотрим два
различных варианта размещения на кристалле микроконтроллера флэш-
памяти данных и организации доступа к ней.
-376-
4.2. Флэш-память данных микроконвертера ADuC824 от Analog Devices
4.2. Флэш-память данных микроконвертера ADuC824
от Analog Devices
У рассмотренных в предыдущей главе микроконвертеров ADuC824
имеется 640 байт флэш-памяти данных. Она, как говорят программисты,
находится в своем собственном адресном пространстве, не пересекаю-
щемся ни с адресным пространством памяти программ, ни с пространс-
твом памяти данных. Сказанное означает, что доступ к флэш-памяти дан-
ных отличается от доступа к регистрам, оперативной памяти и памяти
программ.
У микроконвертеров ADuC824 флэш-память данных организована в
виде 160 4-байтных страниц. Схематически её структура приведена на
Рис. 4.1.
БАЙТ1 БАЙТ 2 БАЙТЗ БАЙТ 4
L
БАЙТ1 БАЙТ 2 БАЙТЗ БАЙТ 4
Рис. 4.1. Конфигурация флэш-памяти данных.
Как и в рассмотренном выше случае, интерфейс к этой области па-
мяти осуществляется через SFR-регистры. Для хранения содержимого
4-байтной страницы последнего обращения используются 4 регистра
данных EDATA1...4. Для хранения 8-битового адреса страницы, к кото-
рой будет осуществляться доступ, используется регистр EADRL. И на-
конец, ECON — 8-битный регистр управления, в который можно запи-
сать одну из пяти команд доступа к флэш-памяти данных, обеспечиваю-
щих выполнение различных операций — чтения, записи, стирания,
верификации.
Эти регистры перечислены в Табл. 4.1.
-377-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
Таблица 4.1. Регистры управления флэш-памятью данных
Название Адрес Функция Значение по умолчанию
ECON 0В9Н Управляет доступом к 640-байтному про- странству флэш-памяти данных ООН
EADRL 0С6Н Содержит адрес страницы пространства флэш-памяти данных (640 байт — 160 адресов страниц, от ООН до 9FH) ООН
EDATA1...4 0BCH...0BFH Содержат данные со страницы флэш-памяти данных для записи или после чтения ООН
Блок-схема регистрового интерфейса к флэш-памяти данных микро-
конвертера приведена на Рис. 4.2.
Рис. 4.2. Блок-схема регистрового интерфейса к флэш-памяти данных
микроконвертера.
-378-
4.2. Флэш-память данных микроконвертера ADuC824 от Analog Devices
ECON — регистр управления флэш-памятью данных
Этот регистр используется в качестве интерпретатора команд; в него
можно записать одну из пяти команд для разрешения различных циклов
чтения, стирания и программирования, как показано в Табл. 4.2.
Таблица 4.2. Команды, активируемые через регистр ECON
Команда Название Описание
01Н Команда чтения Возвращает 4 байта данных, считываемых в регистры EDATA1...4 со страницы по адресу из EADRL
02Н Команда записи 4 байта из EDATA1...4 записываются на страницу по ад- ресу из EADRL. Данная команда предполагает, что содержимое предназна- ченной для записи страницы было предварительно стёрто
ОЗН Команда зарезер- вирована для внутренних целей Пользователь не должен записывать значение ОЗН в ECON
04Н Команда верификации Позволяет пользователю провести верификацию данных, записанных перед этим из EDATA1...4, на страницу по ад- ресу из EADRL. Следующее после этой команды чтение регистра ECON даст ноль, если верификация завершена успешно, и ненулевое значение при несовпадении данных
05Н Команда стирания Производит стирание 4-байтной страницы памяти дан- ных по адресу из EADRL
06Н Команда «Стереть все» Производит стирание всех 640 байт флэш-памяти дан- ных
07H...0FFH Резервные команды Эти команды зарезервированы для использования в сле- дующих моделях
Типовое время программирования/стирания флэш-памяти данных:
• Стирание всего массива (640 байт)....................2 мс
• Стирание одной страницы (4 байта)....................2 мс
• Программирование одной страницы (4 байта).........0.25 мс
• Чтение страницы (4 байта)................1 командный цикл
Как и в большинстве других способов организации доступа к флэш-па-
мяти, загрузка данных в неё может осуществляться в системе на байтовом
уровне, при этом, разумеется, содержимое флэш-памяти должно быть
предварительно стёрто. Стирание выполняется блоками — в данном слу-
чае 4-байтными страницами.
Типовая последовательность доступа к массиву флэш-памяти данных
микроконвертера включает в себя: установку в регистре EADRL адреса
страницы флэш-памяти, к которой будет осуществляться обращение; за-
грузку данных в регистры EDATA1...4, если предполагается цикл записи во
— 379 —
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
флэш-память данных (в случае операции чтения, естественно, ничего за-
гружать в EDATA1...4 не нужно); запись управляющего слова в регистр
ECON, которое инициирует одну из команд в соответствии с Табл. 4.2.
После записи управляющего слова в ECON ядро микроконвертера пе-
реходит на работу в холостом режиме, автоматически выходя из него по за-
вершении указанной команды обращения к флэш-памяти данных.
На практике это означает, что, как только вы запишете в ECON инс-
трукцией MOV ту или иную команду записи/стирания, следующая за ней
инструкция не будет выполняться до тех пор, пока запись или стирание
флэш-памяти данных не будут завершены (соответственно через 0.25 или
2 мс). При этом в течение упомянутого промежутка времени ядро не будет
реагировать даже на запросы прерывания, хотя некоторые функции пери-
ферии, как, например, работа счётчиков/таймеров, будут функциониро-
вать в полном объёме.
Отметим, что при поставке с завода партии новых микросхем стирание
всех 640 Б флэш-памяти данных осуществляется ещё на предприятии-из-
готовителе (т. е. во всех ячейках памяти изначально содержится значение
0FFH). Тем не менее рекомендуется перед первым использованием флэш-
памяти данных произвести вызов подпрограммы стирания всего массива
из 640 байт. Впрочем, эта подпрограмма состоит из одной-единственной
команды, загружающей в регистр ECON код 06Н:
MOV ECON,#06H /команда стереть все
/длительность 2 мс
Запись во флэш-память, как уже говорилось, осуществляется после
стирания записанной туда ранее информации (т. е. загрузки в соответству-
ющие ячейки памяти значения 0FFH). В силу специфики микроконверте-
ра ADuC824 стирание информации производится одновременно во всех
четырёх байтах задаваемой в регистре EADRL страницы памяти. Следова-
тельно, если требуется изменить содержимое всего одного байта на стра-
нице, оставив три других неизменными, необходимо осуществить следую-
щую последовательность действий: сначала считать данные из флэш-па-
мяти данных в регистры EDATA1...4; затем модифицировать содержимое
регистра, в котором находится подлежащий изменению байт; после этого
стереть содержимое текущей страницы, и, наконец, записать в неё инфор-
мацию из EDATA1...4. Соответственно на ассемблере это выглядит таким
образом:
MOV EADRLЛОЗН
MOV ECON,#01H
MOV EDATA2,#0F3H
MOV ECON,#05H
MOV ECON,#02H
/устанавливаем указатель адреса страницы
/читаем страницу флэш-памяти данных
/модифицируем байт
/стираем страницу флэш-памяти данных
/записываем страницу во флэш-память данных.
-380-
4.3. Флэш-память данных микроконтроллера AT89S8252 фирмы ATMEL
4.3. Флэш-память данных микроконтроллера
AT89S8252 фирмы ATMEL
Теперь рассмотрим, как организован интерфейс доступа к флэш-памя-
ти данных у микроконтроллера AT89S8252 фирмы Atmel.
Как вы помните, стандартные х51 могут работать не только с внутрен-
ней, но и с внешней памятью данных, объём которой может достигать
64 КБ. Доступ к этой памяти осуществляется командами MOVX (подробнее
см. первый том данной книги). Многие производители, и Atmel в их числе,
размещают флэш-память данных в адресном пространстве внешней памя-
ти данных. Это означает, что обращение к флэш-памяти такое же, как к
стандартной внешней памяти данных, когда адрес записываемой/считы-
ваемой ячейки заносится в DPTR (или в R0, или в R1), а затем одна из
шести возможных команд MOVX либо пересылает данные из аккумулятора
в выбранную ячейку, либо наоборот.
Рассматриваемая флэш-память, объём которой у AT89S8252 достигает
2 КБ, располагается в младших (0000H...07FFH) адресах адресного про-
странства внешней памяти данных. Необходимо отметить, что она его за-
нимает не полностью, а как бы «квартирует» у законных представителей
внешней памяти данных. Последнее означает, что, загрузив в DPTR адрес
из диапазона (0000H...07FFH), мы командой MOVX можем обратиться как к
ячейке внешней памяти данных (если к микроконтроллеру правильным
образом подключена микросхема внешнего ОЗУ), так и к расположенной
внутри микроконтроллера ячейке флэш-памяти данных с тем же адресом.
Выбор конкретного модуля памяти (внешнего ОЗУ или встроенной флэш-
памяти) осуществляется в соответствии с состоянием бита EEMEN регис-
тра WMCON. Для того чтобы обратиться к флэш-памяти, перед выполне-
нием соответствующей команды MOVX нужно этот бит установить в 1.
Сброс его в 0 задает обращение именно к микросхеме внешнего ОЗУ.
Ещё один бит регистра WMCON, необходимый для организации рабо-
ты с флэш-памятью (точнее, для записи в неё), — это бит EEMWE. Он дол-
жен быть установлен пользователем в 1 перед записью байта во флэш-па-
мять данных, а после завершения записи должен быть сброшен в 0.
Таким образом, чтобы загрузить данные во флэш-память данных, уста-
новите биты EEMEN и EEMWE регистра WMCON в 1, после чего осущес-
твите требуемую пересылку. Обратите внимание: если, начиная с какого-
либо момента, ваша программа достаточно долго не будет осуществлять
обращение к флэш-памяти, Atmel рекомендует сбросить бит EEMWE в 0, а
не держать его всё время во «взведённом» состоянии. Видимо, сброс этого
бита управляет внутренними 12-вольтовыми преобразователями питания,
которые, естественно, лучше не активировать без надобности.
-381-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
Сбрасывать EEMEN в 0 нужно только в том случае, если к микроконт-
роллеру подключена внешняя память данных (ОЗУ).
Индикатором завершения записи является флаг RDY/BSY#, находя-
щийся в том же регистре. При начальном старте микроконтроллера он ус-
танавливается в 1. Как только запускается процесс записи байта во флэш-
память данных, флаг автоматически сбрасывается в 0 и вновь устанавлива-
ется в 1, когда запись будет завершена. Таким образом, считывая содержи-
мое WMCON и анализируя состояние бита RDY/BSY#, можно определить
момент окончания записи байта во флэш-память данных.
Чтобы прочитать данные из флэш-памяти данных, установите в 1 толь-
ко EEMEN, после чего осуществите требуемую пересылку. Как и при запи-
си, сбрасывать его в 0 нужно только в том случае, если к микроконтролле-
ру подключена внешняя память данных (ОЗУ).
Рассмотрим подробнее регистр WMCON микроконтроллера.
WMCON — регистр управления флэш-памяти и сторожевого таймера
• Адрес SFR..............................................096Н
• Значение по включению питания...........................02Н
• Адресация отдельных битов.......................отсутствует
7 6 5 4 3 2 1 О
PS2 PS1 PS0 EEMWE EEMEN DPS RDY/BSY# WDTEN
Таблица 4.3. Назначение битов в WMCON
Бит Название Описание
7 6 5 PS2 PSI PSO Биты делителя времени пересброса контроллера сигналом от таймера-счётчика WDT. Соотношение между значениями битов и временем пересброса:
PS2 PS1 PS0 Время пересброса [мс]
0 0 0 16
0 0 1 32
0 1 0 64
0 1 1 128
1 0 0 256
1 0 1 512
1 1 0 1024
1 1 1 2048
-382-
4.4. Пример использования флэш-памяти данных МК AT89S8252 фирмы ATMEL
(продолжение)
Бит Название Описание
4 EEMWE Бит разрешения записи во флэш-память данных. Должен быть установлен в 1 перед записью байта во флэш-память дан- ных командой MOVX. После завершения записи должен быть сброшен в 0
3 EEMEN Бит разрешения доступа к флэш-памяти данных. Когда бит установлен в 1 и адрес памяти лежит в диапазоне от 000Н до 7FFH, инструкция MOVX обеспечивает обращение к флэш-памяти дан- ных, расположенной на кристалле. Когда бит сброшен в 0, вне зависи- мости от адреса происходит обращение к внешней памяти данных
2 DPS Бит выбора указателя DPTR. Если бит сброшен в 0, то активен основной указатель DPTR, располо- женный в адресах 082Н, 083Н. Если бит установлен в 1, то активен дополнительный указатель DPTR1, расположенный в адресах 084Н, 085Н
1 RDY/ BSY# При чтении — флаг, индицирующий завершение записи в ячейку флэш- памяти данных. Пока запись не завершена, он сброшен в 0 и автомати- чески устанавливается в 1, как только запись завершается. При записи — бит сброса содержимого счётчика сторожевого таймера. Установка его пользовательской программой в 1 сбрасывает сторожевой таймер, после чего бит автоматически устанавливается в 0 в следующем машинном цикле
0 WDTEN Бит включения/выключения сторожевого таймера (0 — выключен)
Отметим, что запись во флэш-память занимает примерно 2.5 мс. Пока
запись не закончена, флаг RDY/BSY# в регистре WMCON будет сброшен.
Как только он установится в 1, это значит, что текущий цикл записи во
флэш-память данных завершён и можно осуществлять следующую запись.
Следует также отметить, что, пока запись во флэш-память не заверше-
на, попытка считать байт по записываемому адресу даёт значение, компле-
ментарное записываемому. Как только запись окончена, считывание даёт
правильное значение.
4.4. Пример использования флэш-памяти
данных MKAT89S8252
фирмы ATMEL
Теперь рассмотрим обещанный пример, где использование флэш-памя-
ти данных позволяет наделить систему новой полезной функцией. Эта
функция (не удивляйтесь) — устройство защиты от... недобросовестного
дилера.
-383-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
Как ни удивительно, но развитие системы дистрибьюции заставляет
задумываться о защите своих прав на интеллектуальную собственность не
только программистов, всегда озабоченных этой проблемой, но и разра-
ботчиков «железа». В самом деле, отдавая созданное изделие на реализа-
цию дилеру, вы имеете в качестве гарантий в лучшем случае порядочность
вашего партнера, а в худшем — лишь договор, обращение в суд с которым
отнюдь не гарантирует положительного решения. Так что, отдавая создан-
ные вами дорогостоящие продукты на реализацию в дилерскую сеть (осо-
бенно в другие регионы), неплохо бы снабдить их каким-либо механиз-
мом, дополнительно страхующим вас от того, что тот или иной партнёр
попросту «кинет» вас. И хотя это происходит не так уж часто, но бережёно-
го, как говорится, и Бог бережёт. К тому же замок — он ведь от честного
человека, чтобы не вводить его в ненужный соблазн...
Теперь собственно о защите, точнее, о том варианте, который был
мной реализован в одном из изделий. Сразу оговорюсь: для его реализации
в составе изделия должен присутствовать микроконтроллер, и созданная
защита — некое дополнение к его основной программе. Для изделий без
микроконтроллера всё приводимое ниже ценности не имеет.
Первое, что мне посоветовали в процессе обмена идеями по данному
вопросу, — прошить в микроконтроллер демоверсию основной програм-
мы, т. е. программу, так или иначе функционально урезанную в сравнении
с полной версией, а после окончательного завершения финансовых взаи-
моотношений (читай: после 100%-ной оплаты изделия) перепрошить в
контроллер вышеупомянутую полную версию. (То есть написать програм-
мку, с помощью которой дилер может самостоятельно, уже без вашего
присутствия, перепрограммировать микроконтроллер программой, кото-
рую вы ему перешлёте по e-mail после оплаты.) Для программирования,
естественно, должен использоваться компьютер и какой-либо из его пор-
тов, например COM-порт. Реализовать всё это несложно, многие контрол-
леры имеют встроенный механизм перепрограммирования из пользова-
тельской программы.
На первый взгляд идея, конечно, красивая. Красота её заключается в
том, что вы реализуете одну из нечасто используемых возможностей мик-
роконтроллеров. Да и реализовать её — это вам не «бегущие огни» на мик-
роконтроллере сваять, что по силам любому, кто хоть что-то в микроконт-
роллерах понимает. Такая «примочка» — это уже высший пилотаж в мик-
роконтроллерных изысках, гарантирующий греющее душу уважение со
стороны разработчиков-профессионалов.
Но давайте отвлечёмся от приятных мыслей об уважительных взглядах
коллег и подумаем о том, насколько при подобной реализации ваш про-
граммный продукт защищён от несанкционированного использования.
Думаю, вряд ли кто будет спорить с тем, что в рассмотренном случае сте-
— 384—
4.4. Пример использования флэш-памяти данных МК AT89S8252 фирмы ATMEL.
пень защиты невысока. Кто-то, помимо вас, будет иметь файл с работаю-
щими кодами. Да, информацию в нем можно зашифровать, а при пере-
программировании сделать обратное преобразование. Но любой опытный
программист скажет вам, что разобраться с алгоритмом расшифровки при
наличии программы, его реализующей, — вопрос времени, причём гораз-
до меньшего, чем вы предполагаете.
Можно пойти и другим путём. Во многих микроконтроллерах есть энер-
гонезависимое ОЗУ, или флэш-память данных микроконтроллера. В одной
из её ячеек должно храниться число, которое и определяет, должен ли мик-
роконтроллер исполнять полную версию своей программы или какой-либо
из её урезанных демовариантов. Снятием защиты является изменение зна-
чения этого числа, оно должно быть проведено микроконтроллером по со-
ответствующей команде извне. Например, после получения кода (опреде-
ленной последовательности заранее заданных чисел) с того же СОМ-порта.
Этот вариант гораздо лучше с точки зрения защищённости программы
вашего изделия. Но и здесь не всё безукоризненно. Если интерфейс связи
с компьютером в вашем изделии присутствовал изначально, т. е. до того,
как вы начали думать о реализации подобной защиты, то всё в порядке,
используйте этот интерфейс для её снятия. Но если ваше изделие по свое-
му назначению вовсе не требует обмена с компьютером, то встраивание в
него даже такого простого интерфейса, как RS-232 (например, на
МАХ202) с необходимыми разъёмами, — это напрасная трата денег. Ко-
нечно, если речь идёт об одном изделии, то лишние 200...300 рублей не в
счёт. А если речь о десятках или сотнях изделий? Тогда эти дополнитель-
ные 10 долларов выльются вам в потерю сотен, если не тысяч долларов.
Альтернативой здесь может быть использование имеющихся в изделии
аппаратных средств. Если в нем есть хотя бы одна пользовательская кноп-
ка и хотя бы трёхразрядный семисегментный знакосинтезирующий инди-
катор, то этих ресурсов уже достаточно. По крайней мере для реализации
описываемого ниже алгоритма защиты.
Внешне работа механизма защиты выглядит так. При включении изде-
лия на его индикаторе в первый момент появится число, значение которого
с каждым последующим включением будет уменьшаться на 1. Это — счёт-
чик числа включений, имеющихся в распоряжении дилера для демонстра-
ции изделия потенциальным покупателям. Начальное значение счётчика
определяется вами — вы можете предоставить дилеру возможность вклю-
чить прибор и полноценно поработать с ним 10, 20, 50 или 250 раз.
Через 1...2 с после появления на индикаторе упомянутое число пропа-
дёт, и изделие начнёт работать в полнофункциональном режиме вплоть до
своего выключения. При последующем включении на индикаторе снова в
течение первых 1...2 с отобразится значение счётчика числа включений,
оно, как отмечалось, будет на 1 меньше, чем в предыдущем случае. И так
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
процедура включения будет повторяться до тех пор, пока счётчик числа
включений не обнулится.
Как только значение счётчика дойдет до 0, функционирование изделия
изменится — оно будет по включении «висеть», отображая на индикаторе
нули во всех разрядах и никак не реагируя на нажатие кнопок управления.
Это будет свидетельствовать о полном использовании дилером отпущен-
ных ему возможностей и о необходимости либо вернуть изделие вам, либо
оплатить его и получить от вас информацию о том, как снять защиту.
Снятие описываемой защиты происходит следующим образом. Вы со-
общаете дилеру два числа (ключа) из диапазона от 1 до 252. Пусть для ка-
кого-либо конкретного изделия, например, снимающими защиту ключа-
ми будут числа 87 и 143. Запомнив эти числа, дилер должен проделать сле-
дующую последовательность действий.
Сначала нужно нажать упомянутую кнопку (в моём изделии она вы-
полнена в виде курка на рукоятке, поэтому далее я буду именовать её кур-
ком) и, не отпуская курка, включить питание изделия. Как только изделие
включится, на его индикаторе отобразится число ООО, затем, спустя секун-
ду — 001, ещё через секунду — 002 и т. д.
• Продолжая удерживать курок нажатым, необходимо дождаться по-
явления на индикаторе первого из указанных выше чисел, 087. Как
только оно появится, нужно отпустить курок. Кратковременное по-
гасание цифры 087 на индикаторе и её восстановление свидетельс-
твуют о том, что микроконтроллер принял первое число (первый
ключ) и сравнил его с хранящимся в его памяти.
• Далее значение описываемого счётчика секунд (не путать со счётчи-
ком числа включений!) продолжит расти (088, 089, 090 и т. д.), и нуж-
но дождаться, когда на индикаторе появится второе из заданных чи-
сел. С его появлением необходимо нажать курок и удерживать его в
течение 3...5 с, после чего его можно будет окончательно отпустить.
В момент нажатия курка отображаемая цифра (это должно быть 143)
кратковременно погаснет, затем снова восстановится, как и в преды-
дущем случае. Это будет свидетельствовать о том, что микроконт-
роллер принял второй ключ и сравнил его с имеющимся в памяти.
Если оба ключа введены верно, то после того, как счётчик секунд до-
считает до 255, его значение пропадёт с экрана, и изделие перейдёт в
нормальный режим работы. И далее при всех последующих включе-
ниях оно будет сразу стартовать в нормальный режим, без каких-ли-
бо счётчиков, как будто никакой защиты в изделии и не было.
Если ключи введены неправильно, изделие «зависнет», отображая на
индикаторе двойки во всех разрядах. Это будет свидетельствовать о том,
что снять защиту не удалось — или ключи были неверными, или отпуска-
ние/нажатие курка были несвоевременными.
— 386 —
4.4. Пример использования флэш-памяти данных МК AT89S8252 фирмы ATMEL.
Несомненным преимуществом такой системы защиты является её
универсальность — она может быть встроена в сотни приборов, от прибора
к прибору будут меняться лишь ключи. Поскольку все пересылки данных
происходят внутри микроконтроллера (флэш-память данных ОБЯЗА-
ТЕЛЬНО должна быть внутренней!), у пирата нет никакой возможности
контролировать пересылки данных и перехватить момент сравнения вве-
дённого ключа с хранящимся в памяти, когда можно было бы узнать его
правильное значение. Вариант перебора всех возможностей почти нереа-
лен — число возможных комбинаций свыше 32 тысяч, на проверку каждой
нужно почти пять минут, в течение 8-часового рабочего дня можно пере-
брать едва ли сотню комбинаций... Даже знание алгоритма не поможет
взломщику программы — нужны конкретные значения ключей, а они си-
дят во внутренней памяти программ микроконтроллера, под битами защи-
ты (естественно, если вы не забудете их установить).
Теперь о том, как прописывается во флэш-память данных информация
о количестве предоставленных дилеру возможностей включить изделие и
полноценно поработать с ним. Для этого желательно иметь внутри изде-
лия кнопку, недоступную пользователю. Вы нажимаете эту кнопку перед
включением питания и, удерживая её, включаете питание. На экране отоб-
ражается текущее значение ячейки, в которую будет записано количество
допустимых включений изделия. Как только кнопка будет отпущена, чис-
ло, соответствующее количеству возможных запусков, загружается в упо-
мянутую ячейку, и начнётся описанный выше старт с отображением и
уменьшением этого числа.
Можно обойтись и без дополнительной кнопки (более того, это даже
лучше). Вместо нажатия на кнопку можно поддерживать нужный потен-
циал на выбранном выводе при помощи щупа, соединённого с общим
проводом (если указанный вывод через резистор «подтянут» к логической
единице), или с плюсом питания (если вывод через резистор «сидит» на
земле). При этом достигается тот же результат, но в распоряжении зло-
умышленника отсутствует кнопка, при помощи которой можно и без ва-
шего ведома добавить ещё 10 (20, 50, 250) возможностей использовать ва-
ше изделие.
Теперь о том, как устроена программа защиты (её блок-схема приведе-
на на Рис. 4.3).
• В ячейке 0 хранится количество возможных запусков. Если их коли-
чество равно 0, это свидетельствует о полном использовании диле-
ром отпущенных ему возможностей. 1 свидетельствует о наличии
ещё одной возможности включения, 2 — о наличии двух возможнос-
тей и т. д. вплоть до установленного вами максимума (но он не дол-
жен превышать 252). Если в ячейке 0 хранится число 254, то это ин-
-387-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
дицирует, что защита снята и микроконтроллер сразу должен
переходить к нормальному исполнению основной программы.
• В ячейке «счётчик» хранится значение счётчика секунд, отображае-
мого на индикаторе в процессе снятия защиты.
• В ячейке «признак» хранится число, отражающее результаты сравне-
ния вводимых ключей с хранимыми в памяти программ эталонами.
Если значение ячейки «признак» равно ОААН, то оба ключа введены
верно; если — ОАН, то введён только первый ключ, и введён верно;
если — 05Н, то один из ключей введён неверно.
• Chislol и Chislo2 — константы, хранимые в памяти программ, они
являются правильными для данного изделия значениями вводимых
ключей.
• «Кнопка» и «курок» — однобитные порты ввода микроконтроллера,
в рассматриваемом случае это две линии порта Р1 микроконтролле-
ра AT89S8252 фирмы Atmel (например, Р1.2 и Р1.5, возможны и лю-
бые другие варианты). Через 20-килоомные резисторы (Рис. 4.4) они
подтянуты к потенциалу питания, нажатие же на кнопку или на ку-
рок сажает соответствующую линию порта на землю. Как отмеча-
лось, физически роль кнопки может выполнять заземлённый щуп,
нажатием является касание щупом вывода Р1.5.
Текст программы, написанной для AT89S8252, приведён в этом разде-
ле. В качестве индикатора в изделии используется индикатор НТ1610
(см. первый том, стр. 95), подпрограммы INDVIV и UNPKQ описаны там
же, на стр. 99. Подпрограммы READMEMO и WRMEM0 осуществляют чтение
числа из флэш-памяти программ (флэш-ОЗУ) и запись его во флэш-ОЗУ
соответственно.
При отладке программы я неожиданно столкнулся с неприятным фак-
том. Написанная и оттранслированная, она работала в основном правиль-
но, но в некоторых случаях (примерно в 1 из 5) количество включений,
имеющихся в распоряжении дилера для демонстрации изделия потенци-
альным покупателям, явно сбоило (т. е. за два включения до текущего их
оставалось, например, 17, при предыдущем включении — 16, а при теку-
щем — не 15, а 252). Какой-либо системы в этих сбоях обнаружить мне не
удалось, тем более что упомянутые READMEMO и WRMEM0 в основной про-
грамме работали с флэш-ОЗУ безукоризненно. Повозившись с этим глю-
ком два дня, я предположил, что флэш-ОЗУ требует для выхода на нор-
мальный режим гораздо больше времени, чем те микросекунды, которые
требуются программе для того, чтобы дойти от первой команды до первого
обращения к этой памяти, и поставил перед этим обращением секундную
задержку. Сбои прекратились.
— 388 —
4,4, Пример использования флэш-памяти данных МК AT89S8252 фирмы ATMEL
Рис. 4.3. Блок-схема программы защиты.
389
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
Рис. 4.4. Фрагмент принципиальной схемы изделия с элементами, участвующими
в схеме защиты.
В явном виде в документации на AT89S8252 даже каких-либо намёков
о необходимости подобной задержки я не увидел. И на старуху бывает про-
руха...
Каких-либо иных особенностей, требующих отдельного описания,
программа не имеет. Отмечу, что её необходимо транслировать для каждо-
го из защищаемых с её помощью изделий, устанавливая в каждом случае
свои значения для констант Chislol и Chislo2.
Программа защиты
CHISLO1 • EQU 012 /ПЕРВЫЙ КЛЮЧ
CHISLO2 • EQU 022 /ВТОРОЙ КЛЮЧ
AD00 • EQU 20H /ОЗУ ЭКРАННОЙ ОБЛАСТИ ИНДИКАТОРА
COUNT • EQU ЗОН /ОДНОБАЙТНЫЙ СЧЁТЧИК СЕКУНД ДЛЯ СНЯТИЯ ЗАЩИТЫ
PRIZN • EQU 31H /ОДНОБАЙТНЫЙ ПРИЗНАК СОВПАДЕНИЯ ВВЕДЕННЫХ ЧИСЕЛ
/С КЛЮЧАМИ
KUROK • EQU Pl .2
KNOPKA • EQU Pl. 5
DATIND • EQU P1.0
CLKIND • EQU Pl.l
USER • EQU 21 /ЧИСЛО ДОПУСТИМЫХ ДЕМОВКЛЮЧЕНИЙ
-39G-
4.4. Пример использования флэш-памяти данных МК AT89S8252 фирмы ATMEL
WMCON JACHO .EQU • EQU 096H 001H /РЕГИСТР ДЛЯ РАБОТЫ С ФЛЭШ-ОЗУ /ЯЧЕЙКА ФЛЭШКИ, КУДА ПИШЕТСЯ СЧЁТЧИК ДЕМОПУСКОВ
.ORG 0
WORKOl:
MOV SP,#ASTK
MOV P3,#11111111B
MOV pi Л11111111В
/СТАРТ - С ПРОВЕРКИ НАЖАТИЯ КНОПКИ
LL252:
LCALL DELIS
MOV C,KNOPKA
JC LSI /ЕСЛИ НЕ НАЖАТА, ПРОВЕРЯТЬ КУРОК
LCALL DEL20
MOV C,KNOPKA
JC LSI /ЕСЛИ НЕ НАЖАТА, ПРОВЕРЯТЬ КУРОК
/СЧИТАТЬ БАЙТ ИЗ ЯЧЕЙКИ 0 ФЛЭП1- -ПАМЯТИ
• LCALL READMEMO /А <- (ЯЧЕЙКА 0)
MOV T_IZM,A
MOV T_IZM+1,#O
MOV R0,#AD00+0
MOV R1,#T_IZM
LCALL UNPKQ /В AD00+0..3 - ЧИСЛО ИЗ ЯЧЕЙКИ 0
MOV A,#USER ;#USER -> (ЯЧЕЙКА 0)
LCALL WRMEMO
MOV T_IZM,#USER
MOV T_IZM+1,#O
MOV R0,#AD00+4
MOV R1,#T_IZM
LCALL UNPKQ /В AD00+4..7 - ЧИСЛО USER
LL251:
LCALL INDVIV /ОТОБРАЗИМ НА ИНДИКАТОРЕ НТ1610
LCALL DELIS /В ТЕЧЕНИЕ 1 СЕКУНДЫ
MOV C,KNOPKA
JNC LL251 /ЕСЛИ НАЖАТА, ЖДАТЬ ОТПУСКАНИЯ
SJMP LSI /НА ПРОВЕРКУ КУРКА, КАК ТОЛЬКО ОТПУСТЯТ КНОПКУ
/ПРОВЕРКА НАЖАТИЯ КУРКА
LSI: MOV C,KUROK
-391-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
JC LCALL MOV JNC LS2 DEL20 C,KUROK LS8 /ЕСЛИ HE НАЖАТ, ПРОВЕРЯТЬ ЧИСЛО ВО ФЛЭШКЕ /ЕСЛИ НАЖАТ, НА ЦИКЛ ЗАЩИТЫ
/ЭТО ЕСЛИ ПРИ СТАРТЕ И КУРОК НЕ НАЖАТ
LS2: LCALL DELIS
LCALL READMEMO /А <- (ЯЧЕЙКА 0)
CJNE A,#254,LS3
SJMP LS5 /НА НОРМ. ИСП. ПРОГРАММЫ, ЕСЛИ (ЯЧЕЙКА 0)=254
LS3: JZ LS6 /ЕСЛИ 0 - ЗАВИСНУТЬ
LS4: DEC A
MOV B,A
LCALL WRMEMO /DEC (ЯЧЕЙКА 0)
MOV A,В
MOV T_IZM,A
MOV T_IZM+1,#O
MOV R0,#AD00+0
MOV R1,#T_IZM
LCALL UNPKQ /В AD00+0..3 - ЧИСЛО USER-1
LCALL ANULAD4 /В AD00+4..7 - КОДЫ 0FH (ПРОБЕЛЫ)
LCALL INDVIV /ОТОБРАЗИМ
LCALL DELIS /В ТЕЧЕНИЕ 1 СЕКУНДЫ
LS5: LJMP START.OS /НА НОРМАЛЬНЫЙ СТАРТ
/ЗАЦИКЛИВАНИЕ
LS6: MOV АД0
LS60: MOV AD00+0,A
MOV AD00+l,A
MOV AD00+2,A
MOV AD00+3,A
MOV AD00+4,A
MOV AD00+5,A
MOV AD00+6,A
MOV AD00+7,A /В AD00+0..3 - ВСЕ НУЛИ
LS7: LCALL INDVIV /ОТОБРАЗИМ
LCALL DELIS /В ТЕЧЕНИЕ 1 СЕКУНДЫ
SJMP LS7 /НА ЗАЦИКЛИВАНИЕ
/ЦИКЛ ЗАЩИТЫ
LS8: MOV PRIZN,#0
MOV COUNT,#1
LS9: MOV T_IZM,COUNT
—392-
4.4. Пример использования флэш-памяти данных МК AT89S8252 фирмы ATMEL.
MOV MOV MOV LCALL LCALL LCALL LCALL T_IZM+l,#0 RO,#AD00+0 R1,#T_IZM UNPKQ ANULAD4 INDVIV DEL05S /В AD00+0..3 - СЧЁТЧИК СЕКУНД /ОТОБРАЗИМ /В ТЕЧЕНИЕ 0.5 СЕКУНДЫ
/ПРОВЕРКИ БАЙТА ПРИЗНАКА
/ MOV A,PRIZN
CJNE A,#0AAH,LS10
SJMP LS13 /ЕСЛИ ОААН - НА LS13
LS10: CJNE A,#O5H,LS11
SJMP LS13 /ЕСЛИ 05Н - НА LS13
LS11: CJNE A,#0AH,LS12
SJMP LS17 /ЕСЛИ ОАН - НА ПРОВЕРКУ РАВЕНСТВА С ЧИСЛОМ 2
LS12: MOV C,KUROK
JNC LS13 /ЕСЛИ НАЖАТ, НА LS13
LCALL DEL20
MOV C,KUROK
JC LS22 /ЕСЛИ НЕ НАЖАТ, НА ПРОВЕРКУ РАВЕНСТВА С ЧИСЛОМ 1
/ВЫХОД Ис 1 ПРОВЕРОК НА РАВЕНСТВО С ЧИСЛАМИ 1 И 2
LS13: LCALL DEL05S /ЗАДЕРЖКА 0.5 С
MOV A,COUNT
INC A
MOV COUNT,A
JNZ LS9 /ЕСЛИ НЕ ДОСЧИТАЛИ ДО 256, НА LS9
/СЧЁТЧИК РАВЕН 0 , РЕЗЕРВ ДЕМОВЕРСИЙ ИСЧЕРПАН
LS14: MOV A,PRIZN
CJNE A,#0AAH,LS16 /ЕСЛИ ПРИЗНАК НЕ ОААН, ЗАЦИКЛИВАНИЕ С ДВОЙКАМИ
LS15: MOV A,#254 /254 -> (ЯЧЕЙКА 0)
LCALL WRMEMO
SJMP LS5 /НА НОРМАЛЬНЫЙ СТАРТ
LS16: MOV A,#2 /ДВОЙКИ
SJMP LS60 /ЗАЦИКЛИВАЕМСЯ
/СРАВНЕНИЕ ПЕРВОГО ВВЕДЕННОГО ЧИСЛА С ПЕРВЫМ КЛЮЧОМ
LS22: MOV AD00+8,AD00+0
MOV ADOO+9,AD00+1
MOV AD00+10,AD00+2
-393
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
MOV AD00+11,AD00+3 /СОХРАНИЛИ AD00+0..3 В AD00+8. .11
MOV AD00+0,#0FH
MOV AD00+1, #0FH
MOV AD00+2,#0FH
MOV AD00+3,#0FH /ПОГАСИЛИ ADO0 + 0..3
LCALL INDVIV /ОТОБРАЗИМ
LCALL DELO5S /В ТЕЧЕНИЕ 0.5 СЕКУНДЫ
MOV AD00+0,AD00+8
MOV AD00+1,AD00+9
MOV AD00+2,AD00+10
MOV AD00+3,AD00+11 /ВОССТАНОВИЛИ AD00+0..3 ИЗ AD00+8..11
MOV A,COUNT
CLR C
SUBB A,#CHISLO1 /СРАВНИМ COUNT С ЧИСЛОМ 1
JZ LS24 /ЕСЛИ РАВНЫ - HA LS24
LS23: MOV PRIZN,#05Н /PRIZN СДЕЛАТЬ РАВНЫМ 05Н
SJMP LS13 /НА LS13
LS24: MOV PRIZN,#0AH /PRIZN СДЕЛАТЬ РАВНЫМ ОАН
SJMP LS13 /НА LS13
;СРАВНЕНИЕ ВТОРОГО ВВЕДЁННОГО ЧИСЛА СО ВТОРЫМ КЛЮЧОМ
LS17: MOV C,KUROK
JC LS13 /ЕСЛИ HE НАЖАТ, HA LS13
LCALL DEL2 0
MOV C,KUROK
JC LS13 /ЕСЛИ HE НАЖАТ, HA LS13
LS19: MOV AD00+8,AD00+0
MOV AD00+9,AD00+1
MOV AD00+10,AD00+2
MOV AD00+11,AD00+3 /СОХРАНИЛИ AD00+0..3 В AD00+8..11
MOV AD00+0,#0FH
MOV AD00+l,#0FH
MOV AD00+2,#0FH
MOV AD00+3,#0FH /ПОГАСИЛИ AD00+0..3
LCALL INDVIV /ОТОБРАЗИМ
LCALL DEL05S /В ТЕЧЕНИЕ 0.5 СЕКУНДЫ
MOV AD00+0,AD00+8
MOV AD00+1,AD00+9
MOV AD00+2,AD00+10
MOV AD00+3,AD00+11 /ВОССТАНОВИЛИ AD00+0..3 ИЗ AD00+8..11
MOV A,COUNT
CLR C
SUBB A,#CHISLO2 /СРАВНИМ COUNT С ЧИСЛОМ 2
JZ LS21 /ЕСЛИ РАВНЫ - HA LS21
LS20: MOV PRIZN,#05Н /PRIZN СДЕЛАТЬ РАВНЫМ 05Н
394-
4.4. Пример использования флэш-памяти данных МК AT89S8252 фирмы ATMEL
LJMP LS13 /НА LSI3
LS21: MOV PRIZN,#OAAH /PRIZN СДЕЛАТЬ РАВНЫМ ОААН
LJMP LS13 ;НА LS13
/ДАЛЬШЕ ЖДЙМ ОТПУСКАНИЯ КУРКА И СТАРТ НОРМАЛЬНОЙ ОСНОВНОЙ ПРОГРАММЫ
START_OS:
LCALL INDVIV /ОТОБРАЗИМ
LCALL DELIS /В ТЕЧЕНИЕ 1 СЕКУНДЫ
MOV С,KUROK
JNC STARTjDS /ЕСЛИ НАЖАТА, ЖДАТЬ ОТПУСКАНИЯ
LJMP WORK
/ПОДПРОГРАММЫ
READMEMO:
MOV DPTR,#JACHO /ЧИТАЕМ ИЗ JACHO
MOV WMCON,#00001010B
NOP
LCALL READ /РЕЗУЛЬТАТ В АККУМУЛЯТОРЕ
NOP
MOV wmcon,#ooooooiob
RET
READ:
MOVX A,@DPTR
RET
/БЫЛО ПРИ ОТЛАДКЕ С ВНУТРЕННИМ ОЗУ
WRMEM0:
MOV DPTR,#JACHO /ПИШЕМ В JACHO
MOV wmcon,#ooooioiob
NOP
LCALL WRITE
NOP
MOV wmcon,#ooooooiob
RET
WRITE:
MOV WMCON,#00011010B
MOVX @DPTR,A
LOOP:
MOV A,WMCON
ANL A,#00000010B
JZ LOOP
MOV wmcon,#ooooioiob
-395-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
/ RET
DEL20: ;ЗАДЕРЖКА 20 мс
MOV R1,#OFDH
LPEX: MOV R2,#26H
LPIN: DJNZ R2,LPIN
DJNZ R1,LPEX
9 RET
DEL05S: ;ЗАДЕРЖКА 500 мс
ACALL DEL02S
ACALL DELO2S
ACALL DEL01S
RET
DEL02S:
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
DEL01S:
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
ACALL DEL20
RET
DEL5S:
ACALL DEL05S
ACALL DEL05S
ACALL DELO5S
ACALL DEL05S
ACALL DELO5S
ACALL DELO5S
DEL2S:
ACALL DELO5S
ACALL DELO5S
DELIS:
ACALL DEL05S
ACALL DELO5S
RET
-3%-
4.5. Краткие выводы
WORK: ;ДАЛЬШЕ ИДЁТ ПРОГРАММА ДЛЯ МИКРОКОНТРОЛЛЕРА ИЗДЕЛИЯ
;В ПОЛНОМ ОБЪЁМЕ
Очевидно, что аналогичный алгоритм может быть легко реализован и
на любом другом микроконтроллере.
Добавлю, что программа может быть модифицирована и под три вво-
димых ключа, при этом число возможных комбинаций вырастет ещё на
полтора порядка. Но в подавляющем большинстве практических случаев и
двух ключей оказывается вполне достаточно.
4.5. Краткие выводы
Итак, мы познакомились с встроенной в микроконтроллеры электри-
чески стираемой флэш-памятъю данных, В отличие от памяти программ и
оперативной памяти данных, единых для всех микроконтроллеров семейс-
тва х51, флэш-память данных у них организована по-разному. Иными сло-
вами, хотя во всех случаях она физически размещена внутри микросхемы,
доступ к ней у различных контроллеров также различен.
В одном случае он осуществляется исключительно с помощью регист-
ров специальных функций (SFR). Типичными представителями такой ор-
ганизации являются микроконвертеры от Analog Devices. Они содержат 640
байт флэш-памяти данных, организованных в 160 4-байтных страниц. Для
хранения содержимого 4-байтной страницы последнего обращения ис-
пользуются 4 регистра данных EDATA1...4. Для хранения 8-битного адреса
страницы, к которой будет осуществляться доступ, используется регистр
EADRL. И наконец, ECON — 8-битный регистр управления, в который
можно записать одну из пяти команд доступа к флэш-памяти данных,
обеспечивающих выполнение различных операций, таких как чтение, за-
пись, стирание, верификация.
В другом случае флэш-память данных располагают в адресном про-
странстве внешней памяти данных. Это означает, что обращение к флэш-
памяти такое же, как к стандартной внешней памяти данных, когда адрес
записываемой/читаемой ячейки заносится в DPTR (или в R0, или в R1), а
затем одна из шести возможных команд MOVX либо пересылает данные из
аккумулятора в выбранную ячейку, либо наоборот. Примером такой адре-
сации флэш-памяти данных являются многие микроконтроллеры фирмы
Atmel.
Рассматриваемая флэш-память, объём которой, например, у
AT89S8252 достигает 2 КБ, располагается в младших (0000H...07FFH) ад-
ресах адресного пространства внешней памяти данных. Она его занимает
не полностью, а делит с внешней памятью данных. Последнее означает,
что, загрузив в DPTR адрес из диапазона (0000H...07FFH), мы командой
-Ж-
Глава 4. ВСТРОЕННАЯ В МИКРОКОНТРОЛЛЕР ФЛЭШ-ПАМЯТЬ ДАННЫХ
MOVX можем обратиться как к ячейке внешней памяти данных (если к
микроконтроллеру правильным образом подключена микросхема вне-
шнего ОЗУ), так и к расположенной внутри микроконтроллера ячейке
флэш-памяти данных с тем же адресом. Выбор конкретного модуля памя-
ти (внешнего ОЗУ или встроенной флэш-памяти) осуществляется в соот-
ветствии с состоянием бита EEMEN регистра WMCON. Для того чтобы
обратиться к флэш-памяти, перед выполнением соответствующей коман-
ды MOVX нужно этот бит установить в 1. Сброс его в 0 задает обращение
именно к микросхеме внешнего ОЗУ.
Ещё один бит регистра WMCON, необходимый для организации рабо-
ты с флэш-памятью (точнее, для записи в неё), — это бит EEMWE. Он дол-
жен быть установлен пользователем в 1 перед записью байта во флэш-па-
мять данных, а после завершения записи должен быть сброшен в 0.
Таким образом, чтобы загрузить данные во флэш-память данных, уста-
новите биты EEMEN и EEMWE регистра WMCON в 1, после чего осущес-
твите требуемую пересылку. Обратите внимание: если, начиная с какого-
либо момента, ваша программа достаточно долго не будет осуществлять
обращение к флэш-памяти, Atmel рекомендует сбросить бит EEMWE в 0, а
не держать его всё время во «взведённом» состоянии.
Сбрасывать EEMEN в 0 нужно только в том случае, если к микроконт-
роллеру подключена внешняя память данных.
Индикатором завершения записи является флаг RDY/BSY#, находя-
щийся в том же регистре. При начальном старте микроконтроллера он ус-
тановлен в 1. Как только запускается процесс записи байта во флэш-па-
мять данных, этот флаг автоматически сбрасывается в 0 и вновь устанавли-
вается в 1, когда запись будет завершена. Таким образом, считывая
содержимое WMCON и анализируя состояние бита RDY/BSY#, можно оп-
ределять момент окончания записи байта во флэш-память данных.
Чтобы прочитать данные из флэш-памяти данных, установите в 1 толь-
ко EEMEN, после чего осуществите требуемую пересылку. Как и при запи-
си, сбрасывать его в 0 нужно только в том случае, если к микроконтролле-
ру подключена внешняя память данных.
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ
ФЛЭШ-ПАМЯТИ ДАННЫХ
К сожалению, не всегда в микроконтроллере, оптимальным образом
подходящем для решения вашей задачи (или просто до боли знакомом, на-
столько, что на другие смотреть пока не хочется), есть встроенная флэш-
память данных. Если при этом возникла потребность в том, чтобы при вы-
ключении питания данные, содержащиеся в ОЗУ, сохранялись, вам помо-
жет внешняя флэш-память. Её выпускают, как минимум, с десяток крупных
фирм-производителей электронных компонентов. Микросхемы в высо-
кой степени стандартизованы (что особенно важно), достаточно дёшевы,
могут осуществлять обмен данными с микроконтроллером по двухпровод-
ной линии, а объём собранной на них внешней памяти может варьиро-
ваться в широком диапазоне — от 1 КБ до десятков МБ.
Мы рассмотрим эти микросхемы на примере 8-килобайтной
АТ24С64А от фирмы Atmel. Приведённой информации вполне достаточ-
но, чтобы любой из читателей, разобравшись с ней, был в состоянии ин-
тегрировать в свою систему любую аналогичную микросхему от любого
производителя.
Но, прежде чем мы займёмся упомянутой микросхемой, нужно позна-
комиться с интерфейсом, с помощью которого она общается с микроконт-
роллером. Тем более что этот интерфейс в последние годы получил очень
широкое распространение в микроконтроллерной технике. Этот интер-
фейс разработан фирмой Philips и носит название шина 12С.
5.1. Шина12С
5.1.1. Описание
Разработанная и запатентованная компанией Philips шина I2C (Inter-
Integrated Circuit) позволяет интегральным микросхемам поддерживать
связь непосредственно между собой по простой двунаправленной 2-про-
водной шине. Всеохватывающее семейство микросхем, как КМОП, так и
биполярных, со встроенным интерфейсом 12С заметно облегчает жизнь
-399-
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
разработчикам цифровых систем управления производственным, потре-
бительским и телекоммуникационным оборудованием. Типовая конфигу-
рация такой системы изображена на Рис. 5.1.
Рис. 5.1. Типовая конфигурация системы с шиной 12С.
Работать с устройствами в системе на основе 12С очень просто, потому
что все они присоединены непосредственно к двум линиям шины: после-
довательной линии данных SDA и последовательной линии тактового сиг-
нала SCL. Процесс конструирования системы от блок-схемы до принци-
пиальной электрической схемы может происходить очень быстро, пос-
кольку нет надобности конструировать интерфейсы шины, а
функциональные блоки на блок-схеме соответствуют реальным микросхе-
мам. Прототип системы, да и законченную версию продукта можно легко
модифицировать или обновить, подстыковывая микросхемы к шине или
отстыковывая их от неё. Простота разработки при использовании шины
12С не снижает её эффективность; это надёжная шина с интегрированны-
ми протоколами адресации и передачи данных (см. Рис. 5.2), поддержива-
ющая несколько ведущих устройств (multimaster). Кроме того, поскольку
многие микроконтроллеры имеют аппаратную реализацию интерфейса
12С, это резко упрощает готовые изделия, сокращает затраты на разводку
печатных плат и в конечном счёте позволяет производителям оборудова-
ния снизить цены на свои изделия.
Поддержка протоколом шины 12С нескольких ведущих устройств —
это весьма важное достоинство, но зачастую оно излишне. Во многих сис-
темах для инициирования всех обменов между устройствами достаточно
единственного ведущего процессора (обычно именуемого мастером). В
данном разделе мы рассматриваем именно такую конфигурацию, с одним
мастером шины 12С.
5.1. Шина I2C
Настоящий раздел ни в коей мере не исчерпывает тему о характеристи-
ках шины 12С. Дополнительные сведения о шине 12С и её аппаратной реа-
лизации теми или иными микроконтроллерами рекомендуется искать в
соответствующих руководствах пользователя этих микроконтроллеров.
5.1.2. Линии шины Г2С
Две линии шины (12С) — это последовательная линия данных (SDA) и
последовательная линия тактового сигнала (SCL). Обе линии присоедине-
ны к плюсу источника питания через подтягивающий резистор, и при не-
занятой шине уровень сигнала в них остаётся ВЫСОКИМ. Каждое уст-
ройство, будь то микрокомпьютер, драйвер ЖК-дисплея, интерфейс па-
мяти или клавиатуры, идентифицируется по уникальному адресу и может
работать в роли передатчика или приёмника в зависимости от функции
данного устройства. Устройство, которое вырабатывает сообщение или
данные, есть передатчик, а устройство, получающее сообщение или дан-
ные, есть приёмник. Очевидно, что пассивные устройства, подобные
драйверу ЖК-дисплея, могут быть только приёмником, тогда как микро-
контроллер или память могут как передавать данные, так и принимать их.
5.1.3. Ведущие и ведомые
Когда в шине производится передача данных, устройство может быть
либо ведущим (мастером), либо ведомым. Мастером является устройство,
которое инициирует передачу и генерирует тактовый сигнал для этой
передачи. В это время любое адресуемое устройство считается ведомым.
Важно отметить, что мастер может быть передатчиком или приёмником;
ведущий микроконтроллер может посылать данные в ОЗУ, работая в роли
передатчика, а затем опрашивать содержимое ОЗУ, действуя в роли
приёмника, но в обоих случаях являясь мастером, инициировавшим
передачу. Точно так же ведомое устройство может быть и приёмником, и
передатчиком.
В шине 12С возможны несколько ведущих устройств. В одной системе
может иметься более чем одно устройство, способное инициировать пере-
дачу и управлять шиной (Рис. 5.2). Микроконтроллер может работать как
ведущий при одной передаче, а затем быть ведомым при другой передаче,
инициированной другим процессором в сети. Деление устройств в сети на
ведущие и ведомые не постоянно и изменяется от передачи к передаче.
Поскольку к шине может быть подключено более одного мастера, то не
исключена ситуация, когда два устройства будут пытаться инициировать
передачу в один и тот же момент времени. Очевидно, что для предотвра-
щения конфликтов в шине и хаоса в процессе обмена необходима проце-
дура арбитража. В протоколе 12С предусмотрены внутренние процедуры
-401*—
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
Рис. 5.2. Соединение по шине 12С.
арбитража и синхронизации тактовых сигналов, которые основаны на со-
единении устройств по схеме «монтажное И» (wired-AND). В типовой сис-
теме с несколькими ведущими устройствами программа микроконтролле-
ра должна свободно переключаться между режимами ведущего и ведомого
устройства и предохранять целостность данных при утрате арбитража.
5.1.4. Передачи данных
Во время каждого тактового импульса передаётся один бит данных (см.
Рис. 5.3). Данные в линии SDA, чтобы быть действительными, должны ос-
таваться стабильными в течение времени, когда уровень тактового им-
пульса сохраняется ВЫСОКИМ. Изменения в линии данных в этот интер-
вал времени будут интерпретироваться как сигналы управления. Переход
из ВЫСОКОГО уровня в НИЗКИЙ на линии данных (SDA) в то время,
как тактовый сигнал (SCL) сохраняет ВЫСОКИЙ уровень, идентифици-
рует условие Старта. Переход в линии SDA из НИЗКОГО уровня в ВЫСО-
КИЙ в то время, когда сигнал SCL сохраняет ВЫСОКИЙ уровень, иден-
тифицирует условие Стопа (Рис. 5.4). Шина считается занятой после появ-
ления условия Старта и снова свободной через некоторый интервал
времени после появления условия Стопа. Условия Старта и Стопа всегда
генерируются мастером.
SDA
SCL
Данные |
на шине I Данные |
I установлены I на шине |
I и не должны I могут |
изменяться изменяться
Рис. 5.3. Передача бита по шине 12С.
-402-
5.1. Шина12С
Старта
Старта
Рис. 5.4. Условие Старта и Стопа на шине 12С.
Количество байтов данных, переданных передатчиком приёмнику за
время от условия Старта до условия Стопа, не ограничивается. Каждый
байт должен быть длиной 8 бит, передача выполняется последовательно,
при передаче первым идёт самый старший бит, передача байта заканчива-
ется битом подтверждения (acknowledge), см. Рис. 5.5. Тактовый импульс,
соответствующий биту подтверждения, генерируется мастером. Устройс-
тво подтверждения должно выставить сигнал НИЗКОГО уровня (удержа-
ния) на линии SDA вниз во время тактового импульса подтверждения, тог-
да как передающее устройство освобождает линию SDA (устанавливает на
своем выходе SDA ВЫСОКИЙ уровень) во время этого импульса,
см. Рис. 5.6.
Ведомый приёмник должен подавать сигнал подтверждения после полу-
чения каждого байта. Также и мастер должен подавать подтверждающий
сигнал после получения каждого байта, принятого от ведомого передатчика.
Если приёмное устройство не может немедленно принять байт данных,
оно может перевести передатчик в состояние ожидания удержанием ли-
нии тактового сигнала на линии SCL на НИЗКОМ уровне. При разработке
системы необходимо принять во внимание случаи, когда сигнал подтверж-
дения не получен. Например, когда устройство-адресат занято выполне-
нием операции, не допускающей отвлечений на иные действия. В подоб-
ном случае мастер после соответствующей временной задержки должен
отменить передачу, сгенерировав условие Стопа, чтобы разрешить выпол-
нение прочих передач. Эти прочие передачи могут быть инициированы
другими мастерами (в системе с несколькими мастерами) или же им
самим.
Есть два исключения из правила «подтверждения после каждого бай-
та». Первое имеет место, когда мастер является приёмником: он должен
просигнализировать о конце данных передатчику, НЕ ДАВ сигнала под-
тверждения для последнего байта, полученного от ведомого. При этом со-
ответствующий подтверждению тактовый импульс, сгенерированный мас-
тером, должен быть подан, но НИЗКИЙ уровень на линии SDA не будет
выставлен. Чтобы показать, что это есть активное и преднамеренное не-
— 403 —
Сигнал подтверждения приёма
___LZLZ
SDA ! Х
MSB
АСК
Бит подтверждения (АСК)
Условие Стоп
Условие
Старт
-----Тактовый сигнал отклоняется
на время обработки прерывания
Передача байта завершена,----
прерывание в приёмнике
Рис. 5.5. Передача данных по шине 12С.
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
5.1. Шина I2C
Данные
на выходе
передатчика
В то время,
когда активен
сигнал подтверждения
приёма,
передатчик
отключен от шины
Данные
на выходе
приёмника
Тактовый
сигнал SCL
от ведущего
устройства
Сигнал
подтверждения приёма
Условие Старт
Рис. 5.6. Подтверждение в шине 12С.
подтверждение, нам следует назвать такое специальное условие «отрица-
тельным подтверждением».
Второе исключение состоит в том, что ведомое устройство пошлёт от-
рицательное подтверждение, когда оно более не может принимать допол-
нительные байты данных. Это происходит после попытки передачи, кото-
рая не может быть принята.
Конструкция шины предусматривает специальное взаимодействие
(интерфейс) с микропроцессорами, которые только программно реализу-
ют весь обмен по 12С, — оно называется медленный режим (Slow Mode).
Медленный режим не нужен, когда все устройства в сети имеют встроен-
ную аппаратную поддержку 12С.
5.1.5. Форматы адресации и передачи
Каждое устройство в сети имеет собственный уникальный адрес. Пе-
ред передачей данных по шине мастер передает по шине адрес ведомого
устройства, к которому будет обращение в данной транзакции. Ведомое
устройство, имеющее именно такой адрес (если оно существует в сети),
конечно же должно откликнуться на призыв мастера. Адресация выполня-
ется первым байтом, который мастер передает после условия Старта.
Адрес в сети имеет длину семь битов, в байте адреса они расположены
в самых старших битах. Последний бит — это бит направления (R/W).
Ноль означает, что мастер выполняет передачу (WRITE), а единица — что
мастер запрашивает данные (READ). Законченный цикл передачи дан-
ных, включающий в себя байт адреса с WRITE и два байта данных, пока-
зан на Рис. 5.7,
Когда послан адрес, каждое устройство в системе сравнивает первые
семь битов после Старта со своим собственным уникальным адресом. Уст-
ройство, которое обнаружило совпадение, будет считать, что мастер обра-
щается именно к нему, и пошлёт подтверждение. Также устройство может
— 405 —
406
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
Рис. 5.7. Полный цикл передачи данных по шине 12С.
5.1. Шина I2C
определить по биту R/W, какая роль ему назначена в данной транзакции —
ведомый приёмник или ведомый передатчик.
Каждый узел в сети 12С обладает уникальным семибитным адресом.
Разумеется, адрес микроконтроллера полностью программируемый, в то
же время адреса периферийных устройств имеют фиксированную и про-
граммируемую части. В дополнение к стандартной адресации, которая
здесь объяснена, протокол шины 12С предусматривает адресацию «общего
вызова» и интерфейс с устройствами CBUS.
Когда мастер занимается обменом только с одним устройством, пере-
дача данных происходит в формате, показанном на Рис. 5.7. При этом бит
R/W может указывать любое направление. По окончании передачи и пода-
чи условия Стопа, если мастер желает обратиться ещё к какому-нибудь ус-
тройству в сети, то, конечно, он начнёт ещё одну транзакцию, сгенериро-
вав новый Старт.
Существует ещё один способ связи мастера с несколькими различны-
ми устройствами — использование «повторного старта». Здесь после пере-
дачи последнего байта транзакции, включая его подтверждение (или отри-
цательное подтверждение), мастер подаёт ещё один Старт, с последующим
адресом и данными, без подачи Стопа. Мастер может общаться с несколь-
кими различными устройствами, с разной последовательностью операций
READ и WRITE (приёма и передачи). По завершении последней передачи
мастер подает Стоп и освобождает шину. Возможные варианты формата
данных изображены на Рис. 5.8. Обратите внимание, что повторный старт
допускает и смену ведомого, и смену направления без освобождения ши-
ны. Потом мы увидим, что возможность смены направления может быть
весьма кстати даже при обмене с единственным устройством.
В системе с единственным мастером механизм повторного старта мо-
жет быть эффективнее, чем завершение каждой передачи Стопом и новым
Стартом. В системе с несколькими мастерами трудно сказать заранее, ка-
кой из форматов наиболее эффективен, потому что, когда один из масте-
ров осуществляет повторный старт и удерживает шину продолжительное
время, остальные устройства вынуждены ожидать своей очереди.
5.1.6. Использование субадресов
Для некоторых микросхем, использующих для обмена данными шину
12С, наличия одного только адреса устройства недостаточно для эффек-
тивной коммуникации и имеется потребность в механизме адресации
внутренних частей устройства. Типичный пример, когда надо обратиться к
конкретному слову внутри устройства — это адресация микросхемы памя-
ти, содержащей последовательность ячеек памяти, начиная с конкретного
внутреннего адреса.
-407-
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
Передаваемые данные
(л байт + бит подтверждения)
Режим ведущего передатчика
S Адрес ведомого W А Данные А Данные А Р
Передаваемые данные
(л-байт + бит подтверждения)
Режим ведущего приёмника
S Адрес ведомого R А Данные А Данные NA Р
п байт + бит подтверждения
п байт + бит подтверждения
может быть изменено
S — Старт
Р — Стоп
W — Запись
R — Чтение
R/W — Чтение или запись
А — Подтверждение
NA — Отказ в подтверждении (отрицательное подтверждение)
Рис. 5.8. Формат данных 12С.
Такое типичное устройство памяти для 12С, как ОЗУ PCF8570, содер-
жит встроенный регистр адреса байта, содержимое которого автоматичес-
ки увеличивается на единицу после каждого байта, который является про-
читанным или записанным байтом данных. Когда мастер общается с
PCF8570, он должен послать субадрес (дополнительный адрес) в байте, ко-
торый следует за байтом адреса ведомого устройства. Этот субадрес есть
внутренний адрес байта, к которому мастер хочет обратиться для выполне-
ния однобайтной передачи, или адрес первой из последовательности яче-
ек, если передача многобайтная. Субадрес — это байт, состоящий из
8 битов. В отличие от адреса устройства он не содержит бита направления
(R/W) и, как для любого байта, передаваемого по шине, после него надо
подать подтверждение.
Цикл записи в память показан на Рис. 5.9а. За Стартом следует байт ад-
реса ведомого устройства, с установленным на WRITE битом направления,
байт субадреса, ряд байтов данных и сигнал Стопа. Субадрес загружается в
память адресов слов, а последующие байты данных будут записаны друг за
другом, начиная с ячейки, заданной субадресом, поскольку регистр инк-
рементируется автоматически.
— 408 —
5.1. Шина I2C
Цикл чтения из памяти (см. Рис. 5.90) начинается похожим образом:
мастер посылает адрес ведомого с битом направления, установленным в
WRITE, и с последующим субадресом. Далее, чтобы изменить направле-
ние передачи, мастер генерирует повторный Старт, за которым снова идёт
адрес устройства памяти, но на этот раз бит направления установлен в
READ. Байты данных, начиная с первого, расположение которого задано
субадресом, будут считаны из устройства, а после каждого из них мастер
подаст подтверждение. После приёма последнего байта цикла чтения бу-
дет подано отрицательное подтверждение, обозначающее конец передачи.
Цикл завершается сигналом Стопа.
Ведущий передаёт данные ведомому
Подтверждение
от ведомого
устройства
Подтверждение
от ведомого
устройства
Подтверждение
от ведомого
устройства
Рис. 5.9. Использование субадресов 12С:
а) цикл записи в память, б) цикл чтения из памяти.
— 409 —
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
5.2. Микросхема АТ24С64А
После знакомства с шиной 12С рассмотрим теперь одну из типичных
микросхем внешней флэш-памяти, для обмена с которой эта шина исполь-
зуется. Речь пойдет о 8-килобайтной АТ24С64А от Atmel. Как уже упоми-
налось, она мало чем отличается от микросхем Atmel с другими объёмами
памяти, да и от подобных изделий иных производителей. Поэтому, под-
робно ознакомившись с одним из представителей этого семейства микро-
схем, всегда можно легко разобраться и в работе любого другого.
5.2.1. Общее описание
АТ24С64А содержит 65536 ячеек электрически стираемой и програм-
мируемой ROM (иначе EEPROM). Её организация — 8192x8 бит. Микро-
схемы допускают каскадирование до 8 штук на одну общую двухпровод-
ную линию. Они оптимизированы для использования в промышленных и
бытовых изделиях, в первую очередь там, где актуальны малая потребляе-
мая мощность и низкое напряжение питания. Выпускаются микросхемы в
8-выводном корпусе (исполнение PDIP, SOIC, MAP, TSSOP). Кроме того,
они различаются по напряжению питания — 2.7-вольтовые (2.7...5.5 В) и
1.8-вольтовые (1.8...5.5 В). Цоколёвка микросхем приведена на Рис. 5.10.
Основные характеристики микросхемы АТ24С64А, на которые обра-
щает наше внимание её производитель, следующие:
8-выводной МАР
8-выводной SOIC
□ 8 1Е
□ 7 2Е
□ 6 ЗЕ
□ 5 4Е
VCC
WP
SCL
SDA
АО
А1
А2
GND
Вид снизу
8-выводной TSSOP
8-выводной PDIP
АОЕ 1
А1Е 2
А2Е 3
GNDE 4
8UVCC
7JWP
6 □SCL
5 □SDA
АОЕ 1
А1Е
А2Е
GNDE
8 □ VCC
7 □WP
6 □SCL
5 □SDA
2
3
4
Рис. 5.10. Цоколёвка АТ24С64А (для различных типов корпуса).
-410-
5.2. Микросхема АТ24С64А
1. Наличие двух версий — низковольтной (1.8...5.5 В) и стандартной
(2.7...5.5 В).
2. Малая потребляемая мощность (есть модификации, потребляющие
6 мкА при U= 5.5 В).
3. Организация 8192x8.
4. Двухпроводной интерфейс с двунаправленным обменом данными.
5. Наличие входных триггеров Шмитта, улучшающих помехозащищён-
ность микросхем.
6. Тактовая частота 100 кГц (низковольтные версии) и 400 кГц (стандар-
тные версии).
7. Аппаратная защита от стирания/перезаписи.
8. 32-байтная страничная организация.
9. Цикл записи — менее 5 мс.
10. Способность к перезаписи — до 1000000 циклов.
11. Время хранения информации — до 100 лет.
Предельно допустимые значения параметров
• Рабочая температура..........................—55...+125 °C
• Температура хранения.........................—65...+150 °C
• Напряжение на любом и$ выводов
(относительно земли)...............................1.0...+7.0 В
• Напряжение питания...........................не более 6.25 В
• Выходной ток.................................не более 5.0 мА
Структурная схема микросхемы приведена на Рис. 5.11.
Внутренне микросхема организована в виде 256 32-байтных страниц.
При осуществлении записи/считывания произвольной ячейки использу-
ется 13-битный субадрес.
5.2.2. Описание выводов
• SCL (SERIAL CLOCK).
По перепаду из 0 в 1 на этом входе данные записываются в микро-
схему, а по перепаду из 1 в 0 — должны быть считаны.
• SDA (SERIAL DATA).
Является двунаправленным входом/выходом. Представляет собой
вывод с открытым коллектором (стоком) и может объединяться с
аналогичными выводами других микросхем по схеме «монтажное
ИЛИ».
• А2, А1 и АО (DEVICE ADRESSES).
Эти адресные входы могут быть оставлены незадействованными
(«висящими в воздухе») либо соединены с шиной питания или об-
щим проводом (землёй). Во втором случае возможно использование
-411-
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
Рис. 5.11. Структурная схема АТ24С64А.
до 8 микросхем памяти на одной двунаправленной линии (т. е. с од-
ним SCL и одним SDA). Способ адресации каждой микросхемы при
этом описан в разд. 5.2.4.
Даже если выводы А2...А0 оставлены «висящими в воздухе», они,
тем не менее заземлены через внутренний резистор. Однако, если
ёмкость монтажа превышает 5 пФ, Atmel рекомендует не оставлять
эти входы неподключенными, а соединять их с общим проводом.
• WP (WRITE PROTECT).
Соединение этого входа с общим проводом обеспечивает функцио-
нирование микросхемы в полном объёме (т. е. с возможностью запи-
си и стирания). Если на этот вход подан ВЫСОКИЙ уровень, опера-
ции записи запрещены. Если вывод WP оставлен «висящим в
воздухе», он тем не менее заземлён через внутренний резистор и на
нем присутствует НИЗКИЙ уровень. Однако, если ёмкость монтажа
- 412 -
5.2. Микросхема АТ24С64А
превышает 5 пФ, Atmel рекомендует не оставлять его неподключен-
ным, а соединять с общим проводом или с шиной питания. Пере-
ключение WP из 0 в 1 перед операцией записи обеспечивает про-
граммную защиту от перезаписи.
5.2.3. Функционирование микросхемы
• SCLHSDA.
Линия SDA обычно «подтянута» внешним резистором к шине пита-
ния. Изменение данных на этом выводе возможно только в проме-
жуток времени, когда на линии SCL присутствует НИЗКИЙ уро-
вень. Изменения состояния линии SDA при высоком уровне на
линии SCL трактуются как условия Старта или Стопа.
• УСЛОВИЕ СТАРТА.
Перепад из 1 в 0 на линии SDA при SCL = 1 является условием стар-
та. Оно должно предшествовать любой команде.
• УСЛОВИЕ СТОПА.
Перепад из 0 в 1 на линии SDA при SCL = 1 является условием стопа.
После операции чтения по произвольному адресу условие стопа пе-
реводит микросхему в режим энергосбережения.
• ПОДТВЕРЖДЕНИЕ (ACKNOWLEGE).
Все последовательные пересылки данных, как адресной информа-
ция, так и самих данных, осуществляются в 8-битном формате. Пос-
ле передачи 8-го бита в 9-м такте SCL микросхема EEPROM выстав-
ляет сигнал НИЗКОГО уровня (0) на линии SDA для подтверждения
того, что пересылка завершена. Микроконтроллер в этот момент
должен поддерживать ВЫСОКИЙ уровень сигнала на своем выводе
SDA и контролировать состояние линии SDA — если на ней 0, то
сигнал ACKNOWLEGE выдан ведомой микросхемой.
• РЕЖИМ ЭНЕРГОСБЕРЕЖЕНИЯ.
Режим энергосбережения наступает:
а) после включения питания и
б) после получения условия стопа и завершения внутренних опера-
ций.
• РЕЖИМ СБРОСА.
После любого нештатного завершения передачи (выключение пита-
ния и т. д.) сброс осуществляется одной из следующих операций:
а) в течение 9 циклов SCL;
б) SDA=lnpn SCL=1;
в) после идентификации условия стопа.
-413 -
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
5.2.4. Адресация микросхемы
Выбор микросхемы осуществляется с использованием 8-битного адре-
са, передаваемого сразу после условия старта (см. Рис. 5.12). Этот адрес
микросхемы состоит из 4-битного фиксированного адреса, присвоенного
этому классу микросхем (старшие 4 бита на Рис. 5.12, содержащие 1010В),
а также из трёхбитного индивидуального адреса (биты А2, А1 и АО). Биты
А2...А0 сравниваются с логическими уровнями, предустановленными на
соответствующих входах каждой из входящих в систему микросхем. Если
для какой-нибудь из этих микросхем обнаруживается совпадение передан-
ного индивидуального адреса с кодом, заданным этими логическими уров-
нями, данная микросхема выбирается для чтения или записи. В против-
ном случае дальнейшая передаваемая от ведущего устройства информация
игнорируется.
Восьмой бит байта адреса микросхемы определяет тип выбранной опе-
рации — чтение из микросхемы или запись в неё. Если значение этого бита
равно единице, то производится операция чтения, если нуль — операция
записи.
В процессе сравнения битов А2...А0 с логическими уровнями на адрес-
ных входах выходные сигналы микросхем устанавливаются в 0. Если сов-
падения адресов не обнаружено, микросхема переходит в режим энерго-
сбережения.
Если адресные входы микросхемы оставлены неподключёнными, для
её выбора биты А2...А0 нужно устанавливать в 0.
1 0 1 0 А2 А, А» R/W
MSB LSB
Рис. 5.12. Адрес, передаваемый после условия старта.
5.2.5. Операции записи
Запись байта
Операция записи требует передачи двухбайтного адреса (субадреса)
требуемого байта сразу после передачи адреса микросхемы, описанного в
предыдущем разделе. Во время приёма этого двухбайтного субадреса вы-
ход микросхемы находится в неактивном (высокоимпендансном) состоя-
нии. По завершении приёма адресной информации микросхема памяти,
тактируемая ведущим микроконтроллером, принимает от последнего 8 бит
данных. Передав их, микроконтроллер должен выставить на линии усло-
вие стопа.
-414 -
5.2. Микросхема АТ24С64А
В это время микросхема памяти завершает свои внутренние операции,
связанные с записью. При этом все её входы недоступны для передачи ин-
формации, и до тех пор, пока операции записи не завершатся, микросхема
не отвечает на внешние сигналы.
Операция записи байта графически изображена на Рис. 5.13.
Уело- Усло-
вие Адрес Запись 1-е слово 2-е слово вие
«Старт» микросхемы / адреса адреса Данные «Стоп»
MSB LSB R/WASK MSB ASK LSB ASK ASK
Примечания: 1 .‘Этот бит может иметь любое значение.
2ЛЭтот бит может иметь любое значение при страничной записи.
3. АСК (ACKNOWLEDGE) — подтверждение, R/W — чтение/запись.
Рис. 5.13. Запись байта.
Запись страницы
Микросхемы АТ24С64А позволяют осуществлять постраничную 32-
байтную запись.
Начинается цикл записи страницы аналогично вышеописанной запи-
си байта, но после завершения передачи байта данных для записи в
EEPROM микроконтроллер не посылает условие стопа. Вместо этого,
дождавшись от микросхемы памяти сигнала подтверждения приёма этого
байта, микроконтроллер посылает вслед за ним ещё до 32 Б данных. При-
ём каждого байта микросхема памяти подтверждает выдачей сигнала
НИЗКОГО уровня ACKNOWLEGE. По завершении передачи микроконт-
роллер должен выставить условие Стопа.
Операция записи страницы графически изображена на Рис. 5.14.
Пять младших битов адреса аппаратно инкрементируются после при-
ёма каждого вновь посланного байта в цикле страничной записи. Осталь-
ные адресные биты остаются неизменными, определяя адрес текущей за-
писываемой страницы. Если микроконтроллер после посылки 32 Б не за-
вершит операцию условием стопа, а продолжит посылку следующего
байта, этот 33-й байт запишется на место первого и т. д. Естественно, пер-
вый, второй и т. д. байты после записи поверх них 33-го, 34-го и т. д. будут
утрачены.
После приёма данных микросхема памяти осуществляет запись их в
соответствующие ячейки, и до тех пор, пока внутренние операции записи
-4J5-
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
MSB
1-е слово
адреса
(для п-го
Условие Адрес Запись
«Старт» микросхемы \ байта данных)
SDA ЛИНИЯ
LSB R/W ASK
ASK
2-е слово
адреса
(для п-го
байта данных)
Данные
(байт/?)
Данные Условие
(байтп+х) «Стоп»
ASK
ASK
ASK
Примечания: 1 .‘Этот бит может иметь любое значение.
2ДЭтот бит может иметь любое значение при страничной записи.
3. АСК (ACKNOWLEDGE) — подтверждение, R/W — чтение/запись.
Рис. 5.14. Запись страницы.
не будут завершены, микросхема не будет реагировать на внешние обра-
щения. Для того чтобы определить момент завершения внутренних опера-
ций записи, микроконтроллер может применить так называемый «опрос-
ожидание подтверждения» (звучит ужасно, но лучший перевод термина
ACKNOWLEGE POLLING я подобрать затрудняюсь). Суть его состоит в
том, что микроконтроллер посылает в шину условие старта и адрес микро-
схемы. Как только микроконтроллер получает подтверждение приёма ад-
реса микросхемы, операции внутренней записи считаются завершёнными
и можно осуществлять следующую операцию чтения или записи.
5.2.6. Операции чтения
Чтение начинается аналогично записи, за исключением того, что вось-
мой бит в адресе микросхемы должен быть не нулём, а единицей.
Есть три типа операций чтения: чтение по текущему адресу, чтение по
произвольному адресу и последовательное чтение.
Чтение по текущему адресу
Внутренний счётчик адреса содержит увеличенный на единицу адрес
той ячейки, куда осуществлялась последняя операция чтения или записи.
Этот адрес может сохраняться до тех пор, пока не будет выключено напря-
жение питания либо пока в этот счётчик не будет занесена новая информа-
ция. Если считанной в предыдущем цикле была последняя ячейка послед-
ней страницы, счётчик «перекинется» на первую ячейку первой страницы.
Если записанной в предыдущем цикле была последняя ячейка той или иной
страницы, счётчик «перекинется» на первую ячейку этой же страницы.
После того как микросхема памяти была адресована с установленным в
1 битом R/W (чтения/записи) и подтвердила приём адреса сигналом
ACKNOWLEGE, она под управлением тактового сигнала от микроконт-
роллера передаёт ему содержимое ячейки памяти по текущему адресу.
-414—
5.2. Микросхема АТ24С64А
Приняв данные, микроконтроллер должен выставить условие стопа, не
подтверждая приём переданного байта своим сигналом ACKNOWLEGE
(см. Рис. 5.15).
Линия SDA
Условие Адрес Чтение
«Старт» микросхемы
MSB
Условие
«Стоп»
Данные
_ Нет
LSB R/W ASK подтверждения
Рис. 5.15. Чтение по текущему адресу.
Чтение по произвольному адресу
Такое чтение требует предварительной записи в память адресной ин-
формации, при этом в байте адреса микросхемы бит «чтение/запись» дол-
жен быть нулевым.
За байтом адреса передаются два байта с субадресом ячейки памяти, ко-
торую требуется прочитать. Микросхема памяти отвечает на каждый при-
нятый байт сигналом подтверждения.
В справочных данных микросхемы АТ24С64А от фирмы-производите-
ля запись этих трёх байтов именуется как dummy write — холостая запись
(дословно — запись-дурилка).
Получив сигнал подтверждения после холостой записи, микроконт-
роллер должен сгенерировать ещё одно условие старта. Фактически после
этого полностью повторяется операция чтения по текущему адресу (см.
Рис. 5.16).
Условие «Старт*
1-е, 2-е слово ал
Условие Адресный Запись п'го байта дан!
«Старт» счётчик \
Адресный Чтение
счётчик /
Условие
«Стоп»
MSB
LSB R/W ASK
ASK
ASK
/ Данные
/ (п-й байт)
ASK
Нет
подтверж-
дения
Холостая запись
Примечание. *Этот бит может иметь любое значение.
Рис. 5.16. Чтение по произвольному адресу.
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
Последовательное чтение
Такое чтение может быть продолжением как операции чтения по теку-
щему адресу, так и операции чтения по произвольному адресу. После полу-
чения байта от микросхемы памяти микроконтроллер должен выставить
сигнал ACKNOWLEGE. Получив этот сигнал подтверждения, микросхема
памяти увеличивает на 1 счётчик адреса ячейки, считывает из неё инфор-
мацию и посылает её в микроконтроллер вслед за предыдущим байтом.
Если при считывании счётчик адреса дойдет до максимума, произойдет
сброс его в 0, и следующее считывание будет из ячейки с адресом 0.
Считывание будет продолжаться до тех пор, пока микроконтроллер бу-
дет подтверждать каждый принятый байт сигналом ACKNOWLEGE. Как
только он не подтвердит считанный байт сигналом ACKNOWLEGE, а вы-
ставит вместо этого условие стопа, последовательное чтение завершится
(см. Рис. 5.17).
R/W ASK подтверж-
дения
Рис. 5.17. Последовательное чтение.
5.3. Подпрограммы для обмена микроконтроллера
CAT24C64A
И в завершение приведу набор подпрограмм, обеспечивающих обмен
информацией между микроконтроллером 51-го семейства и микросхемой
АТ24С64А. Этот набор подпрограмм в свое время был скачан с сайта фир-
мы Atmel.
Поддерживаются все пять типов операций с памятью, доступные
АТ24С64А. Запись байта, чтение по текущему адресу и чтение по произ-
вольному адресу производятся подпрограммами WRITE_BYTE,
READ__CURRENT и READ_RANDOM соответственно. Запись страницы и пос-
ледовательное чтение осуществляют подпрограммы WRITEJBLOCK и
- 418 -
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А
READ_BLOCK. Последние допускают работу с количеством от одного до 32
байт и обеспечивают пересылки между микроконтроллером и буфером
EEPROM.
Приведённые подпрограммы позволяют обслуживать по шине 12С до 8
микросхем памяти, имеющих уникальные адреса (от 0 до 7), определяемые
состоянием входов А2...А0 микросхем. Этот трёхбитный адрес (PADDR)
используется вместе с фиксированным адресом (FADDR) для формирова-
ния уникального адреса каждой из подключенных к шине микросхем. Бо-
лее подробно об этом сказано в предыдущих разделах.
Подпрограммы BYTE-FILL, VERIFY-BYTE_FILL, page_fill И
VERIFY—PAGE—FILL являются артефактами отладочного процесса и слу-
жат для иллюстрации использования подпрограмм чтения и записи
АТ24С64А. Чтобы модифицировать эти подпрограммы для работы с дру-
гими микросхемами 24-го семейства Atmel, достаточно переопределить
значение SIZE (количество байт в микросхеме EEPROM) и PSIZE (коли-
чество байт на странице). Для изменения значения константы заполнения
памяти в подпрограммах BYTE_fill, PAGE—fill переназначают конс-
танту FILL. Для изменения адреса микросхемы определяют в соответс-
твии с состоянием её входов А2...А0 константу PADDR (от 0 до 7).
Приведённые подпрограммы удовлетворяют требованиям временных
характеристик микросхем EEPROM 24-го семейства при использовании
их совместно со стандартными микроконтроллерами х51 на частоте
12 МГц. Для микроконтроллеров, функционирующих на более высоких
тактовых частотах, может потребоваться доработка этих подпрограмм.
Набор подпрограмм, обеспечивающих обмен информацией между
МК 51-го семейства и микросхемой АТ24С64А
DATA
FADDR EQU aOh ;fixed address for AT24Cxx EEPROMs
PADDR EQU ;programmable address (0 ..7)
SIZE EQU 2000h ;bytes per AT24C64
PSIZE EQU 32 ;bytes per page for AT24C64
FILL EQU 55h ;example fill value
;Register definitions.
index REG RO /buffer pointer
kount REG R1 ;byte count register
zdata REG R1 /data register
addr.lo REG R2 /2-byte address register
addr_hi REG R3 /
—4J9-
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
/Microcontroller connections to АТ24Схх serial bus lines.
SCL REG pl.2 /serial clock
SDA REG pl.3 /serial data
ORG 40H
buffer EQU PSIZE /storage for read/write data
CODE
ORG 000H /power on/reset vector
jmp on_reset
on_reset:
/Initialize AT24Cxx serial bus lines.
setb SDA /high
setb SCL / high
call byte_fill
jc fault
call verify_byte_.fi 11
jc fault
call page_fill
jc fault
call verify_page_fill
jc fault
fault:
jmp $
byte_fill:
/Fill every byte in an AT24Cxx with the same value.
/Writes one address at a time (page mode is not used).
/Returns CY set to indicate write timeout.
/Destroys A, B, DPTR, XDATA, ADDR_HI:ADDR_LO.
-‘420-
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А
mov mov zdata, #FILL dptr, #0 addr_lo, dpi addr_hi, dph /set up fill data /initialize address pointer /set up address
x51: mov mov
mov b, #120 /retry counter
x52: mov a, #PADDR /programmable address
call write_byte /try to write
jnc x53 /jump if write OK
djnz b, x52 /try again
setb c /set timeout error flag
jmp x54 /exit
x53: inc dptr /advance address pointer
/mov a, dpi, check low byte
/cjne a , #(< SIZE), x51, jump if not last
mov a, dph /check high byte
cjne a, #(> SIZE)( , /jump if not last
clr x51 c /clear error flag
х54:
ret
verify_byte_fill:
/Verify that all bytes in an AT24Cxx match a fill value.
/Reads and verifies one byte at a time (page mode is not used).
/Performs a Random Read function to initialize the internal
/address counter and checks the contents of the first address.
/Then performs multiple Current Address Read functions to step
/through the remaining addressess.
/Returns CY set to indicate read timeout or compare fail.
/Destroys kt B, DPTR.
mov
mov
mov
dptr, #0 /initialize address pointer/counter
addr_lo, dpi /set up address
addr_hi, dph /
mov b, #120 /retry counter
x81:
mov a, #PADDR /programmable address
call read_random /try to read
-421 -
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
jnc x82 /jump if read OK
djnz b, x81 /try again
jmp x86 /set error flag and exit
x82: cjne a, #FILL, x86 /jump if compare error
jmp x85 /do remaining addresses
x83: mov call a, #PADDR read_current
jc x87 /jump if read fails
cjne a, #FILL, x86 /jump if compare error
x85: inc dptr /advance address pointer
mov a, dph /check high byte
cjne a, #(> SIZE), /jump if not last
clr x83 c /clear error flag
jmp x87 /exit
x86: setb c /set error flag
x87: ret
page_fill:
;Fill every byte in an AT24Cxx with the same value.
/Writes one page at a time.
/Returns CY set to indicate write timeout.
/Destroys A, B, DPTR, KOUNT, INDEX, ADDR_HI:ADDR.LO.
/First fill buffer.
mov b, #PSIZE /bytes per page
mov index, #buffer /point to buffer
x61:
mov @index, #FILL /put fill value in buffer
inc index /advance pointer
djnz b, x61 /next byte
/Copy buffer to device, one page at a time.
mov dptr, #0 /initialize address pointer
x62:
-422-
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А
mov addr_lo, dpi /set up address
mov addr_hi, dph /
mov kount, #PSIZE /bytes per page
mov b, #120 /retry counter
x63:
mov a, #PADDR /programmable address
call write_block /try to write
jnc x64 /jump if write OK
djnz b, x63 /try again
setb c /set timeout error flag
jmp хбб /exit
хб4:
/Add page size to address pointer.
mov a, dpi /get low byte
add a, #PSIZE /add page size
mov dpi, a /save low byte
jnc x65 /jump if high byte not affected
inc dph /increment high byte
;cjne a, #(< SIZE), x62 ;jump if low byte not last
mov a, dph /check high byte
c jne a, #(> SIZE), x62 /jump if not last
clr c /clear error flag
x66:
ret
veri fy_page_fill:
;Verify that all bytes in an AT24Cxx match a fill value.
/Reads and verifies one page at a time.
/Returns CY set to indicate read timeout or compare fail.
/Destroys A, B, DPTR, KOUNT, INDEX, ADDR_HI:ADDR.LO.
/Copy device page to buffer.
mov
x71:
mov
mov
mov
dptr, #0 /initialize address pointer
addr_lo, dpi /set up address
addr_hi, dph /
kount, #PSIZE /bytes per page
mov b, #120
/retry counter
-423-
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
х72:
mov call jnc a, #PADDR ; read_block ; x74 ; programmable address try to read jump if read OK
djnz b, x72 try again
x73: setb c set error flag
jmp x77 exit
x74: /Verify buffer contents.
mov mov b, #PSIZE /bytes per page index, #buffer /point to buffer
x75:
cjne @index, #FILL, /jump if compare fails x73
inc index /advance pointer
djnz b, x75 /next byte
/Add page size to address pointer.
mov a, dpi /get low byte
add a, #PSIZE /add page size
mov dpi, a /save low byte
jnc x76 /jump if high byte not affected
inc dph /increment high byte
/cjne a, #(< SIZE), x71, ;jump if low byte not last
x76:
mov a, dph /check high byte
cjne a, #(> SIZE), x71 /jump if not last
clr x77: ret c /clear error flag
write_block:
;Write from one byte to one page of data to an AT24Cxx.
;Called with programmable address in A, address of first byte
;in register pair ADDR_HI:ADDR_LO, data in BUFFER, byte count
;in register KOUNT.
;Does not wait for write cycle to complete.
;Returns CY set to indicate that the bus is not available
;or that the addressed device failed to acknowledge.
/Destroys A, KOUNT, INDEX.
-424-
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А
call jc start x38 /abort if bus not available
rl a /programmable address to REGs 3:1
orl a, #FADDR /add fixed address
clr acc. 0 /specify write operation
call shout /send device address
jc x37 /abort if no acknowledge
mov a, addr-hi /send high byte of address
call shout
jc x37 /abort if no acknowledge
mov a, addr_lo /send low byte of address
call shout /
jc x37 /abort if no acknowledge
x36: mov index, #buffer /point to buffer
mov a, @index /get data
call shout /send data
jc x37 /abort if no acknowledge
inc index /advance buffer pointer
djnz kount, x36 /next byte
x37: clr c /clear error flag
x38: call ret stop
read-block:
;Read from one byte to one page of data from an AT24Cxx.
/Performs a Random Read which is extended into a Sequential Read
/when more than one byte is read. Called with programmable address
/in A, address of first byte in register pair ADDR_HI:ADDR_LO,
/byte count in register KOUNT.
/Returns data in BUFFER. Returns CY set to indicate that the bus is
/not available or that the addressed device failed to acknowledge.
/Destroys A, KOUNT, INDEX.
/Send dummy write command to address first byte.
-425
1лава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
call jc start x35 ;abort if bus not available
rl a /programmable address to REGs 3:1
orl a, #FADDR ;add fixed address
mov index, a /save copy of device address
clr acc. 0 /specify write operation
call shout /send device address
jc x34 /abort if no acknowledge
mov a, addr_hi /send high byte of address
call shout /
jc x34 /abort if no acknowledge
mov a, addr_lo /send low byte of address
call shout /
jc x34 /abort if no acknowledge /Send read command and receive data
call start /second start for read
jc x34 /abort if bus not available
mov a, index /get device address
setb acc.O /specify read operation
call shout /send device address
jc x34 /abort if no acknowledge
х31: mov index, #buffer /point to buffer
call shin /receive data byte
mov ©index, a /save data
cjne kount, #1, x32 /jump if not last byte
call NAK /do not acknowledge last byte
х32: jmp хЗЗ / done
call ACK /acknowledge byte
inc index /advance buffer pointer
хЗЗ: djnz kount, x31 /next byte
х34: clr c /clear error flag
х35: call ret stop
-426—
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А
write_byte:
/АТ24Схх Byte Write function.
/Called with programmable address in A, byte address in
/register pair ADDR_HI:ADDR_LO, data in register XDATA.
/Does not wait for write cycle to complete.
/Returns CY set to indicate that the bus is not available
/or that the addressed device failed to acknowledge.
/Destroys A.
call jc start x49 /abort if bus not available
rl a /programmable address to REGs 3:1
orl a, #FADDR /add fixed address
clr acc.O /specify write operation
call shout /send device address
jc x48 /abort if no acknowledge
mov a, addr_hi /send high byte of address
call shout /
jc x48 /abort if no acknowledge
mov a, addr_lo /send low byte of address
call shout /
jc x48 /abort if no acknowledge
mov a, zdata /get data
call shout /send data
jc x48 /abort if no acknowledge
clr x48: c /clear error flag
call stop
x49:
ret
read_current:
/AT24Cxx Current Address Read function.
/Called with programmable address in A. Returns data in A.
/Returns CY set to indicate that the bus is not available
/or that the addressed device failed to acknowledge.
— 437 —
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
call jc start x45 /abort if bus not available
rl a /programmable address to REGs 3:1
orl a, #FADDR /add fixed address
setb acc. 0 /specify read operation
call shout /send device address
jc x44 /abort if no acknowledge
call shin /receive data byte
call NAK /do not acknowledge byte
x44: clr c /clear error flag
x45: call ret stop
read_random:
/АТ24Схх Random Read function.
;Called with programmable address in A, byte address in
/register pair ADDR_HI:ADDR_LO. Returns data in A.
/Returns CY set to indicate that the bus is not available
/or that the addressed device failed to acknowledge.
push mov b b, a /save copy of programmable address /Send dummy write command to set internal address
call start
jc x47 /abort if bus not available
rl a /programmable address to REGs 3:1
orl a, #FADDR /add fixed address
clr acc.O /specify write operation
call shout /send device address
jc x46 /abort if no acknowledge
mov a, addr_hi /send high byte of address
call shout /
jc x46 /abort if no acknowledge
mov a, addr_lo /send low byte of address
—428—
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А
call shout ;
jc х4б ;abort if no acknowledge
;Call Current Address Read function.
mov a, b ;get programmable address
call read_current
jmp x46: x47 ;exit
call x47: stop
pop ret b
start:
;Send START, defined as high-to-low SDA with SCL high.
;Return with SCL, SDA low.
;Returns CY set if bus is not available.
setb setb SDA SCL
/Verify bus available.
jnb SDA, x40 /jump if not high
jnb nop clr nop nop nop nop nop clr SCL, x40 ;jump if not high /enforce setup delay and cycle delay SDA /enforce hold delay 9 9 9 SCL
x40: clr jmp c /clear error flag x41
x41: setb ret c /set error flag
^^439 —
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
stop:
/Send STOP, defined as low-to-high SDA with SCL high.
/SCL expected low on entry. Return with SCL, SDA high.
clr SDA
nop /enforce SCL low and data setup
nop
setb SCL
nop /enforce setup delay
nop /
nop
nop
nop
setb SDA
ret
shout:
/Shift out a byte to the AT24Cxx, most significant REG first.
/SCL, SDA expected low on entry. Return with SCL low.
/Called with data to send in A.
/Returns CY set to indicate failure by slave to acknowledge.
/Destroys A.
push mov b b, #8 /REG counter
x42:
rlc a /move REG into CY
mov SDA, c /output REG
nop /enforce SCL low and data setup
setb SCL /raise clock
nop /enforce SCL high
nop /
nop 9
nop 9
clr SCL /drop clock
djnz b, x42 /next REG
setb SDA /release SDA for ACK
nop /enforce SCL low and tAA
nop /
setb SCL /raise ACK clock
nop /enforce SCL high
nop /
5.3. Подпрограммы для обмена микроконтроллера с АТ24С64А
пор ;
ПОР ;
mov с, SDA ;get АСК REG
clr SCL /drop ACK clock
pop b
ret
shin:
;Shift in a byte from the AT24Cxx, most significant REG first.
/SCL expected low on entry. Return with SCL low.
;Returns received data byte in A.
setb SDA ;make SDA an input
push b
mov b, #8 /REG count
x43:
nop /enforce SCL low and data setup
nop
nop
setb SCL /raise clock
nop /enforce SCL high
nop /
mov C, SDA /input REG
rlc a /move REG into byte
clr SCL /drop clock
djnz b, x43 /next REG
pop b
ret
ACK:
;Clock out an acknowledge REG (low).
/SCL expected low on entry. Return with SCL, SDA low.
clr SDA /АСК REG
nop /enforce SCL low and data setup
nop /
setb SCL /raise clock
nop /enforce SCL high
nop 9
nop 9
nop 9
-4Д1-
Глава 5. ИСПОЛЬЗОВАНИЕ ВНЕШНЕЙ ФЛЭШ-ПАМЯТИ ДАННЫХ
clr
ret
SCL
/drop clock
NAK:
;Clock out a negative acknowledge REG (high). /SCL expected low on entry. Return with SCL low, SDA high
setb SDA /NAK REG nop /enforce SCL low and data setup
nop ; setb SCL /raise clock nop /enforce SCL high nop nop ; nop / clr SCL /drop clock ret
END
5.4. Краткие выводы
В этой главе мы рассмотрели одну из наиболее типичных микросхем
внешней флэш-памяти данных (EEPROM) — АТ24С64А фирмы Atmel. Она
имеет объём памяти 8Кх8 и для обмена с микроконтроллером использует
всего 2 линии: линию данных SDA и линию тактирования SCL. С помо-
щью различных кодовых комбинаций на входах А2...А0 можно адресовать
по одной шине до 8 таких микросхем.
Atmel производит целый ряд аналогичных микросхем EEPROM, отли-
чающихся от АТ24С64А общим объёмом памяти и страничной организа-
цией. Работа с этими микросхемами практически не отличается от работы
с рассмотренной АТ24С64А.
Многие ведущие мировые производители микросхем выпускают изде-
лия, аналогичные рассмотренным микросхемам Atmel. Работа с ними так-
же идентична работе с микросхемами Atmel.
Обмен данными с микросхемой осуществляется по шине 12С, разрабо-
танной фирмой Philips. В настоящей главе рассмотрены основные положе-
ния, определяющие работу этой шины с одним мастером. Более подроб-
ную информацию о работе шины 12С можно найти в книге [8].
В этой же главе приведён набор подпрограмм для микроконтроллеров
семейства х51, обеспечивающий все допустимые виды обмена информа-
цией между микроконтроллером и EEPROM АТ24С64А. Эти подпрограм-
мы разработаны специалистами Atmel и в течение долгого времени были
доступны на сайте фирмы.
Глава 6. ПРОСТАЯ КЛАВИАТУРА
НА ОСНОВЕ
МИКРОКОНТРОЛЛЕРА
После выхода в свет первых двух томов книги «Микроконтроллеры?
Это же просто!» я получил более двух десятков писем, содержащих один
вопрос: как в системе на основе микроконтроллера реализовать клавиату-
ру? В этой главе я даю ответ на этот вопрос.
Достаточно простую клавиатуру для системы на основе микроконтрол-
лера семейства х51 (конкретнее -- на AT89S51) можно реализовать следую-
щим образом. Предположим, что нам нужно иметь в ней 16 информацион-
ных клавиш (не будучи большими оригиналами, присвоим им названия О,
1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е и F). Также давайте потребуем, чтобы в
составе клавиатуры было три управляющие клавиши — Alt, Shift и Ctrl, на-
жатие на которые позволяло бы изменять назначение информационных
клавиш, как это сделано в клавиатуре компьютера. В итоге подобная орга-
низация позволяет нам иметь по 4 различных функции на каждой инфор-
мационной клавише: одну — без нажатия на управляющие клавиши и
три — в комбинации с каждой из них. Иными словами, мы можем вводить
в систему при этом 64 различных информационных и управляющих сигна-
ла. Для большинства применений этого вполне достаточно. Если же кто-
то захочет реализовать клавиатуру большей функциональности, то, разо-
бравшись с тем, как реализована описываемая ниже клавиатура, он может
расширить её до любого разумного числа клавиш.
Итак, задача поставлена. Для её решения нам понадобятся некоторые
аппаратные ресурсы (причём достаточно простые) и относительно не-
сложная программа. Начнём с первого.
6.1. Аппаратная реализация простой клавиатуры
Обычно клавиатуру организуют в виде матрицы, как показано на
Рис. 6.1 (остальные части системы: индикатор, АЦП, ЦАП и иные уст-
ройства, которые могут варьироваться, на схеме не приведены). Чтобы за-
действовать 16 клавиш, нам нужно 4 шины, на которых мы будем устанав-
ливать нулевые или единичные уровни при опросе клавиатуры (эти шины
Рис. 6.1. Аппаратные средства клавиатуры.
Глава 6. ПРОСТАЯ КЛАВИАТУРА НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
6.1. Аппаратная реализация простой клавиатуры
нарисованы в виде горизонтальных линий, соединённых с выводами
Р1.4...Р1.7 микроконтроллера). Далее нам нужны 4 шины, состояние кото-
рых мы будем опрашивать (они изображены в виде вертикальных линий,
соединённых с выводами Р1.0...Р1.3 микроконтроллера; кроме того, они
соединены через резисторы R3...R6 с источником питания +5 В). Физи-
чески все линии выполнены в виде проводников на печатной плате, при-
чём ни одна из первых четырёх линий (их иногда называют сигнальными)
не имеет ни одной общей точки ни с одной из линий, соединённых с выво-
дами Р1.4...Р1.7 (последние получили название возвратных). Клавиши на-
шей клавиатуры привязаны на схеме к местам пересечения сигнальных и
возвратных линий. (Ещё раз обращаю внимание на то, что сигнальные и
возвратные линии пересекаются только на бумаге; в действительности же
ни одна из этих линий не соединена с какой-либо другой. Например,
представьте себе, что сигнальные линии выполнены в виде параллельных
проводников на одной стороне печатной платы, а возвратные — на другой.
Кстати, в реальных конструкциях чаще всего именно так и делают.)
Обычно в клавиатурах используют клавиши, работающие на замыкание.
Один из выводов такой клавиши соединяют с соответствующей сигнальной
линией, а другой — с возвратной. Таким образом, если ни одна из клавиш не
нажата, то ни одна из сигнальных линий не соединяется ни с одной из воз-
вратных. Нажатие же на какую-либо клавишу соединяет те сигнальную и
возвратную линии, к которым подпаяны выводы нажатой клавиши.
Как нетрудно заметить, 4 возвратных линии пересекаются на схеме с 4
сигнальными в 16 точках. Клавиши нашей клавиатуры, которых тоже 16,
однозначно привязаны к этим пересечениям. Если бы мы выбрали другое
количество сигнальных и возвратных линий, то и максимальное количест-
во клавиш было бы другим. Например, 5 сигнальных и 3 возвратных линии
дали бы 5 х 3 = 15 пересечений, что позволило бы управлять не более чем
15 клавишами (что на 1 клавишу меньше, чем в варианте с 4 сигнальными
и 4 возвратными линиями, требующий для работы те же 8 линий ввода/
вывода микроконтроллера). 8 сигнальных и 5 возвратных линий дадут нам
возможность управлять матрицей из 8 х 5 = 40 клавиш (вспомните знаме-
нитый Spectrum!), а 8 сигнальных и 8 возвратных — расширят наши воз-
можности до 64-клавишной клавиатуры. Платой за это будет то, что в слу-
чае 8x5 мы должны задействовать под клавиатуру 8 + 5=13 линий ввода/
вывода, а в случае 8x8 — уже 16 линий. Поэтому разработчики часто стре-
мятся не увеличивать число клавиш в клавиатуре, а минимизировать его —
свободных линий ввода/вывода нередко остается не так уж много.
Как подобная конструкция позволит нам узнать, нажата ли какая-ни-
будь из клавиш, и если да, то какая? Очень просто. Давайте предположим,
что наш микроконтроллер установил на своих линиях Р1.4...Р1.7 нули. Ка-
кие сигналы он обнаружит на возвратных линиях, если ни одна из клавиш
-435-
Глава 6. ПРОСТАЯ КЛАВИАТУРА НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
не нажата? Правильно, единицы — ведь все возвратные линии подтянуты
соответствующими резисторами к потенциалу +5 В, именно для этого мы
и установили резисторы R3...R6. А что будет, если мы нажмём какую-либо
из клавиш, например клавишу 7? Она соединит между собой сигнальную
линию, идущую от Р1.5, и возвратную с Р1.3. Но ведь на Р1.5 у нас нуль!
Значит, и на Р1.3 у нас при чтении будет нулевой сигнал. То есть если на-
жата хоть одна из клавиш, то при чтении состояния возвратных линий мы
обнаружим, что какая-либо из них будет в 0. Таким образом, если мы вы-
ставим на сигнальных линиях нули, а прочитав состояние возвратных ли-
ний, увидим, что на всех них присутствуют единицы, это значит, что ни
одна из клавиш не нажата. Наличие нуля на какой-либо из возвратных ли-
ний служит сигналом, что нажата та или иная клавиша. Как видите, в вы-
явлении факта нажатия на клавишу нет ничего сложного.
А как определить, какая именно из клавиш нажата? Например, пусть у
нас нажата клавиша 7. Как, если мы знаем, что какая-то из клавиш нажата,
найти, что нажата семёрка?
Возможно, некоторые из вас уже догадались. Для тех, кто ещё не сооб-
разил, поясню. Нужно поочередно устанавливать нули на каждой из сиг-
нальных линий и смотреть состояние линий возврата. Давайте для начала
установим в 0 сигнальную линию Р1.4, а линии Р1.5...Р1.7 установим в 1.
Далее прочитаем состояние возвратных линий. Если не нажата ни одна из
клавиш, соединённых с установленной в 0 сигнальной линией (в нашем
случае это клавиши 0, 1, 2 и 3), то все 4 возвратные линии при чтении ока-
жутся в единичном состоянии. То есть единицы на возвратных линиях го-
ворят нам о том, что ни 0, ни 1, ни 2, ни 3 не нажаты.
Идём дальше. Установим в 0 сигнальную линию Р1.5 (естественно, ус-
тановив при этом остальные три в единицы). Прочитаем состояние воз-
вратных линий. Как нетрудно догадаться, если нажата клавиша 7, то на
возвратной линии Р1.3 будет 0, в то время как на Р1.0...Р1.2 мы обнаружим
единицы. Итак, комбинация «0 на Р1.5 и 0 на Р1.3» свидетельствует о на-
жатии именно клавиши 7! Для сравнения — нажатой клавише 6 будет соот-
ветствовать комбинация «0 на Р1.5 и 0 на Р1.2», клавише 5 — комбинация
«0 на Р1.5 и 0 на Р1.1» и т. д.
Естественно, что если нажата клавиша 7, а остальные отпущены, то ус-
тановка в 0 сигнальной линии Р1.6 с последующим анализом линий воз-
врата даст единичное состояние всех возвратных линий. Так же, как и в
случае с установкой в 0 сигнальной линии Р1.7.
Итак, для определения того, какая же из клавиш нажата, мы должны
проделать следующее. Поочередно установим в 0 каждую из сигнальных
линий — сначала с Р1.4, затем с Р1.5, затем с Р1.6, а после неё — с Р1.7.
После установки соответствующей сигнальной линии в 0 (напомню, три
остальные должны оставаться в 1) проанализируем состояние возвратных
— 436 —
6.2. Программное обеспечение работы клавиатуры
линий. Если на всех них присутствуют единицы, то ни одна из клавиш, со-
единённых с установленной в 0 сигнальной линией, не нажата. Если одна
из возвратных линий имеет нулевой потенциал, то нажата клавиша, нахо-
дящаяся (по схеме) на пересечении этой возвратной линии и нулевой сиг-
нальной. Не правда ли, просто?
Некоторые, быть может, зададут вопрос: а что будет, если нажать две
клавиши одновременно? Очевидно, возможны два варианта. В первом вы
получите нули на тех или иных возвратных линиях при нуле уже не на од-
ной из сигнальных линий, а на двух (тех, которые соединены с нажатыми
кнопками; например, если нажать клавиши 1 и 8, вы получите 0 на воз-
вратной линии Р1.1 при установке в 0 сигнальной линии Р1.4 и 0 на воз-
вратной линии Р1.0 при нуле на сигнальной линии Р1.6). Во втором вари-
анте (например, если нажаты 8 и 9) вы получите нули на возвратных лини-
ях Р1.0 и Р1.1 при нуле на сигнальной линии Р1.6. При этом в случае
зануления остальных сигнальных линий все возвратные линии будут оста-
ваться единичными.
Добавлю, что выявление нажатия на две и более клавиши — задача от-
носительно сложная, и начинающим я бы не рекомендовал пытаться ре-
шать её.
Управляющие клавиши соединены с линиями Р2.0 и Р2.1. При нажа-
тии клавиши Alt устанавливается в 0 линия ввода Р2.0. Shift устанавливает
в О Р2.1, a Ctrl — и ту, и другую.
Кстати, зачем сначала выявлять, нажата ли хотя бы одна из клавиш или
нет, а лишь после этого искать, какая именно из клавиш нажата? Не проще
ли сразу искать нажатую клавишу? Да, проще. Но гораздо дольше. Про-
цесс обнаружения нажатия займёт несколько десятков микросекунд, а
процесс выявления, что же конкретно нажато — несколько сот. Поскольку,
как правило, нажатия происходят относительно нечасто, а ваш микрокон-
троллер в цикле работы может опрашивать клавиатуру несколько раз в се-
кунду, не надо загружать его в каждом из таких опросов длинной подпро-
граммой определения нажатой клавиши. Лучше пусть он выполняет ко-
роткую, определяющую лишь факт нажатия клавиши подпрограмму и
только при необходимости переходит к длинной. Иначе если вы не будете
разумно экономить его ресурсы, то очень скоро столкнётесь с тем, что не
хватит производительности используемого микроконтроллера.
6.2. Программное обеспечение работы клавиатуры
Теперь давайте рассмотрим подпрограммы, реализующие описанные
выше алгоритмы. Начнём с подпрограммы определения факта нажатия на
одну из клавиш.
— 437 —
Глава 6. ПРОСТАЯ КЛАВИАТУРА НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
Подпрограмма определения факта нажатия на одну из клавиш
KL.PRESS:
MOV
MOV
CPL
ANL
CLR
JZ
SETB
ENDKLPR:
RET
Pl,#00001111B
A,P1
A
A,#00001111B
C
ENDKLPR
C
/НУЛИ НА СИГНАЛЬНЫХ ЛИНИЯХ
/A=****1111B, ЕСЛИ HE НАЖАТО
/ИНВЕРТИРОВАЛИ АККУМУЛЯТОР
/А=ОООООООOB, ЕСЛИ НЕ НАЖАТО
/НА ВЫХОД, ЕСЛИ НЕ НАЖАТО
/УСТАНАВЛИВАЕМ ФЛАГ
/ПЕРЕНОСА ПРИ НАЖАТИИ
Здесь всё просто. Первая команда (MOV Plz#00001111B) настраивает
младшие 4 линии порта Р1 на ввод (занесением единиц в соответствующие
биты регистра порта) и выводит нули на старшие 4 линии. Далее содержи-
мое порта считывается в аккумулятор, инвертируется командой CPL А, и
старшие 4 бита его зануляются командой ANL Az#00001111B.
Давайте теперь проанализируем содержимое аккумулятора после вы-
полнения этих четырёх команд. Если ни одна из клавиш не была нажата, то
возвратные линии были в единичном состоянии. Следовательно, в единич-
ном состоянии оказались и 4 младших бита аккумулятора после чтения в не-
го содержимого порта Р1. Инверсия аккумулятора занулила его 4 младших
бита, а последняя команда занулила 4 старших. Итого после выполнения
команды anl Az#00001111B содержимое аккумулятора будет нулевым,
если ни одна из клавиш не нажата, и отличным от 0, если что-то нажато.
Далее команда CLR С сбрасывает флаг переноса, и, если значение акку-
мулятора равно нулю, осуществляется выход из подпрограммы (сначала
переход JZ ENDKLPR, затем возврат из подпрограммы). Если же что-то
было нажато, то перед возвратом командой SETB С устанавливается флаг
переноса.
Итак, если после выполнения подпрограммы KL_PRESS флаг переноса
оказывается установлен, то это означает, что нажата какая-либо из инфор-
мационных клавиш. Сброшенный флаг переноса свидетельствует об от-
сутствии нажатия.
Подпрограмма определения, какая из клавиш нажата, несколько сложнее.
Подпрограмма определения, какая из клавиш нажата
KLJtUNz
MOV Р1,#11101111В /НУЛЬ НА Р1.4
MOV С,Pl.О /ПРОВЕРЯЕМ ВОЗВРАТНУЮ ЛИНИЮ Р1.О
JC PR01 /ПЕРЕХОД НА ПРОВЕРКУ Pl.1, ЕСЛИ Р1.0=1
-438-
6.2. Программное обеспечение работы клавиатуры
MOV А,#0Н /КОД ОН В АККУМУЛЯТОР, ЕСЛИ Р1.0=0
LJMP CTALTSHF ;НА ПРОВЕРКУ УПРАВЛЯЮЩИХ КЛАВИШ
PR01:
MOV JC MOV LJMP C,P1.1 PRO 2 A,#1H CTALTSHF /ПРОВЕРЯЕМ ВОЗВРАТНУЮ ЛИНИЮ Pl.1
PR02:
MOV C,P1.2 /ПРОВЕРЯЕМ ВОЗВРАТНУЮ ЛИНИЮ Pl.2
JC PR03
MOV A,#2H
LJMP CTALTSHF
PR03:
MOV C,P1.3 /ПРОВЕРЯЕМ ВОЗВРАТНУЮ ЛИНИЮ Р1.0
JC PR10
MOV А,#ЗН
LJMP CTALTSHF
PR10:
MOV Р1Л11011111В /НУЛЬ HA Pl. 5
MOV C,Pl.О
JC PR11
MOV A,#4H
LJMP CTALTSHF
PR11:
MOV C,P1.1
JC PR12
MOV A,#5H
LJMP CTALTSHF
PR12:
MOV C,P1.2
JC PR13
MOV A,#6H
LJMP CTALTSHF
PR13:
MOV C,P1.3
JC PR20
MOV A,#7H
LJMP CTALTSHF
PR20:
MOV Р1Л10111111В /НУЛЬ HA Pl. 6
MOV C,P1.0
JC PR21
MOV A,#8H
LJMP CTALTSHF
PR21:
MOV C,P1.1
439-
Глава 6. ПРОСТАЯ КЛАВИАТУРА НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
JC PR22
MOV A,#9H
LJMP CTALTSHF
PR22:
MOV C,P1.2
JC PR23
MOV A,#0AH
LJMP CTALTSHF
PR23:
MOV C,P1.3
JC PR30
MOV АД0ВН
LJMP CTALTSHF
PR30:
MOV Р1Л01111111В ;НУЛЬ HA Pl.7
MOV c,pi.o
JC PR31
MOV АЛ0СН
LJMP CTALTSHF
PR31:
MOV c,pi.i
JC PR32
MOV АЛ0ОН
LJMP CTALTSHF
PR32:
MOV C,P1.2
JC PR33
MOV АЛ0ЕН
LJMP CTALTSHF
PR33:
MOV C,P1.3
JC CTALTSHF
MOV A 30FH
CTALTSH:
MOV C,P2.0
CPL C
MOV ACC.6,C ;ACC.6=1 при P2.0=0
MOV C,P2.1
CPL C
MOV ACC.7,C ;ACC.7=1 при P2.1=0
RET
Обычно каждой клавише ставится в соответствие определённый код.
Чаще всего этим кодом является число от 0 до 0FFH. То есть давайте дого-
воримся, что если нажата клавиша 0, то при завершении подпрограммы
KL_KLAV в младших битах аккумулятора должен быть код ООН (это и есть
-440л
6.2. Программное обеспечение работы клавиатуры
код клавиши 0). Если нажата клавиша 1, то в младших битах аккумулятора
после завершения KL_KLAV должен быть код 01Н и т. д. вплоть до 0FH.
Как видите, в нашем случае код клавиши (точнее, его часть) совпал с её
названием, т. е. с надписью на клавише. Однако, как нетрудно догадаться,
надписи на клавишах могут быть любыми — с равным успехом мы могли
бы назвать клавиши не 0, 1, 2, 3, ..., Е, F, а, например, А, Б, В, Г, ..., П, Р.
Если бы мы так поступили, то код ООН соответствовал бы клавише А, код
01Н — клавише Б и т. д. В самой же подпрограмме KL_KLAV при этом ни-
чего бы не изменилось. Изменения коснулись бы только таблицы соот-
ветствия названий клавиш кодам в аккумуляторе после окончания под-
программы KL_KLAV. Правда, в явном виде мы эту таблицу здесь не напи-
сали в силу того, что названия клавиш и коды совпадают друг с другом (мы
так выбрали). Если же в вашем случае это будет не так, рекомендую эту
табличку Обязательно составить — этим вы наверняка уменьшите количес-
тво ошибок в своей программе.
Итак, мы договорились, что после завершения подпрограммы
KL_KLAV в аккумуляторе должен быть код нажатой клавиши. Как этого
добиться? Конечно же очень просто. Смотрите, сначала командой
MOV Pl, #11101111В мы настраиваем возвратные линии на ввод инфор-
мации и устанавливаем сигнальную линию с Р1.4 в 0, а остальные три — в
1. Далее командой MOV С, Р1.0 записываем в бит (флаг) переноса CY состо-
яние возвратной линии с Р1.0. Если после этого бит оказывается установ-
лен (т. е. равен 1), то это значит, что клавиша 0 не нажата, и мы переходим
к метке PR01, где будем определять, нажата ли клавиша 1. Если флаг CY
сброшен, т. е. его значение равно 0, то клавиша 0 нажата. В этом случае по-
мещаем в аккумулятор код клавиши 0 (т. е. 0) и переходим к завершающей
части подпрограммы, анализирующей состояние управляющих клавиш
Ctrl, Alt и Shift (на метку CTALTSHF).
Если клавиша 0 не нажата, анализируем следующую. Командой
MOV С, Pl. 1 мы записываем в бит CY состояние возвратной линии с Р1.1.
Если после этого бит оказывается установлен (т. е. равен 1), то клавиша 1
не нажата, и переходим к метке PRO 2, где будем определять, нажата ли
клавиша 2. Если CY сброшен, т. е. равен 0, то клавиша 1 нажата. В этом
случае мы помещаем в аккумулятор код клавиши 1 (т. е. 1) и переходим к
завершающей части подпрограммы, на метку CTALTSHF.
Я надеюсь, что вряд ли кому нужно объяснять, как анализируется со-
стояние клавиш 2, 3, 4,..., F — очевидно, точно так же, как и клавиш 0 и 1,
рассмотренных в двух предыдущих абзацах. Если всё же кому что-то не яс-
но, внимательно прочтите эти абзацы ещё раз — там есть всё, что нужно
для понимания. А мы пока двинемся дальше.
Итак, к моменту, когда мы добрались до метки CTALTSHF, в аккумуля-
торе находится число от ОН до 0FH, в зависимости от того, какая из ин-
-441-
Глава 6. ПРОСТАЯ КЛАВИАТУРА НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
формационных клавиш была нажата. Всё? Нет. Вспомним, что мы не про-
анализировали состояние трёх управляющих клавиш. Давайте посмотрим,
как это реализовано в подпрограмме KL_KLAV.
Собственно, и здесь всё просто. Мы записываем в бит (флаг) переноса
состояние линии Р2.0 порта Р2, инвертируем его и помещаем в шестой бит
аккумулятора. Затем повторяем эту процедуру для Р2.1, помещая результат
в старший, седьмой бит аккумулятора. На этом подпрограмма KL_KLAV
завершается.
Что же получилось после её выполнения? Если была нажата информа-
ционная клавиша 0 и при этом все три управляющие клавиши были отпу-
щены, то хранящийся в аккумуляторе код будет ОН. А что будет, если с ну-
лем была нажата управляющая клавиша Alt? Как нетрудно догадаться, код
в аккумуляторе будет 01000000В = 40Н. Управляющей клавише Shift будет
соответствовать код 10000000В = 80Н. Нажатию на Ctrl и 0 будет соответс-
твовать код 11000000В = 0С0Н. Аналогично клавише 1 без управляющих
клавиш будет соответствовать код 01Н, с Alt — 41Н, с Shift — 81Н, с Ctrl —
0С1Н, клавише 2 без управляющих клавиш будет соответствовать код 02Н,
с Alt — 42Н, с Shift — 82Н, с Ctrl — 0С2Н и т. д. Как видите, мы получили
именно то, о чём шла речь в начале главы: каждой из 16 информационных
клавиш, в зависимости от состояния Ctrl, Alt и Shift, соответствуют 4 раз-
ных кода. Иными словами, после завершения подпрограммы KL_KLAV в
аккумуляторе возможны 64 различных комбинации, и вы можете таким
образом ввести в систему, например, не только 10 цифр, но и весь русский
алфавит, и при этом останется ещё десяток кодов для тех или иных команд.
Как видите, опрос клавиатуры в микроконтроллерной технике осу-
ществляется весьма просто. Нужно иметь микроконтроллер с 8...10 сво-
бодными линиями ввода/вывода и две небольшие подпрограммы, которые
определят, есть ли нажатые клавиши в клавиатурной матрице, и если есть,
то какие. А дальше в основном цикле микроконтроллерной программы вы
должны осуществить обработку нажатий — вызов подпрограмм, связан-
ных с нажатием на ту или иную клавишу.
6.3. Усовершенствование схемы клавиатуры
Иногда оказывается удобным разделить узел клавиатуры и основной
узел разрабатываемого устройства. Сейчас, когда стоимость самых дешё-
вых микроконтроллеров составляет 1...2 доллара за корпус, может быть,
выгоднее выполнить клавиатуру в виде отдельного блока со своим относи-
тельно маломощным микроконтроллером, а остальную часть устройства
выполнить на отдельном (возможно, более мощном) микроконтроллере,
обеспечивающем решение поставленной задачи. В такой конфигурации
первый из упомянутых микроконтроллеров будет осуществлять описан-
-442-
КД503
Рис. 6.2. Клавиатура на микроконтроллере P89LPC915 фирмы Philips.
6.3. Усовершенствование схемы клавиатуры
Глава 6. ПРОСТАЯ КЛАВИАТУРА НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
ный выше опрос клавиатуры (освобождая второй от этих функций) и, об-
наружив факт нажатия, определять код нажатой клавиши и пересылать его
во второй микроконтроллер. Для пересылки логично использовать один
из последовательных интерфейсов, например RS-232 или 12С.
Если использовать RS-232, то можно обойтись только выводом пере-
датчика TxD, реализовав однонаправленный поток данных (от клавиатуры
к основному микроконтроллеру, без сигналов подтверждения). Тогда для
подобной клавиатуры нужно 10+1 = 11 линий ввода/вывода. А такое ко-
личество линий имеет уже описанный в гл. 1 микроконтроллер P89LPC915
фирмы Philips. Он практически идеально подходит для подобной цели,
поскольку может работать с внутренними тактированием и цепью сброса.
В итоге аппаратная реализация такого узла упрощается до предела, как это
видно из Рис. 6.2.
И последнее, о чём я хотел бы сказать. Как известно (подробнее см.
первый том данной книги, стр. 228), нажатие или переключение клавиш
обычно сопровождается дребезгом контактов. В связи с этим необходимо
принимать меры для его подавления. В микроконтроллерной технике это
обычно делают программным путём. В рассматриваемом случае для подав-
ления дребезга контактов достаточно после обнаружения факта нажатия
на одну из клавиш (при помощи подпрограммы KL_PRESS) сформировать
10...20-миллисекундную задержку, после чего снова вызвать KL_PRESS.
Если и во второй раз она проинформирует вас о том, что нажата какая-ли-
бо из клавиш, то так оно и есть, определяйте код нажатой клавиши при по-
мощи KL_KLAV и осуществляйте действия, соответствующие нажатой кла-
више. Если повторный вызов KL_PRESS не выявит нажатия, значит, тре-
вога была ложной, и ситуация может быть квалифицирована как дребезг,
не требующий определения кода нажатой клавиши.
-444-
Приложение.
Программирование микроконтроллеров
AT89S51, AT89S52, AT89S8252
фирмы ATMEL
Для многих читателей, самостоятельно занимающихся изучением мик-
роконтроллеров и разработкой на них своих первых устройств, весьма ост-
ро стоит вопрос программирования микроконтроллеров. Готовый про-
грамматор, стоимость которого может колебаться в пределах от трёх до
шести тысяч рублей (в ценах 2006 г.), по карману далеко не каждому. Поэ-
тому и обращаются — иногда ко мне, иногда в те или иные читательские
конференции — с просьбой выслать схему и программное обеспечение для
программатора, который легко сделать своими руками. Это приложение к
настоящему тому предназначено специально для этого.
Первый совет — стоит обратить внимание на микроконвертеры от
Analog Devices. В гл. 3 настоящего тома я подробно описал, как програм-
мируется их память программ при помощи бесплатно распространяемой
программы wsd.exe, находящейся на сайте фирмы разработчика
(www.analog.com). Здесь всё ясно и просто.
Но в ряде случаев пользователю хочется приобрести более дешёвый
микроконтроллер, чем ADuC. Особенно если ему не нужны ЦАП, АЦП,
таймер реального времени, флэш-память данных и т. д. В этом случае хо-
рошей альтернативой могут оказаться микроконтроллеры AT89S51 и
AT89S52 фирмы Atmel. В принципе опытные разработчики могут и само-
стоятельно сделать программатор для программирования этих микросхем,
благо алгоритмы их программирования приведены в документации на эти
микроконтроллеры. Но более дешёвым может оказаться следующий
вариант.
Бродя по бескрайним просторам Интернета, один из моих знакомых-
разработчиков наткнулся на условно-бесплатную программу для програм-
мирования этих микроконтроллеров от новозеландской фирмы АЕС
Electronics (wwwaec-electronics, со. nz). Обязательными условиями бесплат-
ности этого продукта являются его некоммерческое использование (в том
числе для целей образования, для любительского творчества) и сохранение
всего комплекта поставляемых с программой файлов (в первую очередь
файла aec_isp.pdf) в неизменном авторском варианте.
-4А5-
Приложение
В Табл. ПЛ приведена распайка кабеля, которым должен соединяться
принтерный порт компьютера (снабжённый стандартным разъёмом DB25)
с микроконтроллером AT89S51/AT89S52. Программирование осуществля-
ется по последовательному SPI-интерфейсу (более подробную информа-
цию о нем можно найти во втором томе данной книги, а также в фирмен-
ной документации на эти микроконтроллеры). Номера выводов микро-
контроллера в Табл. П.1 соответствуют 40-выводным корпусам.
Таблица П. 1. Распайка соединительного кабеля
Выводы порта принтера Выводы микроконтроллера
6 (D4) 9 (Сброс)
7(D5) 6 (Р1.5 — MOSI)
8 (D6) 8(P1.7-SCK)
10 (АСК) 7(Р1.6 —MISO)
18...25 (GND) 20 (GND)
Разработчики рекомендуют использовать в кабеле витые пары, всего 4.
Каждая пара должна содержать сигнальный и земляной провода, причём
три из четырёх земляных шин должны быть подключены к общему прово-
ду только на разъёме DB25 со стороны принтерного порта, а их концы со
стороны программируемого микроконтроллера должны «висеть в возду-
хе». Четвёртый (любой из них) с одной стороны должен быть подключен к
общему проводу на разъёме принтерного порта, а с другой — к выводу
GND микроконтроллера. Для устойчивой работы программатора длина
упомянутых витых пар не должна быть более 50 см (разработчики реко-
мендуют не более 1 м, но реально с 50-сантиметровыми проводами про-
грамматор работает заметно устойчивее. На мой взгляд, чем короче эти
провода, тем лучше; я уменьшал их длину до 20 см).
Микроконтроллер должен тактироваться частотой 4...24 МГц. На плату
с программируемым микроконтроллером от внешнего источника должно
подаваться также 5-вольтовое питание. Не забудьте позаботиться о том,
чтобы используемые для программирования выводы микроконтроллера,
если к ним подключена его периферия, не конфликтовали с сигналами
программирования (лучше всего, если эти выводы соединяются
с периферией при помощи перемычек, размыкаемых на момент програм-
мирования).
Вход сброса (RESET) микроконтроллера должен подключаться к про-
воду, идущему от контакта 6 принтерного порта, в соответствии с Рис. П.2.
-446-
Приложение
--------------------------•----------+5 В
“Z 10 мкФ
К разъёму ISP •----------------------1 I-•-Сброс
1.5 кОм I
П10 кОм
-------------•-----------------о В
Рис. П.2. Подключение входа сброса микроконтроллера.
Я несколько раз собирал эту схему, она устойчиво программировала
упомянутые микроконтроллеры, а также вместе с ними AT89S8252. К не-
достаткам этого программатора можно отнести то, что он не работает под
«продвинутыми» версиями Windows, такими как NT. С DOS-интерфейсом
программы вполне можно мириться в том случае, если покупка какого-ли-
бо программатора для вас затруднительна.
Краткий глоссарий
Baud Rate Datasheet DPTR EEPROM KSPS MIPS — скорость передачи данных (измеряется в бит/с) — справочные данные, описание прибора или компонента — Data Pointer — регистр-указатель данных — электрически-стираемое программируемое ПЗУ (флэш-память) — (kylo) samples per seconds — (тысяч) отсчетов в секунду — миллионы инструкций в секунду — характеристика быстродействия процессора
PPm «Sinc»- фильтр SPI — Parts per Million — промил, количество частей на миллион — электронный фильтр, который имеет прямоугольную АЧХ, а его им- пульсная характеристика описывается функцией sin х/х — Serial Peripheral Interface — последовательный периферийный интер- фейс
UART — Universal Asynchronous Receiver/Transmitter — интерфейс универсально- го асинхронного приёмопередатчика
TIC АЦП ШИМ ИОН КМОП ОЗУ (RAM) — Threshold Inverter Comparator — таймер-счётчик временных интервалов — аналого-цифровой преобразователь — широтно-импульсная модуляция — источник опорного напряжения — комплементарная структура «металл — оксид — полупроводник» — Random-Access Memory — память (запоминающее устройство) с произ- вольной выборкой; оперативное запоминающее устройство
ПЗУ (ROM) ПИД TKH — Read Only Memory — постоянное запоминающее устройство — пропорционально-интегрально-дифференциальное (регулирование) — температурный коэффициент напряжения — относительная величина, измеряемая в ррт/°С
ткс — температурный коэффициент электрического сопротивления — отно- сительная величина, измеряемая в ррт/’С
Транзакция — цикл передачи данных от одного устройства к другому по шине 12С
ФАПЧ (PLL) — фазовая автоподстройка частоты
ЦАП — цифро-аналоговый преобразователь
-448 -
Список литературы
1. Гуртовцев А.Л., Гудыменко С. В. Программы для микропроцессоров:
Справ, пособие. Минск.: Высш, шк., 1989. 352 с.: ил.
2. Фрунзе А, В., Фрунзе А. А. Микроконтроллеры? Это же просто! Т 3. М.:
ООО «ИД СКИМЕН», 2003. 224 с.: ил.
3. Справочник по специальным функциям с формулами, графиками и ма-
тематическими таблицами/Под ред. М. Абрамовица и И. Стиган.
М.:Наука, 1979. 832 с.: ил.
4. Дьяконов В. П. Справочник по алгоритмам и программам на языке
бейсик для персональных ЭВМ. М.: Наука. Гл. ред. физ.-мат. лит.,
1987. 240 с.
5. Титце У, Шенк К. Полупроводниковая схемотехника: Справочное ру-
ководство/Пер. с нем. М.: Мир, 1982. 512 с.: ил.
6. Фрунзе А. В. Микроконтроллеры? Это же просто! Т. 1. М.: Издательский
дом «Додэка-ХХ1», 2007. — 312 с.: ил.
7. Фрунзе А. В, Микроконтроллеры? Это же просто! Т. 2. М.: ООО «ИД
СКИМЕН», 2002. 392 с.: ил.
8. Фрунзе А. В. Микроконтроллеры фирмы «Филипс» семейства х51. Т. 1.
М.: ООО «ИД СКИМЕН», 2004. 336 с.: ил.
Предметный указатель
ДТ-заряд аккумулятора 182
ДУ-заряд аккумулятора (NDV) 181,
184
А
адресация косвенная^, 48, 100, юз,
109, 121, 123, 397
адресное пространство 376, 381, 397
алгоритм 94, 176, 184, 187, 197, 397
аналого-цифровой преобразователь
(АЦП) 144, 301, 305, 308, 311, 318, 338,
348
антипереполнение 13, 23, 43, 57, 96, 100
аппроксимация 90, 93, 115, 136-137
арбитраж 401
арифметика ограниченной точ-
ности 12
арифметика с плавающей точкой 18,
21, 94
арифметика с фиксированной точ-
кой 16-17, 43, 56
ассемблер TASM 305, ззз, ззб
ассоциативный закон 13
Б
байт 18
В
выравнивание порядков 28-29
вычитание чисел с плавающей
точкой 27
Г
граница числа 11
граничная частота регулятора 140
д
двоично-десятичные коды 10, 176, 308,
334
деление двоичных чисел с плаваю-
щей точкой 56
денормализация мантиссы 28-29
диапазон 13, 21-22, 175
дистрибутивный закон 13
дополнительный КОД 11, 21, 25, 49, 63,
79, 357, 371
— модифицированный 40
3
заём 10
знак числа 8, 11, 25, 48, 62, 72, 79, 175, 371
знаковый бит 8, 11, 22, 357
значность 17
и
инициирующий ТОК 184, 186, 299
интервал сходимости 91
итерационный метод 89, 105, но
К
компенсация ошибок 16,18
коэффициент усиления
регулятора 139, 141, 143, 174
м
мантисса числа 21, 27, 43, 49, 56, 62, 72,
110, 175
мастер шины 12С 400-401, 403
Предметный указатель
машинный нуль 75, 23
медленный режим 405
микроконвертер 299, 301, 305, 308, 321,
335-336, 338, 348, 356, 372-373, 377, 397,
445
микроконтроллер семейства х51 55,
103, 121, 143, 176, 214, 376, 433
младший байт (МлБ) 25, 175
н
норма функции 90, 94
нормализация 49, 68
— влево 29, 43, 81
— вправо 28, 56
о
обратный КОД 77
округление чисел
— несимметричное
(отбрасывание) 15-16, 23, 26
— правило Гаусса 75
— симметричное 15-17, 23, 26, 30,
42-43, 67, 72
освобождение линии 403
ошибка метода вычисления
функции 90, 92
ошибка округления
— абсолютная 75
— граничная 16
— граничная абсолютная 18, 23, 30
— граничная относительная 17-18,
20, 23, 26, 30, 43, 57, 175
— относительная 15-16
п
память данных 377, 397
— внешняя 381, 397-399, 410, 432
память программ 110, 121, 376-377, 387-
388, 397, 445
параболы n-го порядка 97
перенос ю
переполнение 75, 23, 28, 43, 57, 63, 77,
79, 96, 100
переходная характеристика регуля-
тора 139
период квантования 142, 175
подпрограмма юз
— измерения ззз
позиционный вес 6, ю, 27
ПОЛИНОМ 6, 8-9, 65-66, 89, 91, 100, 120,
136-137
— схема Горнера 65,101, 121
порядок операций 14
порядок полинома 103, 121, 123, 138
порядок числа 27, 23, 27, 41, 43, 48, 56,
62, 72, 84, 103, 110
потеря значности 75, 20, 57
представления нуля 77-72
прямой КОД 77, 72
р
разрядность 6, 67, 84-85
регулирующее воздействие 138, 175
С
система счисления
— двоичная 7, 64
— двоично-десятичная 10, 64, 77
— десятичная 7
— основание 65- 66
— позиционная 6
— смешанная 9
— шестнадцатеричная 7
скоростной заряд аккумулятора 178,
182, 184, 199-200
сложение чисел с плавающей
ТОЧКОЙ 27, 29-30
смещённый порядок 24-25, 43, 57, 175
средний байт (СрБ) 26
старший байт (СтБ) 25, 775
стек 77, 103, 214, 218, 241, 299
степенной ряд Тейлора 89, 91-93, 123,
131, 135-136
субадрес 408, 411, 414
СХОДИМОСТЬ ряда 92, 94, 105, 123, 131
-451
Предметный указатель
Т
такт микроконтроллера 176
тактовая частота ядра микроконтрол-
лера 305, 311, 320, 333, 338, 350, 372
точка перегиба 97
точность результата 14, 17, 21-23, 29,
66-67, 71, 90, 92, 105, 109, 123, 135, 176
транзакция 405, 407
трансцендентная зависимость 122, 130
У
удержание шины 403
умножение чисел с плавающей
точкой 42-43, 56
Ф
факториал 90, по, 115
флаг переноса 43, юз, 121, 123, 173, 438,
441-442
флэш-память данных 305, 373, 376-377,
379, 381-383, 385, 387, 397, 399
флэш-память программ 143, 388
форма записи числа
— развернутая 8
— свернутая 8
формат повышенной точности 27
функция
— алгебраическая 89,176
— аппроксимирующая 90
— гиперболическая 89, 120, 130
— дробно-рациональная 89, 94
— иррациональная 89,105
— линейная 89
— логарифмическая 89, 135-136
— неэлементарная 90
— обратная 89
— обратная
тригонометрическая 135, 137
— обратной
пропорциональности 89
— периодическая 123
— показательная 89, 115, 121,130
— рациональная 89
— сложная 89
— степенная 89, 97
— трансцендентальная 89
— трансцендентная 176
— тригонометрическая 89, 120, 122
— экспоненциальная 115
— элементарная 88, 90, 176
X
характеристика числа 6, 21, 77, 81
ц
цифро-аналоговый преобразователь
(ЦАП) 85, 144
ч
числа
— беззнаковые 8, 13, 24, 64, 84-85,
371
— дробные 7, 9, 64, 66, 68
— нормализованные 22, 24, 26
— ограниченной точности 12, 20,
27, 30
— с плавающей точкой 20, 22, 24,
67, 72, 84-85, 95, ПО, 146, 175
— с фиксированной точкой 7, 11,
20, 23, 64
— смешанные 7
— целые 7, 9, 65, 84-85
ш
шина 12С 399
э
экспонента 115, 122
эффект памяти 183-184
О диске
На компакт-диске помещены тексты всех приведённых в книге про-
грамм, а также полезная справочная информация по электронным компо-
нентам, схемам и протоколам.
Тексты программ, приведённых в книге
Название подпрограммы Имя файла Расположение в книге
Подпрограмма сложения чисел с плавающей точкой SDPZ3.txt Глава 1, подразд. 1.2.2
Подпрограмма умножения чисел с плавающей точкой UDPZ3.txt Глава 1, подразд. 1.2.3
Подпрограмма быстрого умножения чисел с плавающей точкой UDPZ3F.txt Глава 1, подразд. 1.2.3
Подпрограмма деления чисел с плавающей точкой DDPZ3.txt Глава 1, подразд. 1.2.4
Подпрограмма преобразования двоичных дробей в десятичные PF16.txt Глава 1, подразд. 1.3.2
Подпрограмма преобразования двоичных чисел с плавающей точкой в двоично-десятичные числа с плавающей точкой PDPZ2.txt Глава 1, подразд. 1.3.3
Подпрограмма преобразования целых двоичных беззнаковых чисел в двоичные числа с плавающей точкой CDPZ3.txt Глава 1, подразд. 1.3.4
Подпрограмма преобразования двоичных чисел с плавающей точкой в целые двоичные беззнако- вые числа UCDPZ3.txt Глава 1, подразд. 1.3.5
Подпрограмма вычисления обратной функции О'= 1/х) OBRAT.txt Глава 1, подразд. 1.4.2
Подпрограмма вычисления степенной функции О' = хл) STEP.txt Глава 1, подразд. 1.4.3
-453-
О диске
(продолжение)
Название подпрограммы Имя файла Расположение в книге
Подпрограмма вычисления полинома по схеме Горнера POLIN.txt Глава 1, подразд. 1.4.4
Подпрограмма вычисления квадратного корня KKOR.txt Глава 1, подразд. 1.4.5
Подпрограмма вычисления факториала таблич- ным способом FACT.txt Глава 1, подразд. 1.4.6
Подпрограмма вычисления факториала методом умножения FACT2.txt Глава 1, подразд. 1.4.6
Подпрограмма вычисления различных функций (экспоненты, тригонометрических и гиперболи- ческих синуса и косинуса) путём их аппроксима- ции рядом Тейлора FUNCl.txt Глава 1, подразд. 1.4.7
Подпрограмма вычисления тангенса TANT.txt Глава 1, подразд. 1.4.8
Подпрограмма вычисления котангенса COTANT.txt Глава 1, подразд. 1.4.8
Подпрограмма вычисления гиперболического тангенса TANG.txt Глава 1, подразд. 1.4.9
Подпрограмма вычисления гиперболического котангенса COTANG.txt Глава 1, подразд. 1.4.9
Программа для микроконтроллерного ПИД-регу- лятора PIDl.txt Глава 1, подразд. 1.5.4
Вспомогательная программа для схемы зарядного устройства осуществляющая параллельное неза- висимое выполнение двух различных задач ZUPROGl.txt Глава 2, подразд. 2.4.1
Вспомогательная программа для схемы зарядного устройства, осуществляющая параллельное неза- висимое выполнение двух различных задач с тай- мерным прерыванием ZUPROG2.txt Глава 2, подразд. 2.4.1
Вспомогательная программа для схемы зарядного устройства, (отладка многозадачного режима с из- мерениями и отображением при переключении между задачами) ZUPROG3.txt Глава 2, подразд. 2.4.2
Первый вариант программы для устройства скоростного заряда аккумулятора ZUPROG4.txt Глава 2, подразд. 2.4.3
Основная рабочая программа для устройства скоростного заряда аккумулятора ZU611.txt Глава 2, подразд. 2.4.4
-454-
О диске
(продолжение)
Название подпрограммы Имя файла Расположение в книге
Фрагмент программы для основного АЦП ADuC824 от Analog Devices ADCCONV.txt Глава 3, разд. 3.4
Программа для основного АЦП ADuC824 ADUC18.txt Глава 3, разд. 3.4.3
Программа для цифрового вольтметра на АЦП ADuC824 ADUC194.txt Глава 3, разд. 3.7
Программа защиты от копирования с использова- нием флэш-памяти микроконтроллера AT89S8252 FLASHGUARD.txt Глава 4, разд. 4.4
Набор подпрограмм, обеспечивающих обмен ин- формацией между МК 51-го семейства и микро- схемой АТ24С64А CPU_CONN_PROGS.txt Глава 5, разд. 5.3
Подпрограммы для работы с клавиатурой CLAV.txt Глава 6
Справочные данные
Имя файла Описание
7805_datasheet.pdf Интегральный стабилизатор 7805 — подробное описание
AD420.pdf 16-битный ЦАП AD420 — руководство пользователя
ads7816.pdf 12-битный АЦП ADS7816 — руководство пользователя
aduc824_a_rus.pdf Микроконвертер ADuC824 — 16- и 24-битный АЦП со встроенными микропроцессором и флэш-памятью (описание на русском языке)
AT24C64A.pdf Микросхемы внешней флэш-памяти АТ24С32А и АТ24С64А
AT89xxx.doc Программирование микроконтроллеров АТ89ххх (на русском языке)
AT89S8253.pdf Микроконтроллер AT89S8253 — полное описание
DS1833.pdf Микросхема супервизора (контроля) питания — краткое описание
P89LPC91 x_manual.pdf Микроконтроллер Philips P89LPC915 — руководство пользователя
PGA204.pdf Программируемый инструментальный усилитель PGA204 — руководс- тво пользователя
I2C_specification.pdf Описание протокола 12С
ФРУНЗЕ АЛЕКСАНДР ВИЛЕНОВИЧ
Микроконтроллеры? Это же просто!
Том 4
Главный редактор В. М. Халикеев
Ответственный редактор И. А. Корабельникова
Научный редактор С. В. Турецкий
Технический редактор Н. В. Тищенко
Подписано в печать 28.05.08. Формат 60x90/16. Бумага офсетная.
Гарнитура «NewtonC». Печать офсетная.
Объем 29 п. л. Усл. п. л. 29.
Тираж 1500 экз. Код FR04. Заказ № 1752
Издательский дом «Додэка-ХХ1»
ОКП 95 3000
105318 Москва, а/я 70
Тел./факс: (495) 366-24-29,366-09-22
E-mail: books@dodeca.ru; red@dodeca.ru
Отпечатано с готовых диапозитивов в ОАО «Щербинская типография».
117623 Москва, ул. Типографская, д. 10
Тел. 659-23-27
Новинки Издательского дома «Додэка-ХХ1»
Титце У., Шенк К.
Полупроводниковая
схемотехника.
В2т.
Дата выпуска: 2008 г.
Формат: 70x100/16
Том 1:
Объем: 832 с.
ISBN: 978-5-94120-200-3
Том 2:
Объем: 942 с.
ISBN: 978-5-94120-201-0
«Полупроводниковая схемотехника» — перевод 12-го издания широко известной книги
Ульриха Титце и Кристофа Шенка (в 1982 году издательство «Мир» выпустило перевод 5-го
издания этой книги). Это фундаментальный труд, объединяющий принципы устройства по-
лупроводниковых элементов (диоды, биполярные и полевые транзисторы, интегральные
микросхемы) и основы создания из этих элементов различных функциональных узлов ана-
логовой техники (усилители, модуляторы, фильтры, радиоприемники) и цифровой (спуско-
вые схемы, счетчики, регистры, шифраторы и дешифраторы, устройства памяти и т. д.).
Книга разбита на два тома: первый посвящен основам схемотехники, второй — примене-
ниям функциональных узлов при создании более сложных устройств.
При изложении материала широко используются эквивалентные схемы как полупровод-
никовых элементов, так и функциональных узлов, соответствующие работе в области посто-
янного тока и низких/высоких частот. Особое внимание уделено также переходным процес-
сам цифровых схем. Описание каждого элемента или схемы сопровождается необходимым
количеством достаточно элементарных формул, служащих для их инженерного расчета.
Энциклопедическая полнота, обилие самых разных схем и доступное математическое
обоснование делают книгу полезной широкому кругу читателей: радиолюбителям, техникам
ремонтных предприятий, инженерам радиотехники и электроники и научным работникам.
Новинки Издательского дома «Додэка-ХХ1»
Редькин П. П.
32/16-битные микроконтроллеры ARM7
семейства АТ91SAM7 фирмы Atmel.
Руководство пользователя (+CD)
Дата выпуска: 2008 г.
Формат: 70x100/16
Объем: 704 с.
ISBN: 978-5-94120-157-0
Книга представляет собой практическое руководство и
подробное справочное пособие для изучения семейства
микроконтроллеров (МК) SAM7 фирмы Atmel и создания на
их основе пользовательских проектов.
Отличительной особенностью книги является то, что она не только содержит исчерпыва-
ющие сведения справочного характера (на примере наиболее функционально насыщенного
представителя данного семейства — AT91SAM7X128/256), но и охватывает все этапы про-
ектирования приложений на основе МК SAM7, что позволяет в короткие сроки овладеть на-
выками работы с микроконтроллерами даже начинающим разработчикам. После прочте-
ния книги им не надо думать о том, с чего начать работу с МК SAM7, как написать первую
программу, где взять примеры программных кодов, как адаптировать эти примеры под
свою задачу. Все эти и многие другие сведения имеются в предлагаемой книге и прилагае-
мом компакт-диске.
Книга предназначена для специалистов в области разработки электронной аппаратуры,
студентов технических вузов и лиц, интересующихся электроникой. Необходимый уровень
подготовки читателей предполагает знание основ цифровой и аналоговой схемотехники,
а также основ программирования на языке Си.
Новинки Издательского дома «Додэка-ХХ1»
Лебедев М. Б.
CodeVisionAVR:
Пособие для начинающих
Дата выпуска: 2008 г.
Формат: 70x100/16
Объем: 592 с.
ISBN: 978-5-94120-192-1
В книге изложены основные приемы работы в интегри-
рованной среде разработки CodeVisionAVR, предназначен-
ной для разработки программного обеспечения и програм-
мирования микроконтроллеров AVR на языке Си.
Автор постарался сделать описание программы
CodeVisionAVR максимально понятным: приводятся переводы всех меню и команд меню,
диалоговых окон, а также различного рода предупреждений. Кроме того, для облегчения
восприятия материала книга богато иллюстрирована и снабжена перекрестными ссылками.
Книга рассчитана на читателей, изучающих основы микроконтроллерной техники, и мо-
жет быть полезна студентам вузов соответствующих специальностей.
Новинки Издательского дома «Додэка-ХХ1»
БлумХ.
Схемотехника и применение мощных
импульсных устройств
Дата выпуска: 2008 г.
Формат: 70x100/16
Объем: 352 с.
ISBN: 978-5-94120-191-4
В книге изложены физические и технические основы
создания и применения импульсов высокого напряжения
с очень большой мощностью и энергией. В первой части
описаны компоненты, материалы и методы измерений, ис-
пользуемые в технике получения мощных импульсов. Во
второй части— некоторые из наиболее перспективных
применений этой техники в биоэлектрике, поверхностной обработке металлов, медицине,
селективном размельчении различных материалов и т. д., а именно: генераторы мощных
импульсов электрического и магнитного поля, источники интенсивного импульсного излуче-
ния и импульсных электрических разрядов.
Книга представляет собой, по сути, путеводитель по огромному количеству публикаций
по данной тематике, как классических, так и современных.
Книга предназначена широкому кругу читателей, которые хотят ближе ознакомиться
с основными идеями и методами, используемыми в сфере мощных импульсных устройств, а
особо будет полезна студентам, преподавателям вузов, инженерам и ученым.
Новинки Издательского дома «Додэка-ХХ1»
Катцен С.
PIC-микроконтроллеры.
Все, что вам необходимо знать
Дата выпуска: 2008 г.
Формат: 70x100/16
Объем: 656 с.
ISBN: 978-5-94120-134-1
Данная книга представляет собой исчерпывающее
руководство по микроконтроллерам семейства PIC ком-
пании Microchip, являющегося промышленным стандар-
том в области встраиваемых цифровых устройств. В кни-
ге подробно описывается архитектура и система команд
8-битных микроконтроллеров PIC, на конкретных приме-
рах изучается работа их периферийных модулей.
В первой части излагаются основы цифровой схемотехники, математической логики и
архитектуры вычислительных систем. Вторая часть посвящена различным аспектам про-
граммирования PIC-микроконтроллеров среднего уровня: описывается набор команд, рас-
сматривается написание программ на ассемблере и языке высокого уровня (Си), а также
поддержка подпрограмм и прерываний. В третьей части изучаются аппаратные аспекты
взаимодействия микроконтроллера с окружающим миром и обработки прерываний. Рас-
сматриваются такие вопросы, как параллельный и последовательный ввод/вывод данных,
временные соотношения, обработка аналоговых сигналов и использование EEPROM. В за-
ключение приводится пример разработки реального устройства. На этом примере также де-
монстрируются простейшие методики отладки и тестирования, применяемые при разработ-
ке реальных устройств.
Книга рассчитана на самый широкий круг читателей — от любителей до инженеров, при
этом для понимания содержащегося в ней материала вовсе не требуется каких-то специ-
альных знаний в области программирования, электроники или цифровой схемотехники. Эта
книга будет также полезна студентам, обучающимся по специальностям «Радиоэлектрони-
ка» и «Вычислительная техника», которые смогут использовать ее в качестве учебного посо-
бия при прослушивании соответствующих курсов или выполнении курсовых проектов.
Новинки Издательского дома «Додэка-ХХ1»
Финкенцеллер К.
Справочник по RFID
Дата выпуска: 2008 г.
Формат: 70x100/16
Объем: 496 с.
ISBN: 978-5-94120-151-8
Данный справочник представляет собой исчерпываю-
щий обзор систем RFID (систем радиочастотной иденти-
фикации), который, главным образом, ориентирован на
практические вопросы их применения. Основой подоб-
ных систем являются электронные носители данных, не
обладающие собственным источником питания (транс-
пондеры). Информация с такого носителя считывается
бесконтактным способом. Системы RFID находят приме-
нение в самых разнообразных областях, например, в системах контроля допуска на пред-
приятия или в гостиничные номера, в качестве электронных иммобилайзеров или же как
средства предотвращения краж в супермаркетах.
В книге описываются физические принципы работы систем радиочастотной идентифи-
кации, содержится информация по действующим в этой области стандартам и основным
областям практического применения RFID-систем. Представлены также материалы, касаю-
щиеся физических принципов функционирования СВЧ и микроволновых систем, которые
приобретают все большее значение в связи с открытием соответствующих частотных диа-
пазонов.
Для иллюстрации достаточно сложных понятий используются многочисленные рисунки.
Приводятся примеры, которые поясняют вопросы, связанные с практическим применением
систем радиочастотной идентификации. В приложении содержится контактная информа-
ция, а также обзор стандартов и рекомендаций, приводятся ссылки на литературу и на ис-
точники информации в сети Интернет.
Предназначена для разработчиков систем радиочастотной идентификации, инженеров,
студентов, а также будет полезна менеджерам, занимающимся вопросами применения уст-
ройств RFID.
Новинки Издательского дома «Додэка-ХХ1»
Евстифеев А. В.
Микроконтроллеры AVR
семейства Classic фирмы ATMEL
Электронное издание на CD-диске
Дата выпуска: 2008 г.
ISBN: 978-5-94120-219-5
Книга представляет собой справочное издание по приме-
нению микроконтроллеров AVR семейства Classic фирмы
ATMEL.
Рассмотрены особенности архитектуры, приведены основ-
ные электрические параметры. Подробно описаны система ко-
манд, периферия, а также способы программирования.
Предназначена для разработчиков радиоэлектронной аппаратуры, инженеров, студен-
тов технических вузов.
Евстифеев А. В.
Микроконтроллеры AVR
семейств Tiny и Меда
фирмы ATMEL
Электронное издание на CD-диске
Дата выпуска: 2008 г.
ISBN: 978-5-94120-220-1
Книга посвящена вопросам практического применения
однокристальных микроконтроллеров AVR семейств Tiny и
Меда фирмы ATMEL.
Рассмотрена архитектура микроконтроллеров, ее осо-
бенности. Приведены основные электрические параметры и
временные характеристики. Подробно описано внутреннее устройство микроконтроллеров,
системы команд, периферия, а также способы программирования с примерами реализации
некоторых алгоритмов для конктретных цифровых устройств.
Предназначена для разработчиков радиоэлектронной аппаратуры, инженеров, студен-
тов вузов и радиолюбителей.