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

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

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

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


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


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

Сообщений 181 страница 210 из 224

181

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

Что это за зверь - "808" ? Да еще с UART...

ага, SIM808 :)
я такой использую
https://sc01.alicdn.com/kf/HTB1VcsZOXXXXXX8XpXXq6xXFXXXt/221839952/HTB1VcsZOXXXXXX8XpXXq6xXFXXXt.jpg

0

182

andreypav
Китайцы молодцы. У них, что было вчера, это уже прошлое.)))

0

183

Вопрос назрел. Задаю во второй теме. Как выйти из подпрограммы если нет ответа на условие?
В данной теме сталкивался при опросе USART. МК делает запрос модулю SIM800, а тот лежит рядом в стороне. МК ждет ответа. Получаю висяк.
Как выходить в данных ситуациях?

0

184

Таймер заводите, и выходите

0

185

Yuriy.pv
Можно образец кода.
И, что делать если нет свободных таймеров?
Есть бешанная псина, но ей пользоваться неумею.
Как, и где включать, останавливать WDT?
Дык это вопрос не решает. Перезагруз МК. Все равно повиснет на данном этане.

Отредактировано rom-i (2019-06-30 11:55:06)

0

186

Yuriy.pv
Знаю, что Вы любитель приводной техники. Понравился драйвер L6390. Второй вход инверсный. Не надо использовать ШИМ второго порта, и мертвое время задается RC. На пульсации не падок. Два компаратора. Защитный, и для контроля тока.

0

187

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

0

188

Config Watchdog = 2     '  2 4 8 16 32 64 128 256 512 1024   
On Wdt Timer_sys                                                               
Enable Wdt

Read_message:
Flag_out = 0
Start Watchdog

do
if Flag_out = 10 then Exit do

прием сообщения

loop

Stop Watchdog                                             
return

Timer_sys:

incr Flag_out

return

Отредактировано Yuriy.pv (2019-06-30 12:33:36)

0

189

L6390 посмотрел.. он на один канал, надо смотреть как будет влиять dead time на кондере при синхронизации  фаз... применяли уже?

0

190

Yuriy.pv
Спасибо. Но как то заметил, что WDT считает по своему. В основном использую для Pover Down. Время к тактухе не привязано.

0

191

а какая разница, вам же фиксировать зависание.

0

192

Yuriy.pv

L6390 посмотрел.. он на один канал, надо смотреть как будет влиять dead time на кондере при синхронизации  фаз... применяли уже?

По даташиту очень красиво. Ни как не могут сойтись Lout с Hout. Об синхронизации не думал. Здесь может накладка пройти(если очень точно). Тогда да. Нужно точно привязаться к тикам, плюс тики при переносе чезезь озу.

0

193

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

0

194

Yuriy.pv
Как Вы решаете вопрос с зарядкой аккума?
У мну чисто по напряжению.  Использую автомобильный. При 14.3 отключается, 12.3 заряд. Аккум дохлый для испытаний. Но на час автономки хватает. Движка 220 Вт. Но нагрузки нет. Крутит наждачный круг. 50Вт не больше при работе. Это чисто испытания. Реальную нагрузку цеплял, примерно так же. С зарядкой не понимаю. Когда (дохлый) аккум заряжается за минуту. Начинается безконечное вкл/выкл зарядки.
Какие решения есть?

Отредактировано rom-i (2019-06-30 15:58:15)

0

195

Ну если дохлый то уже ничего ему не поможет )) Так и будет за минуту заряжаться. Только контроль тока и напряжения.

0

196

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

Вопрос назрел. Задаю во второй теме. Как выйти из подпрограммы если нет ответа на условие?

If ... Then ...Else... End If уже не работает ?
Не все варианты проверок условия предусмотрены.

0

197

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

Вопрос назрел. Задаю во второй теме. Как выйти из подпрограммы если нет ответа на условие?

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

0

198

Для пользователей UART не обязательно SIM800L. Есть условия. С этой проблемой столкнулся, и ESP8266. Получаешь зависание при ожидании ответа. SIM800 не нуждается в комманде перенос строки Chr(10).  В модуле прошито окончание по Ener Chr(13), и перенос строки просто игнор. Для модуля ESP8266 необходимое условие Chr(10). Это все делает Баском без Вашего участия. В конце передачи данных добавляет Enter Chr(13), и перенос строки(возврат каретки) Chr(10). Для модуля ESP8266 это необходимое условие. Если брать прием по методу Александра, то получите лишний Chr(10). Вам достанется для следующей строки приема. Если смотреть внимательно то Александр не пользуется голой коммандой Print(которая автоматом добавит два символа). Для выхода в процессе наладки, и помех у Баскома есть спецовая комманда(условие), выйти из прерывания приема по UART  $timeout = 1000. Точно в помошнике не указано. Только, что это не время точно. И не количество символов. Но если число будет маленьким, не всю строку получите.
По этому реалный код получается таким.

