1   2   3   4   5   6   7
Ім'я файлу: Арх_комп_КСД12_Гайдук_КР.pdf
Розширення: pdf
Розмір: 997кб.
Дата: 13.02.2022
скачати
Пов'язані файли:
пояснительная_записка.doc
12. Расчет часового угла Функции, выполняющие основную часть астрономических расчетов, сосредоточены в файле
time.asm. Здесь содержатся функции для расчета юлианской даты, юлианских столетий, звездного времени по Гринвичу и местного звездного времени, часового угла, а также все вспомогательные функции. Примеры работы большинства функций не показаны, а показаны примеры работы лишь самых основных. Например, если звездное время рассчитано верно (исходя из примера, то и все задействованные при этом функции также работают корректно (транзитивно). Можно было бы детально остановиться на каждой функции, но, для краткости, этого делать не будем.
12.1 Преобразование времени из формата HH:MM:SS в формат HH,hh Выполняется перевод времени из формата 20:30:00 в 20,5 ч.
;*******************************************************************************
; Часы, минуты и секунды в часы и доли часа.
;*******************************************************************************
GetHHhh:
; Делитель 60. ldi mAL, 60 rcall IntToFloat ; 60 as float rcall AToBuf ; buf = 60.0
; Читаем часы из памяти, преобразуем, кладем в стек. lds temp, hours ; HH mov mAL, temp rcall IntToFloat ; HH to float
PushA ; A -> stack
; Читаем минуты из памяти, преобразуем, кладем в стек. lds temp, minut ; MM mov mAL, temp

47 rcall IntToFloat ; MM to float, A = MM.0 rcall BufToB ; B = 60.0 rcall DivF ; A = A/B = MM/60
PushA ; A -> stack
; Читаем секунды из памяти, преобразуем. lds temp, secnd ; SS mov mAL, temp rcall IntToFloat ; SS to float, A = SS.0 rcall BufToB rcall DivF ; A = A/B = SS/60 rcall BufToB rcall DivF ; A = A/B = SS/3600
; Суммируем все части.
PopB rcall AddF ; A <- SS+MM
PopB rcall AddF ; A <- SS+MM+HH
; Помещаем время в свою область памяти. sts time, pA sts time+1, mAH sts time+2, mAM sts time+3, mAL ret
12.2 Формирование даты по формату DD,dd Выполняется суммирование номера дня месяца и времени, выраженного в долях суток. Например, е число 12:00 будет выглядеть как 15,5.
;*******************************************************************************
; Сутки и доли суток.
;*******************************************************************************
GetDDdd: ldi mAL, 24 ; Делитель 24. rcall IntToFloat ; 24 as float rcall AToBuf ; buf = 24.0 rcall LoadTimeToB ; Читаем время в В. rcall MovBToA ; A <- time rcall BufToB rcall DivF ; A = time/24 rcall AToBuf
; Читаем день месяца из памяти, преобразуем. lds temp, day ; DD mov mAL, temp rcall IntToFloat ; DD to float rcall BufToB ; B <- time/24 rcall AddF ; A = DD + time/24
; Помещаем дату в свою область памяти. sts dddd, pA sts dddd+1, mAH sts dddd+2, mAM sts dddd+3, mAL

48 ret
12.3 Представление номера года в вещественном виде Год вводится без указания тысяч. Например, не 2015, а 15. Функция приводит год к его нормальному виду – 2015, и представляет в виде вещественного числа.
;*******************************************************************************
; Коррекция представления года 15 -> 2015.
;*******************************************************************************
CorrectYear: rcall ClrC ldi mAL, 127 rcall IntToFloat ; 127 as float rcall AToBuf ; buf = 127.0 ldi mAL, 15 rcall IntToFloat ; 15 as float rcall BufToB ; A = 15, B = 127 rcall MulF ; A = 15*127 = 1905 rcall AToBuf ldi mAL, 95 rcall IntToFloat ; 95 as float rcall BufToB rcall AddF ; A = 2000.0 rcall AToBuf lds temp, year mov mAL, temp rcall IntToFloat ; YY as float rcall BufToB rcall AddF ; A = YYYY.0
; Помещаем год в свою область памяти. sts year, pA sts year+1, mAH sts year+2, mAM sts year+3, mAL ret
12.4 Вычисление юлианской даты поместному времени Вычисляется юлианская дата поместному времени. Ввиду того, что в наше время юлианская дата имеет порядок около 2.500.000, с целью "захватить" больше разрядов дробной части, юлианская дата вычисляется со смещением – выходное значение на 2451544 меньше истинного (2451544 – юлианская дата на момент го января го года, что учитывается в дальнейших расчетах.
;*******************************************************************************
; Вычисление юлианской даты по календарной. Вычисляется со смещением.
; -2415020.0
; -36524
; JD' = JD - JD(2000) = JD - 2451544
;*******************************************************************************

49
GetJD:
; Определение вспомогательных величин n и m. rcall LoadYYYYToN ; YYYY -> n lds temp, month ; MM -> m mov mAL, temp rcall IntToFloat rcall LoadAToM lds temp, month cpi temp, 3 ; MM > 2? brpl GetJD1 ; Если больше 2, просто идем дальше. ldi mAL, 1 rcall IntToFloat rcall AToBuf rcall LoadNToA rcall BufToB rcall SubF ; n = YYYY - 1 rcall LoadAToN ldi mAL, 12 rcall IntToFloat rcall AToBuf rcall LoadMToA rcall BufToB rcall AddF ; m = MM + 12 rcall LoadAToM
GetJD1:
; Определение вспомогательных величин k и p. ldi mAL, 100 rcall IntToFloat rcall AToBuf rcall LoadNToA rcall BufToB rcall DivF ; A = n / 100 rcall IntOf ; A = [n/100] = k rcall AToBuf ; k -> buf ldi mAL, 4 rcall IntToFloat rcall MovAToB rcall BufToA rcall DivF ; A = k/4 rcall IntOf ; A = [k/4] rcall BufToB ; B = k rcall SubF ; A = [k/4] - k rcall AToBuf ldi mAL, 2 rcall IntToFloat rcall BufToB rcall AddF ; p = 2-k+[k/4] rcall LoadAToP ; p to memory
; Собственно расчет юлианской даты.
; [(365.25n)] rcall LoadNToA ldi pB, 0x43 ; 365.25 ldi mBH, 0xB6 ldi mBM, 0xA0

50 ldi mBL, 0x00 rcall MulF rcall IntOf ; [(365.25n)]
PushA rcall LoadMToA ldi pB, 0x3f ; 1 ldi mBH, 0x80 ldi mBM, 0x00 ldi mBL, 0x00 rcall AddF ldi pB, 0x41 ; 30.6001 ldi mBH, 0xf4 ldi mBM, 0xcd ldi mBL, 0x01 rcall MulF rcall IntOf ; [30.6001(m+1)]
PushA rcall LoadPToA
PushA ; P ldi pA, 0x49 ; 1720994.5 ldi mAH, 0xd2 ldi mAM, 0x15 ldi mAL, 0x14
PopB rcall AddF ; 1720994.5 + P
PopB rcall AddF ; 1720994.5+P+[30.6001(m+1)]
PopB rcall AddF ; 1720994.5+P+[30.6001(m+1)]+[(365.25n)] ldi pB, 0x4a ; 2415020.0 ldi mBH, 0x13 ldi mBM, 0x66 ldi mBL, 0xb0 rcall SubF ; 1720994.5+P+[30.6001(m+1)]+[(365.25n)]-2415020 ldi pB, 0x47 ; -36524 ldi mBH, 0x0e ldi mBM, 0xac ldi mBL, 0x00 rcall SubF rcall MovAToB lds pA, dddd ; DD,dd lds mAH, dddd+1 lds mAM, dddd+2 lds mAL, dddd+3 rcall AddF rcall LoadAToJD ret

51
12.5 Расчет поясного времени Если действует летнее время, то от местного времени отнимает 1 час.
;*******************************************************************************
; Возвращает поясное время.
;*******************************************************************************
GetStdTime: lds temp, sumtm cpi temp, 0x01 brne GetStdTime1 ; Летнее время не действует. ldi mAL, 1 rcall IntToFloat rcall AToBuf ldi mAL, 24 rcall IntToFloat rcall BufToB rcall swapAB rcall DivF ; 1/24 rcall AToBuf rcall LoadJDToA rcall BufToB rcall SubF ; Tp = Tl - 1 rcall LoadAToJD
GetStdTime1: ret
12.6 Расчет всемирного времени От поясного времени отнимает номер пояса.
;*******************************************************************************
; Поясное время во всемирное.
;*******************************************************************************
StdTimeToUT: lds mAL, timep rcall IntToFloat rcall AToBuf ldi mAL, 24 rcall IntToFloat rcall BufToB rcall swapAB rcall DivF ; Np/24 rcall AToBuf rcall LoadJDToA rcall BufToB rcall SubF ; UT = Tp - Np rcall LoadAToJD ret
12.7 Расчет юлианских столетий Выполняется расчет юлианских столетий на заданную дату и время. Учитывается то, что юлианская дата была расчитана со смещением.

52
;*******************************************************************************
; Расчет юлианских столетий со смещением -36524/36525.
;*******************************************************************************
JulianCent: rcall LoadJDToA ; JD' -> A ldi pB, 0x47 ; 36525 ldi mBH, 0x0e ldi mBM, 0xad ldi mBL, 0x00 rcall DivF ; T' = JD'/36525 rcall LoadAToT ret
12.8 Расчет звездного времени по Гринвичу на момент начала суток Для рассчетов используется формула 2.8, нос учетом смещения юлианских столетий. Результат в часах и долях часа.
;*******************************************************************************
; Звездное время по Гринвичу.
;*******************************************************************************
StarryTime0: ldi pB, 0x3d ; 0.051262 ldi mBH, 0x51 ldi mBM, 0xf8 ldi mBL, 0x1a rcall swapAB rcall AToBuf rcall swapAB rcall LoadTToA rcall MulF ; 0.051262*T'
PushA ldi pB, 0x3f ; sm = 36524/36525 ldi mBH, 0x7f ldi mBM, 0xfe ldi mBL, 0x35 rcall BufToA rcall MulF ; 0.051262*sm
PushA ldi pB, 0x37 ; 0.00002581 ldi mBH, 0xd8 ldi mBM, 0x82 ldi mBL, 0x8e rcall LoadTToA rcall MulF ; 0.00002581*T' rcall swapAB rcall LoadTToA rcall MulF ; 0.00002581*T'*T'
PushA ldi pB, 0x37 ; 0.00002581 ldi mBH, 0xd8 ldi mBM, 0x82 ldi mBL, 0x8e rcall LoadTToA rcall MulF ; 0.00002581*T' ldi pB, 0x3f ; sm = 36524/36525 ldi mBH, 0x7f ldi mBM, 0xfe

53 ldi mBL, 0x35 rcall MulF ; 0.00002581*T'*sm ldi pB, 0x40 ldi mBH, 0x00 ldi mBM, 0x00 ldi mBL, 0x00 rcall MulF ; 0.00002581*T'*sm*2
PushA ldi pB, 0x37 ; 0.00002581 ldi mBH, 0xd8 ldi mBM, 0x82 ldi mBL, 0x8e rcall swapAB ldi pB, 0x3f ; sm = 36524/36525 ldi mBH, 0x7f ldi mBM, 0xfe ldi mBL, 0x35 rcall MulF ldi pB, 0x3f ; sm = 36524/36525 ldi mBH, 0x7f ldi mBM, 0xfe ldi mBL, 0x35 rcall MulF ; 0.00002581*sm*sm
PushA ldi pA, 0x40 ; 6.64607 ldi mAH, 0xd4 ldi mAM, 0xac ldi mAL, 0x9b
PushA ldi pB, 0x45 ; 2400 ldi mBH, 0x16 ldi mBM, 0x00 ldi mBL, 0x00 rcall LoadTToA rcall MulF ; 2400*T'
PushA ldi pB, 0x45 ; 2400 ldi mBH, 0x16 ldi mBM, 0x00 ldi mBL, 0x00 rcall swapAB ldi pB, 0x3f ; sm = 36524/36525 ldi mBH, 0x7f ldi mBM, 0xfe ldi mBL, 0x35 rcall MulF ; 2400*sm
PushA
PopA ; Суммируем все слагаемые.
PopB rcall AddF
PopB rcall AddF
PopB rcall AddF
PopB rcall AddF
PopB rcall AddF

54
PopB rcall AddF
PopB rcall AddF rcall ToInt24 ; Приводим к интервалу 0-24. rcall AToStar0 ; Кладем на свое место в память. ret
12.9 Приведение времени к интервалу 24 ч. Приводит время к интервалу 24 ч. Например, 25 ч. = 1 ч.
;*******************************************************************************
; Приведение к интервалу 24 ч.
;*******************************************************************************
ToInt24: rcall AToBuf ldi mAL, 24 rcall IntToFloat rcall MovAToB rcall BufToA rcall DivF rcall IntOf rcall MovAToC ldi mAL, 24 rcall IntToFloat rcall MovCToB rcall MulF rcall MovAToB rcall BufToA rcall SubF ret
12.10 Получение поясного времени в формате HH,hh Возвращает поясное время как часы и доли часа.
;*******************************************************************************
; Поясное время (часы и доли часа.
;*******************************************************************************
StdTime: rcall LoadTimeToB rcall MovBToA lds temp, sumtm cpi temp, 0x01 brne EndStdTime rcall AToBuf ldi mAL, 1 rcall IntToFloat rcall MovAToB rcall BufToA rcall SubF

55 ldi temp, 0x00 eor temp, pA brpl EndStdTime rcall AToBuf ldi mAL, 24 rcall IntToFloat rcall BufToB rcall AddF
EndStdTime: rcall LoadAToTimeP ; Поясное время на свое место в памяти. ret
12.11 Представление долготы в формате DD,dd Представляет долготу как градусы и доли градусов.
;*******************************************************************************
; Долгота в градусах и долях градуса.
;*******************************************************************************
LongToDeg:
; Делитель 60. ldi mAL, 60 rcall IntToFloat ; 60 as float rcall AToBuf ; buf = 60.0
; Читаем градусы из памяти, преобразуем, кладем в стек. lds temp, l_deg ; deg mov mAL, temp rcall IntToFloat ; deg to float
PushA ; A -> stack
; Читаем минуты из памяти, преобразуем, кладем в стек. lds temp, l_min ; MM mov mAL, temp rcall IntToFloat ; MM to float, A = MM.0 rcall BufToB ; B = 60.0 rcall DivF ; A = A/B = MM/60
PushA ; A -> stack
; Читаем секунды из памяти, преобразуем. lds temp, l_sec ; SS mov mAL, temp rcall IntToFloat ; SS to float, A = SS.0 rcall BufToB rcall DivF ; A = A/B = SS/60 rcall BufToB rcall DivF ; A = A/B = SS/3600
; Суммируем все части.
PopB rcall AddF ; A <- SS+MM
PopB rcall AddF ; A <- SS+MM+deg rcall LoadAToLongitude ret

56
12.12 Преобразование угловой меры (градусы) в часовую Градусы конвертирует в часовую меру, исходя из того, что 360 градусов – это 24 часа.
;*******************************************************************************
; Градусы в часы и доли часа.
;*******************************************************************************
DegToHour: rcall AToBuf ldi mAL, 24 rcall IntToFloat rcall BufToB rcall MulF rcall AToBuf ldi mAL, 90 rcall IntToFloat rcall BufToB rcall swapAB rcall DivF rcall AToBuf ldi mAL, 4 rcall IntToFloat rcall BufToB rcall swapAB rcall DivF ret
12.13 Расчет местного звездного времени Выполняет расчет местного звездного времени по формуле 2.9.
;*******************************************************************************
; Звездное время.
;*******************************************************************************
StarTime: lds mAL, timep rcall IntToFloat rcall AToBuf rcall LoadTimePToA rcall BufToB rcall SubF ; UT0 ldi pb, 0x3f ; 1.002737908 ldi mbH, 0x80 ldi mbM, 0x59 ldi mbL, 0xb7 rcall MulF ; 1.002737908+UT0 rcall AToBuf rcall Star0ToA rcall BufToB rcall AddF ; 1.002737908+UT0+st0 rcall MovAToB rcall LoadLongToA rcall AddF ; 1.002737908+UT0+st0+L rcall LoadAToStarTime

57 ret Пример Рассчитаем местное звездное время на 20 января 2015 года 02:15:35 местного времени для места с географической долготой . Это второй часовой пояс. Летнее время не действует. Для начала, определим результат с помощью онлайн-сервиса для расчета звездного времени http://astro.prao.ru/utilities/utilstar.html
(рис. 12.1). Полученный ответ - 10:13:53.586. В часах и долях часа это будет 10,23167. В формате IEEE-
754 это число выглядит так 0x4123b4ec. А вот результат вычисления с помощью ОМК: 0x4123b243 рис. 12.2-3), что в переводе в десятичную форму выглядит как 10.231021 – ошибка лишь в четвертом знаке после запятой. Рис. 12.1 – Звездное время на заданную дату с указанием географических координат местности. Рис. 12. 2 – Остановка перед выходом из процедуры расчета звездного времени.

58 Рис. 12.3 – Содержимое регистра А.
12.14 Перевод временной меры в радианную Переводит часы и доли часа в радианы, исходя из того, что – это 24 ч.
;*******************************************************************************
; Часы в радианы.
;*******************************************************************************
HourToRad: ldi pb, 0x40 ; 2*pi ldi mbH, 0xc9 ldi mbM, 0x0f ldi mbL, 0xdb rcall MulF ldi pb, 0x41 ; 24 ldi mbH, 0xc0 ldi mbM, 0x00 ldi mbL, 0x00 rcall DivF ret
12.15 Представление широты в формате DD,dd Представляет широту как градусы и доли градуса.
;*******************************************************************************
; Широта в градусах и долях градуса.
;*******************************************************************************
LatitToDeg:
; Делитель 60. ldi mAL, 60 rcall IntToFloat ; 60 as float rcall AToBuf ; buf = 60.0
; Читаем градусы из памяти, преобразуем, кладем в стек. lds temp, s_deg ; deg mov mAL, temp rcall IntToFloat ; deg to float
PushA ; A -> stack
; Читаем минуты из памяти, преобразуем, кладем в стек. lds temp, s_min ; MM mov mAL, temp rcall IntToFloat ; MM to float, A = MM.0 rcall BufToB ; B = 60.0

59 rcall DivF ; A = A/B = MM/60
PushA ; A -> stack
; Читаем секунды из памяти, преобразуем. lds temp, s_sec ; SS mov mAL, temp rcall IntToFloat ; SS to float, A = SS.0 rcall BufToB rcall DivF ; A = A/B = SS/60 rcall BufToB rcall DivF ; A = A/B = SS/3600
; Суммируем все части.
PopB rcall AddF ; A <- SS+MM
PopB rcall AddF ; A <- SS+MM+deg rcall LoadAToLatit ret
12.16 Конвертация градусов в радианы Перевод градусов в радианы.
;*******************************************************************************
; Градусы в радианы.
;*******************************************************************************
DegToRad: ldi pb, 0x40 ; 2*pi ldi mbH, 0xc9 ldi mbM, 0x0f ldi mbL, 0xdb rcall MulF ldi pb, 0x42 ; 90 ldi mbH, 0xb4 ldi mbM, 0x00 ldi mbL, 0x00 rcall DivF ldi pb, 0x40 ; 4 ldi mbH, 0x80 ldi mbM, 0x00 ldi mbL, 0x00 rcall DivF ret
12.17 Представление склонения в формате DD,dd Код подпрограммы
;*******************************************************************************
; Склонение в градусах и долях градуса.

60
;*******************************************************************************
DeclinToDeg:
; Делитель 60. ldi mAL, 60 rcall IntToFloat ; 60 as float rcall AToBuf ; buf = 60.0
; Читаем градусы из памяти, преобразуем, кладем в стек. lds temp, decln ; deg mov mAL, temp rcall IntToFloat ; deg to float
PushA ; A -> stack
; Читаем минуты из памяти, преобразуем, кладем в стек. lds temp, decln+1 ; MM mov mAL, temp rcall IntToFloat ; MM to float, A = MM.0 rcall BufToB ; B = 60.0 rcall DivF ; A = A/B = MM/60
PushA ; A -> stack
; Читаем секунды из памяти, преобразуем. lds temp, decln+2 ; SS mov mAL, temp rcall IntToFloat ; SS to float, A = SS.0 rcall BufToB rcall DivF ; A = A/B = SS/60 rcall BufToB rcall DivF ; A = A/B = SS/3600
; Суммируем все части.
PopB rcall AddF ; A <- SS+MM
PopB rcall AddF ; A <- SS+MM+deg rcall LoadAToDecl ret
12.18 Представление прямого восхождения в формате HH,hh Прямое восхождение представляет как часы и доли часа.
;*******************************************************************************
; Прямое восхождение в часы и доли часа.
;*******************************************************************************
RisgSunToHour:
; Делитель 60. ldi mAL, 60 rcall IntToFloat ; 60 as float rcall AToBuf ; buf = 60.0
; Читаем градусы из памяти, преобразуем, кладем в стек. lds temp, rgsun ; hour mov mAL, temp rcall IntToFloat ; hh to float
PushA ; A -> stack
; Читаем минуты из памяти, преобразуем, кладем в стек. lds temp, rgsun+1 ; MM mov mAL, temp rcall IntToFloat ; MM to float, A = MM.0

61 rcall BufToB ; B = 60.0 rcall DivF ; A = A/B = MM/60
PushA ; A -> stack
; Читаем секунды из памяти, преобразуем. lds temp, rgsun+2 ; SS mov mAL, temp rcall IntToFloat ; SS to float, A = SS.0 rcall BufToB rcall DivF ; A = A/B = SS/60 rcall BufToB rcall DivF ; A = A/B = SS/3600
; Суммируем все части.
PopB rcall AddF ; A <- SS+MM
PopB rcall AddF ; A <- SS+MM+hh rcall LoadAToRisgSun ret

1   2   3   4   5   6   7

скачати

© Усі права захищені
написати до нас