Если Flag = 1, то есть отключено. То при очередном приеме по UART, именно при выполнении этой части кода
вполне возможна накладка переменных
нужно всё в архиве ( симуляшка + исходник )
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Использование модуля SIM800l
Если Flag = 1, то есть отключено. То при очередном приеме по UART, именно при выполнении этой части кода
вполне возможна накладка переменных
нужно всё в архиве ( симуляшка + исходник )
При первом пуске условие обнуления до Zero = 0. Далее при Flag = 1 должно оставаться Zero = 0.
Пример передачи по терминалу. Температура воды + температура в комнате(пока не использую) + контрольная сумма. Например 35.2 градуса котел, 24.1 комната. Строка для передачи 03522410352241 энтер. После копирования и передачи терминал добавит возврат каретки(в HEX 0A, или Chr(10)). Полная строка 03522410352241 + Chr(13) + Chr(10).
https://yadi.sk/d/MJGGb5VwnChFwg
С перехлестом переменных уже сталкивался. Вот появилась возможность понять как это избежать.
В архиве две версии. V1 про, что идет речь. V2 обработка без контрольной суммы. С этой проблемы нет.
Отредактировано rom-i (2019-07-21 13:40:22)
https://yadi.sk/d/MJGGb5VwnChFwg
А симуляция где ?
Dim Crc As String * 7
Dim Crcrx As String * 7
Dim Flag_rx As Bit
Вот Вам и ошибка !
Crcrx = Right(stroka , 7) - затирается флаг
Увеличьте
Dim Crc As String * 7
Dim Crcrx As String * 7
Сделайте
Dim Crc As String * 10
Dim Crcrx As String * 10
sasha_1973
Симуляция под протеус 8. Все в там.
Дык если переменная 7 символов для чего ее увеличивать? Dim Crcrx As String * 7
Не допонимаю самой сути. Давно заметил, что текстовые переменные лучьше задавать с плюсом.
Но для чего? Давно хотел задать этот вопрос.
Симуляция под протеус 8. Все в там.
нашел, обычно симка вместе с исходником
Дык если переменная 7 символов для чего ее увеличивать?
затем, что строковая переменная заканчивается "0", который не видно
Вы назначили переменную 7 символов, и все их используете, а в конце т.е., 8 символ = "0"
этот нолик Вам и обнуляет флаг
Симуляция под протеус 8
И как ей пользоваться, что бы попасть сюды
If Flag_rx = 1 Then
Temper1 = Left(stroka , 4) : Temper2 = Mid(stroka , 5 , 3) : Crcrx = Right(stroka , 7)
Crc = Temper1 + Temper2
Temp1 = Val(temper1) : Temp2 = Val(temper2)
Flag_rx = 0
End If
И как ей пользоваться, что бы попасть сюды
Поставить точку останова на нужную строку и запустить отладочную симуляцию. В качестве прошивки нужно указать не hex, а obj файл.
Поставить точку останова на нужную строку и запустить отладочную симуляцию. В качестве прошивки нужно указать не hex, а obj файл.
Очень смешно !

