Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЕОМ тема 1.doc
Скачиваний:
9
Добавлен:
25.02.2016
Размер:
416.26 Кб
Скачать

5 Приклади програмування

5.1. Приклад використання команди косвеного переходу

Нехай задано таблицю переходів на різні чистини програми, розміщена, починаючи з адреси 30h:

ORG 30h ;(Таблиця переходів

LJMP Reset1 ; 3 байта на команду)

LJMP LoadMem ;

LJMP GetMem ;

LJMP Go ;

LJMP ContAddr ;

LJMP Step ;

Параметр переходу (номер N=0-5) передається з порту Р1 і розміщується в розрядах 6-4. Тоді перехід по значенню параметра (наприклад, якщо N=0, то на Reset1; N=2, то на GetMem; N=5, то на Step) відбудеться в результаті виконання наступної програми:

MOV A, P1 ;зчитування параметра

ANL A,#01110000b ;обнуління розрядів 7, 3-0

SWAP A ;N – в розрядах 3-0

MOV B, #3 ;

MUL AB ;в А – значення N*3

MOV DPTR, #30h ;базова адреса таблиці переходів

JMP @A+DPTR ; перехід по параметру

5.2. Програмування послідовного порту

Обмін даними між двома контролерами виконується по чотирьом лініям (рис. 11). Виходи TxD, RxD – відповідно вихід і вхід дозволу передачі.

У висхідному стані на виходах RTS обох контролерів рівень логічної “1” (отримання заборонено). Отримання даних (обнуління RTS) дозволяється підпрограмою ReceA. Тут поле установки біта RI (закінчення прийому байта) передача знову забороняється й отриманий байт пересилається в акумулятор. Знак $ є спец символом адреси текучої команди.

RQTS EQU P1.1

; підпрограма отримання байта в ACC по RS232

ReceA: CLR RQTS ;Дозволити передачу

JNB RI, $ ;Чекати закінчення сеансу прийому

SETB RQTS ;Заборонити передачу

CLR RI ;Очистити прапорець закінчення

;сеансу прийому

MOV A, SBUF ;Переслати прийнятий байт в АСС

RET ;Повернення з підпрограми

В підпрограмі передачі байту TranA при отриманні дозволу байт байт записується в SBUF, потім виконується очікування закінчення передачі, і очищається біт ТІ.

CTS EQU P1.1

;підпрограма передачі байта з АСС по RS232

TranA: JB CTS, $ ;Чекати дозволу передачі

MOV SBUF, A ;Почати передачу

JMB TI, $ ;Чекати закінчення сеансу передачі

CLR TI ;Очистити прапорець сеансу передачі

RET ;Повернення з підпрограми

Нехай частота задаючого генератора складає fr=11.5 МГц. Необхідно отримати швидкість передачі по послідовному інтерфейсу, що дорівнює 9600 біт/с. УАПП працює в режимі 1, при якому формат посилки 10 біт, а швидкість передачі керується таймером Т/С1 у режимі 2. Із виразу (1) визначимо значення біта SMOD і величину, що завантажується в старший байт таймера ТН1, при якому швидкість роботи послідовного порта F має значення, найбільш близьке до 9600 біт/с. отримаємо, що при SMOD=1 і ТН1=250 частота обміну F=9982 біт/с. відносна похибка швидкості приблизно дорівнює 4%, що є прийнятним, так як максимально допустима похибка складає 5%.

Нехай контролер 1 отримує від контролера 2 байт лічильника, а потім байти даних, число яких передано в лічильнику. Якщо лічильник дорівнює нулю, програма закінчується. Контролер 1 модифікує отриманий байт шляхом операції АБО з байтом із зовнішньої пам'яті даних (ці байти послідовно розміщуються в комірках ВПД, починаючи з адреси 100h) і передає результат контролеру 2. Програма ініціалізації й обміну даними контролера 1 може мати вид:

