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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Использование модуля SIM800l


Использование модуля SIM800l

Сообщений 151 страница 180 из 224

151

Выделенное красным - добавить, но прописать нужные имена переменных, которые действуют в вашей программе.
Выделенное синим - удалить, эти шаги выполняются в другом месте.
Выделенное зеленым - не для форума ;)

rom-i написал(а):

Do
If Флаг_есть_принятое_сообщ_usart = 1 Then
  Temper1 = Left(stroka , 4) : Temper2 = Mid(stroka , 5 , 3) : Crcrx = Right(stroka , 7)
  Crc = Temper1 + Temper2
  Temp1 = Val(temper1) : Temp2 = Val(temper2)
  If Temp1 > 800 And Zero <> 0 Then Gosub Обнуление         'Если проебаны шаги
  If Crc = Crcrx Then
     Положение = Temp1 * 35
     Положение = Положение / 10                             'Грубо 800 * 3,5 = 2800 шагов. Где 800 это 80,0 градуса Цельсия
     Положение = 2800 - Положение                           'Инвертируем показания мин Т заслонка открыта
     If Положение > 2800 Then Положение = 0                 'Нет отрицательным величинам более 80,0
     Угол = Положение / 30                                  '2750 Это 90 Градусов для Индикации
     Gosub Indikator
     If Шаги < Положение Then Gosub Plus
     If Шаги > Положение Then Gosub Minus
Буфер_приема_usart_str = ""       ' Чистим буфер приёма
Enable Urxc       ' Включаем приём

  End If
End If

  Waitms 200
Loop
'******************************************************************************************
....
....
....
'======Если пришло по USART=============================================
Reads:
  Принятый_символ = Udr
   If Принятый_символ <> 10 Then
     If Принятый_символ <> 13 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)
     Stroka = Буфер_приема
     Буфер_приема = ""
     Incr Счетчик_принятых_символов       ' Считаем количество принятых символов
Else          ' Иначе выключаем приём и ставим метку, что приём закончен (принято всё сообщение), можно что-то делать с принятым
     Disable Urxc       ' Выключаем приём, пока не обработаем принятое сообщение
     Счетчик_принятых_символов = 0       ' Сбрасываем счётчик символов, готовим к следующему приёму
     Флаг_есть_принятое_сообщ_usart = 1       ' Если символ оказался "Enter", тогда флаг
                                                                     ' устанавливаем в 1.  "Enter"- конец сообщения
   End If
Return

Отредактировано Nord (2019-06-24 09:40:29)

+1

152

Nord
Так тоже уже попробовал. Смысла большого нет. Буфер приема отключается на чуть больше 200 милисекунды, а передача идет раз в 5 секунд. Единственно в пустую не деребанит строку с флагом.
Сейчас проверяю на работе. Другой монтаж, питание. Единственно данные могу посылать только черезь терминал. Все отлично работает. Думаю, что то в монтаже.

0

153

Nord, а зачем отключать прерывания на прием до обработки сообщения?

0

154

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

Nord, а зачем отключать прерывания на прием до обработки сообщения?

Иначе строка <Буфер_приема> будет пополняться, что будет мешать ее разборке.

Вообще-то, вопрос не ко мне, а к разработчику... ;)
Ссылку я дал. ;)

0

155

rom-i написал(а):

Так тоже уже попробовал. Смысла большого нет.

Смысла нет или результат тот же ?

rom-i написал(а):

Единственно в пустую не деребанит строку с флагом.

А вот это как раз и критично.

Если без флага (ваш вариант), то главный цикл только и занят разбором строки.
При этом в UART может что-то прилететь, т.к. не запрещено, а стока дербанится...

0

156

Nord
Дык если прилетит, оно так, и так прилетит. Флаг ставиться по приходу сообщения. МК не знает мусор это, или нужное. Основной цикл быстро проходит если ничего не меняется. По этому прерывание включится сразу. Ну задержка стоит 200 милисекунд спецом для притормаживания. А нужная передача идет раз в 5 секунд. Опрос 18в20, и передача. То есть для мусора все открыто.

0

157

rom-i написал(а):

Дык если прилетит, оно так, и так прилетит.

Ну, дело ваше... ;)
Я указал вам на этот способ, как на неоднократно проверенный и который с уверенностью применяю.
Разумеется, модифицирую "под себя", но концепция сохраняется полностью.

