РефератыКоммуникации и связьРаРазработка цифрового измерителя кровяного давления на микроконтроллере MC68HC908JL3

Разработка цифрового измерителя кровяного давления на микроконтроллере 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-и пункта был выбран датчик давления фирмы MOTOROLAMPX5050DP.


2.1 Выбор микроконтроллера


Выбор микроконтроллера осуществляется с учётом следующих параметров:


1. Линий ввода-вывода должно быть не менее 13, т.к. 11 линий необходимо для работы с индикатором, а две линии для работы с сигналами поступающими от датчика давления.


2. Микроконтроллер должен иметь встроенный АЦП, для работы с аналоговыми сигналами поступающими от датчика давления MPX5050DP на входы АЦП микроконтроллера.


Поэтому, принимая во внимание, эти два главных параметра, был выбран маловыводной микроконтроллер фирмы MOTOROLAMC68HC908JL3.


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. хорошо иллюстрируют основную идею измерения давления крови, которая сводится в получении и анализе данных, приходящих с датчика и активного фильтра.


Структурная схема устройства.












MCU



Индикатор



Датчик


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. Процедура ожидания окончания накачки манжеты





YN





YN






YN





NY





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, в которой находится кол-во пульсаций, инкрементируется. А далее идет процедура вычисления производной амплитуды.


Производная вычисляется по формуле:


,


где, AMP
1
и AMP
2
– амплитуды;



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 позволяет сначала определять систолическое давление, и только потом определять диастолическое давление, причём если систолическое давление определенно, то в последующем определяется только диастолическое давление.












1.INIT

















7.UpressConst



8.Индикация символов


Рис.4.2.1.2.
















Рис.4.2.1.2.(продолжение)







26.Acmp1






24.UpressA
















32.Вывод сообщения об ошибки


















Рис.4.2.1.2.(продолжение)
























53.Обнуление H:X













63.Сброс Pb






66.Уст Pb в 1







Рис.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.




































3.Сброс Ab1



5.Уст. СОСО1 в 1



9.Сброс Ab2



11.Уст.СОСО в 1



4.Уст. Ab2 в 1



6.ADRUpress



10.Уст. Ab1 в 1



12.ADRUpress1



RTI


Рис.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



2.Udav - CONST



3.Рез.Udav



4.UdavX



5.LDA TCP,X



6.ADav



RTS


Рис.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 проверяется, если ci0, то подпрограмма переходит к выполнению бл.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. БЭК. Жидкокристалические индикаторы фирмы DATAINTERNATIONAL. Москва. 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 ;Установка режима ввода


EC0F [04] 1801 78 bset 4,PTB ;Формирование


стробирующего импульса


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


378 exitdav:


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


EF7C AD 711 db !173


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

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Разработка цифрового измерителя кровяного давления на микроконтроллере MC68HC908JL3

Слов:9159
Символов:72039
Размер:140.70 Кб.