Код:
'======Если пришло ========================================
Reads:
  $timeout = 10000
  Принятый_символ = Udr
   If Принятый_символ <> 10 Then
     If Принятый_символ <> 13 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)
   Else
     Stroka = Буфер_приема
     Буфер_приема = ""
   End If
Return

По пререносу строки берем значение, и игнорим Chr(13) Enter.

Отредактировано rom-i (2019-07-07 14:32:46)

0

199

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

Для пользователей UART не обязательно SIM800L.
Есть условия.
С этой проблемой столкнулся, и ESP8266.

Вот, вроде, русскоязычный сайт, а понять сказанное "без пол-литры" - нереально... ;)
rom-i, плиз !  Выражайтесь понятным (не только вам) языком... ;)

Отредактировано Nord (2019-07-07 22:45:28)

0

200

Nord
Неуж то действительно так непонятно.  :blush: Литературным талантом не владею.
Баском при передаче по UART автоматом добавляет Chr(13), и Chr(10) при использовании комманды Print. Александр передает без символа перенос строки Chr(10). Если по каким причинам этот символ не был принят, то МК повиснет на прерывании по приему. Но это в моей части кода. Если заканчивать забирать из буфера на символе ентер Chr(13), то в нем останется Chr(10). Он достанется следующей строке. По крайней мере у мну так произходило. Для этого желательно прописывать $timeout = число.

0

201

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

Неуж то действительно так непонятно.
Литературным талантом не владею.

Нет, я речь веду именно про указанное, не про все, что после этих строк. ;)

По поводу борьбы с лишними Chr(xx) могу предложить пока только очищать буфер после приема, если нет других способов передачи.

0

202

Доброго времени суток!
Столкнулся с вопросом. Понадобилось вкл\откл условия выполнения программы. 
Config Portc.1 = Input
Vikl Alias Pinc.1
Дальше.
If Vikl = 0 Then
  Waitms 30
  Toggle Flag
  Waitms 100
End If
Где  Dim Flag As Bit
Принимаю данные с другого МК.

Код:
'======Если пришло по USART==============================================================
Reads:
  $timeout = 10000
  Принятый_символ = Udr
   If Принятый_символ <> 10 Then
     If Принятый_символ <> 13 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)       '
   Else
     Flag_rx = 1
     Stroka = Буфер_приема
     Буфер_приема = ""
   End If
Return

Это все отлично работает.
Дальше пока не прописал  вкл\откл тоже все было четко.

Код:
Awake:
  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

  If Temp1 > Temperatura And Zero = 1 Then Gosub Обнуление  'Если шаги

  If Crc = Crcrx And Flag = 0 Then
     Положение = Temp1 * Делитель_word                      'Грубо 800 * 3,5 = 2800 шагов. Где 800 это 80,0 градуса Цельсия
     Положение = Положение / 10
     Положение = Редуктор - Положение                       'Инвертируем показания мин. температура  заслонка открыта
     If Положение > Редуктор Then Положение = 0             'Нет отрицательным величинам более 80,0
     Chim = Положение / 10
  End If

     Угол = Положение / 30                                  '2750 Это 90 Градусов для Индикации
     Gosub Indikator

     If Chim > 255 Then Chim = 255
     If Chim < 50 Then Chim = 0

  If Flag = 0 Then
     If Шаги < Положение Then Gosub Plus
     If Шаги > Положение Then Gosub Minus
     Ocr1a = Chim
    Else
     Ocr1a = 0
     Gosub Обнуление
  End If


Если Flag = 1, то есть отключено. То при очередном приеме по UART, именно при выполнении этой части кода

Код:
  If Flag_rx = 1 And Flag = 0 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

переменная Flag  сбрасывается на 0.
В начале думал из-за пульсаций работы шагового движка. С отключенным драйвером ШД тож самое. Накидал схему в Протеус. Точьно нет ни каких помех. Действительно при приеме UART всегда Flag = 0.
Почему? Чему этот бит мешает?
Если делать так

Код:
  If Flag_rx = 1 And Flag = 0 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

все работает. Но не принимаю температуру. Помог еще один подход. Не использовать контрольную сумму в обработке строки. Просто выбросил переменную Crc.