0

158

MACTEPok
Вот тоже невижу смысла отключать прерывание на один цикл. Следующие все рабно будут со включенным.

0

159

rom-i написал(а):

Вот тоже невижу смысла отключать прерывание на один цикл. Следующие все рабно будут со включенным.

Нет. Изучите внимательнее.

"Приняли строку" - "Отключили прерывание" - "Обработали строку" - "Включили прерывание".
И так - по кругу.
Никаких "на один цикл" и "следующие все равно" нет... ;)

0

160

Да что вы всё мучаетесь с этим UART. Я уже не раз писал о простом методе работы с ним. Не буду повторять здесь.
Отошлю к источнику. PZEM-004T Топик 56.
У меня это работает с модулем NB-IoT BC95-G на два порта. UART 0 общается с модулем, UART1 с компьютером.
Вообще без проблем. Ничего не надо включать и отключать, всё происходит автоматически. Буферизированный приём в BASCOM работает прекрасно.

+1

161

sva-don написал(а):

Да что вы всё мучаетесь с этим UART.

Я не мучаюсь, например... ;)

sva-don написал(а):

Буферизированный приём в BASCOM работает прекрасно.

+100500
Один из вариантов.

0

162

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

Выделенное красным - добавить, но прописать нужные имена переменных, которые действуют в вашей программе.
Выделенное синим - удалить, эти шаги выполняются в другом месте.
Выделенное зеленым - не для форума ;)

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

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

Заметили, заметили. Еще как заметили. :cool:

0

163

Всем здравствуйте!
Подскажите, а может ли модуль общаться в баскоме через программный UART?
Подключаю 808 к nano.
в arduino работает, в баскоме никак.
осциллом вижу, что сигналы ходят, модули разговаривают, но на комманду AT в буфере nano ничего нет.
с програмным UARTом ранее не работал, а найти код не могу.
железный UART использую для связи с компом

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 160
$swstack = 160
$framesize = 128

Config Serialin = Buffered , Size = 161                    
Enable Interrupts                                         


Open "comb.9:9600,8,n,1" For Output As #1
Open "comb.8:9600,8,n,1" For Input As #2

Print "begin"

Dim Sms$ As String * 162
Dim B As Byte 

Do
   Gosub Flushbuf
   Print #1 , "AT" : Gosub Waitms_750                     
   Gosub Getline
   Print "b"
Loop



Flushbuf:                                                  
   Gosub Waitms_100
   Clear Serialin
Return

Getline:                                                    
   Gosub Waitms_100
   Sms$ = ""
   Do
      B = Inkey(#2)                                           
      Select Case B
         'Case 0 : Exit Do                                
         'Case 13              
         Case 10 : If Sms$ <> "" Then Exit Do              
         Case Else : If B > 31 Then Sms$ = Sms$ + Chr(b)    
      End Select
   Loop
   Print Sms$
Return


Waitms_100:
   Waitms 100
Return

Waitms_500:
   Waitms 500 
Return


Waitms_750:
   Waitms 750 
Return

End

0

164

Задержки нужно свести к нулю. Это не аппаратный USART, где возможна буферизация.

0

165

Ого как!
Спасибо!
Попробовал убрать  Gosub Waitms_750

оказывается он все-таки работает, но получается даже при запросе
Print #1 , "AT"                     
Gosub Getline
модуль успевает ответить раньше, чем мы начинаем читаем буфер....

0

166

Ура!!!
Заработало!
Убрал все задержки.
Огромное спасибо! :)

0

167

Программный UART принимает только в момент вызова Inkey. Если данные придут когда функция не выполняется, они не будут приняты.

0

168

Мда... но ведь в програмном уарте IDE Arduino буфер как-то реализован... Возможно здесь такое?
Так по сути мк ничего не успеет сделать, пока будет смотреть в уарт.....

0

169

И еще вопрос, если я подключу железный уарт к 808, то в момент прошивки nano (которая насколько я понимаю шьется именно по нему) в 808 не прилетит много мусора?

Отредактировано andreypav (2019-06-28 10:23:54)

0

170

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

Ура!!!
Заработало!

Не спешите радоваться. :)

Пётр написал(а):

Программный UART принимает только в момент вызова Inkey. Если данные придут когда функция не выполняется, они не будут приняты.

А так же, если данных нет и пытаться читать, то будут неверные данные идти.

