Ультразвуковое измерение дальности на MSP430
Резюме
В этом примере применения описан ультразвуковой дальномер на базе микропотребляющего МК MSP430F413. Прибор передаёт «пачку» волн ультразвуковой частоты по направлению объекта и принимает соответствующий отражённый сигнал. Встроенный в MSP430 аналоговый компаратор Comparator_A используется для определения момента принятия отражённого сигнала. Микроконтроллер с высокой точностью измеряет время прохождения ультразвуковой «пачкой» расстояния от излучателя до объекта и обратно. Принимая во внимание, что скорость звука при комнатной температуре равна 1100 футов/сек, MSP430 вычисляет расстояние между прибором и объектом и выводит значение на 2-цифровой ЖКИ со статическим управлением при помощи встроенного ЖК-драйвера. Расстояние отображается с точностью ?1 дюйм. Минимально измеряемое расстояние – 8 дюймов, оно ограничено физическими характеристиками излучателя. Максимальное измеряемое расстояние – 99 дюймов. Амплитуда отражённого сигнала зависит от материала объекта, его формы и размера. Звукопоглощающие предметы, такие, как ковры и отражающие объекты площадью менее 2-х квадратных футов плохо отражают сигнал, для таких предметов максимально измеряемое расстояние меньше. Если величина отражённого сигнала меньше порога срабатывания Comparator_A, прибор перейдёт в режим перегрузки. На экране будет показано сообщение об ошибке E.
1 Теория работы
Прибор основан на эффекте отражения звуковых волн. Эти волны можно представить как продольные колебания давления в среде их распространения. Предметы, размеры которых превышают длину падающей звуковой волны, отражают её; отражённая волна называется эхом. Если скорость звука в среде известна и можно измерить время распространения волны от источника до объекта и обратно, то расстояние между излучателем и предметом может быть точно вычислено. На этом принципе измерения и основан данный прибор. Средой распространения звуковых волн в данном случае является воздух, а звуковые волны излучаются ультразвуковом диапазоне, т.к. он не воспринимается человеческим ухом. Принимая скорость звука в воздухе равной 1100 футам в секунду при комнатной температуре и обозначив время распространения звуковой волны от излучателя до объекта и обратно через t (сек), расстояние d вычисляется по формуле d=1100 X 12 X t (дюймов). Так как звуковые волны преодолевают удвоенное расстояние между излучателем и предметом, реальное расстояние между источником и объектом будет равно d/2.
2 Описание схемы
В данном приборе использованы керамические ультразвуковые излучатели на частоту 40 кГц. MSP430 подаёт на излучатель пачку из 12 импульсов частотой 40 кГц прямоугольной формы стабилизированной при помощи кварцевого резонатора и принимает «эхо» с помощью УЗ-приёмника. Таймер Timer_A в MSP430 сконфигурирован для подсчёта 40-килогерцовых импульсов от кварца, таким образом, временное разрешение измерения составляет 25 мкс, что более чем достаточно для данных целей. Тактовая частота для измерений получена при помощи кварцевого генератора, что обеспечивает её высокую стабильность. Отражённый сигнал, принятый приёмником усиливается операционным усилителем, выход которого подключен к входу компаратора Comparator_A . Компаратор
Comparator_A определяет наличие сигнала на входе и формирует сигнал захвата для таймера Timer_A, результат счёта при этом «защёлкивается» в регистре захвата-сравнения CCR1. Время осуществления «защёлкивания» в точности соответствует времени прихода импульсов отражённого сигнала. Запомненный в регистре результат счёта соответствует времени, затраченному пачкой ультразвуковых импульсов на преодоление расстояния от прибора до объекта и обратно. Расстояние в дюймах вычисляется микроконтроллером MSP430 исходя из измеренного времени и выводится на 2-х цифровой ЖКИ со статическим управлением. Сразу после этого МК переходит в режим пониженного потребления LPM3 для снижения потребляемой мощности. Таймер Basic Timer1 запрограммирован на формирование прерываний каждые 205 мс. Прерывание от Basic Timer1 переводит MSP430 в активный режим, при этом повторяются цикл измерения и вывод на ЖК. На рис.1 показана принципиальная схема прибора. МК MSP430F413 (U1) является главным элементом схемы. По ссылке [1] находится data sheet на данный МК. LCD1 - 2-х цифровой низковольтный ЖКИ со статическим управлением, управляемый встроенным драйвером ЖКИ. R03 подключен к VSS, а R13 и R23 оставлены неподключенными, таким образом организовано статическое управление ЖК. Кварцевый резонатор на 40 кГц X1 специально выбран для использования в составе низкочастотного кварцевого генератора для обеспечения резонансной частоты используемых в приборе ультразвуковых излучателей. R12 является «подтягивающим» резистором для вывода Reset, а за рабочим уровнем напряжения следит встроенный супервизор. Конденсатор C9 обеспечивает фильтрацию питания и дожжен быть расположен как можно ближе к выводам питания. 14-выводный разъём J1 предназначен для подключения интерфейса JTAG к MSP430 для внутрисхемного программирования и отладки при помощи MSP430 flash emulation tool. Светодиод LED1 сигнализирует о циклах измерения. Вывод порта P1.5 сконфигурирован как выход частоты ACLK, требуемой для УЗ-излучателя.
Цепь выходного драйвера раскачки излучателя запитана непосредственно от 9-вольтовой батареи и обеспечивает на выходе размах сигнала 18 VPP . Это напряжение получается при помощи мостовой схемы на 4-х инверторах U4-CD4049. Data sheet на CD4049 по ссылке [6]. Один из инверторов вращает фазу сигнала на 180° для одного из плеч драйвера, на второе плечо поступает неинвертированный сигнал. При таком построении драйвера на выходе обеспечивается размах сигнала 18 VPP , необходимый для излучателя. По два инвертора соединены в параллель для удвоения выходного тока. Конденсаторы C6 и C7 обеспечивают развязку излучателя по постоянному току. Т.к. CD4049 запитан от 9В, а MSP430 от 3.6В, уровень логического сигнала не согласован. Биполярный транзистор Q1 служит преобразователем уровня.
Операционный усилитель U3 это 5-выводный ОУ с высокой скоростью нарастания выходного сигнала TLV2771 производства TI, документация на который расположена по ссылке [5]. Этот усилитель имеет широкую полосу сигнала и обеспечивает высокое усиление на частоте 40кГц. ОУ включен по инвертирующей схеме. КУ устанавливается резисторами R7 и R5 и равен 55, С5 служит для частотной коррекции. R3 и R4 создают смещение на неинвертирующем входе ОУ для корректной работы с однополярным источником питания. Усиленный ультразвуковой сигнал является двухполярным относительно постоянного уровня в данной точке. Высокая добротность приёмника RX1 обеспечивает требуемую избирательность и ослабление частот, кроме 40кГц. Выход ОУ подключен ко входу CA0 компаратора Comparator_A через вывод порта P1.6. Опорное напряжение компаратора Comparator_A выбрано от внутреннего источника 0.5VCC. Пока не принято ультразвуковое «эхо» уровень напряжения на входе CA0 несколько меньше, чем на опорном CA1. При приёме сигнала уровень на входе возрастает выше опорного, при этом переключается выход компаратора Comparator_A CAOUT. Резистором R3 осуществляется точная подстройка чувствительности и, соответственно, оптимального диапазона измерения.
MSP430 и усилитель сигнала УЗ-приёмника питаются от управляемого источника 3.6В, подключенного к 9-вольтовой батарейке. Источник выполнен на стабилизаторе с низким падением напряжения на регулирующем элементе марки TPS77001. Данная м/сх выпускается фирмой TI, информацию можно найти по ссылке [4]. Резисторы R1 и R2 устанавливают напряжение на выходе стабилизатора на уровне 3.6В. Конденсаторы C1 и C2 рекомендуются типовой схемой включения стабилизатора. Передатчик питается непосредственно от 9-вольтовой батареи. Выключатель S1 управляет питанием прибора.
На рис.2 приведена осциллограмма пачки из 12 импульсов частотой 40 кГц. Обратите внимание, что напряжение «от пика до пика» составляет 19.2В. Синусоидальный «звон» на вершинах прямоугольных импульсов вызван резонансом излучателя.
На рис.3 изображены осциллограммы для полного цикла измерения. Верхняя осциллограмма показывает пачку из 12 40-килогерцовых импульсов на выходе излучателя. На следующей осциллограмме показан усиленный выход приёмника (вывод 1 ОУ). Первая «пачка» - это сигнал, принятый непосредственно с передатчика и проигнорированный микроконтроллером. Следующая «пачка» - это отражённое эхо, этот сигнал используется в MSP430 для измерения. На последней осциллограмме показан измеренный микроконтроллером интервал времени. Он соответствует времени распространения ультразвукового сигнала от прибора до объекта и зависит от измеряемого расстояния.
3 Программа Ultrasonic.s43
3.1 Инициализация Init_Device
В этой подпрограмме инициализируется и конфигурируется периферия контроллера. Прежде всего запрещается сторожевой Watchdog Timer. Для стабилизации низкочастотного кварцевого генератора вводится программная задержка. Умножитель частоты FLL+ имеет значение 64, что даёт частоту MCLK 2.56 МГц. Вывод P1.0 сконфигурирован как выход для управления светодиодом. Неиспользуемые выводы сконфигурированы как выходы, а вывод P1.5 настроен на вывод 40-килогерцовой буферизованной частоты ACLK. Базовый таймер Basic Timer1 включен и сконфигурирован таким образом, чтобы формировать частоту 150 Гц для ЖКИ и вызывать прерывания ЦПУ каждые 205 мс для проведения цикла измерений. Компаратор Comparator_A использует внутренне опорное напряжение 0.5VCC , а биты CAPD установлены в «1», что отключает буфера на входах компаратора. Модуль ЖК контроллера включен и сконфигурирован в режиме статического управления для подключения 2-цифрового ЖКИ прибора. Дисплейная память очищена, т.е. по умолчанию ЖК показывает значение 00. Затем разрешаются прерывания от базового таймера Basic Timer1 и включается общее разрешение прерываний Global Interrupt Enable (GIE), что приводит к периодическим прерываниям ЦПУ.
3.2 Основной цикл Mainloop
В основном цикле на ЖК выводится новое значение, которое хранится в буфере DIGITS, после чего MSP430 переходит в режим пониженного потребления LPM3. MSP430 остаётся в этом режиме до тех пор, пока не возникнет прерывание от базового таймера Basic Timer1, после чего процессор перейдёт к выполнению обработчика прерываний базового таймера BT_ISR. При этом начинается цикл измерения. Таймер Timer_A работает в 16-битном режиме и тактируется частотой ACLK. Регистр CCR1 находится в режиме сравнения с числом 12, таким образом, на выходе P1.5 получаем «пачку» из 12 импульсов частотой 40 кГц. Далее формируется задержка из 36 тактов частоты ACLK для прекращения колебаний на выходе излучателя. Это осуществляется переводом регистра CCR1 в режим сравнения с числом 36. Во время этой паузы, процессор MSP430 пребывает в режиме низкого потребления LPM0.
Теперь прибор готов к приёму отражённого сигнала УЗ-приёмником. Компаратор Comparator_A сконфигурирован на ожидание сигнала эха, после получения которого формируется прерывание для «захвата» значения таймера Timer_A в регистре захвата-сравнения CCR1. Это значение соответствует измеренному времени, в течение которого ультразвуковые волны преодолевали расстояние от излучателя до объекта и обратно. К полученному значению прибавляется 48 для компенсации времени формирования 12 импульсов «пачки» и 36 тактов ожидания установления передатчика. Скорректированное значение в регистре CCR1 представляет собой точный временной интервал между началом «пачки» и временем принятия эха. Далее вызывается подпрограмма математической обработки, вычисляющая значение расстояния в дюймах и возвращающая соответствующий результат. В случае перегрузки (объект вне зоны действия) эхо не будет получено и компаратор Comparator_A не сформирует сигнал прерывания. MSP430 останется в режиме пониженного энергопотребления LPM0 до следующего прерывания базового таймера. В этом случае проверяется бит CAIFG в регистре CCTL1 для установления того факта, что эхо не было получено. Чтобы отобразить данное состояние, в буфер DIGITS записывается значение 0xBE , что приведёт к индикации буквы E на экране ЖКИ. Далее программа возвращается к началу основного цикла Mainloop, обновляет индикацию на ЖКИ и переходит в режим пониженного потребления LPM3. Следующее прерывание базового таймера Basic Timer1 возвратит MSP430 в активный режим и выполнение программы продолжится.
3.3 Математические вычисления Math_calc
Подпрограмма Math_calc отвечает за выполнение математических вычислений, необходимых в приборе. Скорректированное 16-битное значение в регистре CCR1 сохраняется в переменной Result. Это значение представляет из себя время, в течение которого ультразвуковые волны преодолевали расстояние от излучателя до объекта и обратно. Так как таймер Timer_A считает время 25-микросекундными интервалами, то реальное время вычисляется как Result X 25 мкс. Принимая во внимание, что скорость звука при комнатной температуре составляет 1100 футов/сек, значение Result, полученное из таймера Timer_A соответствует 6-ти отсчётам на один дюйм расстояния. Таким образом, разделив значение Result на 6, получим ожидаемое значение расстояния в дюймах. Для обеспечения требуемой точности при использовании целочисленных вычислений в MSP430, 16-битное значение Result сначала умножается на 100, потом делится на 6. Умножение 16X16-бит осуществляется подпрограммой Mul100. 32-битный результат умножения сохраняется в переменных htX100_msw и htX100_lsw. После этого 32-битный результат делится на 6 и полученное значение записывается в ячейку DIGITS. В этой переменной значение хранится в шестнадцатеричном виде. Подпрограмма hex2bcd конвертирует его в двоично-десятичный формат (BCD), при этом две последние цифры двоично-десятичного числа отбрасываются чтобы скомпенсировать предыдущее умножение на 100. Полученное двухразрядное число записывается обратно в ячейку DIGITS.
3.4 Обработчик прерывания базового таймера BT_ISR
Подпрограмма обработки прерываний базового таймера Basic Timer1 BT_ISR изменяет биты статусного регистра SR, находящегося в стеке таким образом, чтобы обеспечить функционирование MSP430 в активном режиме после возврата из подпрограммы обработки прерываний. Это требуется для того, чтобы MSP430 продолжил выполнение программы, следующей за инструкцией LPM3 в основном цикле Mainloop.
3.5 Индикация Display
Эта подпрограмма обновляет информацию на двухцифровом статическом ЖКИ используя информацию, содержащуюся в переменной DIGITS. Данные для линий сегментов статического ЖКИ хранятся в таблице LCD_Tab. Загрузка в память ЖК требуемых данных для сегментов осуществляется выборкой из таблицы LCD_Tab значения, соответствующего числу, хранящемуся в переменной DIGITS.
3.6 Задержка Delay
Эта подпрограмма обеспечивает программную задержку с требуемым 16-битным значением. Значения в регистрах не изменяются, т.к. для счёта используется переменная, расположенная вверху стека (TOS). После окончания задержки указатель стека (SP) инкрементируется, таким образом, перед возвратом из подпрограммы ему возвращается первоначальное значение.
4 Заключение
Такие периферийные устройства, как аналоговый компаратор Comparator_A, 16-битный таймер Timer_A с аппаратными регистрами захвата-сравнения, базовый таймер Basic Timer1 и драйвер ЖКИ значительно упрощают разработку ультразвукового дальномера и обеспечивают однокристальное решение. Средний потребляемый ток прибора 1.3 мА при измерении расстояния в 15 дюймов. Сюда входит собственное потребление LDO-стабилизатора U2, операционного усилителя U3, и КМОП-инвертера U4. Только ОУ потребляет 1 мА, таким образом, вся оставшаяся схема потребляет 300мкА. Ток светодиода во включенном состоянии - 5 мА. MSP430 потребляет в среднем 2.1 мкА с учётом постоянно включенного ЖКИ. Это стало возможным благодаря использованию преимуществ функций ультранизкого энергопотребления MSP430. Основное время MSP430 находится в режиме пониженного потребления LPM3, ресурсы ЦПУ использованы всего на 5.6%.
Т.к. скорость звука зависит от температуры, измерение расстояния будет иметь большую погрешность при температурах, отличающихся от комнатной. Для повышения точности измерения во всём диапазоне температур прибор может быть дополнен простым измерителем температуры на термисторе и соответствующей коррекцией показаний. Измеренное расстояние и температура также, по желанию, могут быть сохранены во встроенной флеш-памяти. Добавление дополнительного каскада усиления сигнала приёмника и использование мультиплексированного ЖКИ с любым желаемым количеством цифр позволит увеличить диапазон измерения.
;**********************************************************************************************
; Демо – программа ультразвукового дальномера на базе MSP430F413
;
;**********************************************************************************************
#include ”msp430x41x.h” ;Стандартные определения
;Назначение регистров
;**********************************************************************************************
#define DIGITS R11
#define Result R10
#define IRBT R9
#define IROP1 R4
#define IROP2L R5
#define IROP2M R6
#define IRACL R7
#define IRACM R8
;**********************************************************************************************
;Определение переменных
;**********************************************************************************************
RSEG UDATA0
htX100_msw: DS 2 ; слово по адресам ОЗУ RAM 200h & 201h
htX100_lsw: DS 2 ; 202h & 203h
;**********************************************************************************************
RSEG CSTACK ; Начало сегмента стека
DS 0
RSEG CODE ; Начало программного сегмента
RESET mov.w #SFE(CSTACK),SP ; Указатель стека
call #Init_Device ; Инициализация устройства
mov.w #0,DIGITS ; Очистка буфера DIGITS
Mainloop
bic.b #CAON,&CACTL1 ; Отключить компаратор Comparator_A
call #Display ; Вывести данные на ЖКИ
bis.w #LPM3,SR ; Перейти в режим пониженного потребления LPM3
;*************** Отправить пачку импульсов и начать измерения *********************************
clr.w &CCTL1 ; Запретить CCTL1
clr.w &TACTL ; Запретить таймер timer_A
bis.b #BIT0,&P1OUT ; Включить светодиод
SetupTimerA
mov.w #TASSEL0+TACLR+MC1,&TACTL ; TACLK = ACLK, 16 бит режим up mode
bis.b #BIT5,&P1SEL ; вывод ACLK на P1.5
mov.w #12,&CCR1 ; 12 импульсов частотой 40KHz
mov.w #CCIE,&CCTL1 ; Прерывания в режиме сравнения
bis.w #LPM0,SR ; Ждём прерывания от CCR1
bic.b #BIT5,&P1SEL ; Отключить ACLK на порту P1.5
TimerCLR bis.w #TACLR,&TACTL
mov.w #36,&CCR1 ; Пауза для установления передатчика
mov.w #CCIE,&CCTL1 ; Прерывания в режиме сравнения
bis.w #LPM0,SR ; Ждём прерывания от CCR1
bis.b #CAON,&CACTL1 ; Включить компаратор Comparator_A
bic.b #CAIFG,&CACTL1 ; Очистить флаг прерывания от Comparator_A
mov.w #CM0+CCIS0+SCS+CAP+CCIE,&CCTL1 ; Прерывание по фронту от компаратора
push &TAR ; TOS = TAR в начале измерения
bis.w #LPM0,SR ; Ждём прерывания от CCR1 (Эхо)
clr.w &CCTL1 ; Запрещаем CCTL1
bic.b #BIT0,&P1OUT ; Выключаем светодиод
bit.b #CAIFG,&CACTL1 ; Проверяем, принято ли эхо
jz Next ; если нет - перегрузка
mov.w &CCR1,Result ; Result = TAR (CCR1)
sub.w @SP+,Result ; Result = время
add.w #48,Result ; Компенсируем время на излучение пачки импульсов и
; задержку 36 циклов на установление передатчика
;****************** Завершение измерения *****************************************************
call #Math_calc ; Вызов подпрограммы математических вычислений
swpb DIGITS ; Сдвиг на две цифры для эмуляции деления на 100
jmp Mainloop ; Следующий цикл измерения
Next mov.w #0beh,DIGITS ; Вывести на ЖКИ «Е» если не принято эхо
jmp Mainloop
;**********************************************************************************************
Init_Device ; Инициализация MSP430x41x
;**********************************************************************************************
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Остановить сторожевой таймер WDT
bis.b #030h,&FLL_CTL0 ; Включить встроенные конденсаторы генератора
call #Delay ; Задержка для стабилизации генератора
mov.b #03fh,&SCFQCTL ; MCLK = 40КГцX64 = 2.56МГц
call #Delay ; задержка для стабилизации умножителя частоты FLL
SetupP1 mov.b #000h,&P1OUT ; Очистить выходную защёлку порта P1
bis.b #0bfh,&P1DIR ; Неиспользуемые выводы назначить выходами
bis.b #040h,&P1SEL ; Вывод будет использован для компаратора Comp_A
SetupP2 mov.b #000h,&P2OUT ; Очистить выходную защёлку порта P2
bis.b #0ffh,&P2DIR ; Неиспользуемые выводы назначить выходами
SetupP6 mov.b #000h,&P6OUT ; Очистить выходную защёлку порта P2
bis.b #0ffh,&P6DIR ; Неиспользуемые выводы назначить выходами
SetupBT mov.b #BTFRFQ0+BTFRFQ1+BTIP2+BTDIV,&BTCTL ; Разрешить базовый таймер BT
; с частотой обновления ЖК 150 Гц
; и прерываниями каждые 250 мс
SetupCA mov.b #CAPD6,&CAPD ; Запретить буфер в компараторе
mov.b #P2CA0,&CACTL2 ; P1.6 – вход компаратора
mov.b #CARSEL+CAREF1+CAON,&CACTL1 ; Включить компаратор, внутр. опора 1/2Vcc
SetupLCD bis.b #LCDON+LCDSON+LCDSG0_7,LCDCTL ;Вкл. модуль ЖК в статическом режиме
ClearLCD mov #15,R15 ; Очистка 15 знакомест ЖКИ
mov.b #LCDMEM,R14
Clear1 mov.b #0,0(R14) ; Запись нулей в дисплейную память
inc.b R14
dec R15 ; Все сегменты очищены?
jnz Clear1 ; Если нет – чистим дальше
bis.b #BTIE,&IE2 ; Разрешить прерывания от базового таймера Basic Timer
eint ; Общее разрешение прерываний
ret
;**********************************************************************************************
BT_ISR ; Обработчик прерываний базового таймера Basic Timer
; после RETI ЦПУ остаётся в активном режиме
;**********************************************************************************************
bic #LPM3,0(SP) ; Очистить биты LPM3 в стекеTOS
reti ; при возврате из прерывания
;**********************************************************************************************
TAX_ISR ; Общий обработчик прерывания для регистров захвата-
;сравнения CCR1–4 и переполнения таймера
;**********************************************************************************************
add.w &TAIV,PC ; Добавить смещение, соответствующее источнику
; прерывания к программному счётчику PC
reti ; CCR0 – не обрабатывается
jmp CCR1_ISR ; по CCR1 вызывается обработка
reti ; CCR2 – не обрабатывается
reti ; CCR3 – не обрабатывается
reti ; CCR4 – не обрабатывается
TA_over reti ; переполнение таймера Timer_A
CCR1_ISR bic.w #CCIFG,&CCTL1
bic.w #LPM0,0(SP) ; По reti выход из режима пониженного потребления LPM0
reti ;
;************************************************************************
Display ; Подпрограмма индикации значений DIGIT1 & DIGIT2
;ЦПУ использует регистры R15, R14, R13 и R12, они не сохраняются
;************************************************************************
mov.w #LCDM1,R15 ; В R15 указатель на первую позицию ЖКИ
mov.b DIGITS,R14 ; Значение копируется в R14
OutLCD mov.b R14,R13 ; R14 копируется в R13
rra.b R13 ; Сдвиг вправо
rra.b R13 ; 4 раза
rra.b R13 ; для обмена
rra.b R13 ; тетрад местами
and.b #0Fh,R14 ; младшая тетрада -> R14
and.b #0Fh,R13 ; старшая тетрада -> R13
mov.b LCD_Tab(R14),R12 ; Вывод младшей тетрады в 1-ю цифру ЖКИ
mov.b R12,0(R15) ; Вывод сегментов a & b младшей тетрады в ЖКИ
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Вывод сегментов с & d младшей тетрады в ЖКИ
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Вывод сегментов e & f младшей тетрады в ЖКИ
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Вывод сегментов g & h младшей тетрады в ЖКИ
rra.w R12
inc.b R15
mov.b LCD_Tab(R13),R12 ; Вывод старшей тетрады во 2-ю цифру ЖКИ
mov.b R12,0(R15) ; Вывод сегментов a & b старшей тетрады в ЖКИ
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Вывод сегментов с & d старшей тетрады в ЖКИ
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Вывод сегментов e & f старшей тетрады в ЖКИ
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Вывод сегментов g & h старшей тетрады в ЖКИ
rra.w R12
ret
;***********************************************************************
; Определение ЖКИ
;***********************************************************************
;Определение сегментов
a equ 001h
b equ 010h
c equ 002h
d equ 020h
e equ 004h
f equ 040h
g equ 008h
h equ 080h
Blank equ 000h
LCD_Tab db a+b+c+d+e+f ; Отображает ”0”
db b+c ; Отображает ”1”
db a+b+d+e+g ; Отображает ”2”
db a+b+c+d+g ; Отображает ”3”
db b+c+f+g ; Отображает ”4”
db a+c+d+f+g ; Отображает ”5”
db a+c+d+e+f+g ; Отображает ”6”
db a+b+c ; Отображает ”7”
db a+b+c+d+e+f+g ; Отображает ”8”
db a+b+c+d+f+g ; Отображает ”9”
db a+b+c+e+f+g ; Отображает ”A”
db Blank ; Пустой экран
db a+d+e+f ; Отображает ”C”
db b+c+d+e+g ; Отображает ”D”
db a+d+e+f+g ; Отображает ”E”
db a+e+f+g ; Отображает ”F”
;***************************************************************************
Delay; Программная задержка
;***************************************************************************
push #0FFFFh ; Задержка -> TOS
DL1 dec.w 0(SP) ; Декремент TOS
jnz DL1 ; Задержка выполнена ?
incd SP ; Очистка TOS
ret ; Возврат из подпрограммы
;***************************************************************************
Math_calc; Подпрограмма математических вычислений
;***************************************************************************
mov.w #0h, DIGITS ; Очистить DIGIT
cmp.w #0h, Result ; Проверка результат счёта Result на 0
jeq calc_over ; Если 0 – на выход
call #Mul100 ; Result умножается на 100
call #Divide ; Потом делится на #06d
call #Hex2bcd ; Преобразование 16-битного двоичного числа
; в двоично-десятичное (BCD) Result xx.xx
calc_over ret ; Возврат из подпрограммы
;******************************************************************************
Mul100 ; Подпрограмма умножения на 100
;входные данные Result 16 бит и константа 64h (100d) 16 бит
;на выходе 32 бит переменные htX100_msw & htX100_lsw
;******************************************************************************
mov.w #100,IROP1 ; Загрузить 1-ый множитель 100 в IROP1
mpyu clr.w htX100_lsw ; Очистить буфер для младшей части слова
clr.w htX100_msw ; И для старшей
macu clr.w IROP2M ; Очистить 2-й множитель
L$002 bit.w #1,IROP1 ; Проверка младшего бита
jz L$01 ; Если 0, не делать ничего
add.w Result,htX100_lsw ; Если 1, добавить Result к произведению
addc.w IROP2M,htX100_msw ;
L$01 rla.w Result ; Произведение X 2
rlc.w IROP2M ;
rrc.w IROP1 ; Проверка следующего бита
jnz L$002 ; Если в carry “1”, то завершаем
ret
;******************************************************************************
Divide ;Подпрограмма деления 32-битного числа на 16-битное
;входные данные 32-бит htX100_msw & htX100_lsw и 16-битная константа #06,
; на выходе 16-битная переменная DIGIT
;******************************************************************************
clr.w DIGITS ; Очистка буфера для нового результата
mov.w #17,IRBT ; Организация цикла
div1 cmp.w #06,htX100_msw ; Сравнить делитель со старшим словом делимого
jlo div2 ; Если меньше – переход на div2
sub.w #06,htX100_msw ; Вычесть 6 из старшего слова
div2 rlc.w DIGITS ; Сдвинуть результат влево через бит переноса
jc div4 ; Если в carry “1”, то завершаем
dec.w IRBT ; Декремент счётчика цикла
jz div3 ; Если счётчик = 0 : завершение
rla.w htX100_lsw ; Делимое X 2
rlc.w htX100_msw ;
jnc div1 ; Если в carry «0» переход к div1
sub.w #06,htX100_msw ; Вычесть 6 из старшего слова
setc ; Установить carry в «1»
jmp div2 ; Повтор
div3 clrc ; Очистить carry
div4 ret ; Возврат из подпрограммы
;*****************************************************************************
Hex2bcd ;Подпрограмма перевода 16-битного шестнадцатеричного значения
; в двоично-десятичное (BCD) входные данные 16-бит шестнадцатеричные в DIGITS,
; выходные там же в BCD
;*****************************************************************************
mov #16,r9 ; в R9 число бит
clr r8 ; Обнулить R8
clr r7 ; Обнулить R7
L$1 rla DIGITS ; Арифметический сдвиг DIGITS влево
dadd r7,r7 ; Десятичное сложение
dadd r8,r8 ; source + carry -> destination
dec r9 ; Декремент счётчика бит
jnz L$1 ; Все 16 бит обработаны ?
mov r7,DIGITS ; Результат -> DIGITS
ret ; Возврат из подпрограммы
;******************************************************************************
COMMON INTVEC ; Вектора прерываний MSP430x41x
;******************************************************************************
ORG BASICTIMER_VECTOR
BT_VEC DW BT_ISR ; Вектор базового таймера Basic Timer
ORG TIMERA1_VECTOR ; Вектор таймера Timer_A
TIMA_VEC DW TAX_ISR ;
ORG RESET_VECTOR
RESET_VEC DW RESET ; POR, внешний Reset, сторожевой таймер Watchdog
;******************************************************************************
END
|