Приём сообщений GPS |
Главная / ЭКВМ / Программы / Примеры |
|
Приём данных проводится при помощи последовательного интерфейса Стык С2 (RS-232C), линии которого выведены на разъём ВУ. Параметры обмена: 4800 бит/с, без контроля чётности. Для определения положения и времени достаточно принять сообщение GGA (Global Positioning System Fixed Data) протокола NMEA. Таким образом на базе различных моделей ЭКВМ можно выполнить простейший переносной или стационарный GPS-навигатор. Приведённая программа принимает данные от модуля и считывает время и координаты в регистры, преобразуя их из строкового в числовой формат. Приём и расшифровка сообщения GGA (dgps.mkp, 263 байта; КС 30416/108)
Текст программы dgps.mkl для кросс-компилятора
.CHARSET 1251
; Приём сигналов от модуля GPS по протоколу NMEA
; Cкорость 4800, 8 бит, без контроля чётности
; Разбор пакета GGA - Global Positiong System Fixed Data
TIME .EQU 21
LAT .EQU 22
LATNS .EQU 23
LONG .EQU 24
LONGEW .EQU 25
PFI .EQU 26
SU .EQU 27
CX
PP M 9072 ; Установить режим 8 бит
7 PP M 9071 ; Установить скорость 4800
8 PP M 9073 ; Задержка между байтами в ответе 8*1,25=10 мс.
1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ
9087 M9 ; константа R9087
A0:
0 PP M 9085 ; буфер приёма, смещение 0
1 PP M 9076 ; Начать приём данных
A1: PP RM 9076 ; Проверить окончание приёма, считав содержимое регистра приёма
F X=0 A1 ; пока оно не равно 0 - продолжать считывание
; Приём окончен, количество принятых байт в R9075,
; пакет для обработки в буфере приёма (R9086-R9089)
PP RM 9075 ; Проверка количества принятых байт
F X!=0 A0 ; Повтор при нулевом значении
CX
PP M 9085 ; Индексный регистр буфера приёма, запись 0 - выбрать первый байт
K RM 9 ; Считать первый байт (R9087)
36 - ; Вычесть код символа '$'
F X=0 A0 ; Если не '$' - продолжить ожидание
P GSB GPGGA ; Найти в буфере строку "GPGGA,"
F X!=0 A0 ; Если строка не найдена - продолжить ожидание
P GSB LCHIS ; Считать числовое поле
P M TIME ; UTC Time
P GSB LCHIS ; Считать числовое поле
100 /
K M->D
K D->MS
P M LAT ; Latitude - широта в градусах, минутах и секундах
P GSB LSIM ; Считать символьное поле
P M LATNS ; N/S Indicator
78 - ; 'N'
F X!=0 A2
P RM LAT
+/- ; южная широта - минус
P M LAT
A2: P GSB LCHIS ; Считать числовое поле
100 /
K M->D
K D->MS
P M LONG ; Longitude - долгота в градусах, минутах и секундах
P GSB LSIM ; Считать символьное поле
P M LONGEW ; E/W Indicator
69 - ; 'E'
F X!=0 A3
P RM LONG
+/- ; западная долгота - минус
P M LONG
A3: P GSB LCHIS ; Считать числовое поле
P M PFI ; Position Fox Indicator: 0-не определена, 1 - GPS SPS, 2 - DGPS SPS, 3 - GPS PPS
P GSB LCHIS ; Считать числовое поле
P M SU ; Satellites Used - число использованных спутников
PP RM TIME
PP RM LONG
PP RM LAT
K SCR
P GOTO A0
GPGGA: ; Поиск строки "GPGGA,"
PP RM 9085 ; индекс буфера приёма
250 -
P X!=0 EGPGGA ; Выход RX=0
K RM 9 ; считать очередной байт из пакета
71 - ; 'G'
P X=0 GPGGA
K RM 9
80 - ; 'P' ('L'=76)
P X=0 GPGGA
K RM 9
71 - ; 'G'
P X=0 GPGGA
K RM 9
71 - ; 'G'
P X=0 GPGGA
K RM 9
65 - ; 'A'
P X=0 GPGGA
K RM 9
44 - ; ','
P X=0 GPGGA
1 ; RX=1
EGPGGA: RTN
LCHIS: ; Считать числовое поле в RA
; Используются RA, RB, RC
CX
MA ; число
MB ; признак точки
LCHIS1:
K RM 9 ; считать очередной байт из пакета
MC
44 - ; ','=44
P X!=0 ELCHIS
2 - ; '.'=46
F X=0 LCHIS2
; точка
RMB
P X=0 LCHIS1 ; Если одна точка уже была - игнорировать
10
MB ; Коэффициент деления
P GOTO LCHIS1
LCHIS2: RMB
F X!=0 LCHIS3
; если точка уже была RB!=0
RMC 48 - ; Предполагаемые значения от '0' до '9'
RMB /
RMA + MA
RMB 10 * MB
P GOTO LCHIS1
LCHIS3: RMA 10 *
RMC 48 - ; Предполагаемые значения от '0' до '9'
+ MA
P GOTO LCHIS1
ELCHIS: RMA
RTN
LSIM: ; Чтение одного символа - последнего перед запятой
; Используются RA, RC
CX
MA
LSIM1:
K RM 9 ; считать очередной байт из пакета
MC
44 -
F X!=0 ELSIM
RMC
MA
GOTO LSIM1 ; продолжать до запятой
ELSIM: RMA
RTN ; выход с прочитанным символом
.ENDP
Управление дискретным выходом в зависимости от текущих координатУстройство УСОМК-5 позволяет включать или отключать различные устройства при приближении к точке с определёнными географическими координатами, например, к какой-либо туристической достопримечательности. Для этого используется алгоритм вычисления расстояния между точками на поверхности земного шара. Записываемое в таймер ЭКВМ замедление позволяет отсрочить сигнал на заданное время после достижения указанного расстояния. После замены условия проверки по адресу 176 на противоположное данную программу можно использовать и для контроля за удалением от предварительно заданной точки. Сигнализирование о приближении (primgps1.mkp, 334 байта, КС 41836/68)
Текст программы primgps1.mkl для кросс-компилятора
.CHARSET 1251
; Сигнализирование о приближении
; Сигнализирование об удалении
; Приём сигналов от модуля GPS по протоколу NMEA
; Cкорость 4800, 8 бит, без контроля чётности
; Разбор пакета GGA - Global Positiong System Fixed Data
; Пример работы с устройством УСОМК-5 (1 дискретный выход, GPS)
; Перед запуском программы в регистры заносятся значения:
; Широта достопримечательности, (г,мс), R6 - от 90 до минус 90
; Долгота достопримечательности, (г,мс), R7 - от 180 до минус 180
; Радиус приближения, м, R8 - от 0 до 50000
; Замедление, с/100, R5 - от 0 до 65535
LAT .EQU 20
LONG .EQU 21
TIME .EQU 22
CX
PP M 9045 ; Размерность тригонометрических функций - градусы
PP M 9072 ; Установить режим 8 бит
7 PP M 9071 ; Установить скорость 4800
8 PP M 9073 ; Задержка между байтами в ответе 8*1,25=10 мс.
1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ
PP M 9090 ; Статический режим параллельного порта
9087 M9 ; константа R9087
111200 M4 ; средняя длина 1 градуса дуги ЗШ, м
RM5 ; время >=0
K ABS
M5
RM6 ; преобразовать широту ТН в доли градуса
K MS->D
M6
RM7 ; преобразовать долготу ТН в доли градуса
K MS->D
M7
RM8 ; ограничить радиус
K ABS
M8
50000 -
F X>=0 A0
50000
M8
A0: 0 PP M 9085 ; буфер приёма, смещение 0
1 PP M 9076 ; Начать приём данных
A1: PP RM 9076 ; Проверить окончание приёма, считав содержимое регистра приёма
F X=0 A1 ; пока оно не равно 0 - продолжать считывание
; Приём окончен, количество принятых байт в R9075,
; пакет для обработки в буфере приёма (R9086-R9089)
PP RM 9075 ; Проверка количества принятых байт
F X!=0 A0 ; Повтор при нулевом значении
CX
PP M 9085 ; Индексный регистр буфера приёма, запись 0 - выбрать первый байт
K RM 9 ; Считать первый байт (R9087)
36 - ; Вычесть код символа '$'
F X=0 A0 ; Если не '$' - продолжить ожидание
P GSB GPGGA ; Найти в буфере строку "GPGGA,"
F X!=0 A0 ; Если строка не найдена - продолжить ожидание
P GSB LCHIS ; Считать числовое поле
P M TIME ; UTC Time
P GSB LCHIS ; Считать числовое поле
100 /
K M->D
P M LAT ; Latitude - широта в градусах
P GSB LSIM ; Считать символьное поле
78 - ; 'N'
F X!=0 A2
P RM LAT
+/- ; южная широта - минус
P M LAT
A2: P GSB LCHIS ; Считать числовое поле
100 /
K M->D
P M LONG ; Longitude - долгота в градусах
P GSB LSIM ; Считать символьное поле
69 - ; 'E'
F X!=0 A3
P RM LONG
+/- ; западная долгота - минус
P M LONG
; вычислить расстояние от текущего местонахождения до ТН
RM7 -
F COS
P RM LAT
F COS *
RM6
F COS *
P RM LAT
F SIN
RM6
F SIN * +
F ARCCOS
RM4 *
MA ; В RA - расстояние, м
P RM TIME ; время
P RM LAT ; широта
P RM LONG ; долгота
K SCR
RMA RM8 -
P X>=0 A0 ; перейти, если больше
; заменой на команду P X<0 A0 можно перевести программу
; в режим слежения за удалением от точки
1000 ENT 10
PP M 9052 ; Звуковое подтверждение приближения (удаления)
RM5
PP M 9050 ; Загрузить замедление в таймер 1
A3: PP RM 9050
K SCR
P X=0 A3
CX
PP M 9092 ; Сигнализировать о приближении (удалении) через дискретный выход УСОМК-5
R/S ; Останов программы
GPGGA: ; Поиск строки "GPGGA,"
PP RM 9085 ; индекс буфера приёма
250 -
P X!=0 EGPGGA ; Выход RX=0
K RM 9 ; считать очередной байт из пакета
71 - ; 'G'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
80 - ; 'P' ('L'=76)
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
71 - ; 'G'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
71 - ; 'G'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
65 - ; 'A'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
44 - ; ','
P X=0 GPGGA
1 ; RX=1
EGPGGA: RTN
LCHIS: ; Считать числовое поле в RA
; Используются RA, RB, RC
CX
MA ; число
MB ; признак точки
LCHIS1:
K RM 9 ; считать очередной байт из пакета
MC
44 - ; ','=44
P X!=0 ELCHIS
2 - ; '.'=46
F X=0 LCHIS2
; точка
RMB
P X=0 LCHIS1 ; Если одна точка уже была - игнорировать
10
MB ; Коэффициент деления
P GOTO LCHIS1
LCHIS2: RMB
P X!=0 LCHIS3
; если точка уже была RB!=0
RMC 48 - ; Предполагаемые значения от '0' до '9'
RMB /
RMA + MA
RMB 10 * MB
P GOTO LCHIS1
LCHIS3: RMA 10 *
RMC 48 - ; Предполагаемые значения от '0' до '9'
+ MA
P GOTO LCHIS1
ELCHIS: RMA
RTN
LSIM: ; Чтение одного символа - последнего перед запятой
; Используются RA, RC
CX
MA
LSIM1:
K RM 9 ; считать очередной байт из пакета
MC
44 -
F X!=0 ELSIM
RMC
MA
GOTO LSIM1 ; продолжать до запятой
ELSIM: RMA
RTN ; выход с прочитанным символом
.ENDP
Запись текущего времени в часы ЭКВМСообщения GPS можно использовать для начальной установки или коррекции хода часов. Для установки часов, минут и секунд достаточно разбора сообщения GGA, как показано в примерах выше. Для установки даты потребуется разбор сообщения RMC (Recommended Minimum Specific GNSS Data). Приведённая программа производит коррекцию хода часов с учётом указанной в RX разницы между UTC и местным временем. Запись текущего времени в часы ЭКВМ (primgps2.mkp, 191 байт, КС 18275/211)
Текст программы primgps2.mkl для кросс-компилятора
.CHARSET 1251
; Запись текущего времени
; Перед запуском записать в RX требуемую разницу во времени с UTC, ч
; Пример работы с устройством УСОМК-5 (1 дискретный выход, GPS)
; Приём сигналов от модуля GPS по протоколу NMEA
; Cкорость 4800, 8 бит, без контроля чётности
; Разбор пакета GGA - Global Positiong System Fixed Data
; Для коррекции даты следует использовать сообщение RMC
M8 ; Разница с UTC, ч
CX
PP M 9072 ; Установить режим 8 бит
7 PP M 9071 ; Установить скорость 4800
8 PP M 9073 ; Задержка между байтами в ответе 8*1,25=10 мс.
1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ
9087 M9 ; константа R9087
A0: 0 PP M 9085 ; буфер приёма, смещение 0
1 PP M 9076 ; Начать приём данных
A1: PP RM 9076 ; Проверить окончание приёма, считав содержимое регистра приёма
F X=0 A1 ; пока оно не равно 0 - продолжать считывание
; Приём окончен, количество принятых байт в R9075,
; пакет для обработки в буфере приёма (R9086-R9089)
PP RM 9075 ; Проверка количества принятых байт
F X!=0 A0 ; Повтор при нулевом значении
CX
PP M 9085 ; Индексный регистр буфера приёма, запись 0 - выбрать первый байт
K RM 9 ; Считать первый байт (R9087)
36 - ; Вычесть код символа '$'
F X=0 A0 ; Если не '$' - продолжить ожидание
P GSB GPGGA ; Найти в буфере строку "GPGGA,"
F X!=0 A0 ; Если строка не найдена - продолжить ожидание
P GSB LCHIS ; Считать числовое поле
10000 /
RM8 +
P X<0 A2
24 +
A2: PP M 9055 ; Коррекция часов
R/S
GPGGA: ; Поиск строки "GPGGA,"
PP RM 9085 ; индекс буфера приёма
250 -
P X!=0 EGPGGA ; Выход RX=0
K RM 9 ; считать очередной байт из пакета
71 - ; 'G'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
80 - ; 'P' ('L'=76)
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
71 - ; 'G'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
71 - ; 'G'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
65 - ; 'A'
P X=0 GPGGA
K RM 9 ; считать очередной байт из пакета
44 - ; ','
P X=0 GPGGA
1 ; RX=1
EGPGGA: RTN
LCHIS: ; Считать числовое поле в RA
; Используются RA, RB, RC
CX
MA ; число
MB ; признак точки
LCHIS1:
K RM 9 ; считать очередной байт из пакета
MC
44 - ; ','=44
P X!=0 ELCHIS
2 - ; '.'=46
F X=0 LCHIS2
; точка
RMB
P X=0 LCHIS1 ; Если одна точка уже была - игнорировать
10
MB ; Коэффициент деления
P GOTO LCHIS1
LCHIS2: RMB
P X!=0 LCHIS3
; если точка уже была RB!=0
RMC 48 - ; Предполагаемые значения от '0' до '9'
RMB /
RMA + MA
RMB 10 * MB
P GOTO LCHIS1
LCHIS3: RMA 10 *
RMC 48 - ; Предполагаемые значения от '0' до '9'
+ MA
P GOTO LCHIS1
ELCHIS: RMA
RTN
.ENDP
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |