Ультразвукове вимір дальності на MSP430

Матеріали взяті з сайту www.gaw.ru

Резюме

У цьому прикладі застосування описаний ультразвукової далекомір на базі мікропотребляющего МК 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 створюють зміщення на неінвертуючий вхід ОП для коректної роботи з однополярним джерелом живлення. Посилений ультразвукової сигнал є двухполярной щодо постійного рівня в цiй точці. Висока добротність приймача 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; Завантажити перший множник 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