MOV IE, #0 ;Заборона переривань

MOV TMOD, #00100000b ;Т/С1: режим 2

MOV TH1, #0FAh ;ТН1=250d для швидкості 9600 бод

MOV TL1, TH1 ;Ініціалізація TL1

MOV PCON, #10000000b ;SMOD=1 подвоєна швидкість

MOV SCON, #01010000b ;УАПП-режим 1, дозвіл

;отримуваня

SETB TR1 ;пуск Т/С1

ACALL ReceA ;Отримати байт лічильника

JZ PEnd ;Кінець, якщо лічильник =0

MOV R3, A ;

MOV DPTR, #100h ;

LdM: ACALL ReceA ;Отримати байт даних

MOV B, A ;Зберегти байт

MOVX A, @DPTR ;Зчитування байта з ВПД

INC DPTR ;

ORL A, B ;Модифікація байта

ACALL TranA ;Передача байта

DJNZ R3, LdM ;Цикл

Pend: NOP ;

END ;

5.3 Арифметичні операції з плаваючою комою

Розглядається реалізація операцій з плаваючою комою, в яких числа представлено в форматі, що прийното фірмою INTEL /6/. Число М з плаваючою комою представляється у вигляді

M=m*2Pm

де m – нормалізована мантиса, тобто мантиса представлена в діапазоні від 0.5 до 1; Pm – порядок.

При записі нормалізованого числа в ЕОМ опускається стакший розряд мантиси m[1], по визначено рівний 1. Такий запис розширяє поле порядка на один розряд. Машиний порядок числа Р представлений в зміщеній формі і записується в виді P+Pm+126. Максимальне значеня Р складає 254, мінімальне – 1. Значення Р, що дорівнюють 255 та 0 використовуються для представлення спеціальних чисел. Число нуль записується нульовим порядком і нульовою мантисою. Формат чисел наведено на рис.12, звідки видно, що сім старших розрядів порядку розміщені в старшому, 3-ому байті, а його молодший біт – в 2-ому байті.

30 31 23 22 0

+

-

порядок+126

P[7-1]

P[0]

мантиса

m[2-24]

3-й байт байти 2, 1, 0

Рис.-12. Формат представлення чисел з плаваючою комою

5.3.1. Програма множеня

Помноживши числа А та В, що представлені в форматі з плаваючою комою, отримаємо:

Y=A*B=(a*2Pa)*(b*2Pa)=(a*b)*2(Pa+pb)

Звідси видно, що мантиса результату дорівнює добутку мантис операндів, а порядок – сумі порядків операндів.

4

a2*b2

7

a2*b1

a1*b2

39

a2*b0

a0*b2

a1*b1

31

a0*b1

a1*b0

23

a0*b0

15 0

Рис.-13. Матриця частичних добутків при перемноженні мантис

Множення 3-х бітних мантис виконується за допомогою команди MUL, входячу в систему команд мікроконтроллера. Вказана команда виконує множення однобайтних чисел з отриманням двобайтового результату. Кінцевий результат отримується додаванням окремих добутків з врахуванням позицій кожного з них. Матрицю окремих добутків при перемножуванні мантис наведено на рис. 2.13, де ai, bi – байти множимого та множника, причому a2 та b2 старші, а a0 та b0 – молодші байти. Звідси видно, що

A*b=232*a2*b2+224*(a2*b1+a1*b2)+216*(a2*b0+a1*b1+a0*b2)+ 28*(a1*b0+a0*b1)+a0*b0

Як відомо /7/, ддля отримання n – розрядного результату операційний пристрій має містити (n+log2n) розрядів, що в даному випадку складає 30 розрядів. Тоді, як видно з рис.13, немає необхідності використоння молодших байтів частичних добутків a0*b1 i a1*b0, а також частичного добутку a0*b0, що дозволяє прискорити отримання результату. Результат множення мантис може вийти ненормалізованим. В цьому випадку необхідно нормалізувати мантису добутку з відповідною корекцією порядку.

