Приём сообщений 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 (многоканальный) |