Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Модули GPS. Общие вопросы

Сообщений 1 страница 16 из 16

1

Здравствуйте. Вводные данные... Никогда не пользовался аппаратным Uart. Пришло время изучить его. ! Исследование USART ! тут читал. Читал даташит. Ещё много гуглил по этому поводу. Но никак не ясно. Атмега328. Имеем буфер. У этого буфера есть размер? Config serialin будет работать с этим МК? Или побайтово принимать и складывать строку из символов?
Для понимания, опишу ситуацию. Раньше тактировался от таймера1, от прерывания. И всего хватало, впринципе. Но дурная голова рукам покоя не даёт. Разжился ардуино про мини и решил тактироваться от uart прерывания. GPS модуль посылает nmea сообщения с прецизионной точностью. В моих задачах все равно их нужно принимать, так почему бы этим не воспользоваться и не отсчитывать системное время по ним? Может быть есть желающие пояснить по регистрам и как это лучше организовать? Вопрос немного преждевременный и изучение информации в сети и даташита решит его, но все же...

0

2

Nec написал(а):

...решил тактироваться от uart прерывания.
GPS модуль посылает nmea сообщения с прецизионной точностью.
В моих задачах все равно их нужно принимать, так почему бы этим не воспользоваться и не отсчитывать системное время по ним?

Вот в этом примере есть все, что вам нужно.
Работает "железно", только адаптируйте под себя.

0

3

И все же про буфер 328ой меги не ясно. Он 1байт? Config serialin не будет работать, в том плане, как я его понял : принимаем по первому входящему байту всю строку целиком до символа "13", если я его таким назначу?

0

4

Nec написал(а):

И все же про буфер 328ой меги не ясно.

В примере Александра программное использование аппаратного буфера ограничивается чтением из него принятого байта.
Он (апп-й буфер) работает на своем, аппаратном уровне... ;)

Nec написал(а):

как я его понял : принимаем по первому входящему байту всю строку целиком до символа "13", если я его таким назначу?

Прием заканчиваем по получении символа окончания передачи.
Обычно строка завершается последовательностью LF (Chr(10)) + CR (Chr(13)).
Какими символами завершает передачу ваш модуль, я не знаю... ;)

Вот тут еще полистайте, может пригодиться Эмулятор SIM800L для Proteus

0

5

Работа с буфером очень проста.
Конфигурируем:
Const Buf=8
Dim D(Buf) As Byte
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = Buf
Читаем:
If Ischarwaiting() = 1 Then      'Если в буфере есть информация
      For I = 1 To Buf                   'прочтем ее
         D(i) = Inkey()
         Waitms 1     
      Next
      Clear Serialin

При использовании буфера UART0 будут сгенерированы следующие внутренние переменные:
__RS_HEAD_PTR0 , счетчик байтов, который хранит начало буфера
__RS_TAIL_PTR0 , счетчик байтов, который хранит конец буфера.
_RS232INBUF0 , массив байтов, который служит кольцевым буфером для принятых символов.
_RS_BUFCOUNTR0, байт, содержащий количество байтов, находящихся в буфере.
Можно пользоваться ими.

Отредактировано sva-don (2023-10-03 17:03:16)

+1

6

Sva-don, спасибо. Пока не совсем понятно, но, чувствую, полезная инфа. Видимо, я настолько привык пользоваться программным uart, что не сразу понимаю плюшки аппаратного.

0

7

Nec написал(а):

Видимо, я настолько привык пользоваться программным uart, что не сразу понимаю плюшки аппаратного.

При использовании программного UART размер буфера определяется заранее.

Аппаратный UART имеет свой регистр, а при приеме нового байта выставляется флаг приема, который сбрасывается после прочтения принятого из регистра.
В указанных ранее примерах роль буфера выполняет переменная, размер которой определяется заранее, исходя из ожидаемого объема принимаемых данных.
Контроль приема можно вести:
- по количеству принятого, т.е. не более какого-то объема
- по значению флага приема, если сброшен, значит ничего нового не "прилетело"
- с использованием "конечных" значений, как в в/у примерах

0

8

Nec написал(а):