Програма множення виконується наступним чином:

  1. Аналіз операндів на нуль та присвоєння результату нульового значення, якщо один з операндів дорівнює нулю.

  2. Обробка порядків і визначення знака результату.

  3. Множення мантис.

  4. Округлення мантиси; при необхідності виконується нормалізація з корекцією порядку.

В п. 4 виконується перевірка виходу результату за межі розрядної сітки – антипереповнення (добуток менше мінімального для даного формату числа) або переповнення (добуток більше максимального) і при необхідності встановлюються відповідні прапорці.

Обробка порядків і визначення виходу результату за межі розрядної сітки. Рядки операндів перетворюються зі зміщеної форми шляхом віднімання константи 126 і представляються в додатковому коді і в вигляді двобайтного числа, причому в старшому байті – розмножений знаковий розряд. Перетворені порядки двох операндів додаються. Операнд А розміщується в комірках 20h-30h, а операнд В – в комірках 24h-27h резидентної пам'яті даних, причому старші байти розміщуються в старших адресах (наприклад, порядок в байті 23h і т.д.). приклад програми (для операції Y=A*B) наведено нижче.

OpX0 EQU 20h ;молодший байт мантиси А

OpX1 EQU 21h ;середній байт мантиси А

OpX2 EQU 22h ;старший байт мантиси А

OpXp EQU 23h ;порядок А

OpY0 EQU 24h ;молодший байт мантиси В

OpY1 EQU 25h ;середній байт мантиси В

OpY2 EQU 26h ;старший байт мантиси В

OpYp EQU 27h ;порядок В та У

Sg EQU 2Ah ;прапорці

SgX EQU 2Bh ;знаковий байт порядка А та У

SgY EQU 2Ch ;знаковий байт порядка В

;обробка порядків

MOV SgX, #0 ;

MOV SgY, #0 ;

;

MOV A, OpYp ;

MOV C, OpY2.7 ;молодший розряд порядка

RLC A ;

CLR C ;

SUBB A, #126 ;

MOV OpYp, A ;збереження порядка В

JNB Cy, Xx1 ;формування знакового байта

MOV SgY, #0FFh ;порядка В

;формування порядка А

Xx1: MOV A, OpXp ;

MOV C, OpX2.7 ;молодший розряд порядка

RLC A ;

CLR C ;

SUBB A, #126 ;порядок А

JNB Cy, Xx2 ;формування знакового байта

MOV SgX,#0FFh ;порядок А

Xx2: ADD A, OpYp ;додавання порядків

MOV A, SgX ;збереження Рмл

ADDC A, SgY ;

MOV SgY, A ;збереження Рст

В результаті виконання цієї програми отримується двобайтний перетворений порядок результату Рпр (в додатковому коді). Він складається з старшого Рс та молодшого Рм байтів. Потім виконується перемножування мантис (див. нижче), округлення за необхідністю, корекція порядка. Після цього необхідність виконати аналіз порядка результату на переповнення та антипереповнення.

Алгоритм визначення виходу за межі розрядної сітки наведено на рис. 4. Спочатку визначається, чи було переповнення при складанні молодших байтів мантис операндів. Це має місто при Pc=254d=011111110b i визначає антипереповнення результату, а також при Рс=1 (переповнення). Якщо переноса з молодшого байта в старший при складанні не було, необхідно проаналізувати значення молодшого порядку результату. Максимальне значення зміщеного порядку дорівнює 254, що в перетвореному порядку становить 254-126=128=80h. Тому, якщо молодший байт додатнього порядку більше 80h, фіксується переповнення.

Мінімальне значення зміщеного порядку дорівнює 1, що в перетвореному порядку складає

0.00000001

-- 0.01111110

1.10000011

Тому, якщо молодший байт від'ємного порядку менш ніж 80h, фіксується антипереповнення.