Симуляция под протеус 8
И чем Вы передаете строку, если терминалом протеуса, то он 10 не передаёт, только 13 ?
sasha_1973
И как ей пользоваться, что бы попасть сюды
Толком не знаю. Но разбирался тыком. Добавил еще один терминал на приеме. Приемный перевел в HEX формат. Обязательно отключить эхо. МК только принимает. Дальше как в посте 214.
Набил строку например 03522410352241. Нажал Enter. Приемный терминал покажет, что к строке добавилось в HEX 00(есть Chr(13)). В терминале нажать Copy. Получается уже скопировал 03522410352241 + Chr(13). Дальше в терминале просто нажать Paste. Терминал добавит к сохраненному 03522410352241 + Chr(13) еще возврат каретки в HEX 0A, или Chr(10). Жутко неудобно, но ***.
Тож самое, и про.
строковая переменная заканчивается "0", который не видно
Огромное спасибо за объяснение. Интересно. Если выводить контрольно черезь UART переменную (в моем случае Crcrx) этот "0" виден будет?
Набил строку например 03522410352241. Нажал Enter. Приемный терминал покажет, что к строке добавилось в HEX 00(есть Chr(13)). В терминале нажать Copy. Получается уже скопировал 03522410352241 + Chr(13). Дальше в терминале просто нажать Paste. Терминал добавит к сохраненному 03522410352241 + Chr(13) еще возврат каретки в HEX 0A, или Chr(10). Жутко неудобно, но ***.
А не проще поставить ещё один МК который по кнопке будет этим заниматься, ещё есть COMPIM в протеусе, но нужен виртуальный COMPORT
переменная STRING отображает только символы таблицы, "0" это конец строки в переменной
Так не эротичнее ?
Reads:
' $timeout = 10000
Принятый_символ = Udr
If Принятый_символ = 13 Then
Goto Exit_reads
End If
If Принятый_символ = 10 Then
Flag_rx = 1
Stroka = Буфер_приема
Буфер_приема = ""
Goto Exit_reads
End If
Буфер_приема = Буфер_приема + Chr(принятый_символ) '
Exit_reads:
Return
sasha_1973
А не проще поставить ещё один МК который по кнопке будет этим заниматься
)))Это была первая мысля при виде этого черного окна в протеус(про терминал). Но любопытство разобраться победило. Да, и времени было завались. На дежурстве был.
sasha_1973
Запустил в железе, все отлично. Без контрольной суммы даже при передаче 2400 не надежно. Очень большые пульсации. Кроме шагового движка, еще работает инвертер из 12/220В, и формирование двух токовых фаз. Синуносоидальной формы с помощью ШИМ. Все с Вашей помощью. Огромное спасибо.
Здравствуйте. Открыл бы новую тему, но, что-то, нет такой кнопки, не могу найти...
Заранее извиняюсь, что влез в чужую тему.
Имеется, значит soft Uart, по которому общаются модули GPS и GSM с 88ой тинькой. Аппаратного на борту нет. Теперь немного о логике работы устройства.
Ровно раз в секунду имеем прерывание по 16 битному таймеру timer1. В нем обрабатываем показания с одного из датчиков (много математики, примерно на 40-50мс) и результаты в несколько переменных integer. Это действие очень важно и промежуток в 1 сек тоже очень важен.
Далее... На борту GPS модуль Neo-6m. По Uart получаем от него координаты и переводим их в две переменные long (цифра о широте и цифра о долготе). На это действие у нас уходит около 200-300мс, так как модуль транслирует сам по себе и не ясно в какой момент и на какую строку мы наткнемся в момент чтения. Приходится немного ждать начала нужной нам строки и потом обрабатывать её.
Продолжаем... Раз в сколько то секунд (хотелось бы чем чаще, тем лучше. Но, в то же время, иметь возможность контролировать интервал) собираем все переменные с данными в одно сообщение и отправляем по смс через модуль Sim800l. И тут начинается самое интересное. Если с GPS я задавал условие
If timer1 <15000 then
Gosub GPS
Return
и укладывался между прерываниями, и даже ещё времени оставалось вагон, то читать GSM модуль необходимо всегда. Меня не покидает чувство, что не МК управляет им, а он МК. К примеру, после отправки СМС, очень хотелось бы получить ответ "ОК" от модуля. Но ответ приходит в любой момент. По закону подлости, даже в момент прерывания по timer1. Итог: ответ прозевали или получили кусок ответа - чепуху. Плюс ко всему-незапрашиваемые уведомления от sim800. Будь то приход нового смс или входящий звонок или ещё что то. Нужно бы не прозевать сообщения в момент прерывания или ухода в подпрограмму GPS (или ещё какую-то, которую мне приспичит добавить).
Из даташита:
1.6.1 Software flow control (XON/XOFF flow control)
Software flow control sends different characters to stop (XOFF, decimal 19) and resume (XON, decimal 17)
data flow. It is quite useful in some applications that only use three wires on the serial interface.
The default flow control approach of SIM7080 Series is hardware flow control (RTS/CTS flow control), to
enable software flow control in the DTE interface and within GSM engine, type the following AT Command:
AT+IFC=1,1
Я правильно понимаю, что это разрешение на приём передачу?
AT+IFC=1,1 установил. Разницы не заметил...
Как этим пользоваться? Или, может быть, у кого-то есть другие варианты решения задачи? Переход на другой мк возможен, но не хотелось бы.
покажите схему подключения GSM к МК, или только 2 ноги задействовано в обмене? нет аппаратного управления потоком?
программным управлением потока никогда не пользовался. Тут не подскажу
Продолжаю безумие. Разобрался с программным управлением потока. Сам затупил. Отправлял модулю просто 17 вместо CHR(17). Вроде бы все заработало. Причём, когда поток возобновляем, из модуля сыпется разом все, что накопилось в его буфер. Строку с ответом модуля пришлось выводить побайтово в цикле через inkey, каждый раз проверяя значение timer1. Если дело идёт к прерыванию, то останавливаем трансляцию от модуля и возобновляем при выходе из прерывания. Выход из цикла по CR.
Есть ещё интересный момент. После отправки сообщения, для отладки, выводил в терминал ход выполнения программы. После уходил в цикл чтения ответа с модуля. Смс улетали раз в 3 сек. Как только удалил строку для отладки, все встало колом. Смс отправляется, а ответ от модуля читается как ">". Больше ни на какие команды не реагирует до перезагрузки. Как это увязать со строкой print#1 (сообщение в терминал) не знаю.
В планах ещё разобраться с потоком сообщений от модуля, которые могут накопиться в его буфере, пока поток от него был перекрыт. Нужно как-то находить последнюю строку, чтобы не подвисать в цикле чтения.
Боремся дальше...
Попробуйте отключать прерывания на время работы с модулем.
Это был бы самый простой путь, но в прерывании обрабатывается показания с датчика, который считает расстояние. А в единицу времени (секунда) это будет скорость. Без скорости никак.
Я тут подумал. Можно же выходя из прерывания возобновлять поток и тупо, через input читать все, что накопилось в памяти. Вот только нужно как то заранее знать количество строк, чтобы не зависнуть на попытке чтения несуществующих
или я не понял хитрый алгоритм, или Вы что-то усложняете
Насколько помню, GPS-модуль сам считает скорость и выдаёт в потоке.
Даже если нет, вам не нужно отсчитывать секунду: модуль сам раз в секунду выдаёт пакет с данными. Вам надо ВСЕГДА ждать данные и расшифровывать их.
Я делал всякие трекеры, но не заморачивался так и все довольны )
а на софтовый UART действует мета-команда $timeout ?
Отредактировано Александр Д. (2023-01-07 11:01:48)
Скорее, это я недоговариваю хитрый алгоритм. GPS только для координат (пока что). Это не совсем трекер, но быть трекером одна из его задач. Скорость он замеряет по вертикали, по барометру (скорость взлета/падения) на GPS в таком случае надежды нет, только барометр. Во первых GSM имеет свойство терять спутники, во вторых считает высоту не всегда корректно.
По сути, с кодом уже все, более менее, ровно. Основная заморочка была с внезапными ответами от GSM. Софтовое управление потоком решило проблему. Пока остановился на варианте сразу после одного из прерываний включать поток от модуля, через inkey проверять идёт ли символ, если идёт то через input забирать строку, закрывать поток и уходить в обработку этой строки. И так по кругу, пока inkey не станет забирать нули. В основном, все строки обрабатываются около 50мс. Что хватает с головой. Приём смс, распознавание номера отправителя и распознавание текста самое долгое. Около 100мс. К сожалению, в тексте принятого СМС сообщения всегда не хватает первых двух символов. Видимо, теряются когда мк отвлекается на команду GSM модулю, чтобы прекратил передачу.
Жаль, что выбрали МК без аппаратного UART
Я применял SIM868 и МК с двумя UART: ATmega328PB
Признаться честно, с аппаратным никогда не имел дел. Да и с МК начал "дружить" недавно. Если бы не бейсик, наверное, до сих пор бы не знал как к ним подойти. Tiny88 выбрал потому что в Китае стоит копейки. Любая Atmega в разы дороже. А шанс потерять изделие велик. То спутники теряются, то сеть не ловит. Поэтому максимально дёшево, надёжно и чтобы собиралось "на коленке".
На счёт $timeout. В хелпе баскома написано, что и на soft uart действует. Вот только я туплю, не могу понять в чем смысл её использования? Для чего её применять? Что означает цифра к которой она приравнивается? Как понять какую цифру задавать?
Отредактировано Nec (2023-01-07 15:41:20)
дешево да геморно ))
GSM-модуль стоит раз в 8-10 больше, чем МК. Тиньку88 покупал чуть дешевле, чем Мегу8 (произвожу устройства). Когда был дефицит Мега8, что я только туда не ставил (изменив программу, конечно): Тини88, Мега168 (да, было такое, что она была дешевле Мега8)
Аппаратный UART позволяет применить прерывания, что даёт возможность сделать фоновый приём в буфер без потерь данных.
А два UARTa вообще сняли все проблемы )
цифра в $timerout это некое значение "тиков" в цикле ожидания данных в порте, я подбирал методом тыка
Чтобы та же INKEY не зависла до получения байта данных
Про высоту: известные мне BMP измеряют её с точностью хуже 20 см
Отредактировано Александр Д. (2023-01-07 16:02:09)
Sim800 в Китае на сегодняшний день, около 200р. Neo-6 примерно столько же. Аттини88 около 100р. Подобные ей ардуино (чтобы плату не травить) от 250р. Вот и вся математика.
Барометр (bmp180) пляшет до двух метров в покое. Шумы, ветер и прочее. Но, для моих целей вполне годится и опробован не один раз. А вот GSM кровушки попил. Крайний раз программу зациклил в каком то месте, но чудом конечные координаты прислал. Вот и решил заморочиться от и до.
Касаемо $timeout, не совсем понятно. В хелпе написано, что при input он будет перебирать каждый символ до окончания. До окончания чего? Длины переменной? То есть, при
Dim stroka As string*5
Input#1, stroka
он будет перебирать 5 символов (каждый по сколько то времени, зависит от значения), если в порт ничего не будет идти?
Есть ли какое-то, хотя бы примерное, понимание зависимости время-частота-значение?
А почему именно GSM ?
Радиоканал чем хуже ? Да и работать проще.
Или ваше устройство будет "за горизонт" улетать ? 
Нет, за горизонт ничего улетать точно не будет. Есть планы перейти на LoRa. Но тут нюансы.
Во первых, низкая скорость передачи данных. Но это решаемо.
Во вторых, 1вт греется за 1 минуту до 60-70 градусов (по слухам). 100мвт маловато будет, скорее всего.
В третьих, в смс ссылка на гугл карты с координатами. Одно устройство, которое всегда в кармане. Удобно. А если привязывать LoRa к телефону, то это нужно организовать Bluetooth связь между телефоном и трансмиттером, да и какое-то приложение писать под андройд.
Думаю, ближе к лету, прикуплю несколько LoRa модулей, побалуюсь ими
Лора у меня "не взлетели": ни дальности я не получил, ни уверенной связи.
Вполне возможно, что я неправильно настраивал радиоканал.
Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Использование модуля SIM800l