Видимо, я настолько привык пользоваться программным uart, что не сразу понимаю плюшки аппаратного.

Плюсы софтового отсутствуют, хотя нет: можно повесить на любую ногу. Но количество ограничений (по сравнению с аппаратным) настолько велико, что применения крайне ограничено...

0

9

Александр Д. , именно поэтому и пытаюсь им воспользоваться. Уж очень много было изящных решений в моей жизни с софтовом UARTом. Настало время воспользоваться этой шиной "в лоб") вот только руки все никак не доходят :) спасибо всем, кто откликнулся. Вроде бы, теорию подтянул, не без вашей помощи.

Отредактировано Nec (2023-10-05 18:53:01)

0

10

Тоже возник вопрос по приему с GPS приемника
Через USB-UART переходник с приемника все идет нормально,никак не могу обработать прием с помощью ATMEGA328,тактовая частота 8 МГц (внутренний генератор атмеги)
Приема нет вообще!не могу понять что не так,код (урезанный)

Код:
$Regfile="m328pdef.dat"                                   'указать нужный
$crystal = 8000000                                         'указать нужный
$hwstack = 16
$swstack = 64
$framesize = 16
$baud = 4800
'Declare Sub Getline
Declare Sub Wait_for_string(byval S As String)
Declare Function Read_string() As String
Config Serialin = Buffered , Size = 100  
Dim Uts As String * 10
Do
   Call Wait_for_string( "$GPRMC,")
   Uts = Read_string()
   Call Nokia_text(3 , 1 , Uts , 0)
Loop
End
Sub Wait_for_string(byval S As String) As String            'подпрограмма ожидания строки  $GPRMC в данных GPS приемника
Local Ii As Byte
Local Cc As Byte
Ii = 1
M1:
   Cc = Waitkey()
   If Cc <> Mid(s , Ii , 1) Then
      Goto M1
   Else
      Incr Ii
      If Ii > Len(s) Then Goto M2
      Goto M1
   End If
M2:
End Sub
'------------------------------------------------------         'подпрограмма "разбора " строки $GPRMC на части
Function Read_string() As String
Local Cc As Byte
Local Ss As String * 14
Ss = ""
Do
   Cc = Waitkey()                                           'ожидает символ
      If Cc <> "," Then Ss = Ss + Chr(cc)
Loop Until Cc = ","
Cc = ""
Read_string = Left(ss , 12)
End Function

0

11

Проблема решена-увеличил

Код:
$hwstack = 128
$swstack = 128
$framesize = 128

0

12

Что за GPS модуль? Почему 4800 бод? Сколько с ними встречался, по умолчанию 9600. Модуль можно настроить на передачу только одной строки, к примеру, gprmc или какой вам надо и принимать только её.
Мой код приёма nmea с софтовым uart выглядел примерно так:

Dim Буффер as byte
Dim строка as string*45

Do
  Буффер = inkey(#1)
Loop until Буффер = "$"     'ждём начало строки
Input#1, строка       ' принимаем строку
Буффер = instr(строка, "RMC")      'проверка на нужную строку
If Буффер <>0 then
  ... Тут выделяем нужные куски строки через "mid".
End if

0

13

модуль GPS SC1513
Про  inkey(#1) не слышал,погуглю
За пример кода спасибо!

Отредактировано Mavkid (2023-10-08 21:02:39)

0

14

В общем работает модуль,но как победить не правильные показания?
Иногда выдает неправильные координаты,причем знак валидности есть,работает на улице
Хочу спидометр на велик....

0

15

Если неверные координаты с самого модуля, то это никак не победить. Насколько я понял, Ваш модуль рассчитан на приём только GPS спутников. Стоит попробовать GNSS модули.
Если дело не в модуле, а в Ваших вычисления, то тут будет сложно угадывать где ошибка. Самый простой путь узнать скорость - извлечь её из строки "RMC". Там она даётся в узлах. Путем несложной математики перевести её в км/ч или м/с, как удобнее для восприятия.

0

16

Скорость беру из строки RMC,надо ковырять модуль GNSS ,валяется Гелиос 1м

0