Разработка цифрового измерителя кровяного давления на микроконтроллере MC68HC908JL3
МО РФ
Новосибирский
колледж электроники
КУРСОВОЙ ПРОЕКТ
По
дисциплине микроконтроллеры
На тему:
“Разработка ЦИФРОВОГО ИЗМЕРИТЕЛЯ КРОВЯНОГО ДАВЛЕНИЯ на микроконтроллере MC68HC908JL3”
Выполнил: Мамаев А.С.
Гр. 9Вт-454
Проверил: Брикман А.И.
2003
Содержание
Введение
1. Техническое задание
2. Выбор и обоснование элементной базы
2.1 Выбор микроконтроллера
3. Структурная схема устройства
3.1 Состав и назначение отдельных элементов
3.2 Анализ ресурсов ввода-вывода
4. Структура алгоритма программы
4.1 Обобщённая БСА
4.2 Рабочая БСА
4.2.1 БСА основной программы.
4.2.2 БСА обработчика прерывания от таймера
4.2.3 БСА обработчика прерываний от АЦП
4.2.4 БСА подпрограммы табличной перекодировки напряжение в
давление
4.2.5 БСА подпрограммы вывода числа на индикацию
4.2.6 БСА подпрограммы перевода числа в BCD формат
5. Принципиальная схема устройства
Заключение
Список литературы
Приложение
Введение.
С развитием
микроэлектронной индустрии, а в частности с развитием микроконтроллеров,
появилась возможность делать малогабаритные и сравнительно дешёвые электронные
изделия.
На сегодняшний день, в
каждой аптеке и специализированных магазинах, можно увидеть в продаже различные
медицинские приборы. Например, цифровой термометр, цифровой измеритель давления
крови и многое другое.
Появление таких приборов
на прилавках магазинов, обусловлено прогрессивным развитием цифровой техники, в
том числе и микроконтроллерных систем.
Микроконтроллеры
позволяют меньше использовать типовые элементы в разработках, т.к. практически
всё можно сделать программными средствами, тем самым электронные изделия
сделанные на базе микроконтроллеров являются малогабаритными и стоят сравнительно
не дорого.
В настоящее время,
большая часть медицинских приборов построенна на цифровой логике, главным
элементом которой является микроконтроллер, и индикация происходит на цифровых
индикаторах, большую часть из которых составляют ЖКИ.
Поэтому, тема для
разработки была выбранна: “Цифровой измеритель кровяного давления”. Этот прибор
является наиболее нужным в каждой семье. Ведь если ты чувствуеш себя не важно,
то в любой момент можно померить давление и из полученных результатов сделать
вывод, надо бежать в больницу или нет.
1.Техническое задание
Устройство – цифровой
измеритель кровяного давления.
Основные технические
характеристики прибора:
1. Общий диапазон измерения:
а.
Систолическое/диастолическое давление: от 0 до 250 мм.рт.ст.
б. Пульс: от 0 до 133 уд.
в мин.
2. Минимальный шаг индикации: 1.5
мм.рт.ст.
3. Точность измерения:
а. Статическое давление:
3 мм.рт.ст.
б. Пульс: 5% показаний.
4. Индикатор: ЖКИ-модуль.
Информация о давлении и
пульсе отображается на 16-ти разрядном, 2-х строчном ЖКИ-модуле.
Измерение происходит в
полуавтоматическом режиме.
2. Выбор и обоснование
элементной базы
В данном устройстве,
информация о систолическом, диастолическом давлении и пульсе должна выводиться
одновременно. С учётом всего этого, был выбран ЖКИ-модуль DV-16210NRB/R,
который имеет две строки, по 16 разрядов в каждой строке.
Датчик давления в
рассматриваемом устройстве, должен отвечать следующим требованиям:
1. Датчик должен быть со стандартным
выходным сигналом, то есть при минимальном значении давления должен иметь
выходной сигнал не более 0,3V, а
при максимальном давлении не более 4,8V, это обеспечивает непосредственное соединение датчика с
микроконтроллером.
2. Датчик должен измерять относительное
давление(относительно атмосферы).
3. Максимальное измеряемое давление
должно лежать в пределах от 30 кПа до 50 кПа, так как диапазон измерения
систолического/диастолического давления составляет от 0 до 250 мм.рт.ст.
Взяв во внимание все эти
3-и пункта был выбран датчик давления фирмы MOTOROLA MPX5050DP.
2.1 Выбор
микроконтроллера
Выбор микроконтроллера
осуществляется с учётом следующих параметров:
1. Линий ввода-вывода должно быть не
менее 13, т.к. 11 линий необходимо для работы с индикатором, а две линии для
работы с сигналами поступающими от датчика давления.
2. Микроконтроллер должен иметь
встроенный АЦП, для работы с аналоговыми сигналами поступающими от датчика
давления MPX5050DP на входы АЦП микроконтроллера.
Поэтому, принимая во
внимание, эти два главных параметра, был выбран маловыводной микроконтроллер
фирмы MOTOROLA MC68HC908JL3.
3.
Структурная схема
устройства
3.1 Состав и назначение
отдельных элементов
Структурная схема
устройства приведена на рис.3.1.1.
Основой устройства
является микроконтроллер. Основная функция микроконтроллера, это прием данных
от датчика и активного фильтра(АФ), обработка этих данных, т.е. вычисление
систолического, диастолического давления и усреднённой частоты пульса. После
того, как все измерения будут произведены, микроконтроллер выводит информацию
на индикатор.
Датчик предназначен для
перевода давления в манжете, в электрический сигнал, т.е. напряжение.
АФ высокой частоты
предназначен для выделения и усиления сигнала, пульсирующего с частотой 1Гц,
наложенного на медленно изменяющийся сигнал 0.04Гц. Выделение сигнала необходимо,
потому что давление распознаётся по производной сигнала, пульсирующего с
частотой 1Гц, а значение давления смотрится по медленно изменяющемуся сигналу
(0,04Гц). Поэтому у микроконтроллера задействованы 2-а входа АЦП.
При разработке данного
устройства существовала сложность в том, что датчик при неинвазивных
применениях(без проникновения во внутренние полости организма) не может быть
расположен непосредственно внутри системы, в которой измеряется давление.
Поэтому пришлось разработать нестандартную систему измерений, в которой датчик
помещается внутри манжеты, на которое наложены небольшие по амплитуде и более
быстрые пульсации, соответствующее изменению давления в кровеносной системе.
С внешней стороной этого
метода измерения давления крови, называемого осциллометрическим, знакомы
практически все. При этом рука сжимается кольцевой надувной манжетой,
накачиваемой вручную. Затем вентиль манжеты слегка приоткрывается, и давление в
манжете постепенно падает, и, когда оно становится близким к артериальному
давлению, амплитуда пульсации давления возрастает. Пульсации давления
определяются работой сердца.
Когда давление в манжете
изменяется от систолического до диастолического, пульсации давления достаточно
велики, за границей этого диапазона они резко снижаются. Определить этот
диапазон можно, прослушивая манжету с помощью стетоскопа, но, имея датчик
давления, лучше превратить пульсации давления в электрический сигнал и далее
анализировать его с помощью микропроцессорного устройства.
Такой электрический сигнал
на протяжении всего времени измерения представлен на рис.3.1.2.а. Сначала идёт
этап ручной подкачки манжеты(на рис.3.1.2.а. видны повышения давления при
каждом нажатии груши), затем в момент t1 прекращается подкачка и открывается вентиль. Давление, которое в момент
t1 превышает систолическое, постепенно
понижается.
В то же время, как это
видно из рис.3.1.2.а. на определённом участке пульсации давления растут, но
относительная величина этих пульсаций очень невелика по сравнению с усреднённой
величиной давления. Чтобы было удобно работать с сигналом пульсаций, необходимо
отфильтровать низкочастотную усреднённую составляющую и усилить сигнал
пульсаций. Это можно сделать с помощью активного фильтра на базе операционного
усилителя (на структурной схеме АФ). Такой отфильтрованный и усиленный сигнал
представлен на рис.3.1.2.б в диапазоне выделенном на рис.3.1.2.а
прямоугольником.
Диаграммы рис.3.1.2.
хорошо иллюстрируют основную идею измерения давления крови, которая сводится в
получении и анализе данных, приходящих с датчика и активного фильтра.
Структурная схема
устройства.
11
Рис.3.1.1.
Диаграммы измерения
кровяного давления
Рис.3.1.2.
3.2 Анализ ресурсов
ввода-вывода
Микроконтроллеры
семейства HC08 фирмы MOTOROLA имеют закрытую архитектуру, которая
характеризуется отсутствием линий магистралей адреса и данных на выводах
корпуса микроконтроллера. Микроконтроллер представляет собой законченную
систему обработки данных, наращивание памяти или периферийных устройств с
использованием параллельных магистралей адреса и данных не предполагается.
Поэтому анализ ресурсов ввода-вывода, должен происходить в самом начале
разработки, т.к. в противном случае может возникнуть ситуация нехватки линий
ввода-вывода.
На принципиальной схеме
изображённой на рис.5.1. можно подсчитать, что у микроконтроллера должно быть
не менее 13 линий ввода-вывода(11 линий для работы с ЖКИ-модулем и две линии
для работы с датчиком давления).
В данном случае был
выбран микроконтроллер MC68HC908JL3, который имеет 22 линии ввода-вывода. То есть, по сути дела
у нас остаётся свободными, 9-ть линий ввода-вывода, которые можно использовать
для различных усовершенствований прибора. Например, можно дополнительно в
приборе сделать часы, также можно сделать, чтобы прибор измерял давление в
автоматическом режиме, для этого необходим компрессор, который будет нагнетать
давление в манжету. Все эти доработки непосредственно повлекут за собой,
задействование дополнительных линий ввода-вывода.
4. Структура алгоритма
программы
4.1 Обобщённая БСА
Обобщённая БСА программы,
управляющей системой, приведена на рис.4.1.2. После включения питания происходит
инициализация всей системы. После этого микроконтроллер ждёт накачки манжеты,
осуществляя циклическую проверку окончания накачки. Когда сигнал датчика
уменьшается в течении более чем 0,75 секунд, это свидетельствует, что
пользователь больше не накачивает манжету, и микроконтроллер начинает
анализировать сигнал колебания. Анализ сигнала колебания сводится к
идентификации амплитуды пульса и осуществляется в блоках 3 и 4.
Пороговый уровень для
измерения частоты импульсов установлен равным 1,75V, чтобы устранить шумы или всплески. Как только амплитуда
пульса идентифицирована, микроконтроллер игнорирует сигнал в течении 450 мS, чтобы предотвратить ложную
идентификацию из-за наличия промежуточного максимума колебания. После чего в
блоке 5 происходит вычисление производной амплитуды пульса. Именно по
производной амплитуды пульса определяется давление крови, блок 6.
Из графика показанного на
рис.4.1.1., можно увидеть, что основной принцип измерения основан на сравнении
производной с 2-мя порогами, Порог1 и Порог2. Более подробно, это будет
рассмотрено в пункте 4.2.
График производной
амплитуды пульса.
Порог2
Порог1
Рис.4.1.1.
После того как
устройство определит давление и пульс, оно проверяет, есть ошибки в измерении
или нет. Если ошибки есть, то микроконтроллер выводит сообщение об ошибки,
после чего, если манжета спущена, т.е. давление внутри манжеты равно
атмосферному давлению, то устройство начинает измерение по новому. Если ошибок
нет, то информация о давлении и пульсе выводится на индикатор, после чего
система опять смотрит, если манжета спущена, то измерение давления происходит
по новому, если манжета не спущена, то программа зациклевается и ждёт спуска
манжеты.
2. Процедура
ожидания окончания накачки манжеты
|
|
Y N
Y
N
Y
N
N
Y
Y
Рис.4.1.2. Обобщённая
БСА.
4.2 Рабочая БСА
4.2.1 БСА основной
программы
Рабочая БСА придставленна
на рис.4.2.1.2..В начале программы происходит инициализация, блок 1, в котором
происходит инициализация портов ввода-вывода, АЦП и таймера. После чего в блоке
2 обнуляются все переменные, задействованные в данной программе. Как только,
это всё выполнится, происходит запуск АЦП(блок 4), у которого аналоговым входом
является линия РТВ0.
Первый результат преобразования
аналогового сигнала, заносится в ячейку памяти CONST, и означает значение кода при нулевом давлении. После
этого на индикатор выводятся символы как показано на рис.4.2.1.1., и в младшем
разряде “сис:” зажигается 0. После чего, идёт процедура ожидания окончания
накачки манжеты.
сис х х 0
диа х х х пул х х х
рис.4.2.1.1. Расположение
символов на индикаторе.
Она заключается в
следующем. В ячейку памяти del
заносится число соответствующее задержке 0,75 секунды( бл.12). В блоках 16 и 15
организован цикл, после выполнения которого, происходит индикация текущего
давления (бл. 17 – 21). После чего делается декремент ячейки памяти del. Если del0 то, программа переходит к выполнению бл.13. и все происходит заново.
Если del=0, то в бл.25. происходит сравнение
давления до задержки и после задержки. Если давление после задержки больше
давления до задержки, то программа переходит к выполнению бл.12. и данная
процедура повторяется. Если же давление после задержки меньше давления до
задержки, то это означает, что пользователь прекратил накачку манжеты, и
программа переходит на процедуру определения амплитуды.
В начале процедуры, в
блоке 30 происходит сравнение напряжения снимаемого с активного фильтра (вход
РТВ1) с заданным порогом напряжения (1,75V). Если пороговое напряжение больше напряжения снимаемого с
АФ, то программа зациклевается и ожидает когда напряжение с АФ будет больше
порогового. Причём, если в течении 5 секунд программа находится в цикле, то
измерение прекращается и выводится сообщение об ошибки. Если Upress1>Пор, то происходит сброс ячейки
памяти OVSEC, и далее происходит определение
значения амплитуды (бл. 33 – 37).
Как только, амплитуда
будет определенна, происходит сброс и перезапуск таймера, а также обнуление SEC10 и SEC (бл. 38). После чего значение амплитуды заносится в
ячейку памяти АМР2 (бл. 39). Далее АЦП переключается на вход РТВ0 (бл. 40), и
результат второго преобразования заносится в UDAV (этот результат показывает давление в манжете), после
чего АЦП обратно переключается на вход РТВ1. Как только АЦП переключится на
вход РТВ1, ячейка памяти PULSE,
в которой находится кол-во пульсаций, инкрементируется. А далее идет процедура
вычисления производной амплитуды.
Производная вычисляется
по формуле:
,
где, AMP1 и AMP2 – амплитуды;
time – время между амплитудами.
При первом входе в
процедуру SB=0 (бл.50), вычисляется время
импульса и заносится в ячейку памяти time1 (бл.52 – 55). После чего проверяется (бл.56), если первая амплитуда
находится в АМР2, а вторая в АМР1, то они меняются местами (бл.57 – 59) и
программа переходит на выполнение бл.29, т.е. определение амплитуды начинается
сначала. Если первая амплитуда находится в АМР1, а вторая в АМР2, то ничего не
происходит, и определение амплитуды начинается заново.
При последующем входе SB=1, в начале также определяется время
импульса, но далее смотрится:
1. Если РВ=0, то значение времени
заносится в time2, после чего из time2 вычитается time1, и РВ устанавливается в “1” (бл.64 – 66).
2. Если РВ=1, то значение времени
заносится в time1, после чего из time1 вычитается time2, и РВ устанавливается в “0” (бл.61 – 63).
И в первом, и во втором
случае, результат преобразования заносится в time3 (бл.67).
В блоке 68 происходит
определение разности между АМР2 и АМР1. Далее в блоках 69 – 73 вычисляется
производная. После чего программа переходит к процедуре определения давления.
Из графика показанного на
рис.4.2.1.1. видно, что первая производная, которая больше порога ПОРОГ1
является определяющей для систолического давления, т.е. по ней определяют
систолическое давление. Последующее производные, которые больше порога ПОРОГ1,
но меньше порога ПОРОГ2 не являются определяющими и игнорируются. Когда
производная будет больше порога ПОРОГ2, то она станет определяющей для
диастолического давления. Поэтому в процедуре определения давления, сначала
определяется систолическое давление (бл.75). Если давление определилось, то
значение давления заносится в SIS,
после чего бит QB устанавливается
в “1” (бл.77,78), и идёт определение диастолического давления. Если давление не
определилось, то бит QB не
устанавливается, и далее происходит определение диастолического давления.
Как только диастолическое
давление будет определенно (бл.76), его значение переносится в DIA (бл.79). После чего осуществляется
проверка (бл.80), если SIS=0,
то выводится сообщение об ошибки, после чего устройство ожидает спуска манжеты
(бл.81), перед повторным измерением. Если SIS0, то идёт вычисление частоты пульса (бл.82 – 84) и далее происходит
индикация давления и пульса (бл.85), после чего устройство опять ожидает спуск
манжеты перед повторной накачкой.
Бит QB позволяет сначала определять
систолическое давление, и только потом определять диастолическое давление,
причём если систолическое давление определенно, то в последующем определяется
только диастолическое давление.
Рис.4.2.1.2.
Рис.4.2.1.2.(продолжение)
|
|
|
|
|
|
|
32.Вывод
сообщения об ошибки
|
|
Рис.4.2.1.2.(продолжение)
Рис.4.2.1.2.(продолжение)
Рис.4.2.1.2.(продолжение)
Рис.4.2.1.2.(продолжение)
4.2.2 БСА обработчика
прерывания от таймера
БСА обработчика
прерывания от таймера, представлена на рис.4.2.2.1. Для правильной работы
обработчика, необходимо частоту тактирования таймера сделать равной 125кГц,
т.е. Fbus/8, а в регистр периода загрузить
число 12499. Тогда через каждые 0,1 S будет вызываться обработчик прерывания от таймера.
В начале подпрограммы
обработчика необходимо сбросить флаг TOF(бл.1), иначе в противном случае следующий запрос на прерывание
“потеряется”.
После того, как флаг
будет сброшен, подпрограмма переходит к выполнению блока 2, в котором она
делает инкремент ячейки памяти Sec10(в
ней находятся 10-е доли секунды). Как только Sec10 станет равным 9-и (бл.3), происходит очистка, т.е.
обнуление, Sec10 (бл.4) и делается инкримент ячейки
памяти Sec (в которой находятся целые секунды).
В блоках 6,7 происходит
отсчёт времени до 2-х минут, после чего устанавливается бит Dvb(бл.8), который контролирует время
нахождения в программы в цикле (бл.30,31,29) см. рис.4.2.1.2.
Рис.4.2.2.1.
4.2.3 БСА обработчика
прерываний от АЦП
БСА обработчика
прерываний от АЦП представленна на рис.4.2.3.1.
Бит ab (бл.1) определяет аналоговый вход
АЦП, или РТВ0, или РТВ1. Рассмотрим случай когда аналоговым входом является
линия РТВ0, т.е. ab=0.
В блоке 2 определяется,
был ли ранее у АЦП аналоговый вход РТВ0:
1. Если не был (ab2=0), то происходит сброс бита ab1, который выполняет аналогичную функцию, только показывает,
был ли ранее у АЦП, аналоговый вход РТВ1. После чего происходит установка бита ab2 в 1 (бл.4), и запуск АЦП с
аналоговым входом РТВ0 (бл.7). Далее программа выходит из обработчика.
2. Если был (ab2=1), то в блоке 5 устанавливается бит СОСО1, сигнализирующий
о том, что преобразование завершено, после чего результат из регистра данных
АЦП переносится в ячейку памяти Upress,
и происходит запуск АЦП с аналоговым входом РТВ0 (бл.7). После чего программа
выходит из обработчика.
В случае когда аналоговым
входом является линия РТВ1 (ab=1),
всё происходит аналогично.
Бит ab2 и ab1 необходимы для корректной работы подпрограммы. То есть,
если аналоговым входом является линия РТВ0, то при смене аналогового входа на
РТВ1, первый результат преобразования окажется ложным, он не будет
соответствовать значению сигнала на входе РТВ1. Поэтому чтобы этого не
случилось, вводятся биты ab2 и ab1.
Рис.4.2.3.1.
4.2.4 БСА подпрограммы
табличной перекодировки напряжение в давление.
БСА подпрограммы табличной
перекодировки напряжения в давление представленна на рис. 4.2.4.1.
В начале подпрограммы
происходит сохранение регистров CPU в
стеке (бл.1). Далее происходит вычисление истинного давления(бл.2), после чего
результат проделанной операции заносится в Udav (бл.3). В блоке 4 происходит загрузка числа в регистр
Х, затем следует команда табличной перекодировки ( бл.5), где TCP – начало таблицы перекодировки.
После чего, в блоке 6, перекодированное число заносится в Udav, в блоке 7 восстанавливаются из стека
регистры CPU, и программа выходит из обработчика.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.Загрузить в
стек регистры CPU
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис.4.2.4.1.
4.2.5 БСА подпрограммы
вывода числа на индикацию
БСА вывода числа на
индикацию представлена на рис.4.2.5.1.
В ячейку памяти ci заносится число (бл.2) равное кол-ву
цифр выводимых на индикатор.
В блоке 5 происходит
загрузка числа для табличной перекодировки, в регистр Х. После чего в бл.6
следует команда табличной перекодировки числа для индикации, где TCI – это начало кодовой таблицы. После
этой команды, происходит передвижение по ячейкам BCDxxx.
В блоках 8,9 происходит
запись перекодированного числа в одну из ячеек памяти INDxxx, после чего в блоке 10 идёт передвижение по ячейкам INDxxx.
В блоке 11 происходит
настройка индикатора на приём адреса, после чего в блоке 12 адрес передаётся в
индикатор, который стробируется импульсом образованным блоками 13-15. После
этого следует задержка 30 мкС, в течении которой индикатор выполняет, свои
внутренние операции.
Как только задержка окончилась,
в бл.17,18 индикатор настраивается на приём данных, и далее происходит передача
данных (бл.19), которые стробируются импульсом образованным блоками 20-22.
После чего в блоке 23 происходит задержка, после которой декрементируется
ячейка памяти ci, в блоках 25-27 происходит
подготовка для вывода следующего числа на индикацию, и в бл.28 проверяется,
если ci 0, то подпрограмма переходит к выполнению бл.6 и всё начинается заново.
Если ci=0, то программа выходит из
обработчика.
Рис.4.2.5.1.
Рис.4.2.5.1.(продолжение)
4.2.6 БСА подпрограммы
перевода числа в BCD формат
БСА подпрограммы перевода
числа в BCD формат представлена на рис.4.2.6.1.
В начале подпрограммы,
регистры CPU сохраняются в стеке. В блоке 1
происходит проверка:
1. Если число больше 99, то в блоке 3
происходит деление числа на 100, в результате этой операции, целое частное помещается
в аккумулятор, а остаток деления в регистр H. Целое частное – это сотни числа, поэтому они заносятся в
ячейку памяти BCD100 (бл.4), после чего остаток
загружается в аккумулятор (бл.5), и делится на 10 (бл.6). В результате этой
операции, в аккумуляторе получаются десятки числа, которые заносятся в BCD10 (бл.7), а остаток числа показывает
единицы и заносится в BCD1
(бл.8).
2. Если число меньше 99, то оно
проверяется в блоке 2, если оно меньше 9, то в ячейку памяти BCD100,BCD10 записывается код пробела (бл. 11,12), после чего
данное число записывается в BCD1
(бл.13). Если оно больше 9, то число записывается в аккумулятор (бл.9), в
ячейку памяти BCD100 записывается код пробела, после
чего происходит деление числа на 10 (бл.6) и далее всё происходит как в пункте
1, только начиная с блока 6.
3.
Рис.4.2.6.1.
5. Принципиальная схема
устройства
Принципиальная схема
устройства изображена на рис.5.1.
Заключение
Обратите внимание на
принципиальную схему прибора, в ней как видно минимум элементов. Это
объясняется применением в схеме, микроконтроллера. Причем всё измерение
осуществляется в полуавтоматическом режиме и происходит в микроконтроллере. Тем
самым пользователь прикладывает минимум усилий для измерения своего давления.
Таким образом применение
микропроцессорных систем в устройствах различного типа, позволяет сократить
кол-во элементов в схеме, сделать устройство более качественным, а также
позволяет осуществить наиболее “дружелюбный” интерфейс с пользователем.
Программа для данного
устройства была написана на ассемблере CASM08, оттранслированна и отлажена на ICS08JL, листинг программы приведён в приложении.
Список литературы
1.
Панфилов Д.И.
Датчики фирмы MOTOROLA. Москва. ДОДЭКА. 2000. 96 с.
2.
БЭК.
Жидкокристалические индикаторы фирмы DATA INTERNATIONAL.
Москва. 1999. 64 с.
3.
Technical
Data. MC68HC908JL3.
4.
Technical
Data. MPX5050DP.
Приложение
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 1
0000 1
PTA equ $0
0000 2
PTB equ $1
0000 3
PTD equ $3
0000 4
DDRA equ $4
0000 5
DDRB equ $5
0000 6
DDRD equ $7
0000 7 PDCR
equ $A
0000 8
PTAPUE equ $D
0000 9
KBSCR equ $1A
0000 10
KBIER equ $1B
0000 11
CONFIG2 equ $1E
0000 12
CONFIG1 equ $1F
0000 13
TSC equ $20
0000 14
TCNTH equ $21
0000 15
TCNTL equ $22
0000 16
TMODH equ $23
0000 17
TMODL equ $24
0000 18
ADSCR equ $3C
0000 19
ADR equ $3D
0000 20
ADICLK equ $3E
21
22
23
0080
24 org $80 ;ОЗУ
25
0080 26
ind rmb 3
0083 01 27
adres db 1
0084 01 28
BCD100 db 1
0085 01 29
BCD10 db 1
0086 01 30
BCD1 db 1
0087 01 31
indx db 1
0088 01 32
ci db 1
0089 01 33
bitf db 1
008A 01 34
upress1 db 1
008B 01 35
upress db 1
008C 01 36 udav
db 1
008D 01 37
const db 1
008E 01 38
dav db 1
008F 01 39
y db 1
0090 01 40
pulse db 1
0091 01 41
bitf1 db 1
0092 01 42
cmp1 db 1
0093 01 43
del db 1
0094 01 44
por db 1
0095 01 45
ovsec db 1
0096 01 46
cmpad db 1
0097 01 47 amp2
db 1
0098 01 48
amp1 db 1
0099 01 49
sec db 1
009A 01 50
sec10 db 1
009B 01 51
time1 db 1
009C 01 52
time2 db 1
009D 01 53
time3 db 1
009E 01 54
pr1 db 1
009F 01 55
sis db 1
00A0 01 56
pr2 db 1
00A1 01 57
dia db 1
00A2 01 58
pul db 1
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 2
00A3 01 59
bcdx db 1
00A4 01 60
pmem1 db 1
61
EC00
62 org $ec00 ;программа
63
64
start:
65
;--------------------------- Инициализация -----
66
EC00 [01] 4F
67 clra
EC01 [01] 5F
68 clrx
69
EC02 [04] 6EFF07 70
mov #$ff,DDRD ;Настраиваем линии
порта PTD на вывод
EC05 [04] 6E1C05 71
mov #$1c,DDRB ;Настраиваем линии
РТВ2,РТВ3,РТВ4
на вывод
72
73
;Инициализация индикатора
74
EC08 [04] 1501 75
bclr 2,PTB
EC0A [04] 1701 76 bclr
3,PTB
EC0C [04] 6E0603 77
mov #$6,PTD ;Установка режима ввода
стробирующего
импульса
EC11 [01]
9D 79 nop
EC12 [01] 9D
80 nop
EC13 [01] 9D
81 nop
EC14 [01] 9D
82 nop
EC15 [01] 9D
83 nop
EC16 [04] 1901
84 bclr 4,PTB
EC18 [05] CDEF08
85 jsr deleysret
EC1B [04] 6E3803
86 mov #$38,PTD ;Установка выполняемых
функций
EC1E [04] 1801 87
bset 4,PTB ;Формирование
стробирующего импульса
EC20 [01]
9D 88 nop
EC21 [01] 9D
89 nop
EC22 [01] 9D
90 nop
EC23 [01] 9D
91 nop
EC24 [01] 9D 92
nop
EC25 [04] 1901
93 bclr 4,PTB
EC27 [05] CDEF08
94 jsr deleysret ;Задержка 30 мкС
EC2A [04] 6E0803
95 mov #$8,PTD
EC2D [04] 1801
96 bset 4,PTB ;Формирование
стробирующего
импульса
EC2F [01] 9D 97 nop
EC30 [01] 9D 98 nop
EC31 [01]
9D 99 nop
EC32 [01] 9D
100 nop
EC33 [01] 9D 101 nop
EC34 [04] 1901
102 bclr 4,PTB
EC36 [05] CDEF08
103 jsr deleysret ;Задержка 30 мкС
104
105
;---------------------------------------------
106
107 main:
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 3
EC39 [02] A628
108 lda #!40
EC3B [02] AE80
109 ldx #$80
110 sbm:
EC3D [02] 7F
111 clr ,X ; Обнуление ячеек памяти
EC3E [01] 5C
112 incx
EC3F [01] 4A
113 deca
EC40 [03] 26FB
114 bne sbm
EC42 [04] 6E5994
115 mov #!89,por
EC45 [04] 6E089E
116 mov #!8,pr1 ;Порог для систоличе
ского
EC48 [04] 6E0DA0 117
mov #!13,pr2;Порог для диастолического
118
EC4B [02] 9A 119
cli ;Разрешаем прерывания
120
EC4C [04] 6E403C 121
mov #$40,ADSCR ;Запуск АЦП вход РТВ0
EC4F [05]
0789FD 122 brclr 3,bitf,$
EC52 [04] 1789 123 bclr
3,bitf
EC54 [05] 4E8B8D
124 mov upress,const
125
126
;--------------------------- ИНДИКАЦИЯ сис,диа,пул
127
EC57 [04] 6E0B84 128
mov #!11,bcd100 ;$34 - код буквы "C"
EC5A [04]
6E0C85 129 mov #!12,bcd10
EC5D [04] 6E0B86
130 mov #!11,bcd1
EC60 [04] 6E0083
131 mov #$0,adres
EC63 [05] CDEEC1
132 jsr IND_RET ;Вывод на индикацию
EC66 [04] 6E0D84
133 mov #!13,bcd100 ;Вывод "ДИА"
EC69 [04] 6E0C85
134 mov #!12,bcd10
EC6C [04] 6E0E86
135 mov #!14,bcd1
EC6F [04] 6E4083
136 mov #$40,adres
EC72 [05] CDEEC1
137 jsr IND_RET
EC75 [04] 6E0F84
138 mov #!15,bcd100 ;Вывод "ПУЛ"
EC78 [04] 6E1085
139 mov #!16,bcd10
EC7B [04] 6E1186
140 mov #!17,bcd1
EC7E [04] 6E4983 141 mov
#$49,adres
EC81 [05] CDEEC1
142 jsr IND_RET
143
144
;----------------------------------------------
145
146
147 ;----------
ИНДИКАЦИЯ 0 в разделе сис ------------------------------;
148
EC84 [04] 6E0A84 149
mov #$a,bcd100 ;Символ пробела
EC87 [04]
6E0A85 150 mov #$a,bcd10
EC8A [04] 6E0386 151
mov #$03,bcd1 ;Символ "0"
EC8D [04] 6E4683
152 mov #$46,adres ;Запись адреса
EC90 [05]
CDEEC1 153 jsr IND_RET
EC93 [04] 1501
154 bclr 2,PTB
EC95 [04] 1701
155 bclr 3,PTB
EC97 [04] 6E0C03
156 mov #$c,PTD ;Включить дисплей
157
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 4
158
159
;-------------------------------------------------
160
EC9A [05] 4E8B92
161 mov upress,cmp1
162
163 ;-
Процедура ожидания окончания накачки манжеты --
164
165 ;- Задержка
0.7 секунды с индикацией текущего давления --------
166
167 loop:
EC9D [04] 6E0093
168 mov #$0,del
169
loop2:
ECA0 [01] 4F
170 clra
ECA1 [04] C7FFFF
171 sta $ffff ;Сброс WDOG
172
loop1:
ECA4 [01] 4A
173 deca
ECA5 [03] 26FD
174 bne loop1 ;Если аккумулятор=0 то
переход на loop1
ECA7 [05] 4E8B8C 175
mov upress,udav ;код напряжения с датчика заносим в udav
ECAA [03] 450000 176
ldhx #$0
ECAD [05] CDEE74 177
jsr VOLTS_PRESSURE_RET ;Вызов подпрограммы перекодировки напряжение в
давление
ECB0 [05]
4E8E8F 178 mov dav,y
ECB3 [05] CDEE85
179 jsr BCD_RET
ECB6 [04] 6E0483
180 mov #$04,adres ;занести адрес начала индикации
ECB9 [05]
CDEEC1 181 jsr IND_RET
ECBC [04] 3A93
182 dec del
ECBE [03] 26E0
183 bne loop2 ;Если del=0 то переход на loop2
ECC0 [05] 069104 184
brset 3,bitf1,lop ;Если 3 бит=0 то задержка происходит снова
ECC3 [04] 1691 185
bset 3,bitf1 ;Установить 3 бит в 1
ECC5 [03] 20D6 186
bra loop ;Переход на loop
187 lop:
ECC7 [04] 1789 188
bclr 3,bitf ;Сбросить 3 бит в 1
189
190
;-------------------------------------------------
ECC9 [04] C7FFFF 191
sta $ffff
ECCC [03] B68B 192
lda upress ;Загружаем upress в аккумулятор для сравнения
ECCE [03]
B192 193 cmp cmp1 ;с cmp1
ECD0 [03] 2502
194 blo ampmet ;Если А>cmp1, то
накачка манжеты всё ещё идет
ECD2 [03] 20C9 195
bra loop ;поэтому переходим на loop
196
197 ;-------
Определение амплитуды -------------------
198
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 5
199 ampmet:
ECD4 [04] C7FFFF 200 sta
$ffff
ECD7 [04] 1089 201
bset 0,bitf ;Устанавливаем аналоговый вход РТВ1
ECD9 [04] 6E3023 202
mov #$30,TMODH ;Инициализация
таймера, период счёта до 12499
ECDC [04] 6ED324 203
mov #$d3,TMODL ; частота тактирования 125000 Гц
ECDF [04] 6E4320 204
mov #$43,TSC ;Запуск таймера
205 dvbm:
ECE2 [04] C7FFFF 206
sta $ffff
ECE5 [05] 0A8902 207
brset 5,bitf,rm ;Если цикл продолжается больше 5 секунд
ECE8 [03] 2003 208
bra m55 ;то выводим сообщение об ошибки
209
rm:
ECEA [03] CCEDFC
210 jmp rorm
211 m55:
ECED [03] B68A
212 lda upress1
ECEF [03] B194
213 cmp por ;Сраниваем upress1 c порогом por
ECF1 [03] 25EF
214 blo dvbm ;Если upress1<por
то переходим на
dvbm
ECF3 [03] 3F95
215 clr ovsec ;Сброс OVsec
ECF5 [05] 4E8A96
216 mov upress1,cmpad ;-----------------------------
217
loopamp:
ECF8 [04] C7FFFF
218 sta $ffff ;-----------------
ECFB [04] 1989
219 bclr 4,bitf ;-----------------
ECFD [05] 0989FD
220 brclr 4,bitf,$ ;Идентификация
амплитуды
ED00 [03] B68A
221 lda upress1 ;-----------------
ED02 [03] B196
222 cmp cmpad ;-----------------
ED04 [03] 22F2
223 bhi loopamp ;Если
upress1>cmpad
то переходим на loopamp
224
225 ;----------
Сброс и перезапуск таймера -----------
226
ED06 [04] 1A20
227 bset 5,TSC
ED08 [04] 1820
228 bset 4,TSC
ED0A [04] 6E4320
229 mov #$43,TSC
230
231
;-------------------------------------------------
232
ED0D [05] 4E9697
233 mov cmpad,amp2 ;В amp2 находится значение амплитуды
ED10 [04] 1189
234 bclr 0,bitf ;Устанавливаем аналоговый вход РТВ0
ED12 [04] 1789 235
bclr 3,bitf ;Обнуляем бит СОСО1
ED14 [05] 0789FD 236
brclr 3,bitf,$ ;Если СОСО1=0 то
зациклеваемся
ED17 [05] 4E8B8C 237 mov
upress,udav ;Код напряжения с
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 6
датчика
в udav
ED1A [04] 1089 238
bset 0,bitf ;Устанавливаем
аналоговый вход РТВ1
ED1C [04] 3C90 239
inc pulse ;В pulse кол-во
амплитуд
ED1E [03] B697 240
lda amp2
ED20 [03] B198 241
cmp amp1
ED22 [03]
220B 242 bhi proim ;Если amp2>amp1 то
переход на proim
ED24 [05] 4E98A4
243 mov amp1,pmem1 ;-----------------
ED27 [05] 4E9798
244 mov amp2,amp1 ;Меняем местами
amp2
с
amp1
ED2A [05] 4EA497
245 mov pmem1,amp2 ;-----------------
ED2D [04] 1E89
246 bset 7,bitf ;Устанавливаем в 1
бит
cb
247
248 ;---
Процедура вычисления производной амплитуды --
249 proim:
ED2F [04] C7FFFF 250
sta $ffff
ED32 [05] 00913E 251
brset 0,bitf1,mtime ;Если вход в
процедуру 2-ой раз то переход на mtime
ED35 [04] 1091 252
bset 0,bitf1 ;Устанавливаем sb в 1
ED37 [03]
BE99 253 ldx sec
ED39 [02] A60A 254
lda #!10
ED3B [05] 42
255 mul ;Умножаем sec на 10
ED3C [01] 8C
256 clrh
ED3D [01] 5F
257 clrx
ED3E [03] BB9A
258 add sec10 ;Результат умножения
складываем с sec10,
259 ;получаем время импульса
ED40 [03] B79B 260
sta time1 ;Время импульса
заносим в time1
261 cbm:
ED42 [05] 0F8908 262
brclr 7,bitf,perem ;Если amp2 и amp1
менялись местами то
ED45 [04] 1F89 263
bclr 7,bitf ;меняем их обратно
ED47 [05]
4E97A4 264 mov amp2,pmem1 ;-------------------
ED4A [05] 4E9897
265 mov amp1,amp2
;-------------------
266
perem:
ED4D [05] 4E9798
267 mov amp2,amp1 ;amp2 заносим в amp1
268
269 ;- Задержка
с индикацией текущего давления 0.3 секунды ---------------------;
270
271
ED50 [04] 6E0093
272 mov #$0,del
273
loop20:
ED53 [01] 4F
274 clra
ED54 [04] C7FFFF
275 sta $ffff ;Сброс WDOG
276
loop11:
ED57 [01] 4A 277
deca
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 7
ED58 [03] 26FD
278 bne loop11
ED5A [05] 4E8B8C
279 mov upress,udav
ED5D [03] 450000
280 ldhx #$0
ED60 [05] CDEE74 281
jsr VOLTS_PRESSURE_RET;Вызов подпрограммы перекодировки напряжение в
давление
ED63 [05]
4E8E8F 282 mov dav,y
ED66 [05] CDEE85
283 jsr BCD_RET
ED69 [04] 6E0483
284 mov #$04,adres ;занести адрес начала индикации
ED6C [05]
CDEEC1 285 jsr IND_RET
ED6F [04] 3A93
286 dec del
ED71 [03] 26E0
287 bne loop20
288
289
290
291 ;---------------------------------------------
292
293 mtime:
ED73 [04] C7FFFF 294
sta $ffff
ED76 [03] BE99 295
ldx sec
ED78 [02] A60A 296
lda #!10
ED7A [05] 42 297
mul ;sec умножаем на 10
ED7B [03] BB9A
298 add sec10 ;sec10+результат
умножения
ED7D [05] 039108
299 brclr 1,bitf1,time2m ;Если pb=0 то
переходим
на time2m
ED80 [03] B79B 300
sta time1 ;Время импульса в
time1
ED82 [03] B09C
301 sub time2 ;Вычитаем из
time1,time2
ED84 [04] 1391
302 bclr 1,bitf1 ;Обнуляем pb
ED86 [03] 2006
303 bra raznom
304
time2m:
ED88 [03] B79C
305 sta time2 ;Время импульса в
time2
ED8A [03] B09B 306
sub time1 ;Вычитаем из
time2,time1
ED8C [04] 1291
307 bset 1,bitf1 ;Устанавливаем pb
308 raznom:
ED8E [03] B79D 309
sta time3 ;Разность времени в
Time3
ED90 [03] B697 310
lda amp2 ;-------------------
------
ED92 [03] B098 311
sub amp1 ;Вычисляем разность амплитуд рез. в аккумуляторе
ED94 [02] AE0A 312
ldx #!10 ;Разность амплитуд
умножаем на 10
ED96 [05]
42 313 mul ;-------------------
-------------
ED97 [03] BFA4 314
stx pmem1
ED99 [04] 55A4
315 ldhx pmem1
ED9B [03] BE9D
316 ldx time3
ED9D [07] 52
317 div ;Разность амплитуд умноженная на 10 делим на time3
318 ;в
результате получаем производную амплитуд
319
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 8
320
;--------------------- Процедура определения
давления
----------------------------------;
321
ED9E [05] 049109 322
brset 2,bitf1,pr2m ;Если qb=1 то
переходим на pr2m
EDA1 [03] B19E 323
cmp pr1 ;pr1 - порог для
систолического
давления
EDA3 [03] 2505 324
blo pr2m ;Если производная
меньше pr1 то переход на pr2m
EDA5 [05] 4E8C9F 325
mov udav,sis ;Заносим значение
давления в sis
EDA8 [04] 1489 326
bset 2,bitf ;Устанавливаем qb в
1
327 pr2m:
EDAA [04] C7FFFF
328 sta $ffff
EDAD [03] B1A0
329 cmp pr2 ;pr2 - порог для
диастолического
давления
EDAF [03] 2591 330
blo cbm ;Если производная
меньше pr2 то переход на cbm
EDB1 [05] 4E8CA1 331
mov udav,dia ;Значение давления
заносим в dia
EDB4 [02] A600
332 lda #!0
EDB6 [03] B19F
333 cmp sis
EDB8 [03] 2342
334 bls rorm ;Если sis=<0 то
переходим на rorm
EDBA [02] A63C 335
lda #!60 ;Вычисляем усреднённое значение пульса
EDBC [03]
BE99 336 ldx sec ;-----------------
EDBE [07] 52
337 div ;-----------------
EDBF [03] BE90
338 ldx pulse ;-----------------
EDC1 [05] 42
339 mul ;-----------------
EDC2 [03] B7A2 340
sta pul ;-----------------
341
342
;--------------------- Индикация давления и пульса
-----------------------------------;
343
EDC4 [04] C7FFFF 344
sta $ffff
EDC7 [05] 4E9F8C 345
mov sis,udav ;Вывод систолического давления
EDCA [05]
CDEE74 346 jsr VOLTS_PRESSURE_RET ;Вызов
подпрограммы перекодировки напряжение в
давление
EDCD [05] 4E8E8F 347
mov dav,y
EDD0 [05] CDEE85 348
jsr BCD_RET
EDD3 [04] 6E0483 349
mov #$04,adres ;занести адрес начала индикации
EDD6 [05]
CDEEC1 350 jsr IND_RET
351
EDD9 [05] 4EA18C
352 mov dia,udav ;Вывод диастолического давления
EDDC [05]
CDEE74 353 jsr VOLTS_PRESSURE_RET ;Вызов
подпрограммы перекодировки напряжение в
давление
EDDF [05] 4E8E8F 354
mov dav,y
EDE2 [05]
CDEE85 355 jsr BCD_RET
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 9
EDE5 [04] 6E4483
356 mov #$44,adres ;занести адрес начала индикации
EDE8 [05]
CDEEC1 357 jsr IND_RET
358
EDEB [04] C7FFFF
359 sta $ffff
EDEE [05] 4EA28F
360 mov pul,y ;Вывод пульса
EDF1 [05] CDEE85
361 jsr BCD_RET
EDF4 [04] 6E4D83
362 mov #$4d,adres ;занести адрес начала индикации
EDF7 [05] CDEEC1
363 jsr IND_RET
EDFA [03] 2022
364 bra exitdav
365 rorm:
EDFC [04] 1501 366 bclr
2,PTB
EDFE [04] 1701
367 bclr 3,PTB
EE00 [04] 6E0103
368 mov #$1,PTD
;Очистка дисплея
EE03 [04]
6E1284 369 mov #!18,bcd100 ; "O"
EE06 [04] 6E1385
370 mov #!19,bcd10 ; "Ш"
EE09 [04] 6E0C86
371 mov #!12,bcd1 ; "И"
EE0C [04] 6E0583
372 mov #$5,adres
EE0F [05] CDEEC1
373 jsr IND_RET
EE12 [04] 6E1484
374 mov #!20,bcd100 ; "Б"
EE15 [04] 6E1585
375 mov #!21,bcd10 ; "К"
EE18 [04] 6E0E86
376 mov #!14,bcd1 ; "А"
EE1B [05] CDEEC1
377 jsr IND_RET
379
380 ;------
Проверка спущена манжета или нет ---------
EE1E [04]
C7FFFF 381 sta $ffff
EE21 [04] 1189
382 bclr 0,bitf
EE23 [04] 1789
383 bclr 3,bitf
EE25 [05] 0789FD
384 brclr 3,bitf,$ ;Если COCO1=0 происходит
зациклевание
EE28 [03]
B68B 385 lda upress
EE2A [02] A105 386 cmp
#!5
EE2C [03] 22F0
387 bhi exitdav
EE2E [03] CCEC39
388 jmp main
389
390
;------------------------------------------------;
391
392
393
394
395
396
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
397
398
399 ADC_INT: ;
обработчик прерывания от АЦП
EE31 [02] 8B
400 pshh
EE32 [05] 018913
401 brclr 0,bitf,adm1 ;если ав=0
то переход на adm1
EE35 [05] 038907
402 brclr 1,bitf,adm2 ;переход если ав1=0
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 10
EE38 [04] 1889
403 bset 4,bitf
EE3A [05] 4E3D8A
404 mov ADR,upress1
EE3D [03] 2004
405 bra zap
406 adm2:
EE3F [04] 1589
407 bclr 2,bitf ;сброс ав2
EE41 [04] 1289
408 bset 1,bitf ;уст. ав1
409 zap:
EE43 [04] 6E413C
410 mov #$41,ADSCR ;команда
запуска АЦП вход PTB1
411
EE46 [03] 2011
412 bra exit
413 adm1:
EE48 [05] 058907
414 brclr 2,bitf,adm3 ;переход если ав2=0
EE4B [04]
1689 415 bset 3,bitf
EE4D [05] 4E3D8B
416 mov ADR,upress
EE50 [03] 2004
417 bra zap1
418 adm3:
EE52 [04] 1389
419 bclr 1,bitf ; сброс ав1
EE54 [04] 1489
420 bset 2,bitf ; уст. ав2
421 zap1:
EE56 [04] 6E403C
422 mov #$40,ADSCR ;команда
запуска АЦП вход PTB0
423
exit:
EE59 [02] 8A
424 pulh
EE5A [07] 80
425 rti
426
427
428
429
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
430
431
timer_int: ;Обработчи прерывания от таймера
EE5B [04] 1F20
432 bclr 7,TSC ;Сброс TOF
EE5D [04]
3C9A 433 inc sec10
EE5F [03] B69A
434 lda sec10
EE61 [02] A109
435 cmp #$9
EE63 [03] 250E
436 blo exittime ;Если sec10>9 то перхода нет
EE65 [03] 3F9A
437 clr sec10
EE67 [04] 3C99
438 inc sec
EE69 [04] 3C95
439 inc ovsec
EE6B [03] B695
440 lda ovsec
EE6D [02] A105
441 cmp #!5
EE6F [03] 2502
442 blo exittime
EE71 [04] 1A89
443 bset 5,bitf
444
exittime:
EE73 [07] 80
445 rti
446
447
448
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
449
450
451
VOLTS_PRESSURE_RET: ;подпрограмма табличной перекодировки напр. в давление
452 ;число для перекодир
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 11
453 ;начало таблицы -TCP
EE74 [02]
87 454 psha
EE75 [02] 8B
455 pshh
EE76 [02]
89 456 pshx
457
EE77 [03] B68C
458 lda udav
EE79 [03] B08D
459 sub const ;const- напряжение
при
нулевом давлении
EE7B [01] 97
460 tax
EE7C [04] D6EF14
461 lda TCP,x
EE7F [03] B78E 462 sta
dav ;перекодированное
число в dav
463
EE81 [02] 88
464 pulx
EE82 [02] 8A
465 pulh
EE83 [02] 86 466
pula
EE84 [04] 81
467 rts
468
469
470
471
472
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
473
474
475
476
477 BCD_RET:
;подпрограмма перевода числа в BCD формат
478
;число для перевода находится в "y"
479 ;BCD100 - сотни
480 ;BCD10 - десятки
481 ;BCD1 - единицы
482
EE85 [02] 87
483 psha
EE86 [02] 8B
484 pshh
EE87 [02] 89
485 pshx
486
EE88 [03] B68F
487 lda y ;Делимое в
аккумулятор
EE8A [02] A163
488 cmp #!99
EE8C [03] 2206
489 bhi bcd100m ;если y>99 то переход на bcd100m
EE8E [02] A109 490
cmp #!9
EE90 [03] 2210
491 bhi bcd10m ;если y>9 то переход на bcd10m
EE92 [03] 2020
492 bra bcd1m
493 bcd100m:
EE94 [02] AE64 494 ldx
#!100 ;100-делитель
EE96 [07] 52
495 div
EE97 [03] B784
496 sta BCD100 ;Результат в BCD100
EE99 [04]
35A4 497 sthx pmem1
EE9B [03] 450000 498 ldhx
#!0
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 12
EE9E [03] B6A4
499 lda pmem1 ;Остаток в
аккумулятор
EEA0 [03] 2003
500 bra mb1
501
bcd10m:
EEA2 [04] 6E0A84
502 mov #$a,BCD100 ;Пробел в BCD100
503 mb1:
EEA5 [02] AE0A
504 ldx #!10 ;10-делитель
EEA7 [07] 52
505 div ;Делим остаток на 10
EEA8 [03] B785
506 sta BCD10 ;Результат в BCD10
EEAA [04]
35A4 507 sthx pmem1
EEAC [03] 450000
508 ldhx #!0
EEAF [05] 4EA486
509 mov pmem1 BCD1
EEB2 [03] 200C
510 bra exitb
511
bcd1m:
EEB4 [04] 6E0A84 512 mov
#$a,BCD100 ;Пробел в BCD100
EEB7 [04] 6E0A85
513 mov #$a,BCD10 ;Про BCD10
EEBA [05] 4E8F86
514 mov y,BCD1
515
516
EEBD [02] 88
517 pulx
EEBE [02] 8A
518 pulh
EEBF [02] 86
519 pula
EEC0 [04] 81 520
exitb: rts
521
522
523
524
525
526
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
527
528
529
530 IND_RET:
;Подпрограмма для вывода числа на индикацию
531
;для подпрограммы необходимо:
532
;- число или символ для индикации
533 ;(BCD100,BCD
10,BCD1)
534
;- адрес ячейки в индикаторе
EEC1 [02]
87 535 psha
EEC2 [02] 8B
536 pshh
EEC3 [02] 89
537 pshx
538
EEC4 [04] 6E0388
539 mov #$3,ci
EEC7 [04] 6E8087
540 mov #$80,indx ;заместо ind поставить адрес!!!!!!!!!!!!!!!!!
EECA [04] 6E84A3
541 mov #$84,bcdx ;адрес bcd100 в
bcdx
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 13
EECD [03] BE84
542 ldx BCD100
543
stind:
EECF [04] D6EFAE
544 lda TCI,x ;TCI-началотаблицы перекодировки
EED2 [04]
3CA3 545 inc BCDX
EED4 [03] BE87
546 ldx indx
EED6 [02] F7
547 sta ,x ;Результат перекодировки в ячейку памяти
с регистре Х
EED7 [04] 3C87
548 inc indx ;передвегаемся по ячейкам IND
EED9 [04] 1501 549 bclr
2,PTB ;уст. в 0
PTB2
EEDB [04] 1701
550 bclr 3,PTB
EEDD [05] 4E8303
551 mov adres,PTD ;Адрес
знакоместа в порт PTD
EEE0 [04]
1801 552 bset 4,PTB
EEE2 [01] 9D
553 nop
EEE3 [01] 9D
554 nop
EEE4 [01] 9D
555 nop ;Формирование стробирующего импульса
EEE5 [01]
9D 556 nop
EEE6 [01] 9D
557 nop
EEE7 [04] 1901
558 bclr 4,PTB
EEE9 [04] AD1D
559 bsr deleysret ;задержка 30mkc
EEEB [04] 1401 560
bset 2,PTB
EEED [04] 1701
561 bclr 3,PTB
EEEF [04] 7E03
562 mov x+,PTD ;Вывод числа на индикацию
EEF1 [04]
1801 563 bset 4,PTB
EEF3 [01] 9D 564
nop
EEF4 [01] 9D
565 nop ;Формирование стробирующего импульса
EEF5 [01]
9D 566 nop
EEF6 [01] 9D
567 nop
EEF7 [01] 9D
568 nop
EEF8 [04] 1901
569 bclr 4,PTB
EEFA [04] AD0C
570 bsr deleysret ;задержка 30mkc
EEFC [04] 3C83
571 inc adres ;Подготовка
к следующему циклу
EEFE [03]
BEA3 572 ldx BCDX ;----
EF00 [02] FE
573 ldx ,x ;--------
EF01 [05] 3B88CB
574 dbnz ci,stind ;Если все числа выведены то выходим из
подрограммы
575
EF04 [02] 88
576 pulx
EF05 [02] 8A
577 pulh
EF06 [02] 86
578 pula
EF07 [04] 81
579 rts
580
581 ;\\\\\\
Подпрограмма задержки на 30 мкС\\\\\\\\\\\
582
583
deleysret:
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 14
584
585
586
EF08 [02] 87
587 psha
EF09 [02] 8B
588 pshh
EF0A [02] 89
589 pshx
590
EF0B [02] A61E 591
lda #!30
592
loopdel:
EF0D [01] 4A
593 deca
EF0E [03] 26FD
594 bne loopdel
595
EF10 [02] 88
596 pulx
EF11 [02] 8A
597 pulh
EF12 [02] 86
598 pula
EF13 [04] 81
599 rts
600
601
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
602
603
;/////Таблица перекодировки для давлен ////////
604
605 TCP:
606
EF14 00
607 db !0
EF15 01 608
db !1
EF16 03
609 db !3
EF17 05
610 db !5
EF18 06
611 db !6
EF19 08
612 db !8
EF1A 0A
613 db !10
EF1B 0B
614 db !11
EF1C 0D
615 db !13
EF1D 0F
616 db !15
EF1E 10
617 db !16
EF1F 12
618 db !18
EF20 14
619 db !20
EF21 15
620 db !21
EF22 17
621 db !23
EF23 19
622 db !25
EF24 1A
623 db !26
EF25 1C
624 db !28
EF26 1E
625 db !30
EF27 1F
626 db !31
EF28 21
627 db !33
EF29 23
628 db !35
EF2A 24
629 db !36
EF2B 26
630 db !38
EF2C 28 631
db !40
EF2D 29
632 db !41
EF2E 2B
633 db !43
EF2F 2D
634 db !45
EF30 2E
635 db !46
EF31 30
636 db !48
EF32 32
637 db !50
EF33 33
638 db !51
EF34 35
639 db !53
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 15
EF35 37
640 db !55
EF36 38
641 db !56
EF37 3A
642 db !58
EF38 3C
643 db !60
EF39 3D
644 db !61
EF3A 3F
645 db !63
EF3B 41
646 db !65
EF3C 42
647 db !66
EF3D 44
648 db !68
EF3E 46
649 db !70
EF3F 47
650 db !71
EF40 49
651 db !73
EF41 4B 652
db !75
EF42 4C
653 db !76
EF43 4E
654 db !78
EF44 50
655 db !80
EF45 51
656 db !81
EF46 53
657 db !83
EF47 55
658 db !85
EF48 56
659 db !86
EF49 58
660 db !88
EF4A 5A
661 db !90
EF4B 5B
662 db !91
EF4C 5D
663 db !93
EF4D 5F
664 db !95
EF4E 60
665 db !96
EF4F 62 666
db !98
EF50 64
667 db !100
EF51 65
668 db !101
EF52 67
669 db !103
EF53 69
670 db !105
EF54 6A
671 db !106
EF55 6C
672 db !108
EF56 6E
673 db !110
EF57 6F
674 db !111
EF58 71
675 db !113
EF59 73
676 db !115
EF5A 74
677 db !116
EF5B 76
678 db !118
EF5C 78 679 db
!120
EF5D 79
680 db !121
EF5E 7B
681 db !123
EF5F 7D
682 db !125
EF60 7E
683 db !126
EF61 80
684 db !128
EF62 82
685 db !130
EF63 83
686 db !131
EF64 85
687 db !133
EF65 87
688 db !135
EF66 88
689 db !136
EF67 8A
690 db !138
EF68 8C
691 db !140
EF69 8D
692 db !141
EF6A 8F 693
db !143
EF6B 91
694 db !145
EF6C 92
695 db !146
EF6D 94
696 db !148
EF6E 96
697 db !150
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 16
EF6F 97
698 db !151
EF70 99
699 db !153
EF71 9B
700 db !155
EF72 9C
701 db !156
EF73 9E
702 db !158
EF74 A0
703 db !160
EF75 A1
704 db !161
EF76 A3 705 db
!163
EF77 A5
706 db !165
EF78 A6
707 db !166
EF79 A8
708 db !168
EF7A AA
709 db !170
EF7B AB
710 db !171
EF7D AF
712 db !175
EF7E B0
713 db !176
EF7F B2
714 db !178
EF80 B4
715 db !180
EF81 B5
716 db !181
EF82 B7
717 db !183
EF83 B9
718 db !185
EF84 BA 719
db !186
EF85 BC
720 db !188
EF86 BE
721 db !190
EF87 BF
722 db !191
EF88 C1
723 db !193
EF89 C3
724 db !195
EF8A C4
725 db !196
EF8B C6
726 db !198
EF8C C8
727 db !200
EF8D C9
728 db !201
EF8E CB
729 db !203
EF8F CD
730 db !205
EF90 CE
731 db !206
EF91 D0 732 db
!208
EF92 D2
733 db !210
EF93 D3
734 db !211
EF94 D5
735 db !213
EF95 D7
736 db !215
EF96 D8
737 db !216
EF97 DA
738 db !218
EF98 DC
739 db !220
EF99 DD
740 db !221
EF9A DF
741 db !223
EF9B E1
742 db !225
EF9C E2
743 db !226
EF9D E4
744 db !228
EF9E E6
745 db !230
EF9F E7 746
db !231
EFA0 E9
747 db !233
EFA1 EB
748 db !235
EFA2 EC
749 db !236
EFA3 EE
750 db !238
EFA4 F0
751 db !240
EFA5 F1
752 db !241
EFA6 F3
753 db !243
EFA7 F5
754 db !245
EFA8 F6
755 db !246
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 17
EFA9 F8
756 db !248
EFAA FA
757 db !250
EFAB FB 758 db
!251
EFAC FD
759 db !253
EFAD FF
760 db !255
761
762
763
;//////////////////////////////////////////////
764
765 ;//////////
Таблица перекодировки для индикации //
766
767 TCI:
EFAE 03
768 db $03 ;0
EFAF 13
769 db $13 ;1
EFB0 23
770 db $23 ;2
EFB1 33
771 db $33 ;3
EFB2 43
772 db $43 ;4
EFB3 53
773 db $53 ;5
EFB4 63
774 db $63 ;6
EFB5 73
775 db $73 ;7
EFB6 83
776 db $83 ;8
EFB7 93
777 db $93 ;9
EFB8 02
778 db $02 ;Пробел
EFB9 34
779 db $34 ;С
EFBA 5A
780 db $5a ;И
EFBB 0E
781 db $0e ;Д
EFBC 14
782 db $14 ;А
EFBD 8A
783 db $8a ;П
EFBE 9A
784 db $9a ;У
EFBF 7A
785 db $7a ;Л
EFC0 F4
786 db $f4 ;О
EFC1 CA
787 db $ca ;Ш
EFC2 0A
788 db $0a ;Б
EFC3 B4
789 db $b4 ;К
790
791
;///////////////////////////////////////////////////
///////////////////////////////////////
792
793
FFDE
794 org $ffde
FFDE EE31
795 dw ADC_INT ;Векторпрерывания
для АЦП
FFF2
796 org $fff2
FFF2 EE5B
797 dw timer_int;Векторпрерывания
для таймера
FFFE
798 org $fffe
FFFE EC00
799 dw start ;Вектор сброса
800
Symbol Table
ADC_INT EE31
ADICLK 003E
ADM1 EE48
ADM2 EE3F
ADM3 EE52
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 18
ADR 003D
ADRES 0083
ADSCR 003C
AMP1 0098
AMP2 0097
AMPMET ECD4
BCD1 0086
BCD10 0085
BCD100 0084
BCD100M EE94
BCD10M EEA2
BCD1M EEB4
BCDX 00A3
BCD_RET EE85
BITF 0089
BITF1 0091
CBM ED42
CI 0088
CMP1 0092
CMPAD 0096
CONFIG1 001F
CONFIG2 001E
CONST 008D
DAV 008E
DDRA 0004
DDRB 0005
DDRD 0007
DEL 0093
DELEYSRET EF08
DIA 00A1
DVBM ECE2
EXIT EE59
EXITB EEC0
EXITDAV EE1E
EXITTIME EE73
IND 0080
INDX 0087
IND_RET EEC1
KBIER 001B
KBSCR 001A
LOOP EC9D
LOOP1 ECA4
LOOP11 ED57
LOOP2 ECA0
LOOP20 ED53
LOOPAMP ECF8
LOOPDEL EF0D
LOP ECC7
M55 ECED
MAIN EC39
MB1 EEA5
MTIME ED73
OVSEC 0095
PDCR 000A
PEREM ED4D
PMEM1 00A4
POR 0094
PR1 009E
тонометр.asm
Assembled with CASM08Z 25.02.03 9:58:45 PAGE 19
PR2 00A0
PR2M EDAA
PROIM ED2F
PTA 0000
PTAPUE 000D
PTB 0001
PTD 0003
PUL 00A2
PULSE 0090
RAZNOM ED8E
RM ECEA
RORM EDFC
SBM EC3D
SEC 0099
SEC10 009A
SIS 009F
START EC00
STIND EECF
TCI EFAE
TCNTH 0021
TCNTL 0022
TCP EF14
TIME1 009B
TIME2 009C
TIME2M ED88
TIME3 009D
TIMER_INT EE5B
TMODH 0023
TMODL 0024
TSC 0020
UDAV 008C
UPRESS 008B
UPRESS1 008A
VOLTS_PRESSURE_R EE74
Y 008F
ZAP EE43
ZAP1 EE56