Здравствуйте. Вводные данные... Никогда не пользовался аппаратным Uart. Пришло время изучить его. ! Исследование USART ! тут читал. Читал даташит. Ещё много гуглил по этому поводу. Но никак не ясно. Атмега328. Имеем буфер. У этого буфера есть размер? Config serialin будет работать с этим МК? Или побайтово принимать и складывать строку из символов?
Для понимания, опишу ситуацию. Раньше тактировался от таймера1, от прерывания. И всего хватало, впринципе. Но дурная голова рукам покоя не даёт. Разжился ардуино про мини и решил тактироваться от uart прерывания. GPS модуль посылает nmea сообщения с прецизионной точностью. В моих задачах все равно их нужно принимать, так почему бы этим не воспользоваться и не отсчитывать системное время по ним? Может быть есть желающие пояснить по регистрам и как это лучше организовать? Вопрос немного преждевременный и изучение информации в сети и даташита решит его, но все же...
Модули GPS. Общие вопросы
Сообщений 1 страница 16 из 16
Поделиться12023-10-02 19:06:44
Поделиться22023-10-02 20:13:38
...решил тактироваться от uart прерывания.
GPS модуль посылает nmea сообщения с прецизионной точностью.
В моих задачах все равно их нужно принимать, так почему бы этим не воспользоваться и не отсчитывать системное время по ним?
Вот в этом примере есть все, что вам нужно.
Работает "железно", только адаптируйте под себя.
Поделиться32023-10-02 20:33:35
И все же про буфер 328ой меги не ясно. Он 1байт? Config serialin не будет работать, в том плане, как я его понял : принимаем по первому входящему байту всю строку целиком до символа "13", если я его таким назначу?
Поделиться42023-10-02 22:05:46
И все же про буфер 328ой меги не ясно.
В примере Александра программное использование аппаратного буфера ограничивается чтением из него принятого байта.
Он (апп-й буфер) работает на своем, аппаратном уровне... 
как я его понял : принимаем по первому входящему байту всю строку целиком до символа "13", если я его таким назначу?
Прием заканчиваем по получении символа окончания передачи.
Обычно строка завершается последовательностью LF (Chr(10)) + CR (Chr(13)).
Какими символами завершает передачу ваш модуль, я не знаю... 
Вот тут еще полистайте, может пригодиться Эмулятор SIM800L для Proteus
Поделиться52023-10-03 16:57:13
Работа с буфером очень проста.
Конфигурируем:
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)
Поделиться62023-10-03 17:17:07
Sva-don, спасибо. Пока не совсем понятно, но, чувствую, полезная инфа. Видимо, я настолько привык пользоваться программным uart, что не сразу понимаю плюшки аппаратного.
Поделиться72023-10-03 19:40:04
Видимо, я настолько привык пользоваться программным uart, что не сразу понимаю плюшки аппаратного.
При использовании программного UART размер буфера определяется заранее.
Аппаратный UART имеет свой регистр, а при приеме нового байта выставляется флаг приема, который сбрасывается после прочтения принятого из регистра.
В указанных ранее примерах роль буфера выполняет переменная, размер которой определяется заранее, исходя из ожидаемого объема принимаемых данных.
Контроль приема можно вести:
- по количеству принятого, т.е. не более какого-то объема
- по значению флага приема, если сброшен, значит ничего нового не "прилетело"
- с использованием "конечных" значений, как в в/у примерах
Поделиться82023-10-05 11:39:18
Видимо, я настолько привык пользоваться программным uart, что не сразу понимаю плюшки аппаратного.
Плюсы софтового отсутствуют, хотя нет: можно повесить на любую ногу. Но количество ограничений (по сравнению с аппаратным) настолько велико, что применения крайне ограничено...
Поделиться92023-10-05 18:51:50
Александр Д. , именно поэтому и пытаюсь им воспользоваться. Уж очень много было изящных решений в моей жизни с софтовом UARTом. Настало время воспользоваться этой шиной "в лоб") вот только руки все никак не доходят
спасибо всем, кто откликнулся. Вроде бы, теорию подтянул, не без вашей помощи.
Отредактировано Nec (2023-10-05 18:53:01)
Поделиться102023-10-08 19:12:52
Тоже возник вопрос по приему с 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
Поделиться112023-10-08 19:55:34
Проблема решена-увеличил
$hwstack = 128 $swstack = 128 $framesize = 128
Поделиться122023-10-08 20:02:29
Что за 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
Поделиться132023-10-08 20:59:32
модуль GPS SC1513
Про inkey(#1) не слышал,погуглю
За пример кода спасибо!
Отредактировано Mavkid (2023-10-08 21:02:39)
Поделиться142023-10-15 19:27:39
В общем работает модуль,но как победить не правильные показания?
Иногда выдает неправильные координаты,причем знак валидности есть,работает на улице
Хочу спидометр на велик....
Поделиться152023-10-16 06:16:14
Если неверные координаты с самого модуля, то это никак не победить. Насколько я понял, Ваш модуль рассчитан на приём только GPS спутников. Стоит попробовать GNSS модули.
Если дело не в модуле, а в Ваших вычисления, то тут будет сложно угадывать где ошибка. Самый простой путь узнать скорость - извлечь её из строки "RMC". Там она даётся в узлах. Путем несложной математики перевести её в км/ч или м/с, как удобнее для восприятия.
Поделиться162023-10-16 19:43:18
Скорость беру из строки RMC,надо ковырять модуль GNSS ,валяется Гелиос 1м