Алгоритм рис.14 можна реалізувати, наприклад, за допомогою наступної програми, яка є продовженням наведеної вище (в А – старший байт порядку).

JNB P,Xx5 ;аналіз на парність ст. байта порядка

;був перенос в старший байт порядка

JNB SgY.7, Xx4 ;

Xx20: SETB Sg.4 ;установка прапорця антипереповненя

AJMP Xx9 ;перехід на кінець

Xx4: SETB Sg.5 ;уст. прапорця переповненя

;не було переносу в старший байт порядку

Xx5: MOV A, OpYp ;молодший байт порядку

CLR C ;

JNB SgY.7, Xx6 ;

SUBB A, #83h ;порядок від'ємний

JB Cy, Xx20 ;антипереповнення

AJMP Xx9 ;перехід на кінець

Xx6: SUBB A, #81h ;порядок додатній

JNB Cy, Xx4 ;переповнення

Xx9: NOP ;кінець обровки порядків

Програма множення 3-байтних мантис. Добуток накопичується в регістрах R5(старший), R4, R3 i R2. Вв програмі використовується підпрограма множення Mul3, котра призначена для множення і додавання часних добутків a2*b0, a0*b2, a1*b1.

;підпрограма множення

Mul3: MUL AB ;

ADD A, R2 ;

MOV R2, A ;

MOV A, B ;

ADDC A, R3 ;

MOV R3, A ;

CLR A ;

ADDC A, R4 ;

MOV R4, A ;

RET

;перемноження мантис

SETB OpY2.7 ;установка старших

SETB OpX2.7 ;розрядів мантис

MOV A, OpX1 ;формування

MOV B, OpY0 ;a1*b0

MUL AB ;

MOV R2,B ;

MOV A,OpX0 ;формування

MOV B, OpY1 ;a0*b1

MUL AB ;

MOV A, B ;формування старшого байта

ADD A,R2 ;у1=a0*b1+a1*b0

MOV R2, A ;

CLR A ;

ADDC A,#0 ;

MOV R3, A ;

MOV A, OpX2 ;

MOV B,OpY0 ;a2*b0

ACALL Mul3 ;у2=a2*b0+у1

MOV A, OpX1 ;формування

MOV B, OpY1 ;a1*b1

ACALL Mul3 ;у3=a1*b1+у2

MOV A, OpX0 ;формування

MOV B, OpY2 ;a0*b2

ACALL Mul3 ;у4=a0*b2+у3

MOV A, OpX1 ;формування

MOV B, OpY2 ;a1*b2

MUL AB ;

ADD A, R3 ;у5=у4+a1*b2 мол. байт

MOV R3, A ;

MOV A, B ;

ADDC A, R4 ;у5=у4+a1*b2 ст. байт

MOV R4.A ;

CLR A ;

ADDC A, #0 ;

MOV R5, A ;

MOV A, OpX2 ;формування

MOV B, OpY1 ;a2*b1

MUL AB ;

ADD A, R3 ;у6=у5+a2*b1 мл. байт

MOV R3, A ;

MOV A, B ;

ADDC A, R4 ;у6=у5+a2*b1 ст. байт

MOV R4, A ;

CLR A ;

ADDC A, R5 ;

MOV R5, A ;

MOV A,OpX2 ;a2*b2

MOV B, OpY2 ;

MUL AB ;

ADD A, R4 ;у7=у6+a2*b2 мол. байт

MOV R4, A ;

MOV A, B ;

ADDC A, R5 ;у7=у6+a2*b2 ст. байт

MOV R5, A ;

Програма множення чисел з плаваючою комою, частини якої були наведені вище, потребує 275 байт пам'яті програм. Час множення чисел складає 350-410 циклів роботи мікроконтролера, що, наприклад, при частоті кварцевого резонатора, рівному 12 мГц складає 0,35-0,41 мс.