Что это за зверь - "808" ? Да еще с UART...
ага, SIM808 
я такой использую
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Использование модуля SIM800l
Что это за зверь - "808" ? Да еще с UART...
ага, SIM808 
я такой использую
andreypav
Китайцы молодцы. У них, что было вчера, это уже прошлое.)))
Вопрос назрел. Задаю во второй теме. Как выйти из подпрограммы если нет ответа на условие?
В данной теме сталкивался при опросе USART. МК делает запрос модулю SIM800, а тот лежит рядом в стороне. МК ждет ответа. Получаю висяк.
Как выходить в данных ситуациях?
Таймер заводите, и выходите
Yuriy.pv
Можно образец кода.
И, что делать если нет свободных таймеров?
Есть бешанная псина, но ей пользоваться неумею.
Как, и где включать, останавливать WDT?
Дык это вопрос не решает. Перезагруз МК. Все равно повиснет на данном этане.
Отредактировано rom-i (2019-06-30 11:55:06)
Yuriy.pv
Знаю, что Вы любитель приводной техники. Понравился драйвер L6390. Второй вход инверсный. Не надо использовать ШИМ второго порта, и мертвое время задается RC. На пульсации не падок. Два компаратора. Защитный, и для контроля тока.
WDT используйте как таймер, при входе заводите, в нем флаг, а в приеме сообщения проверяете его ..
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)
L6390 посмотрел.. он на один канал, надо смотреть как будет влиять dead time на кондере при синхронизации фаз... применяли уже?
Yuriy.pv
Спасибо. Но как то заметил, что WDT считает по своему. В основном использую для Pover Down. Время к тактухе не привязано.
а какая разница, вам же фиксировать зависание.
Yuriy.pv
L6390 посмотрел.. он на один канал, надо смотреть как будет влиять dead time на кондере при синхронизации фаз... применяли уже?
По даташиту очень красиво. Ни как не могут сойтись Lout с Hout. Об синхронизации не думал. Здесь может накладка пройти(если очень точно). Тогда да. Нужно точно привязаться к тикам, плюс тики при переносе чезезь озу.
К такому варианту надо кондеры точно подбирать учитывать температурный дрейф.. как то ненадежно все это.. для однофазной структуре пойдет, для трех думаю будет много вытекающих проблем..
Yuriy.pv
Как Вы решаете вопрос с зарядкой аккума?
У мну чисто по напряжению. Использую автомобильный. При 14.3 отключается, 12.3 заряд. Аккум дохлый для испытаний. Но на час автономки хватает. Движка 220 Вт. Но нагрузки нет. Крутит наждачный круг. 50Вт не больше при работе. Это чисто испытания. Реальную нагрузку цеплял, примерно так же. С зарядкой не понимаю. Когда (дохлый) аккум заряжается за минуту. Начинается безконечное вкл/выкл зарядки.
Какие решения есть?
Отредактировано rom-i (2019-06-30 15:58:15)
Ну если дохлый то уже ничего ему не поможет )) Так и будет за минуту заряжаться. Только контроль тока и напряжения.
Вопрос назрел. Задаю во второй теме. Как выйти из подпрограммы если нет ответа на условие?
If ... Then ...Else... End If уже не работает ?
Не все варианты проверок условия предусмотрены.
Вопрос назрел. Задаю во второй теме. Как выйти из подпрограммы если нет ответа на условие?
Я в начале темы давал пример с таймаутом, можно любой таймер использовать, лишь бы тикал без остановки.
Для пользователей 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)
Для пользователей UART не обязательно SIM800L.
Есть условия.
С этой проблемой столкнулся, и ESP8266.
Вот, вроде, русскоязычный сайт, а понять сказанное "без пол-литры" - нереально... 
rom-i, плиз ! Выражайтесь понятным (не только вам) языком... 
Отредактировано Nord (2019-07-07 22:45:28)
Nord
Неуж то действительно так непонятно.
Литературным талантом не владею.
Баском при передаче по UART автоматом добавляет Chr(13), и Chr(10) при использовании комманды Print. Александр передает без символа перенос строки Chr(10). Если по каким причинам этот символ не был принят, то МК повиснет на прерывании по приему. Но это в моей части кода. Если заканчивать забирать из буфера на символе ентер Chr(13), то в нем останется Chr(10). Он достанется следующей строке. По крайней мере у мну так произходило. Для этого желательно прописывать $timeout = число.
Неуж то действительно так непонятно.
Литературным талантом не владею.
Нет, я речь веду именно про указанное, не про все, что после этих строк. 
По поводу борьбы с лишними Chr(xx) могу предложить пока только очищать буфер после приема, если нет других способов передачи.
Доброго времени суток!
Столкнулся с вопросом. Понадобилось вкл\откл условия выполнения программы.
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)
Где накладка?
Пару раз встречается вызов Gosub Обнуление, причем при разных условиях.
Там все в порядке ? 
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)
Nord
Да, и для протеус пробовал исключять вообше вращение. Думаю тема кроется именно в обработке принятого сообщения по UART.
Вообще есть какая нибудь четность в текстовых переменных?
Этот бит где то в памяти должен храниться. Имею ввиду Dim Flag As Bit .
Чему этот бит может мешать?
Отредактировано rom-i (2019-07-21 00:49:18)
Пытался писать не Toggle. Делать триггер с помощью еще одной переменной. Результат один, в один.
Имею ввиду Dim Flag As Bit. Чему этот бит может мешать?
Возможно, что-то недоувидел, но накладок в кодах выше не встретил...
Попробуйте отказаться от созвучия "Flag"... 
Flag_rx как объявлена ?
Обзовите эти переменные по-разному.
Nord
В начале Flag был Разрешение. Думал программе русский не понравился.
.
Думаю проблема скрыта в четности памяти. Иначе как етот бит прогамма вышвыривает.
Не пробовал Flag сделать байтом. Но если ни кто ответа не даст, сделаю.)))
Отредактировано rom-i (2019-07-21 01:48:01)
Думаю проблема скрыта в четности памяти.
Это что за зверь ? 
Или новое название чего-то существующего ? 
Переменные объявлены, компилятор выделил для них необходимый объем памяти...
Следовательно или глюки с их (переменных) адресацией (читай "с именем"), или таки где-то в программе ляпа...
Вот зависимость нашел кое-какую...
Если Flag = 1, то есть отключено.
То при очередном приеме по UART, именно при выполнении этой части кода
If Flag_rx = 1 And Flag = 0 Then
.....
Flag_rx = 0
End If
переменная Flag сбрасывается на 0.
Дело в том, что Flag становится "0" где-то раньше, иначе бы условие не выполнилось бы.
Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Использование модуля SIM800l