Приём сообщений GPS


Главная / ЭКВМ / Программы / Примеры

Приём данных проводится при помощи последовательного интерфейса Стык С2 (RS-232C), линии которого выведены на разъём ВУ. Параметры обмена: 4800 бит/с, без контроля чётности.

Для определения положения и времени достаточно принять сообщение GGA (Global Positioning System Fixed Data) протокола NMEA. Таким образом на базе различных моделей ЭКВМ можно выполнить простейший переносной или стационарный GPS-навигатор.

Приведённая программа принимает данные от модуля и считывает время и координаты в регистры, преобразуя их из строкового в числовой формат.


Приём и расшифровка сообщения GGA (dgps.mkp, 263 байта; КС 30416/108)

  0 1 2 3 4 5 6 7 8 9
000 Cx PP П 90 72 7 PP П 90 71 8 PP П
010 90 73 1 PP П 90 70 9 0 8 7
020 П 9 0 PP П 90 85 1 PP П 90 76 PP ИП
030 90 76 F x=0 29 PP ИП 90 75 F x≠0 21 Cx
040 PP П 90 85 K ИП 9 3 6 - F x=0 21 P ПП
050 01 34 F x≠0 21 P ПП 01 88 P П 21 P ПП
060 01 88 1 0 0 ÷ K М→Г K Г→МС P П 22
070 P ПП 02 48 P П 23 7 8 - F x≠0 85
080 P ИП 22 /-/ P П 22 P ПП 01 88 1 0
090 0 ÷ K М→Г K Г→МС P П 24 P ПП 02 48 P П
100 25 6 9 - F x≠0 11 P ИП 24 /-/ P П
110 24 P ПП 01 88 P П 26 P ПП 01 88 P П
120 27 PP ИП 00 21 PP ИП 00 24 PP ИП 00 22
130 K ЭКР P БП 00 21 PP ИП 90 85 2 5 0
140 - P x≠0 01 87 K ИП 9 7 1 - P x=0 01
150 34 K ИП 9 8 0 - P x=0 01 34 K ИП 9 7
160 1 - P x=0 01 34 K ИП 9 7 1 - P x=0
170 01 34 K ИП 9 6 5 - P x=0 01 34 K ИП 9
180 4 4 - P x=0 01 34 1 В/О Cx П A
190 П B K ИП 9 П C 4 4 - P x≠0 02 46 2
200 - F x=0 13 ИП B P x=0 01 91 1 0 П B
210 P БП 01 91 ИП B F x≠0 33 ИП C 4 8 -
220 ИП B ÷ ИП A + П A ИП B 1 0 × П B
230 P БП 01 91 ИП A 1 0 × ИП C 4 8
240 - + П A P БП 01 91 ИП A В/О Cx П A
250 K ИП 9 П C 4 4 - F x≠0 61 ИП C П A БП
260 50 ИП A В/О              

Текст программы 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)

  0 1 2 3 4 5 6 7 8 9
000 Cx PP П 90 45 PP П 90 72 7 PP П 90
010 71 8 PP П 90 73 1 PP П 90 70 PP П
020 90 90 9 0 8 7 П 9 1 1 1
030 2 0 0 П 4 ИП 5 K |x| П 5 ИП 6 K МС→Г П 6
040 ИП 7 K МС→Г П 7 ИП 8 K |x| П 8 5 0 0 0
050 0 - F x≥0 60 5 0 0 0 0 П 8
060 0 PP П 90 85 1 PP П 90 76 PP ИП 90
070 76 F x=0 68 PP ИП 90 75 F x≠0 60 Cx PP П
080 90 85 K ИП 9 3 6 - F x=0 60 P ПП 02
090 04 F x≠0 60 P ПП 02 58 P П 22 P ПП 02
100 58 1 0 0 ÷ K М→Г P П 20 P ПП 03
110 19 7 8 - F x≠0 21 P ИП 20 /-/ P П
120 20 P ПП 02 58 1 0 0 ÷ K М→Г P П
130 21 P ПП 03 19 6 9 - F x≠0 92 P ИП
140 21 /-/ P П 21 ИП 7 - F cos P ИП 20 F cos
150 × ИП 6 F cos × P ИП 20 F sin ИП 6 F sin ×
160 + F arccos ИП 4 × П A P ИП 22 P ИП 20 P ИП
170 21 K ЭКР ИП A ИП 8 - P x≥0 00 60 1 0
180 0 0 B↑ 1 0 PP П 90 52 ИП 5 PP П
190 90 50 PP ИП 90 50 K ЭКР P x=0 01 92 Cx
200 PP П 90 92 С/П PP ИП 90 85 2 5 0
210 - P x≠0 02 57 K ИП 9 7 1 - P x=0 02
220 04 K ИП 9 8 0 - P x=0 02 04 K ИП 9 7
230 1 - P x=0 02 04 K ИП 9 7 1 - P x=0
240 02 04 K ИП 9 6 5 - P x=0 02 04 K ИП 9
250 4 4 - P x=0 02 04 1 В/О Cx П A
260 П B K ИП 9 П C 4 4 - P x≠0 03 17 2
270 - F x=0 83 ИП B P x=0 02 61 1 0 П B
280 P БП 02 61 ИП B P x≠0 03 04 ИП C 4 8
290 - ИП B ÷ ИП A + П A ИП B 1 0 ×
300 П B P БП 02 61 ИП A 1 0 × ИП C 4
310 8 - + П A P БП 02 61 ИП A В/О Cx
320 П A K ИП 9 П C 4 4 - F x≠0 32 ИП C П A
330 БП 21 ИП A В/О            

Текст программы 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)

  0 1 2 3 4 5 6 7 8 9
000 П 8 Cx PP П 90 72 7 PP П 90 71 8
010 PP П 90 73 1 PP П 90 70 9 0 8
020 7 П 9 0 PP П 90 85 1 PP П 90 76
030 PP ИП 90 76 F x=0 30 PP ИП 90 75 F x≠0 22
040 Cx PP П 90 85 K ИП 9 3 6 - F x=0 22
050 P ПП 00 76 F x≠0 22 P ПП 01 30 1 0
060 0 0 0 ÷ ИП 8 + P x<0 00 72 2
070 4 + PP П 90 55 С/П PP ИП 90 85 2
080 5 0 - P x≠0 01 29 K ИП 9 7 1 -
090 P x=0 00 76 K ИП 9 8 0 - P x=0 00 76
100 K ИП 9 7 1 - P x=0 00 76 K ИП 9 7 1
110 - P x=0 00 76 K ИП 9 6 5 - P x=0 00
120 76 K ИП 9 4 4 - P x=0 00 76 1 В/О
130 Cx П A П B K ИП 9 П C 4 4 - P x≠0 01
140 89 2 - F x=0 55 ИП B P x=0 01 33 1
150 0 П B P БП 01 33 ИП B P x≠0 01 76 ИП C
160 4 8 - ИП B ÷ ИП A + П A ИП B 1
170 0 × П B P БП 01 33 ИП A 1 0 ×
180 ИП C 4 8 - + П A P БП 01 33 ИП A
190 В/О                  

Текст программы 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 (многоканальный)