Код:
Awake:
  If Flag_rx = 1 Then
     Temper1 = Left(stroka , 4) : Temper2 = Mid(stroka , 5 , 3)
     Temp1 = Val(temper1) : Temp2 = Val(temper2)
     Flag_rx = 0
  End If

  If Temp1 > Temperatura And Zero = 1 Then Gosub Обнуление  'Если шаги

  If Flag = 0 Then                                                           'Переменные не работают при отк.
     Положение = Temp1 * Делитель_word                      'Грубо 800 * 3,5 = 2800 шагов. Где 800 это 80,0 градуса Цельсия
     Положение = Положение / 10
     Положение = Редуктор - Положение                       'Инвертируем показания мин. температура  заслонка открыта
     If Положение > Редуктор Then Положение = 0             'Нет отрицательным величинам более 80,0
     Chim = Положение / 10
  End If

     Угол = Положение / 30                                  '2750 Это 90 Градусов для Индикации
     Gosub Indikator

     If Chim > 255 Then Chim = 255
     If Chim < 50 Then Chim = 0

  If Flag = 0 Then
     If Шаги < Положение Then Gosub Plus
     If Шаги > Положение Then Gosub Minus
     Ocr1a = Chim
    Else
     Ocr1a = 0
     Gosub Обнуление
  End If

Где накладка?

Отредактировано rom-i (2019-07-20 23:51:57)

0

203

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

Где накладка?

Пару раз встречается вызов Gosub Обнуление, причем при разных условиях.
Там все в порядке ? ;)

0

204

Nord
Обнуление. Движка крутьться пока не сработает датчик. Использую порт для него.
Config Portc.3 = Input
Zero Alias Pinc.3

Код:
'****** Вращение вправо открытие ********************************************
Plus:
  Reset Portb.2
   Do
  Reset Portd.2
  Reset Portd.3
   Waitus 1000
  Set Portd.3
   Waitus 1000
  Incr Шаги                                                 'Увеличиваем переменную счета сделанных шагов
   Loop Until Шаги = Положение                              'Выходим из подпрограммы если количество сделанных шагов равня заданным
  Set Portb.2
Return
'****** Вращение влево закрытие ******
Minus:
 If Zero = 1 Then
  Reset Portb.2
   Do
  Set Portd.2
  Reset Portd.3
   Waitus 1000
  Set Portd.3
   Waitus 1000
  Decr Шаги
   Loop Until Шаги = Положение
  Set Portb.2
 End If
Return
'****** Выход в ноль ******
Обнуление:
 If Zero = 1 Then
  Reset Portb.2
   Do
  Set Portd.2
  Reset Portd.3
   Waitus 1000
  Set Portd.3
   Waitus 1000
   Loop Until Zero = 0
  Set Portb.2
 End If
  Шаги = 0
  Положение = 0
Return

Отредактировано rom-i (2019-07-21 00:58:40)

0

205

Nord
Да, и для протеус пробовал исключять вообше вращение. Думаю тема кроется именно в обработке принятого сообщения по UART.
Вообще есть какая нибудь четность в текстовых переменных?
Этот бит где то в памяти должен храниться. Имею ввиду  Dim Flag As Bit .
Чему этот бит может мешать?

Отредактировано rom-i (2019-07-21 00:49:18)

0

206

Пытался писать не Toggle. Делать триггер с помощью еще одной переменной. Результат один, в один.

0

207

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

Имею ввиду  Dim Flag As Bit.  Чему этот бит может мешать?

Возможно, что-то недоувидел, но накладок в кодах выше не встретил...

Попробуйте отказаться от созвучия "Flag"... ;)
Flag_rx как объявлена ?
Обзовите эти переменные по-разному.

0

208

Nord
В начале Flag был Разрешение. Думал программе русский не понравился.  8-).
Думаю проблема скрыта в четности памяти. Иначе как етот бит прогамма вышвыривает.
Не пробовал Flag сделать байтом. Но если ни кто ответа не даст, сделаю.)))

Отредактировано rom-i (2019-07-21 01:48:01)

0

209

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

Думаю проблема скрыта в четности памяти.

Это что за зверь ? ;)
Или новое название чего-то существующего ? ;)

Переменные объявлены, компилятор выделил для них необходимый объем памяти...
Следовательно или глюки с их (переменных) адресацией (читай "с именем"), или таки где-то в программе ляпа...

0

210

Вот зависимость нашел кое-какую...

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

Если Flag = 1, то есть отключено.
То при очередном приеме по UART, именно при выполнении этой части кода
     If Flag_rx = 1 And Flag = 0 Then
.....
     Flag_rx = 0
     End If
переменная Flag  сбрасывается на 0.

Дело в том, что Flag становится "0" где-то раньше, иначе бы условие не выполнилось бы.

0


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