У вас нет события, по которому бы синхронизировался приём данных (прерывание).

0

171

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

Не спешите радоваться. :)

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

А так же, если данных нет и пытаться читать, то будут неверные данные идти.

У вас нет события, по которому бы синхронизировался приём данных (прерывание).

Да...
До меня уже дошло, что надо цеплять 808 на железный уарт, а софтовый использовать для отправки данных на комп.
А шить nano придется не через usb, а через  ISP.

Отредактировано andreypav (2019-06-28 13:50:29)

0

172

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

До меня уже дошло, что надо цеплять 808 на железный уарт, а софтовый использовать для отправки данных на комп

Можно принимать и софтовым уартом, просто я обычно для RX использую ногу INT и настраиваю срабатывание по прерыванию, по спаду. Да, когда данные принимаются, МК больше ничем заниматься не может, порой этого достаточно или можно как нибудь схитрить.

0

173

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

Можно принимать и софтовым уартом, просто я обычно для RX использую ногу INT и настраиваю срабатывание по прерыванию, по спаду. Да, когда данные принимаются, МК больше ничем заниматься не может, порой этого достаточно или можно как нибудь схитрить.

О! Отличная идея! :)
Так ведь можно и буфер организовать!
Я что-то не догадался....
Буду пробовать.
Уж очень мне нравится шить nano без доп устройств.

0

174

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

Можно принимать и софтовым уартом, просто я обычно для RX использую ногу INT и настраиваю срабатывание по прерыванию, по спаду. Да, когда данные принимаются, МК больше ничем заниматься не может, порой этого достаточно или можно как нибудь схитрить.

Здесь есть некий подводный камень. Я пытался так сделать для вывода МК из спящего режима (спасибо Sasha_1973 за помощь). Всё прекрасно работало, но только от внутреннего тактового генератора.
При тактировании от кварца пропускался целый ряд символов. На частоте 1,8432 мГц примерно штук 5-6.

0

175

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

Можно принимать и софтовым уартом, просто я обычно для RX использую ногу INT и настраиваю срабатывание по прерыванию, по спаду. Да, когда данные принимаются, МК больше ничем заниматься не может, порой этого достаточно или можно как нибудь схитрить.

что-то не получается.
есть ощущение, что так как нога на прерывании и на приеме одна и та же, то во время приема ответа снова срабатывают прерывания и цикл перезапускается.
пробовал выключать прерывания на время приема данных, тогда буфер пустой.
возможно, пока выключалось прерывание, 808 успел закончить передачу.

Отредактировано andreypav (2019-06-28 16:31:24)

0

176

sva-don написал(а):

При тактировании от кварца пропускался целый ряд символов. На частоте 1,8432 мГц примерно штук 5-6.

Честно говоря по этому поводу ничего сказать не могу, т.к. всегда юзал этот подход в устройствах без внешнего кварца. Могу предположить, что для запуска кварца нужно больше времени (зависит от добротности), от сюда RC шустрее в этом роде (ибо только наличие питание достаточно, чтобы пошел процесс). Вообще даже у компов есть такое понятие как "время на просыпание", видимо надо делать нечто подобное (вначале отправлять сигнал на проснуться, а затем на работу). В общем целая тема для изучения. Впрочем с режимом глубокой спячки всегда куча проблем с разными аппаратными блоками МК.

0

177

Вобщем я так и не понял как подружить 808 и программный уарт.
Пошел по классическому пути
808 подключил к железному uart nano
прошиваю nano через ISP
смотрю что пишет модем через ttl переходник, подключенный к программному uart nano.
Огромное спасибо за помощь!!!

0

178

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

Подключаю 808 к nano.

Осмелюсь спросить таки...
Что это за зверь - "808" ? Да еще с UART... ;)
Смартфон ?  Металлоискатель ?  Друм-машина ?  o.O
Поисковик не дает внятного ответа...  :canthearyou:

0

179

http://sg.uploads.ru/t/2Qo3z.jpg
Енто маяк для охотничьей собаки. Сразу ссылка на Гугл карты приходит по запросу. Придумана для авто.
Задумка выкладывалась на Радиокоте.

+1

180

Как зделать более точную задержку чем Wait?
Поглядите пожалуйста. Тема давнешняя, посетителей мало.

Отредактировано rom-i (2019-06-29 00:14:52)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Использование модуля SIM800l